diff --git a/README.md b/README.md index 3d0db56..5afc7f2 100644 --- a/README.md +++ b/README.md @@ -1,255 +1,184 @@ [![Build Status](https://travis-ci.org/crossoverJie/JCSprout.svg?branch=master)](https://travis-ci.org/crossoverJie/jeeplatform) [![Join the chat at https://gitter.im/jeeplatform/community](https://badges.gitter.im/jeeplatform/community.svg)](https://gitter.im/jeeplatform/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -## 项目简介 ## -一款企业信息化开发基础平台,拟集成OA(办公自动化)、SCM(供应链系统)、ERP(企业资源管理系统)、CMS(内容管理系统)、CRM(客户关系管理系统)等企业系统的通用业务功能 +## 一、项目简介 +JeePlatform项目是一款以SpringBoot为核心框架,集ORM框架Mybatis,Web层框架SpringMVC和多种开源组件框架而成的一款通用基础平台,代码已经捐赠给开源中国社区:https://www.oschina.net/p/jeeplatform -JeePlatform项目是一款以Spring Framework为核心框架,集ORM框架Mybatis,Web层框架SpringMVC和多种开源组件框架而成的一款通用基础平台,代码已经捐赠给开源中国社区:https://www.oschina.net/p/jeeplatform +代码结构图: +``` +├─jeeplatform----------------------------父项目,公共依赖 +│ │ +│ ├─jeeplatform-admin--------------------------基础管理系统 +│ │ +│ ├─jeeplatform-cms-----------------------内容管理系统 +│ │ +│ ├─jeeplatform-common--------------------------通用工程 +│ │ +│ ├─jeeplatform-oa--------------------------协调办公系统 +| | +| |─jeeplatform-provider-----------------------平台服务中心 +│ │ +│ ├─jeeplatform-provider-api-----------------------平台服务API +| | +│ ├─jeeplatform-sso-cas-----------------------CAS单点登录服务端 +│ │ +│ ├─jeeplatform--sso-oauth2---------------OAuth2.0单点登录服务端 +│ │ + +``` -## 系统设计 ## -### 系统管理(模块名称jeeplatform-admin) ### -管理系统登录页面,采用Shiro登录验证 +## 二、系统设计 +### 系统管理(模块名称jeeplatform-admin) +管理系统登录页面 ps:登录链接一般为:http://127.0.0.1:8080/jeeplatform/login -![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/管理系统登录页面.png) +![Image text](https://gitee.com/362330721/jeeplatform/raw/master/screenshot/管理系统登录页面.png) 管理系统主页前端,可以适配移动端页面 -![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/适配移动端.png) +![Image text](https://gitee.com/362330721/jeeplatform/raw/master/screenshot/适配移动端.png) 管理系统主页采用开源前端模板,具有换肤功能 -![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/系统主页墨绿主题.png) +![Image text](https://gitee.com/362330721/jeeplatform/raw/master/screenshot/系统主页墨绿主题.png) -![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/系统主页清新主题.png) +![Image text](https://gitee.com/362330721/jeeplatform/raw/master/screenshot/系统主页清新主题.png) 管理系统主页,获取用户具有的权限,显示菜单 -![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/管理系统主页.png) +![Image text](https://gitee.com/362330721/jeeplatform/raw/master/screenshot/管理系统主页.png) 角色进行授权,只有超级管理员才具有权限 -![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/角色授权.png) +![Image text](https://gitee.com/362330721/jeeplatform/raw/master/screenshot/角色授权.png) 角色进行配置,可以学习一下RBAC(基于角色的权限控制) -![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/角色配置.png) +![Image text](https://gitee.com/362330721/jeeplatform/raw/master/screenshot/角色配置.png) 使用JavaEmail插件实现邮件发送,记得需要开启SSl验证 -![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/发送邮件.png) +![Image text](https://gitee.com/362330721/jeeplatform/raw/master/screenshot/发送邮件.png) ### OA管理系统(待开发) - +接入CAS Server实现单点登录 ### CMS管理系统(待开发) +暂时接入Oauth2.0实现的单点登录系统 -## 系统升级 -### 单点登录基础(模块名称jeeplatform-sso)(开发中) -> 项目采用CAS登录登录实现,单点登录集群搭建可以参考博客: +## 三、关键技术 +### CAS单点登录基础(模块名称jeeplatform-sso-cas)(功能修整中) +> 项目采用CAS实现单点登录,单点登录集群搭建可以参考博客: > http://blog.csdn.net/u014427391/article/details/78653482 -> 项目单点登录:使用nginx作为负载均衡,使用redis存储tomcat session,来实现集群中tomcat session的共享,使用redis作为cas ticket的仓库,来实现集群中cas ticket的一致性。 +> 项目单点登录:使用nginx作为负载均衡,使用redis存储tomcat session,来实现集群中tomcat session的共享,使用redis作为cas ticket的仓库,来实现集群中cas ticket的一致性。OA已经对接CAS,admin工程暂时不对接CAS -单点登录集群如图 -![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/单点登录集群.png) -### SpringBoot集成Redis缓存处理(Spring AOP实现) -先从Redis里获取缓存,查询不到,就查询MySQL数据库,然后再保存到Redis缓存里,下次查询时直接调用Redis缓存 +图来自官网,这里简单介绍一下,从图可以看出,CAS支持多种方式的认证,一种是LDAP的、比较常见的数据库Database的JDBC,还有Active Directory等等;支持的协议有Custom Protocol 、 CAS 、 OAuth 、 OpenID 、 RESTful API 、 SAML1.1 、 SAML2.0 等 -``` -package org.muses.jeeplatform.cache; - -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; - -/** - * AOP实现Redis缓存处理 - */ -@Component -@Aspect -public class RedisAspect { - - private static final Logger LOGGER = LoggerFactory.getLogger(RedisAspect.class); - - @Autowired - @Qualifier("redisCache") - private RedisCache redisCache; - - /** - * 拦截所有元注解RedisCache注解的方法 - */ - @Pointcut("@annotation(org.muses.jeeplatform.annotation.RedisCache)") - public void pointcutMethod(){ - - } - - /** - * 环绕处理,先从Redis里获取缓存,查询不到,就查询MySQL数据库, - * 然后再保存到Redis缓存里 - * @param joinPoint - * @return - */ - @Around("pointcutMethod()") - public Object around(ProceedingJoinPoint joinPoint){ - //前置:从Redis里获取缓存 - //先获取目标方法参数 - long startTime = System.currentTimeMillis(); - String applId = null; - Object[] args = joinPoint.getArgs(); - if (args != null && args.length > 0) { - applId = String.valueOf(args[0]); - } - - //获取目标方法所在类 - String target = joinPoint.getTarget().toString(); - String className = target.split("@")[0]; - - //获取目标方法的方法名称 - String methodName = joinPoint.getSignature().getName(); - - //redis中key格式: applId:方法名称 - String redisKey = applId + ":" + className + "." + methodName; - - Object obj = redisCache.getDataFromRedis(redisKey); - - if(obj!=null){ - LOGGER.info("**********从Redis中查到了数据**********"); - LOGGER.info("Redis的KEY值:"+redisKey); - LOGGER.info("REDIS的VALUE值:"+obj.toString()); - return obj; - } - long endTime = System.currentTimeMillis(); - LOGGER.info("Redis缓存AOP处理所用时间:"+(endTime-startTime)); - LOGGER.info("**********没有从Redis查到数据**********"); - try{ - obj = joinPoint.proceed(); - }catch(Throwable e){ - e.printStackTrace(); - } - LOGGER.info("**********开始从MySQL查询数据**********"); - //后置:将数据库查到的数据保存到Redis - String code = redisCache.saveDataToRedis(redisKey,obj); - if(code.equals("OK")){ - LOGGER.info("**********数据成功保存到Redis缓存!!!**********"); - LOGGER.info("Redis的KEY值:"+redisKey); - LOGGER.info("REDIS的VALUE值:"+obj.toString()); - } - return obj; - } - - -} +![这里写图片描述](https://images.gitee.com/uploads/images/2020/0517/212349_a195821a_355133.png) + +![这里写图片描述](https://images.gitee.com/uploads/images/2020/0517/212349_384ef37d_355133.png) + +单点登录集群方案如图 +![Image text](https://gitee.com/362330721/jeeplatform/raw/master/screenshot/单点登录集群.png) + +### OAuth2.0单点登录基础(模块名称jeeplatform-sso-oauth2)(功能修整中) + +![在这里插入图片描述](https://images.gitee.com/uploads/images/2020/0517/212350_327aefca_355133.png) + +### SpringBoot集成Redis缓存处理(Spring AOP实现) +先从Redis里获取缓存,查询不到,就查询MySQL数据库,然后再保存到Redis缓存里,下次查询时直接调用Redis缓存,详情参考博客:[链接](https://blog.csdn.net/u014427391/article/details/78799623) -``` ![这里写图片描述](http://img.blog.csdn.net/20171214104250995?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDQyNzM5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 可以看到Redis里保存到了缓存 ![这里写图片描述](http://img.blog.csdn.net/20171214104303308?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDQyNzM5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) -## 业务方案 ## -### 系统管理通用功能 #### +## 四、业务方案 +### 系统管理通用功能 +- [ ] 单点登录: OAuth2.0+JWT单点登录/CAS单点登录 - [x] 用户管理: 系统用户 -- [x] 角色管理: 按照企业系统职能进行角色分配,每个角色具有不同的系统操作权限 OK -- [x] 权限管理: 权限管理细分到系统按钮权限,菜单权限,管理员可以对权限进行细分控制 +- [x] 角色管理: 按照企业系统职能进行角色分配,每个角色具有不同的系统操作权限 +- [x] 权限管理: 权限管理细分到系统菜单权限 - [ ] 在线管理:管理在线用户,可以强制下线 -- [x] 菜单管理:系统可以配置系统菜单,并分配不同的权限 OK +- [x] 菜单管理:系统可以配置系统菜单,并分配不同的权限 - [ ] 报表统计:数据报表、用户分析 -- [ ] 系统监控:数据监控、系统日志(用户登录记录) -- [ ] 通用接口:SMS(短信)、系统邮件、Excel表导出导入操作... -### OA系统通用功能(待开发) ### +- [x] 系统监控:数据库等方面监控(采用Druid提供的) +- [x] 在线文档:SwaggerUI API在线文档管理 +- [x] 通用接口:系统邮件发送功能、Excel报表功能 +### OA系统通用功能(待开发) +- [x] 单点登录: CAS单点登录 - [ ] 考勤管理:请假流程 - [ ] 人事管理:机构管理、部门管理、员工管理 -### CMS系统通用功能(待开发) ### +### CMS系统通用功能(待开发) +- [x] 单点登录: OAuth2.0+JWT单点登录 - [ ] 信息管理:文章管理、文章审核 ... -## 技术方案 ## -### 后台技术 ### -* 工作流引擎:Activiti5 -* ORM框架:Mybatis/Hibernate JPA +## 五、技术方案 +### 后台技术 +* 工作流引擎:Activiti5(待定) +* ORM框架:Mybatis * Web框架:SpringMVC -* 核心框架:Spring Framework4.0 -* 任务调度:Spring Task -* 权限安全:Apache Shiro/Spring Security -* 全文搜索引擎:Lucene/Solr -* 页面静态化处理:Freemark/Velocity -* 服务器页面包含技术:SSI -* 网页即时通讯:long polling/websocket +* 核心框架:SpringBoot +* 任务调度:Spring Task(待定) +* 权限安全:Apache Shiro、Spring Security +* 全文搜索引擎:Lucene(待定) +* 模板引擎:JSP(还没使用Thymeleaf,前端需要重构) +* 服务器页面包含技术:SSI(待定) +* 网页即时通讯:websocket * 连接池:Druid(阿里开源) -* 日志处理:SLF4J -* 缓存处理:Redis、EhCache +* 日志处理:SLF4J(日志门面框架)、logback +* 缓存处理:Redis * Excel表处理:POI -### 前端技术 ### +### 前端技术 * 文件上传:JQuery uploadify * 树形结构:EasyUI Tree * 日期插件:JQuery Date * 弹窗框架:zDialog * Cookie保存:JQuery Cookie * 富文本编辑器:Baidu UEDitor -* 前端框架:Twitter Bootstrap、ExtJS - -### 服务器 #### -* 负载均衡:Nginx -* 分布式:alibaba Dubbo -* 中间件:RocketMQ - -### 项目测试 ### -* DeBug:Junit、FindBugs、EclEmma -* 程序质量:Jdepend4eclipse -* 压力测试:JMeter - -### 工具软件 ### -* 服务器:SecureCRT -* Java:IntelliJ IDEA/Eclipse -* 远程控制:TeamViewer -* 版本控制:Git -* Jar管理:Maven -* UML建模:ArgoUML -* Eclipse测试插件:EclEmma -* 程序质量检查插件:Jdepend4eclipse(Eclipse平台) -## 常见问题 ## +* 前端框架:Twitter Bootstrap + +## 六、常见问题 运行jeeplatform打开页面404,如果是用idea的,就可以edit configurations->configuration->edit working directory设置为:$MODULE_DIR$ -## 项目技术博客介绍 ## + +## 七、版本说明 +* master版本 +主干版本,实现简单的权限管理,单点登录方案有CAS和OAuth2.0+JWT两种方案,admin暂时没接单点,oa工程对接cas,cms对接OAuth2.0实现单点登录,微服务只是做了个demo,还没进行项目服务处理,所以并没有merge代码 +* dev版本 +dev版本代码和master分支基本一致 +* 1.0.0版本 +基础版,基本实现简单的权限管理,功能还需改善,权限控制还需要进行细粒度控制 + +* 1.1.0版本 +进行单点登录对接实验的版本,拟采用两种方案,CAS实现的单点登录和OAuth2.0+JWT单点登录,admin工程暂时还没对接,oa工程对接CAS,cms工程对接OAuth2.0 + +## 八、项目技术博客介绍 为了帮助学习者更好地理解代码,下面给出自己写的一些博客链接 ### Java框架 -* [基于RBAC模型的权限系统设计(Github开源项目)](http://blog.csdn.net/u014427391/article/details/78889378) -* [Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页](http://blog.csdn.net/u014427391/article/details/77434664) +* [基于RBAC模型的权限系统设计](http://blog.csdn.net/u014427391/article/details/78889378) +* [Spring Data Jpa实现分页](http://blog.csdn.net/u014427391/article/details/77434664) * [SpringMVC+ZTree实现树形菜单权限配置](https://blog.csdn.net/u014427391/article/details/78889378) -* [Github开源项目(企业信息化基础平台)](https://blog.csdn.net/u014427391/article/details/78867439) -* [基于权限安全框架Shiro的登录验证功能实现](http://blog.csdn.net/u014427391/article/details/78307766) +* [企业信息化基础平台项目介绍](https://blog.csdn.net/u014427391/article/details/78867439) +* [基于Shiro的登录验证功能实现](http://blog.csdn.net/u014427391/article/details/78307766) -SpringBoot +### SpringBoot +我的Springboot系列博客可以参考我的专栏:[SpringBoot系列博客](https://blog.csdn.net/u014427391/category_9195353.html) * [SpringBoot热部署配置](https://smilenicky.blog.csdn.net/article/details/89765909) * [SpringBoot集成Redis实现缓存处理](http://blog.csdn.net/u014427391/article/details/78799623) * [SpringBoot profles配置多环境](https://smilenicky.blog.csdn.net/article/details/89792248) * [SpringBoot集成Swagger2](https://smilenicky.blog.csdn.net/article/details/90706219) -### Redis知识 -* [Redis学习笔记之基本数据结构](https://blog.csdn.net/u014427391/article/details/82860694) -* [Redis学习笔记之位图](https://blog.csdn.net/u014427391/article/details/87923407) -* [Redis学习笔记之延时队列](https://blog.csdn.net/u014427391/article/details/87905450) -* [Redis学习笔记之分布式锁](https://blog.csdn.net/u014427391/article/details/84934045) - -### Oracle知识 -* [Oracle知识整理笔录](https://blog.csdn.net/u014427391/article/details/82317376) -* [Oracle笔记之锁表和解锁](https://blog.csdn.net/u014427391/article/details/83046148) -* [select in超过1000条报错解决方法](https://blog.csdn.net/u014427391/article/details/87922878) -* [Oracle笔记之修改表字段类型](https://blog.csdn.net/u014427391/article/details/83046006) -* [Oracle merge合并更新函数](https://blog.csdn.net/u014427391/article/details/87898729) - +### RPC框架 +* [Dubbo服务注册与发现](https://smilenicky.blog.csdn.net/article/details/96754952) ### 单点登录 * [ 单点登录集群安装教程](http://blog.csdn.net/u014427391/article/details/78653482) +* [CAS单点登录系列之原理简单介绍](https://blog.csdn.net/u014427391/article/details/82083995) +* [CAS系列之使用cas overlay搭建服务端(一)](https://blog.csdn.net/u014427391/article/details/105818468) +* [CAS 5.3.1系列之支持JDBC认证登录(二)](https://blog.csdn.net/u014427391/article/details/105603895) +* [CAS 5.3.1系列之自定义JDBC认证策略(三)](https://blog.csdn.net/u014427391/article/details/105820486) +* [CAS 5.3.1系列之自定义Shiro认证策略(四)](https://blog.csdn.net/u014427391/article/details/105820586) +### Docker笔记 +* [Docker简介和安装教程](https://smilenicky.blog.csdn.net/article/details/97613891) -### SQL调优知识 -* [Oracle优化器基础知识](https://blog.csdn.net/u014427391/article/details/88650696) -* [Oracle性能调优之虚拟索引用法简介](https://smilenicky.blog.csdn.net/article/details/89761234) -* [Oracle性能调优之物化视图用法简介](https://smilenicky.blog.csdn.net/article/details/89762680) -* [Orace执行计划学习笔记](https://smilenicky.blog.csdn.net/article/details/89604262) -* [Oracle共享池分析SQL资源使用情况](https://blog.csdn.net/u014427391/article/details/86562755) diff --git a/code/.gitignore b/code/.gitignore index 266bfaa..4ace0e4 100644 --- a/code/.gitignore +++ b/code/.gitignore @@ -19,6 +19,7 @@ mvnw.* *.ipr *.iml *.iws +.mvn # temp ignore *.log diff --git a/code/HELP.md b/code/HELP.md new file mode 100644 index 0000000..73e3250 --- /dev/null +++ b/code/HELP.md @@ -0,0 +1,8 @@ +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) +* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/) + diff --git a/code/jeeplatform-admin/pom.xml b/code/jeeplatform-admin/pom.xml index dbf353c..c5fa26a 100644 --- a/code/jeeplatform-admin/pom.xml +++ b/code/jeeplatform-admin/pom.xml @@ -14,8 +14,12 @@ 1.2.3 + 1.2.4 + 1.2.4 4.7.2 3.7 + 3.2.0 + 1.2.4 @@ -26,8 +30,39 @@ org.muses.jeeplatform - jeeplatform-core - ${jeeplatform-core.version} + jeeplatform-provider-api + ${jeeplatform-provider-api.version} + + + + org.springframework.boot + spring-boot-starter-data-redis + ${spring-boot.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + + + com.alibaba + druid + ${druid.version} + + + com.alibaba + druid-spring-boot-starter + ${druid.version} @@ -52,13 +87,23 @@ javax.servlet jstl - + org.apache.shiro - shiro-all - ${shiro.version} + shiro-spring + ${shiro.spring.version} + + + org.apache.shiro + shiro-ehcache + ${shiro.encache.version} + @@ -74,12 +119,25 @@ 1.5.6 - + + + + - commons-lang - commons-lang - 2.5 + net.unicon.cas + cas-client-autoconfig-support + 1.5.0-GA + + diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/Application.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java similarity index 58% rename from code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/Application.java rename to code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java index 09bbe50..2dab8fb 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/Application.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java @@ -1,7 +1,9 @@ package org.muses.jeeplatform; -import org.muses.jeeplatform.cache.RedisClient; +import net.unicon.cas.client.configuration.EnableCasClient; +import org.jasig.cas.client.validation.Assertion; +import org.muses.jeeplatform.cache.redis.RedisClient; import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; @@ -14,8 +16,14 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + /** * @author caiyuyu */ @@ -27,13 +35,13 @@ //@EnableCaching @EnableAsync @Controller -public class Application { +public class AdminApplication { @Autowired RedisClient redisClient; public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(AdminApplication.class, args); } @RequestMapping("/set") @@ -53,4 +61,27 @@ public String get(String key) throws Exception { // return c; // } + @GetMapping("/auth") + public void auth(HttpServletRequest request, HttpServletResponse response, HttpSession session) { + Assertion assertion = (Assertion) session.getAttribute("_const_cas_assertion_"); + response.setHeader("Content-type", "application/json;charset=UTF-8"); + response.setCharacterEncoding("utf-8"); + response.setStatus(200); + if (assertion != null) { + String redirectUrl= request.getParameter("redirectUrl"); + try { + response.setHeader("Content-type", "text/html;charset=UTF-8"); + response.sendRedirect(redirectUrl); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + try { + response.getWriter().print("401"); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisAspect.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/aop/RedisAspect.java similarity index 96% rename from code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisAspect.java rename to code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/aop/RedisAspect.java index 8f9c726..d886b57 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisAspect.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/aop/RedisAspect.java @@ -1,9 +1,10 @@ -package org.muses.jeeplatform.cache; +package org.muses.jeeplatform.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; +import org.muses.jeeplatform.cache.redis.RedisCache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/authentication/cas/CustomAuthticationRedirectStrategy.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/authentication/cas/CustomAuthticationRedirectStrategy.java new file mode 100644 index 0000000..01845de --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/authentication/cas/CustomAuthticationRedirectStrategy.java @@ -0,0 +1,36 @@ +package org.muses.jeeplatform.authentication.cas; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.shiro.authc.pam.AbstractAuthenticationStrategy; +import org.jasig.cas.client.authentication.AuthenticationRedirectStrategy; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/27 13:37  修改内容:
+ * 
+ */ +public class CustomAuthticationRedirectStrategy implements AuthenticationRedirectStrategy { + + @Override + public void redirect(HttpServletRequest request, HttpServletResponse response, String potentialRedirectUrl) throws IOException { +// response.setCharacterEncoding("utf-8"); +// response.setContentType("application/json; charset=utf-8"); +// PrintWriter out = response.getWriter(); +// out.write("401"); + //response重定向 + response.sendRedirect(potentialRedirectUrl); + } +} diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisCache.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/redis/RedisCache.java similarity index 92% rename from code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisCache.java rename to code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/redis/RedisCache.java index af3cd3b..01ebfdf 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisCache.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/redis/RedisCache.java @@ -1,5 +1,6 @@ -package org.muses.jeeplatform.cache; +package org.muses.jeeplatform.cache.redis; +import org.muses.jeeplatform.cache.SerializeUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisClient.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/redis/RedisClient.java similarity index 94% rename from code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisClient.java rename to code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/redis/RedisClient.java index 101991a..ce7c0f4 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisClient.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/redis/RedisClient.java @@ -1,4 +1,4 @@ -package org.muses.jeeplatform.cache; +package org.muses.jeeplatform.cache.redis; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomErrorAttributes.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomErrorAttributes.java new file mode 100644 index 0000000..f15e6ae --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomErrorAttributes.java @@ -0,0 +1,35 @@ +package org.muses.jeeplatform.component; + +import org.springframework.boot.autoconfigure.web.DefaultErrorAttributes; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; + +import java.util.Map; + +/** + *
+ *   自定义异常Attributes类
+ * 
+ * + * @author nicky + *
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2019年12月01日  修改内容:
+ * 
+ */ +@Component +public class CustomErrorAttributes extends DefaultErrorAttributes { + + //返回值的map就是页面和json能获取的所有字段 + @Override + public Map getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) { + //先将默认的Attributes封装到map + Map map = super.getErrorAttributes(requestAttributes, includeStackTrace); + map.put("company","company.com"); + //获取ExceptionHandler设置的Attributes,0表示从Request中拿 + Map ext = (Map) requestAttributes.getAttribute("extend",0); + map.put("extend",ext); + return map; + } + +} \ No newline at end of file diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomExceptionHandler.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomExceptionHandler.java new file mode 100644 index 0000000..8643de6 --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomExceptionHandler.java @@ -0,0 +1,48 @@ +package org.muses.jeeplatform.component; + +import org.muses.jeeplatform.exception.CustomException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; + +/** + *
+ *  自定义异常处理类
+ * 
+ * + * @author nicky + *
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2019年12月01日  修改内容:
+ * 
+ */ +//@RestControllerAdvice +@ControllerAdvice +public class CustomExceptionHandler { + +// @ExceptionHandler(NotFoundException.class) +// @ResponseBody +// //@ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR) +// @Deprecated +// public Map handleException(Exception e){ +// Map map = new HashMap<>(16); +// map.put("code", "404"); +// map.put("message", e.getMessage()); +// return map; +// } + + @ExceptionHandler({CustomException.class}) + public String handleException(Exception e, HttpServletRequest request){ + Map map = new HashMap<>(16); + map.put("code", "404"); + map.put("message", e.getMessage()); + request.setAttribute("javax.servlet.error.status_code",404); + request.setAttribute("extend",map); + return "forward:/error";//BasicErrorController的接口 + } + + +} diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CASConfig.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CASConfig.java new file mode 100644 index 0000000..d777822 --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CASConfig.java @@ -0,0 +1,88 @@ +package org.muses.jeeplatform.config; + +import net.unicon.cas.client.configuration.CasClientConfigurerAdapter; +import net.unicon.cas.client.configuration.EnableCasClient; +import org.jasig.cas.client.authentication.AuthenticationFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +import java.util.HashMap; +import java.util.Map; + +/** + *
+ *  TODO 接入CAS 单点登录
+ * 
+ * + * @author nicky + *
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020年04月11日  修改内容:
+ * 
+ */ +//@Configuration +//@EnableCasClient +//@EnableConfigurationProperties(CasConfigurationProperties.class) +public class CASConfig extends CasClientConfigurerAdapter { + +// @Autowired +// private CasConfigurationProperties casProperties; + + private static final String CAS_SERVER_URL_LOGIN = "http://127.0.0.1:8080/cas/login"; + private static final String SERVER_NAME = "http://127.0.0.1:8081/"; + + private static final String AUTHENTICATION_REDIRECT_STRATEGY_CLASS = "org.muses.jeeplatform.authentication.cas.CustomAuthticationRedirectStrategy"; + + + @Override + public void configureAuthenticationFilter(FilterRegistrationBean authenticationFilter) { + super.configureAuthenticationFilter(authenticationFilter); + authenticationFilter.getInitParameters().put("authenticationRedirectStrategyClass",AUTHENTICATION_REDIRECT_STRATEGY_CLASS); + } + + @Override + public void configureValidationFilter(FilterRegistrationBean validationFilter) { + Map initParameters = validationFilter.getInitParameters(); + initParameters.put("encodeServiceUrl", "false"); + } + + @Bean + public FilterRegistrationBean filterRegistrationBean(){ + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(new AuthenticationFilter()); + registrationBean.addUrlPatterns("/*"); + Map initParameters = new HashMap(4); + initParameters.put("casServerLoginUrl",CAS_SERVER_URL_LOGIN); + initParameters.put("serverName",SERVER_NAME); + initParameters.put("ignorePattern","/logoutSuccess/*"); + // 自定义重定向策略 + initParameters.put("authenticationRedirectStrategyClass", AUTHENTICATION_REDIRECT_STRATEGY_CLASS); + registrationBean.setInitParameters(initParameters); + registrationBean.setOrder(1); + return registrationBean; + } + + /*@Bean + public FilterRegistrationBean corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOrigin("*"); + config.addAllowedHeader("*"); + config.addAllowedMethod("*"); + source.registerCorsConfiguration("/**", config); + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(new CorsFilter(source)); + registrationBean.setOrder(1); + return registrationBean; + }*/ + + + +} diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CorsConfig.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CorsConfig.java new file mode 100644 index 0000000..e0d2d59 --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CorsConfig.java @@ -0,0 +1,28 @@ +package org.muses.jeeplatform.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; + +/** + * TODO SSO跨域支持 + * @Author mazq + * @Date 2020/04/28 14:55 + * @Param + * @return + */ +//@Configuration +public class CorsConfig extends WebMvcConfigurationSupport { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedHeaders("*") + .allowedMethods("*") + .maxAge(3600) + .allowCredentials(true); + } + + +} \ No newline at end of file diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/DefaultView.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/DefaultView.java new file mode 100644 index 0000000..0ff2b1f --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/DefaultView.java @@ -0,0 +1,27 @@ +package org.muses.jeeplatform.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/28 13:29  修改内容:
+ * 
+ */ +//@Configuration +public class DefaultView extends WebMvcConfigurerAdapter { + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + registry.setOrder(Ordered.HIGHEST_PRECEDENCE); + super.addViewControllers(registry); + } +} diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/Constants.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CommonConsts.java similarity index 97% rename from code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/Constants.java rename to code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CommonConsts.java index 31127d7..7c75fe8 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/Constants.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CommonConsts.java @@ -7,7 +7,7 @@ * @author Nicky * @date 2017年3月6日 */ -public class Constants { +public class CommonConsts { //定义统一Locale.CHINA,程序中所有和Locale相关操作均默认使用此Locale public static final Locale LOCALE_CHINA = Locale.CHINA; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/shiro/ShiroRealm.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/shiro/ShiroRealm.java index 6dfda18..a9a918d 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/shiro/ShiroRealm.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/shiro/ShiroRealm.java @@ -20,6 +20,7 @@ * @author Nicky * @date 2017年3月12日 */ +//登录机制代码搬到单点登录工程实现 public class ShiroRealm extends AuthorizingRealm { /**注解引入业务类**/ diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/exception/CustomException.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/exception/CustomException.java new file mode 100644 index 0000000..909f51b --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/exception/CustomException.java @@ -0,0 +1,30 @@ +package org.muses.jeeplatform.exception; + +/** + *
+ *  自定义异常类
+ * 
+ * + * @author nicky + *
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2019年12月01日  修改内容:
+ * 
+ */ +public class CustomException extends RuntimeException{ + + private Integer code;//自定义异常码 + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public CustomException(String message, Integer code) { + super(message);// 父类的构造函数;调用底层的Throwable的构造函数,将参数message赋值到detailMessage (Throwable的属性) + this.code = code;//赋值code码 + } +} diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/util/DateUtils.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/util/DateUtils.java index d945df3..fad42c8 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/util/DateUtils.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/util/DateUtils.java @@ -2,7 +2,7 @@ -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -40,7 +40,7 @@ public static String formatDate(Date date,String format){ * @return */ public static Date parse(String pattern, String date){ - return parse(pattern, date, Constants.LOCALE_CHINA); + return parse(pattern, date, CommonConsts.LOCALE_CHINA); } /** diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/CodeController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/CodeController.java index ffbf2bb..71e299f 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/CodeController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/CodeController.java @@ -3,7 +3,7 @@ import org.apache.shiro.SecurityUtils; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -30,7 +30,7 @@ public void generate(HttpServletResponse response){ Subject currentUser = SecurityUtils.getSubject(); Session session = currentUser.getSession(); - session.setAttribute(Constants.SESSION_SECURITY_CODE, code); + session.setAttribute(CommonConsts.SESSION_SECURITY_CODE, code); try { ServletOutputStream out = response.getOutputStream(); diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/LoginController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/LoginController.java index a6022d6..1079f37 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/LoginController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/LoginController.java @@ -8,7 +8,7 @@ import org.apache.shiro.crypto.hash.SimpleHash; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.ResultVO; import org.muses.jeeplatform.core.entity.admin.Menu; import org.muses.jeeplatform.core.entity.admin.Permission; @@ -95,7 +95,7 @@ public ResultVO loginCheck(HttpServletRequest request)throws AuthenticationExcep //获取Shiro管理的Session Subject subject = SecurityUtils.getSubject(); Session session = subject.getSession(); - String codeSession = (String)session.getAttribute(Constants.SESSION_SECURITY_CODE); + String codeSession = (String)session.getAttribute(CommonConsts.SESSION_SECURITY_CODE); String code = logindata[2]; /**检测页面验证码是否为空,调用工具类检测**/ if(Tools.isEmpty(code)){ @@ -116,9 +116,9 @@ public ResultVO loginCheck(HttpServletRequest request)throws AuthenticationExcep }else{ //Shiro添加会话 session.setAttribute("username", username); - session.setAttribute(Constants.SESSION_USER, user); + session.setAttribute(CommonConsts.SESSION_USER, user); //删除验证码Session - session.removeAttribute(Constants.SESSION_SECURITY_CODE); + session.removeAttribute(CommonConsts.SESSION_SECURITY_CODE); //保存登录IP this.getRemortIP(username); /**Shiro加入身份验证**/ @@ -153,7 +153,7 @@ public ModelAndView toMain() throws AuthenticationException{ /**获取Shiro管理的Session**/ Subject subject = SecurityUtils.getSubject(); Session session = subject.getSession(); - User user = (User)session.getAttribute(Constants.SESSION_USER); + User user = (User)session.getAttribute(CommonConsts.SESSION_USER); if(user != null){ Set roles = user.getRoles(); @@ -218,8 +218,8 @@ public ModelAndView logout(){ /**Shiro管理Session**/ Subject sub = SecurityUtils.getSubject(); Session session = sub.getSession(); - session.removeAttribute(Constants.SESSION_USER); - session.removeAttribute(Constants.SESSION_SECURITY_CODE); + session.removeAttribute(CommonConsts.SESSION_USER); + session.removeAttribute(CommonConsts.SESSION_SECURITY_CODE); /**Shiro销毁登录**/ Subject subject = SecurityUtils.getSubject(); subject.logout(); @@ -228,5 +228,11 @@ public ModelAndView logout(){ return mv; } + @RequestMapping("/403") + public ModelAndView to403PAge(){ + ModelAndView mv = this.getModelAndView(); + mv.setViewName("admin/frame/403"); + return mv; + } } diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/MenuController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/MenuController.java index 291c42c..cc39189 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/MenuController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/MenuController.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSON; import org.muses.jeeplatform.annotation.LogController; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.entity.admin.Menu; import org.muses.jeeplatform.core.entity.admin.Permission; import org.muses.jeeplatform.service.MenuService; @@ -39,7 +39,7 @@ public class MenuController extends BaseController { public ModelAndView toMenuList(HttpServletRequest request, HttpServletResponse response, Model model) throws IOException { String pageIndexStr = request.getParameter("pageIndex"); - int pageSize = Constants.PAGE_SIZE; + int pageSize = CommonConsts.PAGE_SIZE; ModelAndView mv = this.getModelAndView(); Page menuPage; @@ -72,7 +72,7 @@ public String doLoadData(HttpServletRequest request, Model model) throws IOExcep pageIndex = 1; } - int pageSize = Constants.PAGE_SIZE; + int pageSize = CommonConsts.PAGE_SIZE; Page menuPage = menuService.findAll(pageIndex, pageSize, Sort.Direction.ASC,"menuId"); String json = JSON.toJSONString(menuPage.getContent()); return json; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/PermissionController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/PermissionController.java index 8add10b..2dbb3eb 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/PermissionController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/PermissionController.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSON; import org.muses.jeeplatform.annotation.LogController; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.entity.admin.Permission; import org.muses.jeeplatform.service.PermissionPageService; import org.muses.jeeplatform.service.PermissionService; @@ -43,7 +43,7 @@ public class PermissionController extends BaseController { public ModelAndView queryAll(HttpServletRequest request, HttpServletResponse response, Model model){ String pageIndexStr = request.getParameter("pageIndex"); - int pageSize = Constants.PAGE_SIZE; + int pageSize = CommonConsts.PAGE_SIZE; ModelAndView mv = this.getModelAndView(); Page permissionPage; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/RoleController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/RoleController.java index 18476d3..7180ba9 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/RoleController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/RoleController.java @@ -1,8 +1,7 @@ package org.muses.jeeplatform.web.controller; import com.alibaba.fastjson.JSON; -import org.apache.commons.lang.StringUtils; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.entity.admin.Menu; import org.muses.jeeplatform.core.entity.admin.Permission; import org.muses.jeeplatform.core.entity.admin.Role; @@ -14,6 +13,7 @@ import org.springframework.data.domain.Sort; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; @@ -51,7 +51,7 @@ public class RoleController extends BaseController { public ModelAndView queryAll(HttpServletRequest request, HttpServletResponse response, Model model){ String pageIndexStr = request.getParameter("pageIndex"); - int pageSize = Constants.PAGE_SIZE; + int pageSize = CommonConsts.PAGE_SIZE; ModelAndView mv = this.getModelAndView(); Page rolePage; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/UserController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/UserController.java index b3c9ecc..2a689eb 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/UserController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/UserController.java @@ -1,12 +1,16 @@ package org.muses.jeeplatform.web.controller; import com.alibaba.fastjson.JSON; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; import org.apache.shiro.crypto.hash.SimpleHash; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.email.JavaEmailSender; import org.muses.jeeplatform.core.entity.admin.Role; import org.muses.jeeplatform.core.entity.admin.User; -import org.muses.jeeplatform.core.entity.admin.dto.RoleVO; +import org.muses.jeeplatform.core.dto.admin.RoleVO; import org.muses.jeeplatform.core.excel.ExcelViewWrite; import org.muses.jeeplatform.service.RolePageService; import org.muses.jeeplatform.service.RoleService; @@ -28,6 +32,7 @@ /** * Created by Nicky on 2017/7/29. */ +@Api(value="用户操作接口",tags={"用户操作接口"}) @RequestMapping("/user") @Controller public class UserController extends BaseController { @@ -48,11 +53,12 @@ public class UserController extends BaseController { * @param model * @return */ + @ApiOperation(value="用户信息列表", notes="用户信息列表") @RequestMapping(value = "/queryAll", produces = "application/json;charset=UTF-8") public ModelAndView findAll(HttpServletRequest request, HttpServletResponse response, Model model) { String pageIndexStr = request.getParameter("pageIndex"); - int pageSize = Constants.PAGE_SIZE; + int pageSize = CommonConsts.PAGE_SIZE; ModelAndView mv = this.getModelAndView(); Page userPage; @@ -87,10 +93,11 @@ public ModelAndView findAll(HttpServletRequest request, HttpServletResponse resp * @param endDateStr * @return */ + @ApiOperation(value = "查询用户信息", notes = "查询用户信息") @RequestMapping(value = "/searchU", produces = "application/json;charset=UTf-8") - public ModelAndView doSearch(@RequestParam(value = "pageIndex",required = false) String pageIndexStr, @RequestParam(value = "keyword",required = false) String keyword, + public ModelAndView doSearch(@RequestParam(value = "pageIndex",required = true) String pageIndexStr, @RequestParam(value = "keyword",required = false) String keyword, @RequestParam(value = "startDate",required = false) String startDateStr, @RequestParam(value = "endDate",required = false) String endDateStr) { - int pageSize = Constants.PAGE_SIZE; + int pageSize = CommonConsts.PAGE_SIZE; ModelAndView mv = this.getModelAndView(); Page userPage; @@ -140,6 +147,10 @@ public String goAddU() { * * @param params */ + @ApiOperation(value = "新增用户",notes = "新增用户") + @ApiImplicitParams({ + @ApiImplicitParam(name="params",value = "json参数",paramType = "query",dataType = "String") + }) @PostMapping(value = "/addU") @ResponseBody public Map addU(@RequestParam("params") String params) { @@ -183,6 +194,10 @@ public Map addU(@RequestParam("params") String params) { return result; } + @ApiOperation(value = "跳转到编辑用户信息页面",notes = "编辑用户信息页面") + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId",paramType = "query",dataType = "String") + }) @GetMapping(value = "/goEditU") public String goEditU(@RequestParam("userId")String userId, Model model) { User user = userService.findByUId(Integer.parseInt(userId)); @@ -278,6 +293,7 @@ public String goAuthorise(@RequestParam("userId")String userId, Model model){ return "admin/user/sys_user_auth"; } + @ApiOperation(value="修改用户", notes="修改用户") @PostMapping(value = "/auth",produces = "application/json;charset=utf-8") @ResponseBody public Map doAuth(@RequestParam("params")String params ){ diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/filter/SysAccessControllerFilter.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/filter/SysAccessControllerFilter.java index 1203bcd..a238ad8 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/filter/SysAccessControllerFilter.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/filter/SysAccessControllerFilter.java @@ -22,6 +22,13 @@ import java.util.LinkedList; import java.util.Map; +/** + * TODO 功能还没实现 + * @Author mazq + * @Date 2020/04/26 17:17 + * @Param + * @return + */ public class SysAccessControllerFilter extends AccessControlFilter{ private String url;//被提出后,重定向的url diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/interceptor/LoginInterceptor.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/interceptor/LoginInterceptor.java index 6b378e8..1985374 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/interceptor/LoginInterceptor.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/interceptor/LoginInterceptor.java @@ -3,7 +3,7 @@ import org.apache.shiro.SecurityUtils; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.entity.admin.User; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; @@ -22,19 +22,19 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String urlpath = request.getServletPath(); /**正则表达式过滤,不匹配该值的就拦截处理**/ - if(urlpath.matches(Constants.REGEXP_PATH)){ + if(urlpath.matches(CommonConsts.REGEXP_PATH)){ return true; }else { //shiro框架的会话管理,获取Session,校验用户是否通过登录验证 Subject subject = SecurityUtils.getSubject(); Session session = subject.getSession(); - User user = (User)session.getAttribute(Constants.SESSION_USER); + User user = (User)session.getAttribute(CommonConsts.SESSION_USER); if(user != null){ /**加入权限校验,待开发...**/ return true; }else{ //重定向到登录页面 - response.sendRedirect(request.getContextPath() + Constants.URL_LOGIN); + response.sendRedirect(request.getContextPath() + CommonConsts.URL_LOGIN); return false; } } diff --git a/code/jeeplatform-admin/src/main/resources/application-dev.yml b/code/jeeplatform-admin/src/main/resources/application-dev.yml index 2223642..30d2464 100644 --- a/code/jeeplatform-admin/src/main/resources/application-dev.yml +++ b/code/jeeplatform-admin/src/main/resources/application-dev.yml @@ -1,5 +1,7 @@ server: - port: 8080 + port: 8081 + error: + path: /error spring: @@ -67,6 +69,15 @@ spring: maxTotal : 100 maxIdle : 10 maxWaitMillis : 100000 +#cas: +# server-login-url: http://127.0.0.1:8080/cas/login +# server-url-prefix: http://127.0.0.1:8080/cas +# client-host-url: http://127.0.0.1:8081 +# validation-type: cas +# authentication-url-patterns: /auth +# use-session: true + + diff --git a/code/jeeplatform-admin/src/main/resources/application-prod.yml b/code/jeeplatform-admin/src/main/resources/application-prod.yml index 2223642..baa3dc7 100644 --- a/code/jeeplatform-admin/src/main/resources/application-prod.yml +++ b/code/jeeplatform-admin/src/main/resources/application-prod.yml @@ -69,6 +69,11 @@ spring: maxWaitMillis : 100000 - +cas: + server-login-url: http://127.0.0.1:8080/cas/login + server-url-prefix: http://127.0.0.1:8080/cas + client-host-url: http://127.0.0.1:8081 + validation-type: cas +# use-session: true diff --git a/code/jeeplatform-admin/src/main/resources/application-test.yml b/code/jeeplatform-admin/src/main/resources/application-test.yml index d6dd45b..38502d2 100644 --- a/code/jeeplatform-admin/src/main/resources/application-test.yml +++ b/code/jeeplatform-admin/src/main/resources/application-test.yml @@ -68,7 +68,9 @@ spring: maxIdle : 10 maxWaitMillis : 100000 - - - - +cas: + server-login-url: http://127.0.0.1:8080/cas/login + server-url-prefix: http://127.0.0.1:8080/cas + client-host-url: http://127.0.0.1:8081 + validation-type: cas +# use-session: true diff --git a/code/jeeplatform-admin/src/main/resources/i18n/i18n.properties b/code/jeeplatform-admin/src/main/resources/i18n/i18n.properties new file mode 100644 index 0000000..66a8e1f --- /dev/null +++ b/code/jeeplatform-admin/src/main/resources/i18n/i18n.properties @@ -0,0 +1,3 @@ +login.loginBtnName=登录 +login.password=密码 +login.username=用户名 \ No newline at end of file diff --git a/code/jeeplatform-admin/src/main/resources/i18n/i18n_en_US.properties b/code/jeeplatform-admin/src/main/resources/i18n/i18n_en_US.properties new file mode 100644 index 0000000..2c67923 --- /dev/null +++ b/code/jeeplatform-admin/src/main/resources/i18n/i18n_en_US.properties @@ -0,0 +1,3 @@ +login.loginBtnName=login +login.password=password +login.username=userName \ No newline at end of file diff --git a/code/jeeplatform-admin/src/main/resources/i18n/i18n_zh_CN.properties b/code/jeeplatform-admin/src/main/resources/i18n/i18n_zh_CN.properties new file mode 100644 index 0000000..66a8e1f --- /dev/null +++ b/code/jeeplatform-admin/src/main/resources/i18n/i18n_zh_CN.properties @@ -0,0 +1,3 @@ +login.loginBtnName=登录 +login.password=密码 +login.username=用户名 \ No newline at end of file diff --git a/code/jeeplatform-admin/src/main/resources/user.properties b/code/jeeplatform-admin/src/main/resources/user.properties new file mode 100644 index 0000000..51722ee --- /dev/null +++ b/code/jeeplatform-admin/src/main/resources/user.properties @@ -0,0 +1,9 @@ +user.userName= root +user.isAdmin= true +user.regTime= 2019/11/01 +user.isOnline= 1 +user.maps.k1=v1 +user.maps.k2=v2 +user.lists=list1,list2 +user.address.tel= 15899988899 +user.address.name=上海浦东区 \ No newline at end of file diff --git a/code/jeeplatform-admin/src/main/webapp/WEB-INF/jsp/admin/frame/403.jsp b/code/jeeplatform-admin/src/main/webapp/WEB-INF/jsp/admin/frame/403.jsp new file mode 100644 index 0000000..5016486 --- /dev/null +++ b/code/jeeplatform-admin/src/main/webapp/WEB-INF/jsp/admin/frame/403.jsp @@ -0,0 +1,36 @@ +<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<% + String path = request.getContextPath(); + String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; +%> + + + + + + + + 403无权访问 + + + + +
+

403 why

+

非常抱歉...

+

您访问的页面无权访问

+

您可以 返回登录页

+
+ + \ No newline at end of file diff --git a/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml b/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml index a6f9b49..4a450b6 100644 --- a/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml +++ b/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml @@ -1,112 +1,173 @@ - - - + + + Archetype Created Web Application - - - + - - - - - - - - + - - - - - - - - - - - - - - - + + encodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + utf-8 + + + forceEncoding + true <!– 配置forceEncoding为true,请求和响应的数据的字符集均使用当前配置的字符集–> + + + + encodingFilter + /* + - - - - - - - - - - - + <!– 添加SSI(服务端页面包含技术)配置 start –> + + ssi + org.apache.catalina.ssi.SSIServlet + + + ssi + *.shtml + + <!– 添加SSI(服务端页面包含技术)配置 end –> - - - - - - - - - - - - - - - - - - - - - - + <!– 连接池 启用Web监控统计功能 start–> + + DruidWebStatFilter + com.alibaba.druid.support.http.WebStatFilter + + exclusions + *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/* + + + + DruidWebStatFilter + /* + + + DruidStatView + com.alibaba.druid.support.http.StatViewServlet + + + DruidStatView + /druid/* + + <!– 连接池 启用Web监控统计功能 end–> - - - - - - + + org.springframework.web.util.Log4jConfigListener + + + org.springframework.web.context.ContextLoaderListener + - - - - - - - - - - - - - + + springMvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:spring/spring-mvc.xml + + 1 + + + springMvc + / + - - - - - - - - - - - - - - - - + <!– Shiro过滤器配置 start –> + + shiroFilter + + org.springframework.web.filter.DelegatingFilterProxy + + + targetFilterLifecycle + true + + + + shiroFilter + /* + + <!– Shiro过滤器配置 end –> - - - + + 600 + --> - + + + diff --git a/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/SpringBootTest.java b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/SpringBootTest.java new file mode 100644 index 0000000..586814d --- /dev/null +++ b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/SpringBootTest.java @@ -0,0 +1,21 @@ +package org.muses.jeeplatform; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.muses.jeeplatform.bean.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@org.springframework.boot.test.context.SpringBootTest +public class SpringBootTest { + + @Autowired + User user; + + @Test + public void testConfigurationProperties(){ + System.out.println(user); + } + +} diff --git a/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/Address.java b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/Address.java new file mode 100644 index 0000000..7db481e --- /dev/null +++ b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/Address.java @@ -0,0 +1,41 @@ +package org.muses.jeeplatform.bean; + +/** + *
+ *
+ * 
+ * + * @author nicky + *
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2019年11月03日  修改内容:
+ * 
+ */ +public class Address { + private String tel; + private String name; + + @Override + public String toString() { + return "Address{" + + "tel='" + tel + '\'' + + ", name='" + name + '\'' + + '}'; + } + + public String getTel() { + return tel; + } + + public void setTel(String tel) { + this.tel = tel; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java new file mode 100644 index 0000000..4af6973 --- /dev/null +++ b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java @@ -0,0 +1,103 @@ +package org.muses.jeeplatform.bean; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + *
+ *
+ * 
+ * + * @author nicky + *
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2019年11月03日  修改内容:
+ * 
+ */ +@Component +@PropertySource(value = "classpath:user.properties",encoding = "utf-8") +@ConfigurationProperties(prefix = "user") +public class User { + + private String userName; + private boolean isAdmin; + private Date regTime; + private Long isOnline; + private Map maps; + private List lists; + private Address address; + + @Override + public String toString() { + return "User{" + + "userName='" + userName + '\'' + + ", isAdmin=" + isAdmin + + ", regTime=" + regTime + + ", isOnline=" + isOnline + + ", maps=" + maps + + ", lists=" + lists + + ", address=" + address + + '}'; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public boolean isAdmin() { + return isAdmin; + } + + public void setAdmin(boolean admin) { + isAdmin = admin; + } + + public Date getRegTime() { + return regTime; + } + + public void setRegTime(Date regTime) { + this.regTime = regTime; + } + + public Long getIsOnline() { + return isOnline; + } + + public void setIsOnline(Long isOnline) { + this.isOnline = isOnline; + } + + public Map getMaps() { + return maps; + } + + public void setMaps(Map maps) { + this.maps = maps; + } + + public List getLists() { + return lists; + } + + public void setLists(List lists) { + this.lists = lists; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } +} diff --git a/code/jeeplatform-cms/.gitignore b/code/jeeplatform-cms/.gitignore new file mode 100644 index 0000000..a2a3040 --- /dev/null +++ b/code/jeeplatform-cms/.gitignore @@ -0,0 +1,31 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ diff --git a/code/jeeplatform-cms/mvnw b/code/jeeplatform-cms/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/code/jeeplatform-cms/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/code/jeeplatform-cms/pom.xml b/code/jeeplatform-cms/pom.xml new file mode 100644 index 0000000..29110a2 --- /dev/null +++ b/code/jeeplatform-cms/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.1.RELEASE + + + org.muses.jeeplatform.cms + jeeplatform-cms + 0.0.1-SNAPSHOT + jeeplatform-cms + Demo project for Spring Boot + + + 1.8 + Hoxton.SR3 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + org.springframework.cloud + spring-cloud-starter-security + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/JeeplatformCmsApplication.java b/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/JeeplatformCmsApplication.java new file mode 100644 index 0000000..28a9019 --- /dev/null +++ b/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/JeeplatformCmsApplication.java @@ -0,0 +1,17 @@ +package org.muses.jeeplatform.cms; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; +import org.springframework.context.annotation.Scope; +import org.springframework.web.context.WebApplicationContext; + +@SpringBootApplication +//@Scope(value = WebApplicationContext.SCOPE_SESSION) +public class JeeplatformCmsApplication { + + public static void main(String[] args) { + SpringApplication.run(JeeplatformCmsApplication.class, args); + } + +} diff --git a/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/config/SecurityConfiguration.java b/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/config/SecurityConfiguration.java new file mode 100644 index 0000000..ab13052 --- /dev/null +++ b/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/config/SecurityConfiguration.java @@ -0,0 +1,45 @@ +package org.muses.jeeplatform.cms.config; + +import org.muses.jeeplatform.cms.util.EnvironmentUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/05/07 16:08  修改内容:
+ * 
+ */ +@Configuration +@EnableOAuth2Sso +//@EnableResourceServer +@EnableGlobalMethodSecurity(securedEnabled = true) +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + + @Autowired + private EnvironmentUtils environmentUtils; + + @Override + protected void configure(HttpSecurity http) throws Exception { + if ("local".equals(environmentUtils.getActiveProfile())) { + http.authorizeRequests().anyRequest().permitAll(); + }else { + http.logout().logoutSuccessUrl("http://localhost:8888/logout") + .and() + .authorizeRequests() + .anyRequest().authenticated() + .and() + .csrf().disable(); + } + } +} diff --git a/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/controller/HelloController.java b/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/controller/HelloController.java new file mode 100644 index 0000000..83b00f7 --- /dev/null +++ b/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/controller/HelloController.java @@ -0,0 +1,35 @@ +package org.muses.jeeplatform.cms.controller; + +import org.springframework.security.access.annotation.Secured; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/05/07 16:55  修改内容:
+ * 
+ */ +@RestController +public class HelloController { + + @GetMapping("/getCurrentUser") + public Object getCurrentUser(Authentication authentication) { + return authentication; + } + + @GetMapping("/index") + public String index() { + return "index"; + } +} \ No newline at end of file diff --git a/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/controller/IndexController.java b/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/controller/IndexController.java new file mode 100644 index 0000000..eff64a2 --- /dev/null +++ b/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/controller/IndexController.java @@ -0,0 +1,28 @@ +package org.muses.jeeplatform.cms.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/05/09 18:03  修改内容:
+ * 
+ */ +@RestController +public class IndexController { + @Autowired + private HelloController helloController; + + @GetMapping("/") + public Object index(Authentication authentication) { + return helloController.getCurrentUser(authentication); + } +} diff --git a/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/util/EnvironmentUtils.java b/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/util/EnvironmentUtils.java new file mode 100644 index 0000000..766c64c --- /dev/null +++ b/code/jeeplatform-cms/src/main/java/org/muses/jeeplatform/cms/util/EnvironmentUtils.java @@ -0,0 +1,28 @@ +package org.muses.jeeplatform.cms.util; + +import org.springframework.context.EnvironmentAware; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * copy + * @ https://github.com/chengjiansheng/cjs-oauth2-sso-demo/blob/master/oauth2-sso-client-member/src/main/java/com/cjs/example/util/EnvironmentUtils.java + * @Date 2020/05/11 11:47 + */ +@Component +public class EnvironmentUtils implements EnvironmentAware { + + private Environment environment; + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + + public String getActiveProfile() { + if (environment.getActiveProfiles().length > 0) { + return environment.getActiveProfiles()[0]; + } + return environment.getDefaultProfiles()[0]; + } +} \ No newline at end of file diff --git a/code/jeeplatform-cms/src/main/resources/application.properties b/code/jeeplatform-cms/src/main/resources/application.properties new file mode 100644 index 0000000..d4a6260 --- /dev/null +++ b/code/jeeplatform-cms/src/main/resources/application.properties @@ -0,0 +1,17 @@ +security.oauth2.client.client-secret=secret +security.oauth2.client.client-id=cms +security.oauth2.client.scope=all +security.oauth2.client.user-authorization-uri=http://localhost:8888/oauth/authorize +security.oauth2.client.access-token-uri=http://localhost:8888/oauth/token +security.oauth2.resource.user-info-uri=http://localhost:8888/user +security.oauth2.client.use-current-uri=false +security.oauth2.client.pre-established-redirect-uri=http://localhost:8084/cms/login +security.oauth2.resource.token-info-uri= http://localhost:8888/oauth/check_token +security.oauth2.resource.jwt.key-uri=http://localhost:8888/oauth/token_key +security.oauth2.authorization.check-token-access= http://localhost:8888/oauth/check_token + +server.port=8084 +server.servlet.context-path=/cms + +# 预防cookie冲突,设置cookie name +server.servlet.session.cookie.name=OAUTH2-CLIENT-SESSIONID diff --git a/code/jeeplatform-cms/src/test/java/org/muses/jeeplatform/cms/JeeplatformCmsApplicationTests.java b/code/jeeplatform-cms/src/test/java/org/muses/jeeplatform/cms/JeeplatformCmsApplicationTests.java new file mode 100644 index 0000000..14402fe --- /dev/null +++ b/code/jeeplatform-cms/src/test/java/org/muses/jeeplatform/cms/JeeplatformCmsApplicationTests.java @@ -0,0 +1,13 @@ +package org.muses.jeeplatform.cms; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class JeeplatformCmsApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/code/jeeplatform-common/pom.xml b/code/jeeplatform-common/pom.xml index f3df0fe..8e21368 100644 --- a/code/jeeplatform-common/pom.xml +++ b/code/jeeplatform-common/pom.xml @@ -16,4 +16,12 @@ jeeplatform-common + + + + org.springframework.boot + spring-boot-starter-data-redis + ${spring-boot.version} + + diff --git a/code/jeeplatform-core/pom.xml b/code/jeeplatform-core/pom.xml deleted file mode 100755 index ad6b46d..0000000 --- a/code/jeeplatform-core/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - 4.0.0 - - org.muses.jeeplatform - jeeplatform - 1.0-SNAPSHOT - - jeeplatform-core - jeeplatform-core - ${jeeplatform-core.version} - jar - - - - UTF-8 - - - - - com.aliyun.oss - aliyun-sdk-oss - ${oss.version} - - - org.jdom - jdom - - - net.sf.json-lib - json-lib - - - - - - diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/web/demoController.java b/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/web/demoController.java deleted file mode 100644 index 736f563..0000000 --- a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/web/demoController.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.muses.jeeplatform.core.web; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -/** - * @author caiyuyu - * @date 2017/10/26 - */ -//@RestController -public class demoController { - @RequestMapping("/") - public ModelAndView login(){ - ModelAndView mv = new ModelAndView("base"); - return mv; - } -} diff --git a/code/jeeplatform-oa/pom.xml b/code/jeeplatform-oa/pom.xml new file mode 100644 index 0000000..e0134f7 --- /dev/null +++ b/code/jeeplatform-oa/pom.xml @@ -0,0 +1,42 @@ + + + + jeeplatform + org.muses.jeeplatform + 1.0-SNAPSHOT + + 4.0.0 + + jeeplatform-oa + jeeplatform-oa + jar + ${jeeplatform-oa.version} + + + jeeplatform-oa + + + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + net.unicon.cas + cas-client-autoconfig-support + 1.5.0-GA + + + + + \ No newline at end of file diff --git a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/OAApplication.java b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/OAApplication.java new file mode 100644 index 0000000..be5bb08 --- /dev/null +++ b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/OAApplication.java @@ -0,0 +1,22 @@ +package org.muses.jeeplatform.oa; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +public class OAApplication { + + public static void main(String[] args) { + SpringApplication.run(OAApplication.class, args); + } + + @GetMapping("/test") + public String test(){ + return "hello world!"; + } + + +} diff --git a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/cas/CustomAuthticationRedirectStrategy.java b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/cas/CustomAuthticationRedirectStrategy.java new file mode 100644 index 0000000..e11ca43 --- /dev/null +++ b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/cas/CustomAuthticationRedirectStrategy.java @@ -0,0 +1,31 @@ +package org.muses.jeeplatform.oa.cas; + +import org.jasig.cas.client.authentication.AuthenticationRedirectStrategy; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/27 13:37  修改内容:
+ * 
+ */ +public class CustomAuthticationRedirectStrategy implements AuthenticationRedirectStrategy { + + @Override + public void redirect(HttpServletRequest request, HttpServletResponse response, String potentialRedirectUrl) throws IOException { +// response.setCharacterEncoding("utf-8"); +// response.setContentType("application/json; charset=utf-8"); +// PrintWriter out = response.getWriter(); +// out.write("401"); + //response重定向 + response.sendRedirect(potentialRedirectUrl); + } +} diff --git a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/CASConfig.java b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/CASConfig.java new file mode 100644 index 0000000..3b32fcb --- /dev/null +++ b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/CASConfig.java @@ -0,0 +1,63 @@ +package org.muses.jeeplatform.oa.config; + +import net.unicon.cas.client.configuration.CasClientConfigurerAdapter; +import net.unicon.cas.client.configuration.EnableCasClient; +import org.jasig.cas.client.authentication.AuthenticationFilter; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.HashMap; +import java.util.Map; + +/** + *
+ *
+ * 
+ * + * @author nicky + *
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020年04月11日  修改内容:
+ * 
+ */ +@Configuration +@EnableCasClient +public class CASConfig extends CasClientConfigurerAdapter { + + + private static final String CAS_SERVER_URL_LOGIN = "http://127.0.0.1:8080/cas/login"; + private static final String SERVER_NAME = "http://127.0.0.1:8082/"; + + private static final String AUTHENTICATION_REDIRECT_STRATEGY_CLASS = "org.muses.jeeplatform.oa.cas.CustomAuthticationRedirectStrategy"; + + @Override + public void configureAuthenticationFilter(FilterRegistrationBean authenticationFilter) { + super.configureAuthenticationFilter(authenticationFilter); + authenticationFilter.getInitParameters().put("authenticationRedirectStrategyClass",AUTHENTICATION_REDIRECT_STRATEGY_CLASS); + } + + @Override + public void configureValidationFilter(FilterRegistrationBean validationFilter) { + Map initParameters = validationFilter.getInitParameters(); + initParameters.put("encodeServiceUrl", "false"); + } + + @Bean + public FilterRegistrationBean filterRegistrationBean(){ + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(new AuthenticationFilter()); + registrationBean.addUrlPatterns("/*"); + Map initParameters = new HashMap(4); + initParameters.put("casServerLoginUrl",CAS_SERVER_URL_LOGIN); + initParameters.put("serverName",SERVER_NAME); + initParameters.put("ignorePattern","/logoutSuccess/*"); + // 自定义重定向策略 + initParameters.put("authenticationRedirectStrategyClass", AUTHENTICATION_REDIRECT_STRATEGY_CLASS); + registrationBean.setInitParameters(initParameters); + registrationBean.setOrder(1); + return registrationBean; + } + + +} diff --git a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/DefaultView.java b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/DefaultView.java new file mode 100644 index 0000000..84acb8f --- /dev/null +++ b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/DefaultView.java @@ -0,0 +1,27 @@ +package org.muses.jeeplatform.oa.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/28 13:29  修改内容:
+ * 
+ */ +//@Configuration +public class DefaultView extends WebMvcConfigurerAdapter { + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + registry.setOrder(Ordered.HIGHEST_PRECEDENCE); + super.addViewControllers(registry); + } +} diff --git a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/web/controller/OAIndexController.java b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/web/controller/OAIndexController.java new file mode 100644 index 0000000..b81fe75 --- /dev/null +++ b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/web/controller/OAIndexController.java @@ -0,0 +1,27 @@ +package org.muses.jeeplatform.oa.web.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +/** + *
+ *
+ * 
+ * + * @author nicky + *
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020年04月11日  修改内容:
+ * 
+ */ +@Controller +public class OAIndexController { + + @GetMapping(value = {"/"}) + public ModelAndView toIndexPage(){ + return new ModelAndView("index"); + } + +} diff --git a/code/jeeplatform-oa/src/main/resources/application.yml b/code/jeeplatform-oa/src/main/resources/application.yml new file mode 100644 index 0000000..b04f158 --- /dev/null +++ b/code/jeeplatform-oa/src/main/resources/application.yml @@ -0,0 +1,26 @@ +server: + context-path: /oa + port: 8082 + error: + path: /error +spring: + #添加Thymeleaf配置,除了cache在项目没上线前建议关了,其它配置都可以不用配的,本博客只是列举一下有这些配置 + thymeleaf: + # cache默认开启的,这里可以关了,项目上线之前,项目上线后可以开启 + cache: false + # 这个prefix可以注释,因为默认就是templates的,您可以改成其它的自定义路径 + prefix: classpath:/templates/ + suffix: .html + mode: HTML5 + # 指定一下编码为utf8 + encoding: UTF-8 + # context-type为text/html,也可以不指定,因为boot可以自动识别 + content-type: text/html + + +cas: + server-login-url: http://127.0.0.1:8080/cas/login + server-url-prefix: http://127.0.0.1:8080/cas + client-host-url: http://127.0.0.1:8082 + + diff --git a/code/jeeplatform-oa/src/main/resources/templates/index.html b/code/jeeplatform-oa/src/main/resources/templates/index.html new file mode 100644 index 0000000..de51525 --- /dev/null +++ b/code/jeeplatform-oa/src/main/resources/templates/index.html @@ -0,0 +1,13 @@ + + + + 首页 + + + + + + +hi + + \ No newline at end of file diff --git a/code/jeeplatform-core/.gitignore b/code/jeeplatform-provider-api/.gitignore similarity index 100% rename from code/jeeplatform-core/.gitignore rename to code/jeeplatform-provider-api/.gitignore diff --git a/code/jeeplatform-provider-api/pom.xml b/code/jeeplatform-provider-api/pom.xml new file mode 100644 index 0000000..8fd6885 --- /dev/null +++ b/code/jeeplatform-provider-api/pom.xml @@ -0,0 +1,68 @@ + + 4.0.0 + + org.muses.jeeplatform + jeeplatform + 1.0-SNAPSHOT + + jeeplatform-provider-api + jeeplatform-provider-api + ${jeeplatform-provider-api.version} + jar + + + + UTF-8 + + + + + com.aliyun.oss + aliyun-sdk-oss + ${oss.version} + + + org.jdom + jdom + + + net.sf.json-lib + json-lib + + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis-spring-boot.version} + + + + tk.mybatis + mapper + ${tk.mybatis.mapper.version} + + + javax.persistence + persistence-api + + + + + com.github.pagehelper + pagehelper + ${github.pagehelper.version} + + + + org.springframework.boot + spring-boot-starter-data-jpa + ${spring-boot.version} + + + + + diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuTreeRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuTreeRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuTreeRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuTreeRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionPageRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionPageRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionPageRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionPageRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePageRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePageRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePageRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePageRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePermissionRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePermissionRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePermissionRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePermissionRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RoleRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RoleRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RoleRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RoleRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRoleRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRoleRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRoleRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRoleRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/RoleVO.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/RoleVO.java similarity index 94% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/RoleVO.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/RoleVO.java index 567b48a..ca318a0 100644 --- a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/RoleVO.java +++ b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/RoleVO.java @@ -1,4 +1,4 @@ -package org.muses.jeeplatform.core.entity.admin.dto; +package org.muses.jeeplatform.core.dto.admin; import java.io.Serializable; diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/SysMenu.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/SysMenu.java similarity index 97% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/SysMenu.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/SysMenu.java index 558febe..39d82ab 100644 --- a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/SysMenu.java +++ b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/SysMenu.java @@ -1,4 +1,4 @@ -package org.muses.jeeplatform.core.entity.admin.dto; +package org.muses.jeeplatform.core.dto.admin; import java.io.Serializable; diff --git a/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/UserDto.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/UserDto.java new file mode 100644 index 0000000..38491b0 --- /dev/null +++ b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/UserDto.java @@ -0,0 +1,69 @@ +package org.muses.jeeplatform.core.dto.admin; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.muses.jeeplatform.core.entity.admin.Role; + +import java.io.Serializable; +import java.util.Date; +import java.util.Set; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/27 17:20  修改内容:
+ * 
+ */ +@Data +@AllArgsConstructor +public class UserDto implements Serializable { + /** 用户Id**/ + private int id; + + /** 用户名**/ + private String username; + + /** 用户密码**/ + private String password; + + /** 手机号**/ + private String phone; + + /** 性别**/ + private String sex; + + /** 邮件**/ + private String email; + + /** 备注**/ + private String mark; + + /** 用户级别**/ + private String rank; + + /** 最后一次时间**/ + private Date lastLogin; + + /** 登录ip**/ + private String loginIp; + + /** 图片路径**/ + private String imageUrl; + + /** 注册时间**/ + private Date regTime; + + /** 账号是否被锁定**/ + private Boolean locked = Boolean.FALSE; + + /** 权限**/ + private String rights; + + private Set roles; + +} diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/ZTree.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/ZTree.java similarity index 93% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/ZTree.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/ZTree.java index 3e11236..63b48c2 100644 --- a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/ZTree.java +++ b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/ZTree.java @@ -1,4 +1,4 @@ -package org.muses.jeeplatform.core.entity.admin.dto; +package org.muses.jeeplatform.core.dto.admin; import java.io.Serializable; diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Menu.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Menu.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Menu.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Menu.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Operation.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Operation.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Operation.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Operation.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Permission.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Permission.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Permission.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Permission.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Role.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Role.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Role.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Role.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/RolePermission.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/RolePermission.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/RolePermission.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/RolePermission.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/User.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/User.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/User.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/User.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/UserRole.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/UserRole.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/UserRole.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/UserRole.java diff --git a/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/web/demoController.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/web/demoController.java new file mode 100644 index 0000000..74678d4 --- /dev/null +++ b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/web/demoController.java @@ -0,0 +1,16 @@ +package org.muses.jeeplatform.core.web; + + + +/** + * @author caiyuyu + * @date 2017/10/26 + */ +//@RestController +public class demoController { +// @RequestMapping("/") +// public ModelAndView login(){ +// ModelAndView mv = new ModelAndView("base"); +// return mv; +// } +} diff --git a/code/jeeplatform-core/src/main/resources/application.yml b/code/jeeplatform-provider-api/src/main/resources/application.yml similarity index 100% rename from code/jeeplatform-core/src/main/resources/application.yml rename to code/jeeplatform-provider-api/src/main/resources/application.yml diff --git a/code/jeeplatform-core/src/main/resources/mybatis-config.xml b/code/jeeplatform-provider-api/src/main/resources/mybatis-config.xml similarity index 100% rename from code/jeeplatform-core/src/main/resources/mybatis-config.xml rename to code/jeeplatform-provider-api/src/main/resources/mybatis-config.xml diff --git a/code/jeeplatform-core/src/main/resources/templates/base.html b/code/jeeplatform-provider-api/src/main/resources/templates/base.html old mode 100755 new mode 100644 similarity index 100% rename from code/jeeplatform-core/src/main/resources/templates/base.html rename to code/jeeplatform-provider-api/src/main/resources/templates/base.html diff --git a/code/jeeplatform-core/src/main/resources/templates/index.html b/code/jeeplatform-provider-api/src/main/resources/templates/index.html similarity index 100% rename from code/jeeplatform-core/src/main/resources/templates/index.html rename to code/jeeplatform-provider-api/src/main/resources/templates/index.html diff --git a/code/jeeplatform-core/src/main/resources/templates/login.html b/code/jeeplatform-provider-api/src/main/resources/templates/login.html old mode 100755 new mode 100644 similarity index 100% rename from code/jeeplatform-core/src/main/resources/templates/login.html rename to code/jeeplatform-provider-api/src/main/resources/templates/login.html diff --git a/code/jeeplatform-core/src/main/resources/templates/table.html b/code/jeeplatform-provider-api/src/main/resources/templates/table.html old mode 100755 new mode 100644 similarity index 100% rename from code/jeeplatform-core/src/main/resources/templates/table.html rename to code/jeeplatform-provider-api/src/main/resources/templates/table.html diff --git a/code/jeeplatform-provider/.gitignore b/code/jeeplatform-provider/.gitignore new file mode 100644 index 0000000..266bfaa --- /dev/null +++ b/code/jeeplatform-provider/.gitignore @@ -0,0 +1,33 @@ +# maven ignore +target/ +*.jar +*.war +*.zip +*.tar +*.tar.gz +*.class +*.mvn +mvnw.* + +# eclipse ignore +.settings/ +.project +.classpath + +# idea ignore +.idea/ +*.ipr +*.iml +*.iws + +# temp ignore +*.log +*.cache +*.diff +*.patch +*.tmp +*.swp + +# system ignore +.DS_Store +Thumbs.db diff --git a/code/jeeplatform-provider/pom.xml b/code/jeeplatform-provider/pom.xml new file mode 100644 index 0000000..cbe450a --- /dev/null +++ b/code/jeeplatform-provider/pom.xml @@ -0,0 +1,28 @@ + + 4.0.0 + + org.muses.jeeplatform + jeeplatform + 1.0-SNAPSHOT + + jeeplatform-provider + jeeplatform-provider + ${jeeplatform-provider.version} + jar + + + + org.muses.jeeplatform + jeeplatform-provider-api + ${jeeplatform-provider-api.version} + + + org.muses.jeeplatform + jeeplatform-common + ${jeeplatform-common.version} + + + + + diff --git a/code/jeeplatform-provider/src/main/java/org/muses/jeeplatform/ProviderApplication.java b/code/jeeplatform-provider/src/main/java/org/muses/jeeplatform/ProviderApplication.java new file mode 100644 index 0000000..e6f1d5a --- /dev/null +++ b/code/jeeplatform-provider/src/main/java/org/muses/jeeplatform/ProviderApplication.java @@ -0,0 +1,14 @@ +package org.muses.jeeplatform; + + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ProviderApplication { + + public static void main(String[] args) { + SpringApplication.run(ProviderApplication.class, args); + } + +} diff --git a/code/jeeplatform-provider/src/main/resources/application.yml b/code/jeeplatform-provider/src/main/resources/application.yml new file mode 100644 index 0000000..796b6d2 --- /dev/null +++ b/code/jeeplatform-provider/src/main/resources/application.yml @@ -0,0 +1,50 @@ +spring: + datasource: + + # 主数据源 + shop: + url: jdbc:mysql://127.0.0.1:3306/jeeplatform?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8 + username: root + password: root + + driver-class-name: com.mysql.jdbc.Driver + type: com.alibaba.druid.pool.DruidDataSource + + # 连接池设置 + druid: + initial-size: 5 + min-idle: 5 + max-active: 20 + # 配置获取连接等待超时的时间 + max-wait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + time-between-eviction-runs-millis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + min-evictable-idle-time-millis: 300000 + # Oracle请使用select 1 from dual + validation-query: SELECT 'x' + test-while-idle: true + test-on-borrow: false + test-on-return: false + # 打开PSCache,并且指定每个连接上PSCache的大小 + pool-prepared-statements: true + max-pool-prepared-statement-per-connection-size: 20 + # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + filters: stat,wall,slf4j + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + # 合并多个DruidDataSource的监控数据 + use-global-data-source-stat: true + jpa: + database: mysql + properties: + hibernate: + show_sql: false + format_sql: true + +# 端口 +server: + port: 8022 + + +#debug: true diff --git a/code/jeeplatform-provider/src/main/resources/mybatis-config.xml b/code/jeeplatform-provider/src/main/resources/mybatis-config.xml new file mode 100644 index 0000000..793bded --- /dev/null +++ b/code/jeeplatform-provider/src/main/resources/mybatis-config.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/code/jeeplatform-sso/README.md b/code/jeeplatform-sso-cas/README.md similarity index 100% rename from code/jeeplatform-sso/README.md rename to code/jeeplatform-sso-cas/README.md diff --git a/code/jeeplatform-sso-cas/etc/cas/config/application.yml b/code/jeeplatform-sso-cas/etc/cas/config/application.yml new file mode 100644 index 0000000..be1f7c3 --- /dev/null +++ b/code/jeeplatform-sso-cas/etc/cas/config/application.yml @@ -0,0 +1,2 @@ +info: + description: CAS Configuration \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/etc/cas/config/cas.properties b/code/jeeplatform-sso-cas/etc/cas/config/cas.properties new file mode 100644 index 0000000..47a1477 --- /dev/null +++ b/code/jeeplatform-sso-cas/etc/cas/config/cas.properties @@ -0,0 +1,7 @@ +cas.server.name: https://cas.example.org:8443 +cas.server.prefix: https://cas.example.org:8443/cas + +cas.adminPagesSecurity.ip=127\.0\.0\.1 + +logging.config: file:/etc/cas/config/log4j2.xml +# cas.serviceRegistry.config.location: classpath:/services diff --git a/code/jeeplatform-sso-cas/etc/cas/config/log4j2.xml b/code/jeeplatform-sso-cas/etc/cas/config/log4j2.xml new file mode 100644 index 0000000..e688cc0 --- /dev/null +++ b/code/jeeplatform-sso-cas/etc/cas/config/log4j2.xml @@ -0,0 +1,117 @@ + + + + + + . + + warn + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info new file mode 100644 index 0000000..ee00d81 --- /dev/null +++ b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info @@ -0,0 +1,3 @@ +1586750915519 +(?:[^/]+/)*?[^/]*? +WEB-INF/classes/application/[^/]*?, WEB-INF/classes/services/[^/]*? \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6/META-INF/MANIFEST.MF b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6/META-INF/MANIFEST.MF new file mode 100644 index 0000000..6a78b56 --- /dev/null +++ b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6/META-INF/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Implementation-Title: cas-server-webapp-tomcat +Implementation-Version: 5.2.6 +Start-Class: org.apereo.cas.web.CasWebApplication +Spring-Boot-Classes: WEB-INF/classes/ +Spring-Boot-Lib: WEB-INF/lib/ +Implementation-Date: 2018-07-05T14:53:01.852-07:00[America/Phoenix] +Spring-Boot-Version: 1.5.12.RELEASE +Created-By: org.apereo.cas +Specification-Version: f5118fffa39b90da780500631d1dffcc296bbc08 +Implementation-Vendor: org.apereo.cas +Main-Class: org.springframework.boot.loader.WarLauncher + diff --git a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1.info b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1.info new file mode 100644 index 0000000..8ba8377 --- /dev/null +++ b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1.info @@ -0,0 +1,3 @@ +1587720632042 +(?:[^/]+/)*?[^/]*? +WEB-INF/classes/application/[^/]*?, WEB-INF/classes/services/[^/]*? \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1/META-INF/MANIFEST.MF b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1/META-INF/MANIFEST.MF new file mode 100644 index 0000000..4247a39 --- /dev/null +++ b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1/META-INF/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Implementation-Title: cas-server-webapp-tomcat +Implementation-Version: 5.3.1 +Start-Class: org.apereo.cas.web.CasWebApplication +Spring-Boot-Classes: WEB-INF/classes/ +Spring-Boot-Lib: WEB-INF/lib/ +Implementation-Date: 2018-07-12T10:40:21.572-07:00[America/Phoenix] +Spring-Boot-Version: 1.5.14.RELEASE +Created-By: org.apereo.cas +Specification-Version: 8ac40891b296f75f73d43233252d6d2ddf491487 +Implementation-Vendor: org.apereo.cas +Main-Class: org.springframework.boot.loader.WarLauncher + diff --git a/code/jeeplatform-sso-cas/pom.xml b/code/jeeplatform-sso-cas/pom.xml new file mode 100644 index 0000000..1886102 --- /dev/null +++ b/code/jeeplatform-sso-cas/pom.xml @@ -0,0 +1,236 @@ + + 4.0.0 + + org.apereo.cas + cas-overlay + jeeplatform-sso-cas + ${jeeplatform-sso-cas.version} + war + + + + UTF-8 + UTF-8 + 1.8 + + 5.3.1 + -tomcat + + org.springframework.boot.loader.WarLauncher + false + + ${project.build.directory}/war/work/org.apereo.cas/cas-server-webapp${app.server}/META-INF/MANIFEST.MF + + + 1.8 + 1.8 + 1.5.14.RELEASE + 1.1.0 + + + + + + maven-ali + http://maven.aliyun.com/nexus/content/groups/public// + + true + + + true + always + fail + + + + + + public + aliyun nexus + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + false + + + + + + + + com.rimerosolutions.maven.plugins + wrapper-maven-plugin + 0.0.4 + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${springboot.version} + + ${mainClassName} + true + ${isExecutable} + WAR + + + + + repackage + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.6 + + cas + false + false + + false + ${manifestFileToUse} + + + + org.apereo.cas + cas-server-webapp${app.server} + ${cas.version} + + WEB-INF/classes/services/* + WEB-INF/classes/application/* + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + + cas + + + + src/main/resources + false + + + + + + + + + + + org.apereo.cas + cas-server-support-jdbc + ${cas.version} + + + + + + mysql + mysql-connector-java + 5.1.27 + runtime + + + + + org.apereo.cas + cas-server-core-authentication-api + ${cas.version} + + + + + org.apereo.cas + cas-server-core-configuration-api + ${cas.version} + + + + org.apereo.cas + cas-server-support-generic + ${cas.version} + + + + + org.apereo.cas + cas-server-support-shiro-authentication + ${cas.version} + + + + org.apache.shiro + shiro-spring + 1.4.0 + + + + + org.apereo.cas + cas-server-support-rest-authentication + ${cas.version} + + + + + org.projectlombok + lombok + 1.16.10 + compile + + + + + + + + + true + + default + + + org.apereo.cas + cas-server-webapp${app.server} + ${cas.version} + war + runtime + + + + + + + + + + diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/JdbcConfig.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/JdbcConfig.java new file mode 100644 index 0000000..5d76133 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/JdbcConfig.java @@ -0,0 +1,54 @@ +package org.muses.jeeplatform.cas.authentication.config; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DriverManagerDataSource; + +/** + *
+ *  jdbc配置类
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/26 15:36  修改内容:
+ * 
+ */ +@Configuration +public class JdbcConfig { + + /** + * jdbc驱动连接池 + * @Author mazq + * @Date 2020/04/26 15:39 + * @Param [] + * @return org.springframework.jdbc.datasource.DriverManagerDataSource + */ + @Bean("driverManagerDataSource") + public DriverManagerDataSource driverManagerDataSource(){ + // JDBC模板依赖于连接池来获得数据的连接,所以必须先要构造连接池 + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://192.168.0.152:33306/jeeplatform"); + dataSource.setUsername("root"); + dataSource.setPassword("minstone"); + return dataSource; + } + + /** + * 创建JDBC模板 + * @Author mazq + * @Date 2020/04/26 15:39 + * @Param [] + * @return org.springframework.jdbc.core.JdbcTemplate + */ + @Bean("jdbcTemplate") + public JdbcTemplate jdbcTemplate(){ + JdbcTemplate jdbcTemplate = new JdbcTemplate(); + jdbcTemplate.setDataSource(driverManagerDataSource()); + return jdbcTemplate; + } +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java new file mode 100644 index 0000000..d8d6545 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java @@ -0,0 +1,114 @@ +package org.muses.jeeplatform.cas.authentication.config; + +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apereo.cas.authentication.AuthenticationEventExecutionPlan; +import org.apereo.cas.authentication.AuthenticationEventExecutionPlanConfigurer; +import org.apereo.cas.authentication.AuthenticationHandler; +import org.apereo.cas.authentication.PrePostAuthenticationHandler; +import org.apereo.cas.authentication.principal.DefaultPrincipalFactory; +import org.apereo.cas.configuration.CasConfigurationProperties; +import org.apereo.cas.services.ServicesManager; +import org.muses.jeeplatform.cas.authentication.handler.ShiroAuthenticationHandler; +import org.muses.jeeplatform.cas.authentication.handler.UsernamePasswordAuthenticationHandler; +import org.muses.jeeplatform.cas.authentication.shiro.ShiroAuthorizingRealm; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.config.MethodInvokingFactoryBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/26 16:35  修改内容:
+ * 
+ */ +@Configuration("ShiroAuthenticationConfiguration") +@EnableConfigurationProperties(CasConfigurationProperties.class) +public class ShiroAuthenticationConfiguration implements AuthenticationEventExecutionPlanConfigurer { + @Autowired + private CasConfigurationProperties casProperties; + + @Autowired + @Qualifier("servicesManager") + private ServicesManager servicesManager; + + //@Bean + public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + shiroFilterFactoryBean.setSecurityManager(securityManager); + + //拦截器. + Map filterChainDefinitionMap = new LinkedHashMap<>(); + // 配置不会被拦截的链接 顺序判断 + filterChainDefinitionMap.put("/static/**", "anon"); + filterChainDefinitionMap.put("/upload/**", "anon"); + filterChainDefinitionMap.put("/plugins/**", "anon"); + filterChainDefinitionMap.put("/code", "anon"); + filterChainDefinitionMap.put("/login", "anon"); + filterChainDefinitionMap.put("/logincheck", "anon"); + filterChainDefinitionMap.put("/**", "authc"); + + shiroFilterFactoryBean.setLoginUrl("/login"); + shiroFilterFactoryBean.setSuccessUrl("/index"); + shiroFilterFactoryBean.setUnauthorizedUrl("/login"); + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); + return shiroFilterFactoryBean; + } + + @Bean + public ShiroAuthorizingRealm shiroAuthorizingRealm(){ + ShiroAuthorizingRealm myShiroRealm = new ShiroAuthorizingRealm(); + //myShiroRealm.setCachingEnabled(false); + //启用身份验证缓存,即缓存AuthenticationInfo信息,默认false + myShiroRealm.setAuthenticationCachingEnabled(false); + //启用授权缓存,即缓存AuthorizationInfo信息,默认false + myShiroRealm.setAuthorizationCachingEnabled(false); + return myShiroRealm; + } + + + @Bean + public SecurityManager securityManager(){ + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + securityManager.setRealm(shiroAuthorizingRealm()); + return securityManager; + } + + /** + * Spring静态注入 + * @return + */ + @Bean + public MethodInvokingFactoryBean getMethodInvokingFactoryBean(){ + MethodInvokingFactoryBean factoryBean = new MethodInvokingFactoryBean(); + factoryBean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager"); + factoryBean.setArguments(new Object[]{securityManager()}); + return factoryBean; + } + + @Bean + public AuthenticationHandler myAuthenticationHandler() { + return new ShiroAuthenticationHandler(ShiroAuthenticationHandler.class.getName(), + servicesManager, new DefaultPrincipalFactory(), 1); + } + + @Override + public void configureAuthenticationExecutionPlan(AuthenticationEventExecutionPlan plan) { + plan.registerAuthenticationHandler(myAuthenticationHandler()); + } + + + +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/UsernamePasswordAuthConfig.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/UsernamePasswordAuthConfig.java new file mode 100644 index 0000000..b2c0ae6 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/UsernamePasswordAuthConfig.java @@ -0,0 +1,42 @@ +package org.muses.jeeplatform.cas.authentication.config; + + +import org.apereo.cas.authentication.*; +import org.apereo.cas.authentication.principal.DefaultPrincipalFactory; +import org.apereo.cas.configuration.CasConfigurationProperties; +import org.apereo.cas.services.ServicesManager; +import org.muses.jeeplatform.cas.authentication.handler.UsernamePasswordAuthenticationHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +//@Configuration("UsernamePasswordAuthConfig") +@EnableConfigurationProperties(CasConfigurationProperties.class) +public class UsernamePasswordAuthConfig implements AuthenticationEventExecutionPlanConfigurer { + + @Autowired + private CasConfigurationProperties casProperties; + + @Autowired + @Qualifier("servicesManager") + private ServicesManager servicesManager; + + + @Bean + public PrePostAuthenticationHandler myAuthenticationHandler() { + // 定义为优先使用它进行认证 +// return new UsernamePasswordAuthenticationHandler(UsernamePasswordAuthenticationHandler.class.getName(), +// servicesManager, new DefaultPrincipalFactory(), 1); + + return new UsernamePasswordAuthenticationHandler(UsernamePasswordAuthenticationHandler.class.getName(), + servicesManager, new DefaultPrincipalFactory(), 1); + } + + @Override + public void configureAuthenticationExecutionPlan(AuthenticationEventExecutionPlan plan) { + plan.registerAuthenticationHandler(myAuthenticationHandler()); + } +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/encode/MD5PasswordEncoder.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/encode/MD5PasswordEncoder.java new file mode 100644 index 0000000..9cb565b --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/encode/MD5PasswordEncoder.java @@ -0,0 +1,31 @@ +package org.muses.jeeplatform.cas.authentication.encode; + +import org.springframework.security.crypto.password.PasswordEncoder; + +/** + *
+ *   自定义PasswordEncoder
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/24 17:02  修改内容:
+ * 
+ */ +public class MD5PasswordEncoder implements PasswordEncoder { + + @Override + public String encode(CharSequence charSequence) { + return charSequence.toString(); + } + + @Override + public boolean matches(CharSequence charSequence, String s) { + String encodeStr = charSequence.toString() + "aa"; + if (encodeStr.equals(s)) { + return true; + } + return false; + } +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java new file mode 100644 index 0000000..2578df7 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java @@ -0,0 +1,83 @@ +package org.muses.jeeplatform.cas.authentication.handler; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.*; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.apereo.cas.authentication.*; +import org.apereo.cas.authentication.AuthenticationException; +import org.apereo.cas.authentication.exceptions.AccountDisabledException; +import org.apereo.cas.authentication.handler.support.AbstractPreAndPostProcessingAuthenticationHandler; +import org.apereo.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; +import org.apereo.cas.authentication.principal.PrincipalFactory; +import org.apereo.cas.services.ServicesManager; + +import javax.security.auth.login.AccountLockedException; +import javax.security.auth.login.AccountNotFoundException; +import javax.security.auth.login.CredentialExpiredException; +import javax.security.auth.login.FailedLoginException; +import java.security.GeneralSecurityException; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/26 11:03  修改内容:
+ * 
+ */ +public class ShiroAuthenticationHandler extends AbstractUsernamePasswordAuthenticationHandler { + + public ShiroAuthenticationHandler(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) { + super(name, servicesManager, principalFactory, order); + } + + @Override + protected AuthenticationHandlerExecutionResult authenticateUsernamePasswordInternal(UsernamePasswordCredential credential, String originalPassword) throws GeneralSecurityException, PreventedException { + try { + UsernamePasswordToken token = new UsernamePasswordToken(credential.getUsername(), credential.getPassword()); + + if (credential instanceof RememberMeUsernamePasswordCredential) { + token.setRememberMe(RememberMeUsernamePasswordCredential.class.cast(credential).isRememberMe()); + } + + Subject subject = getCurrentExecutingSubject(); + subject.login(token); + + //获取Shiro管理的Session + //Session session = getShiroSession(subject); + + final String username = subject.getPrincipal().toString(); + return createHandlerResult(credential, this.principalFactory.createPrincipal(username)); + } catch (final UnknownAccountException uae) { + throw new AccountNotFoundException(uae.getMessage()); + } catch (final IncorrectCredentialsException ice) { + throw new FailedLoginException(ice.getMessage()); + } catch (final LockedAccountException | ExcessiveAttemptsException lae) { + throw new AccountLockedException(lae.getMessage()); + } catch (final ExpiredCredentialsException eae) { + throw new CredentialExpiredException(eae.getMessage()); + } catch (final DisabledAccountException eae) { + throw new AccountDisabledException(eae.getMessage()); + } catch (final AuthenticationException e) { + throw new FailedLoginException(e.getMessage()); + } + } + + protected Subject getCurrentExecutingSubject(){ + return SecurityUtils.getSubject(); + } + + protected Session getShiroSession(Subject subject){ + return subject.getSession(); + } + + + @Override + public boolean supports(Credential credential) { + return false; + } +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthenticationHandler.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthenticationHandler.java new file mode 100644 index 0000000..77fa795 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthenticationHandler.java @@ -0,0 +1,75 @@ +package org.muses.jeeplatform.cas.authentication.handler; + + +import org.apereo.cas.authentication.*; +import org.apereo.cas.authentication.handler.support.AbstractPreAndPostProcessingAuthenticationHandler; +import org.apereo.cas.authentication.principal.PrincipalFactory; +import org.apereo.cas.services.ServicesManager; +import org.muses.jeeplatform.cas.user.model.User; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DriverManagerDataSource; + +import javax.security.auth.login.AccountException; +import javax.security.auth.login.FailedLoginException; +import java.security.GeneralSecurityException; +import java.util.*; + +public class UsernamePasswordAuthenticationHandler extends AbstractPreAndPostProcessingAuthenticationHandler { + private static final org.slf4j.Logger logger = LoggerFactory.getLogger(UsernamePasswordAuthenticationHandler.class); + + public UsernamePasswordAuthenticationHandler(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) { + super(name, servicesManager, principalFactory, order); + } + + @Override + protected AuthenticationHandlerExecutionResult doAuthentication(Credential credential) throws GeneralSecurityException, PreventedException { + UsernamePasswordCredential usernamePasswordCredential = (UsernamePasswordCredential) credential; + + String username = usernamePasswordCredential.getUsername(); + String password = usernamePasswordCredential.getPassword(); + + System.out.println("username : " + username); + System.out.println("password : " + password); + + // JDBC模板依赖于连接池来获得数据的连接,所以必须先要构造连接池 + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://192.168.0.152:33306/jeeplatform"); + dataSource.setUsername("root"); + dataSource.setPassword("minstone"); + + // 创建JDBC模板 + JdbcTemplate jdbcTemplate = new JdbcTemplate(); + jdbcTemplate.setDataSource(dataSource); + + String sql = "SELECT * FROM sys_user WHERE username = ?"; + + User info = (User) jdbcTemplate.queryForObject(sql, new Object[]{username}, new BeanPropertyRowMapper(User.class)); + + System.out.println("database username : "+ info.getUsername()); + System.out.println("database password : "+ info.getPassword()); + + + if (info == null) { + throw new AccountException("Sorry, username not found!"); + } + + if (!info.getPassword().equals(password)) { + throw new FailedLoginException("Sorry, password not correct!"); + } else { + + final List list = new ArrayList<>(); + + return createHandlerResult(usernamePasswordCredential, + this.principalFactory.createPrincipal(username, Collections.emptyMap()), list); + } + } + + + @Override + public boolean supports(Credential credential) { + return credential instanceof UsernamePasswordCredential; + } +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java new file mode 100644 index 0000000..d1c01ce --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java @@ -0,0 +1,128 @@ +package org.muses.jeeplatform.cas.authentication.shiro; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.*; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.subject.Subject; +import org.muses.jeeplatform.cas.user.model.User; +import org.muses.jeeplatform.cas.user.service.UserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DriverManagerDataSource; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/26 11:33  修改内容:
+ * 
+ */ +public class ShiroAuthorizingRealm extends AuthorizingRealm { + + Logger LOG = LoggerFactory.getLogger(ShiroAuthorizingRealm.class); + + /**注解引入业务类**/ + //@Autowired + //UserService userService; + + /** + * 登录信息和用户验证信息验证(non-Javadoc) + * @see org.apache.shiro.realm.AuthenticatingRealm#doGetAuthenticationInfo(AuthenticationToken) + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { + + String username = (String)token.getPrincipal(); //得到用户名 + String password = new String((char[])token.getCredentials()); //得到密码 + + LOG.info("Shiro doGetAuthenticationInfo>> username:{},password:{}",username,password); + + //User user = userService.findByUsername(username); + // JDBC模板依赖于连接池来获得数据的连接,所以必须先要构造连接池 + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://192.168.0.152:33306/jeeplatform"); + dataSource.setUsername("root"); + dataSource.setPassword("minstone"); + + // 创建JDBC模板 + JdbcTemplate jdbcTemplate = new JdbcTemplate(); + jdbcTemplate.setDataSource(dataSource); + + String sql = "SELECT * FROM sys_user WHERE username = ?"; + + User user = (User) jdbcTemplate.queryForObject(sql, new Object[]{username}, new BeanPropertyRowMapper(User.class)); + Subject subject = getCurrentExecutingSubject(); + //获取Shiro管理的Session + Session session = getShiroSession(subject); + //Shiro添加会话 + session.setAttribute("username", username); + session.setAttribute(ShiroConsts.SESSION_USER, user); + + /**检测是否有此用户 **/ + if(user == null){ + throw new UnknownAccountException();//没有找到账号异常 + } + /**检验账号是否被锁定 **/ + if(Boolean.TRUE.equals(user.getLocked())){ + throw new LockedAccountException();//抛出账号锁定异常 + } + /**AuthenticatingRealm使用CredentialsMatcher进行密码匹配**/ + if(null != username && null != password){ + return new SimpleAuthenticationInfo(username, password, getName()); + }else{ + return null; + } + + } + + /** + * 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用,负责在应用程序中决定用户的访问控制的方法(non-Javadoc) + * @see AuthorizingRealm#doGetAuthorizationInfo(PrincipalCollection) + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) { + String username = (String)pc.getPrimaryPrincipal(); + SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); +// authorizationInfo.setRoles(userService.getRoles(username)); +// authorizationInfo.setStringPermissions(userService.getPermissions(username)); + System.out.println("Shiro授权"); + return authorizationInfo; + } + + @Override + public void clearCachedAuthorizationInfo(PrincipalCollection principals) { + super.clearCachedAuthorizationInfo(principals); + } + + @Override + public void clearCachedAuthenticationInfo(PrincipalCollection principals) { + super.clearCachedAuthenticationInfo(principals); + } + + @Override + public void clearCache(PrincipalCollection principals) { + super.clearCache(principals); + } + + protected Subject getCurrentExecutingSubject(){ + return SecurityUtils.getSubject(); + } + + protected Session getShiroSession(Subject subject){ + return subject.getSession(); + } + +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroConsts.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroConsts.java new file mode 100644 index 0000000..cba6cf6 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroConsts.java @@ -0,0 +1,26 @@ +package org.muses.jeeplatform.cas.authentication.shiro; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/26 16:54  修改内容:
+ * 
+ */ +public class ShiroConsts { + + //验证码Session + public static final String SESSION_SECURITY_CODE = "sessionSecCode"; + //用户信息Session + public static final String SESSION_USER = "sessionUser"; + //角色权限Session + public static final String SESSION_ROLE_RIGHTS = "sessionRoleRights"; + //所有菜单Session + public static final String SESSION_ALLMENU = "sessionAllMenu"; + //权限Session + public static final String SESSION_RIGHTS = "sessionRights"; +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/package-info.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/package-info.java new file mode 100644 index 0000000..8c49236 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/package-info.java @@ -0,0 +1,12 @@ +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/24 10:26  修改内容:
+ * 
+ */ +package org.muses.jeeplatform.cas; \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/model/User.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/model/User.java new file mode 100644 index 0000000..ca5313e --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/model/User.java @@ -0,0 +1,62 @@ +package org.muses.jeeplatform.cas.user.model; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/24 17:45  修改内容:
+ * 
+ */ +@Data +public class User implements Serializable { + /** 用户Id**/ + private int id; + + /** 用户名**/ + private String username; + + /** 用户密码**/ + private String password; + + /** 手机号**/ + private String phone; + + /** 性别**/ + private String sex; + + /** 邮件**/ + private String email; + + /** 备注**/ + private String mark; + + /** 用户级别**/ + private String rank; + + /** 最后一次时间**/ + private Date lastLogin; + + /** 登录ip**/ + private String loginIp; + + /** 图片路径**/ + private String imageUrl; + + /** 注册时间**/ + private Date regTime; + + /** 账号是否被锁定**/ + private Boolean locked = Boolean.FALSE; + + /** 权限**/ + private String rights; +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/service/UserService.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/service/UserService.java new file mode 100644 index 0000000..9c64dab --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/service/UserService.java @@ -0,0 +1,48 @@ +package org.muses.jeeplatform.cas.user.service; + +import org.muses.jeeplatform.cas.user.model.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/26 15:26  修改内容:
+ * 
+ */ +@Service +public class UserService { + + @Autowired + @Qualifier("jdbcTemplate") + JdbcTemplate jdbcTemplate; + + + /** + * 通过用户名查询用户信息 + * @param username + * @return + */ + @Transactional(readOnly=true) + //@RedisCache(nameSpace = RedisCacheNamespace.SYS_USER) + public User findByUsername(String username){ + String sql = "SELECT * FROM sys_user WHERE username = ?"; + User info = null; + try { + info = (User) jdbcTemplate.queryForObject(sql, new Object[]{username}, new BeanPropertyRowMapper(User.class)); + } catch (Exception e) { + e.printStackTrace(); + } + return info; + } + +} diff --git a/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories b/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..1d0e5ac --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +org.muses.jeeplatform.cas.authentication.config.ShiroAuthenticationConfiguration diff --git a/code/jeeplatform-sso-cas/src/main/resources/application.properties b/code/jeeplatform-sso-cas/src/main/resources/application.properties new file mode 100644 index 0000000..36d3c39 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/resources/application.properties @@ -0,0 +1,201 @@ +## +# CAS Server Context Configuration +# +server.context-path=/cas +server.port=8443 + +#SSL配置 +#cas.server.name=https://sso.anumbrella.com:8443 +#cas.server.prefix=https://sso.anumbrella.com:8443/cas +server.ssl.enabled=true +server.ssl.key-store=classpath:thekeystore +server.ssl.key-store-password=changeit +server.ssl.key-password=changeit +server.ssl.keyAlias=caskeystore + +server.max-http-header-size=2097152 +server.use-forward-headers=true +server.connection-timeout=20000 +server.error.include-stacktrace=ALWAYS + +server.compression.enabled=true +server.compression.mime-types=application/javascript,application/json,application/xml,text/html,text/xml,text/plain + +server.tomcat.max-http-post-size=2097152 +server.tomcat.basedir=build/tomcat +server.tomcat.accesslog.enabled=true +server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms) +server.tomcat.accesslog.suffix=.log +server.tomcat.min-spare-threads=10 +server.tomcat.max-threads=200 +server.tomcat.port-header=X-Forwarded-Port +server.tomcat.protocol-header=X-Forwarded-Proto +server.tomcat.protocol-header-https-value=https +server.tomcat.remote-ip-header=X-FORWARDED-FOR +server.tomcat.uri-encoding=UTF-8 + +spring.http.encoding.charset=UTF-8 +spring.http.encoding.enabled=true +spring.http.encoding.force=true + +## +# CAS Cloud Bus Configuration +# +spring.cloud.bus.enabled=false + +# Indicates that systemPropertiesOverride can be used. +# Set to false to prevent users from changing the default accidentally. Default true. +spring.cloud.config.allow-override=true + +# External properties should override system properties. +spring.cloud.config.override-system-properties=false + +# When allowOverride is true, external properties should take lowest priority, and not override any +# existing property sources (including local config files). +spring.cloud.config.override-none=false + +# spring.cloud.bus.refresh.enabled=true +# spring.cloud.bus.env.enabled=true +# spring.cloud.bus.destination=CasCloudBus +# spring.cloud.bus.ack.enabled=true + +endpoints.enabled=false +endpoints.sensitive=true + +endpoints.restart.enabled=false +endpoints.shutdown.enabled=false + +# Control the security of the management/actuator endpoints +# The 'enabled' flag below here controls the rendering of details for the health endpoint amongst other things. +management.security.enabled=true +management.security.roles=ACTUATOR,ADMIN +management.security.sessions=if_required +management.context-path=/status +management.add-application-context-header=false + +# Define a CAS-specific "WARN" status code and its order +management.health.status.order=WARN, DOWN, OUT_OF_SERVICE, UNKNOWN, UP + +# Control the security of the management/actuator endpoints +# With basic authentication, assuming Spring Security and/or relevant modules are on the classpath. +security.basic.authorize-mode=role +security.basic.path=/cas/status/** +# security.basic.enabled=true +# security.user.name=casuser +# security.user.password= + +## +# CAS Web Application Session Configuration +# +server.session.timeout=300 +server.session.cookie.http-only=true +server.session.tracking-modes=COOKIE + +## +# CAS Thymeleaf View Configuration +# +spring.thymeleaf.encoding=UTF-8 +spring.thymeleaf.cache=true +spring.thymeleaf.mode=HTML +spring.thymeleaf.template-resolver-order=100 +## +# CAS Log4j Configuration +# +# logging.config=file:/etc/cas/log4j2.xml +server.context-parameters.isLog4jAutoInitializationDisabled=true + +## +# CAS AspectJ Configuration +# +spring.aop.auto=true +spring.aop.proxy-target-class=true + +## +# CAS Authentication Credentials +# +#cas.authn.accept.users=casuser::Mellon + +## +# JDBC Authentication +# +# 查询账号密码SQL,必须包含密码字段 +cas.authn.jdbc.query[0].sql=select * from sys_user where username=? +# 指定上面的SQL查询字段名(必须) +cas.authn.jdbc.query[0].fieldPassword=password +# 指定过期字段,1为过期,若过期不可用 +cas.authn.jdbc.query[0].fieldExpired=expired +# 为不可用字段段,1为不可用,需要修改密码 +cas.authn.jdbc.query[0].fieldDisabled=disabled +# 数据库连接 +cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/jeeplatform?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8 + +# 数据库dialect配置 +cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect +# 数据库用户名 +cas.authn.jdbc.query[0].user=root +# 数据库用户密码 +cas.authn.jdbc.query[0].password=root +# 数据库事务自动提交 +cas.authn.jdbc.query[0].autocommit=false +# 数据库驱动 +cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver +# 超时配置 +cas.authn.jdbc.query[0].idleTimeout=50000 +# 默认加密策略,通过encodingAlgorithm来指定算法,默认NONE不加密 +# NONE|DEFAULT|STANDARD|BCRYPT|SCRYPT|PBKDF2 +cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT +#cas.authn.jdbc.query[0].passwordEncoder.type=org.muses.jeeplatform.cas.authentication.encode.MD5PasswordEncoder +# 字符类型 +cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8 +# 加密算法 +cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5 +# 加密盐 +#cas.authn.jdbc.query[0].passwordEncoder.secret= +# 加密字符长度 +#cas.authn.jdbc.query[0].passwordEncoder.strength=16 + +## +# 支持http方式 +# +#开启识别json文件,默认false +cas.serviceRegistry.initFromJson=true +cas.tgc.secure=false +cas.warningCookie.secure=false + +## +# File (Whitelist) Authentication +# +cas.authn.file.separator=:: +cas.authn.file.filename=file:///users/whitelist/file +cas.authn.file.name= + +## +#JSON (Whitelist) Authentication +# +cas.authn.json.location=file:///users/whitelist/file.json +cas.authn.json.name= + +## +# Reject Users (Blacklist) Authentication +# +cas.authn.reject.users=user,user1 +cas.authn.reject.name= + +## +# Shiro Authentication +# +#允许登录的用户,必须要有以下权限,否则拒绝,多个逗号隔开 +cas.authn.shiro.requiredPermissions=staff +#允许登录的用户,必须要有以下角色,否则拒绝,多个逗号隔开 +cas.authn.shiro.requiredRoles=admin +#shiro配置文件位置 +cas.authn.shiro.location=classpath:shiro.ini +# shiro name唯一 +cas.authn.shiro.name=cas-shiro + +## +# REST Authentication +# +#cas.authn.rest.uri=http://localhost:8081/jeeplatform +cas.authn.rest.name= + diff --git a/code/jeeplatform-sso-cas/src/main/resources/casServer.crt b/code/jeeplatform-sso-cas/src/main/resources/casServer.crt new file mode 100644 index 0000000..c58e92d Binary files /dev/null and b/code/jeeplatform-sso-cas/src/main/resources/casServer.crt differ diff --git a/code/jeeplatform-sso-cas/src/main/resources/casServer.keystore b/code/jeeplatform-sso-cas/src/main/resources/casServer.keystore new file mode 100644 index 0000000..b96ed96 Binary files /dev/null and b/code/jeeplatform-sso-cas/src/main/resources/casServer.keystore differ diff --git a/code/jeeplatform-sso-cas/src/main/resources/casexample.keystore b/code/jeeplatform-sso-cas/src/main/resources/casexample.keystore new file mode 100644 index 0000000..4161907 Binary files /dev/null and b/code/jeeplatform-sso-cas/src/main/resources/casexample.keystore differ diff --git a/code/jeeplatform-sso-cas/src/main/resources/services/Apereo-10000002.json b/code/jeeplatform-sso-cas/src/main/resources/services/Apereo-10000002.json new file mode 100644 index 0000000..cda4cd7 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/resources/services/Apereo-10000002.json @@ -0,0 +1,9 @@ +{ + "@class" : "org.apereo.cas.services.RegexRegisteredService", + "serviceId" : "^https://www.apereo.org", + "name" : "Apereo", + "theme" : "apereo", + "id" : 10000002, + "description" : "Apereo foundation sample service", + "evaluationOrder" : 1 +} diff --git a/code/jeeplatform-sso-cas/src/main/resources/services/Client1-10000004.json b/code/jeeplatform-sso-cas/src/main/resources/services/Client1-10000004.json new file mode 100644 index 0000000..02ad211 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/resources/services/Client1-10000004.json @@ -0,0 +1,8 @@ +{ + "@class": "org.apereo.cas.services.RegexRegisteredService", + "serviceId": "^http://www\\.casclient1\\.com.*", + "name": "本地服务", + "id": 10000004, + "description": "这是一个本地允许的服务,通过localhost访问都允许通过", + "evaluationOrder": 1 +} \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/src/main/resources/services/Client1-10000005.json b/code/jeeplatform-sso-cas/src/main/resources/services/Client1-10000005.json new file mode 100644 index 0000000..ec6c0ed --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/resources/services/Client1-10000005.json @@ -0,0 +1,8 @@ +{ + "@class": "org.apereo.cas.services.RegexRegisteredService", + "serviceId": "^http://www\\.casclient2\\.com.*", + "name": "本地服务", + "id": 10000005, + "description": "这是一个本地允许的服务,通过localhost访问都允许通过", + "evaluationOrder": 1 +} \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/src/main/resources/services/HTTPSandIMAPS-10000001.json b/code/jeeplatform-sso-cas/src/main/resources/services/HTTPSandIMAPS-10000001.json new file mode 100644 index 0000000..d034046 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/resources/services/HTTPSandIMAPS-10000001.json @@ -0,0 +1,8 @@ +{ + "@class" : "org.apereo.cas.services.RegexRegisteredService", + "serviceId" : "^(https|http|imaps)://.*", + "name" : "HTTPS and IMAPS", + "id" : 10000001, + "description" : "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.", + "evaluationOrder" : 10000 +} diff --git a/code/jeeplatform-sso-cas/src/main/resources/services/Localhost-10000003.json b/code/jeeplatform-sso-cas/src/main/resources/services/Localhost-10000003.json new file mode 100644 index 0000000..d4cfd24 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/resources/services/Localhost-10000003.json @@ -0,0 +1,8 @@ +{ + "@class": "org.apereo.cas.services.RegexRegisteredService", + "serviceId": "^http://127\\.0\\.0\\.1.*", + "name": "本地服务", + "id": 10000003, + "description": "这是一个本地允许的服务,通过localhost访问都允许通过", + "evaluationOrder": 1 +} \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/src/main/resources/shiro.ini b/code/jeeplatform-sso-cas/src/main/resources/shiro.ini new file mode 100644 index 0000000..94f2dd8 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/resources/shiro.ini @@ -0,0 +1,9 @@ +[main] +cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager +securityManager.cacheManager = $cacheManager + +[users] +casuser = Mellon, admin + +[roles] +admin = system,admin,staff,superuser:* \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ar.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ar.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ar.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ar.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ca.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ca.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ca.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ca.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_cs.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_cs.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_cs.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_cs.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_de.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_de.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_de.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_de.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_es.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_es.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_es.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_es.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_fa.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_fa.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_fa.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_fa.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_fr.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_fr.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_fr.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_fr.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_hr.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_hr.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_hr.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_hr.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_it.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_it.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_it.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_it.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ja.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ja.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ja.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ja.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_mk.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_mk.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_mk.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_mk.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_nl.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_nl.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_nl.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_nl.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_pl.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_pl.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_pl.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_pl.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_pt_BR.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_pt_BR.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_pt_BR.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_pt_BR.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_pt_PT.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_pt_PT.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_pt_PT.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_pt_PT.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ru.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ru.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ru.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ru.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_sk.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_sk.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_sk.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_sk.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_sl.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_sl.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_sl.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_sl.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_sv.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_sv.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_sv.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_sv.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_tr.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_tr.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_tr.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_tr.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_uk.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_uk.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_uk.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_uk.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ur.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ur.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ur.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ur.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_zh_CN.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_zh_CN.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_zh_CN.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_zh_CN.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_zh_TW.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_zh_TW.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_zh_TW.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_zh_TW.properties diff --git a/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/web.xml b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..5529b65 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,10 @@ + + + Archetype Created Web Application + + + \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/favicon.ico b/code/jeeplatform-sso-cas/src/main/webapp/favicon.ico similarity index 100% rename from code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/favicon.ico rename to code/jeeplatform-sso-cas/src/main/webapp/favicon.ico diff --git a/code/jeeplatform-sso-cas/users/whitelist/file b/code/jeeplatform-sso-cas/users/whitelist/file new file mode 100644 index 0000000..6cd0cae --- /dev/null +++ b/code/jeeplatform-sso-cas/users/whitelist/file @@ -0,0 +1 @@ +test::123 \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/users/whitelist/file.json b/code/jeeplatform-sso-cas/users/whitelist/file.json new file mode 100644 index 0000000..d12e4f7 --- /dev/null +++ b/code/jeeplatform-sso-cas/users/whitelist/file.json @@ -0,0 +1,14 @@ +{ + "@class" : "java.util.LinkedHashMap", + "casuser" : { + "@class" : "org.apereo.cas.adaptors.generic.CasUserAccount", + "password" : "Mellon", + "attributes" : { + "@class" : "java.util.LinkedHashMap", + "firstName" : "Apereo", + "lastName" : "CAS" + }, + "status" : "OK", + "expirationDate" : "2018-01-19" + } +} \ No newline at end of file diff --git a/code/jeeplatform-sso-oauth2/.gitignore b/code/jeeplatform-sso-oauth2/.gitignore new file mode 100644 index 0000000..a2a3040 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/.gitignore @@ -0,0 +1,31 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ diff --git a/code/jeeplatform-sso-oauth2/mvnw b/code/jeeplatform-sso-oauth2/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/code/jeeplatform-sso-oauth2/pom.xml b/code/jeeplatform-sso-oauth2/pom.xml new file mode 100644 index 0000000..aa6084e --- /dev/null +++ b/code/jeeplatform-sso-oauth2/pom.xml @@ -0,0 +1,144 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.1.RELEASE + + + org.muses.jeeplatform + jeeplatform-sso-oauth2 + 0.0.1-SNAPSHOT + jeeplatform-sso-oauth2 + Demo project for Spring Boot + jar + + + 1.8 + Hoxton.SR4 + 1.0.9.RELEASE + 0.9.0 + 2.1.1 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + + org.springframework.cloud + spring-cloud-starter-security + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis.springboot.version} + + + + + + + + + + org.springframework.security + spring-security-jwt + ${security-jwt.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + io.jsonwebtoken + jjwt + ${jjwt.version} + + + + org.projectlombok + lombok + 1.16.10 + + + + + com.alibaba + fastjson + 1.2.7 + + + + javax.servlet + javax.servlet-api + 3.1.0 + + + + mysql + mysql-connector-java + 5.1.27 + runtime + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2Application.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2Application.java new file mode 100644 index 0000000..bcd6cb3 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2Application.java @@ -0,0 +1,15 @@ +package org.muses.jeeplatform.oauth; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; + +@SpringBootApplication +@EnableResourceServer +public class JeeplatformSsoOauth2Application { + + public static void main(String[] args) { + SpringApplication.run(JeeplatformSsoOauth2Application.class, args); + } + +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/component/CustomPasswordEncoder.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/component/CustomPasswordEncoder.java new file mode 100644 index 0000000..5e11e90 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/component/CustomPasswordEncoder.java @@ -0,0 +1,31 @@ +package org.muses.jeeplatform.oauth.component; + +import org.springframework.security.crypto.password.PasswordEncoder; + +/** + *
+ *   自定义PasswordEncoder
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/24 17:02  修改内容:
+ * 
+ */ +public class CustomPasswordEncoder implements PasswordEncoder { + + @Override + public String encode(CharSequence charSequence) { + return charSequence.toString(); + } + + @Override + public boolean matches(CharSequence charSequence, String s) { + String encodeStr = charSequence.toString() + ""; + if (encodeStr.equals(s)) { + return true; + } + return false; + } +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/component/MessagesLocalResolver.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/component/MessagesLocalResolver.java new file mode 100644 index 0000000..ecd2aee --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/component/MessagesLocalResolver.java @@ -0,0 +1,62 @@ +package org.muses.jeeplatform.oauth.component; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.lang.Nullable; +import org.springframework.util.StringUtils; +import org.springframework.web.servlet.LocaleResolver; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Locale; + +/** + *
+ *
+ * 
+ * + * @author nicky + *
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2019年11月23日  修改内容:
+ * 
+ */ +public class MessagesLocalResolver implements LocaleResolver { + + Logger LOG = LoggerFactory.getLogger(this.getClass()); + + @Nullable + private Locale defaultLocale; + + public void setDefaultLocale(@Nullable Locale defaultLocale) { + this.defaultLocale = defaultLocale; + } + + @Nullable + public Locale getDefaultLocale() { + return this.defaultLocale; + } + + @Override + public Locale resolveLocale(HttpServletRequest request) { + Locale defaultLocale = this.getDefaultLocale(); + if(defaultLocale != null && request.getHeader("Accept-Language") == null) { + return defaultLocale; + } else { + Locale requestLocale = request.getLocale(); + String localeFlag = request.getParameter("lang"); + //LOG.info("localeFlag:{}",localeFlag); + if (!StringUtils.isEmpty(localeFlag)) { + String[] split = localeFlag.split("_"); + requestLocale = new Locale(split[0], split[1]); + } + return requestLocale; + } + } + + @Override + public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { + + } +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/configuration/MyMvcConfiguration.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/configuration/MyMvcConfiguration.java new file mode 100644 index 0000000..eb67c7f --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/configuration/MyMvcConfiguration.java @@ -0,0 +1,60 @@ +package org.muses.jeeplatform.oauth.configuration; + +import org.muses.jeeplatform.oauth.component.MessagesLocalResolver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; + +/** + *
+ *
+ * 
+ * + * @author nicky + *
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2019年11月23日  修改内容:
+ * 
+ */ +@Configuration +//@ComponentScan(basePackages = { "com.example.springboot.web" }) +//@Order(0) +@EnableConfigurationProperties({ WebMvcProperties.class}) +public class MyMvcConfiguration implements WebMvcConfigurer{ + + //装载WebMvcProperties 属性 + @Autowired + WebMvcProperties webMvcProperties; + /** + * 自定义LocalResolver + * @Author nicky.ma + * @Date 2019/11/24 13:45 + * @return org.springframework.web.servlet.LocaleResolver + */ + @Bean + public LocaleResolver localeResolver(){ + MessagesLocalResolver localResolver = new MessagesLocalResolver(); + localResolver.setDefaultLocale(webMvcProperties.getLocale()); + return localResolver; + } + + @Bean + public LocaleChangeInterceptor localeChangeInterceptor() { + LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); + lci.setParamName("lang"); + return lci; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(localeChangeInterceptor()).addPathPatterns("/**");; + } + + +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/configuration/MybatisConfiguration.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/configuration/MybatisConfiguration.java new file mode 100644 index 0000000..59c7304 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/configuration/MybatisConfiguration.java @@ -0,0 +1,37 @@ +package org.muses.jeeplatform.oauth.configuration; + +import org.mybatis.spring.annotation.MapperScan; +import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + *
+ * Mybatis配置类
+ * 
+ * + * @author nicky + *
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2019年12月15日  修改内容:
+ * 
+ */ +@Configuration +//开启支持事务管理 +@EnableTransactionManagement +// Mapper接口扫描,加上这个就不需要每一个Mapper接口都加@Mapper注解 +@MapperScan(basePackages = {"org.muses.jeeplatform.oauth.mapper"}) +public class MybatisConfiguration { + + //配置支持驼峰命名和大小写自动转换 + @Bean + public ConfigurationCustomizer configurationCustomizer(){ + return new ConfigurationCustomizer(){ + @Override + public void customize(org.apache.ibatis.session.Configuration configuration) { + configuration.setMapUnderscoreToCamelCase(true); + } + }; + } +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/configuration/OAuth2Configuration.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/configuration/OAuth2Configuration.java new file mode 100644 index 0000000..189c088 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/configuration/OAuth2Configuration.java @@ -0,0 +1,186 @@ +package org.muses.jeeplatform.oauth.configuration; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.OAuth2Authentication; +import org.springframework.security.oauth2.provider.token.DefaultTokenServices; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; +import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; + +import javax.annotation.Resource; +import javax.sql.DataSource; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + *
+ *  OAuth2.0配置
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/29 15:06  修改内容:
+ * 
+ */ +@Configuration +//开启授权服务 +@EnableAuthorizationServer +public class OAuth2Configuration extends AuthorizationServerConfigurerAdapter { + + @Autowired + private AuthenticationManager authenticationManager; + @Resource(name = "userService") + private UserDetailsService userDetailsService; + + @Autowired + @Qualifier("dataSource") + private DataSource dataSource; + + private static final String CLIENT_ID = "cms"; + private static final String SECRET_CHAR_SEQUENCE = "{noop}secret"; + private static final String SCOPE_READ = "read"; + private static final String SCOPE_WRITE = "write"; + private static final String TRUST = "trust"; + private static final String USER ="user"; + private static final String ALL = "all"; + private static final int ACCESS_TOKEN_VALIDITY_SECONDS = 2*60; + private static final int FREFRESH_TOKEN_VALIDITY_SECONDS = 2*60; + // 密码模式授权模式 + private static final String GRANT_TYPE_PASSWORD = "password"; + //授权码模式 + private static final String AUTHORIZATION_CODE = "authorization_code"; + //refresh token模式 + private static final String REFRESH_TOKEN = "refresh_token"; + //简化授权模式 + private static final String IMPLICIT = "implicit"; + //指定哪些资源是需要授权验证的 + private static final String RESOURCE_ID = "resource_id"; + + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + /*clients + // 使用内存存储 + .inMemory() + //标记客户端id + .withClient(CLIENT_ID) + //客户端安全码 + .secret(SECRET_CHAR_SEQUENCE) + //为true 直接自动授权成功返回code + .autoApprove(true) + .redirectUris("http://127.0.0.1:8084/cms/login") //重定向uri + //允许授权范围 + .scopes(ALL) + //token 时间秒 + .accessTokenValiditySeconds(ACCESS_TOKEN_VALIDITY_SECONDS) + //刷新token 时间 秒 + .refreshTokenValiditySeconds(FREFRESH_TOKEN_VALIDITY_SECONDS) + //允许授权类型 + .authorizedGrantTypes(GRANT_TYPE_PASSWORD , AUTHORIZATION_CODE , REFRESH_TOKEN , IMPLICIT);*/ + // 数据库保存配置信息到oauth_client_details表,schema参考sql/oauth_client_details + clients.jdbc(dataSource); + } + + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + endpoints.tokenStore(jwtTokenStore()).authenticationManager(authenticationManager) + .accessTokenConverter(accessTokenConverter()) + //必须注入userDetailsService否则根据refresh_token无法加载用户信息 + .userDetailsService(userDetailsService) + //支持获取token方式 + .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST,HttpMethod.PUT,HttpMethod.DELETE,HttpMethod.OPTIONS) + //刷新token + .reuseRefreshTokens(true); + //endpoints.tokenServices(createDefaultTokenServices()); + // 使用内存保存生成的token + //endpoints.authenticationManager(authenticationManager).tokenStore(memoryTokenStore()); + } + + /** + * 认证服务器的安全配置 + * + * @param security + * @throws Exception + */ + @Override + public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { + security + //.realm(RESOURCE_ID) + // 开启/oauth/token_key验证端口认证权限访问 + .tokenKeyAccess("isAuthenticated()") + // 开启/oauth/check_token验证端口认证权限访问 + .checkTokenAccess("isAuthenticated()") + //允许表单认证 在授权码模式下会导致无法根据code获取token  + .allowFormAuthenticationForClients(); + } + + @Bean + public JwtAccessTokenConverter accessTokenConverter(){ + JwtAccessTokenConverter converter = new JwtAccessTokenConverter(){ + @Override + public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { + String grantType = authentication.getOAuth2Request().getGrantType(); + //授权码和密码模式才自定义token信息 + if(AUTHORIZATION_CODE.equals(grantType) || GRANT_TYPE_PASSWORD.equals(grantType)) { + String userName = authentication.getUserAuthentication().getName(); + // 自定义一些token 信息 + Map additionalInformation = new HashMap(16); + additionalInformation.put("user_name", userName); + additionalInformation = Collections.unmodifiableMap(additionalInformation); + ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInformation); + } + OAuth2AccessToken token = super.enhance(accessToken, authentication); + return token; + } + }; + // 设置签署key + converter.setSigningKey("bcrypt"); + return converter; + } + + @Bean + public TokenStore jwtTokenStore() { + //基于jwt实现令牌(Access Token)保存 + return new JwtTokenStore(accessTokenConverter()); + } + +// @Bean +// public TokenStore memoryTokenStore() { +// // 最基本的InMemoryTokenStore生成token +// return new InMemoryTokenStore(); +// } + + @Bean + public DefaultTokenServices createDefaultTokenServices() { + final DefaultTokenServices defaultTokenServices = new DefaultTokenServices(); + defaultTokenServices.setTokenEnhancer(accessTokenConverter()); + defaultTokenServices.setTokenStore(jwtTokenStore()); + defaultTokenServices.setSupportRefreshToken(true); + defaultTokenServices.setAccessTokenValiditySeconds((int) TimeUnit.DAYS.toSeconds(30)); + return defaultTokenServices; + } + + + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/configuration/SecurityConfiguration.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/configuration/SecurityConfiguration.java new file mode 100644 index 0000000..0940e59 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/configuration/SecurityConfiguration.java @@ -0,0 +1,109 @@ +package org.muses.jeeplatform.oauth.configuration; + + +import org.muses.jeeplatform.oauth.component.CustomPasswordEncoder; +import org.muses.jeeplatform.oauth.filter.SimpleCORSFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.context.SecurityContextPersistenceFilter; + + +import javax.annotation.Resource; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/30 15:58  修改内容:
+ * 
+ */ +@Configuration +@EnableWebSecurity +@Order(1) +//@EnableGlobalMethodSecurity(prePostEnabled = true) +//@EnableAutoConfiguration(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class }) +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + @Autowired + private SimpleCORSFilter simpleCORSFilter; + + @Resource(name = "userService") + private UserDetailsService userDetailsService; + + private static final String SECRET_CHAR_SEQUENCE = "secret"; + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { //auth.inMemoryAuthentication() +// auth.inMemoryAuthentication() +// .withUser("nicky") +// .password("{noop}123") +// .roles("admin"); + auth.userDetailsService(userDetailsService) + .passwordEncoder(new CustomPasswordEncoder()); + auth.parentAuthenticationManager(authenticationManagerBean()); + + } + + @Override + public void configure(WebSecurity web) throws Exception { + //解决静态资源被拦截的问题 + web.ignoring().antMatchers("/asserts/**"); + //web.ignoring().antMatchers("/favicon.ico"); + + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http // 配置登录页并允许访问 + .formLogin().loginPage("/login").permitAll() + // 配置Basic登录 + //.and().httpBasic() + // 配置登出页面 + .and().logout().logoutUrl("/logout").logoutSuccessUrl("/") + .and().authorizeRequests().antMatchers("/oauth/**", "/login/**", "/logout/**").permitAll() + // 其余所有请求全部需要鉴权认证 + .anyRequest().authenticated() + // 关闭跨域保护; + .and().csrf().disable(); + //http.addFilterBefore(simpleCORSFilter, SecurityContextPersistenceFilter.class); + } + + + + @Bean + public PasswordEncoder bcryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + + public static void main(String[] args) { + BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); + //加密"123" + String encode = bCryptPasswordEncoder.encode("123"); + System.out.println(encode); + //结果:$2a$10$CpuVEbTuUkOUJWFz.4kMSeRGJHDefn7tFKLsBVnMo8ZxZrCMeuYwG + } +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/entity/User.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/entity/User.java new file mode 100644 index 0000000..2b1bb47 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/entity/User.java @@ -0,0 +1,62 @@ +package org.muses.jeeplatform.oauth.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户信息的实体类 + * @author Nicky + */ +@Data +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class User implements Serializable { + /** 用户Id**/ + private int id; + + /** 用户名**/ + private String username; + + /** 用户密码**/ + private String password; + + /** 手机号**/ + private String phone; + + /** 性别**/ + private String sex; + + /** 邮件**/ + private String email; + + /** 备注**/ + private String mark; + + /** 用户级别**/ + private String rank; + + /** 最后一次时间**/ + private Date lastLogin; + + /** 登录ip**/ + private String loginIp; + + /** 图片路径**/ + private String imageUrl; + + /** 注册时间**/ + private Date regTime; + + /** 账号是否被锁定**/ + private Boolean locked = Boolean.FALSE; + + /** 权限**/ + private String rights; +} + diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/entity/dto/UserDto.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/entity/dto/UserDto.java new file mode 100644 index 0000000..0500100 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/entity/dto/UserDto.java @@ -0,0 +1,66 @@ +package org.muses.jeeplatform.oauth.entity.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + *
+ *    用户信息DTO类
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/30 15:24  修改内容:
+ * 
+ */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserDto implements Serializable { + /** 用户Id**/ + private int id; + + /** 用户名**/ + private String username; + + /** 用户密码**/ + private String password; + + /** 手机号**/ + private String phone; + + /** 性别**/ + private String sex; + + /** 邮件**/ + private String email; + + /** 备注**/ + private String mark; + + /** 用户级别**/ + private String rank; + + /** 最后一次时间**/ + private Date lastLogin; + + /** 登录ip**/ + private String loginIp; + + /** 图片路径**/ + private String imageUrl; + + /** 注册时间**/ + private Date regTime; + + /** 账号是否被锁定**/ + private Boolean locked = Boolean.FALSE; + + /** 权限**/ + private String rights; +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/filter/SimpleCORSFilter.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/filter/SimpleCORSFilter.java new file mode 100644 index 0000000..b182f8d --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/filter/SimpleCORSFilter.java @@ -0,0 +1,30 @@ +package org.muses.jeeplatform.oauth.filter; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + + +@Slf4j +@Component +public class SimpleCORSFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { + httpServletRequest.setCharacterEncoding("utf-8"); + httpServletResponse.setCharacterEncoding("utf-8"); + httpServletResponse.setHeader("Content-Type", "application/json"); + httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");//允许所有域名访问 + httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");//允许的访问方式 + httpServletResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type,Authorization"); + httpServletResponse.setHeader("Access-Control-Request-Headers", "x-requested-with,content-type,Accept,Authorization"); + httpServletResponse.setHeader("Access-Control-Request-Method", "GET,POST,PUT,DELETE,OPTIONS"); + filterChain.doFilter(httpServletRequest, httpServletResponse); + } +} \ No newline at end of file diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/mapper/UserMapper.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/mapper/UserMapper.java new file mode 100644 index 0000000..7a0d4ae --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/mapper/UserMapper.java @@ -0,0 +1,27 @@ +package org.muses.jeeplatform.oauth.mapper; + + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.muses.jeeplatform.oauth.entity.User; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/05/15 17:34  修改内容:
+ * 
+ */ +public interface UserMapper { + + @Select("select * from sys_user where username=#{username}") + User findByUsername(@Param("username") String username); + + @Select("select * from sys_user where username=#{username} and password=#{password}") + User findByUsernameAndPassword(@Param("username")String username, @Param("password")String password); + +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/service/UserDetailsServiceImpl.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/service/UserDetailsServiceImpl.java new file mode 100644 index 0000000..920a6f5 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/service/UserDetailsServiceImpl.java @@ -0,0 +1,48 @@ +package org.muses.jeeplatform.oauth.service; + +import lombok.extern.slf4j.Slf4j; +import org.muses.jeeplatform.oauth.entity.User; +import org.muses.jeeplatform.oauth.mapper.UserMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/04/30 15:15  修改内容:
+ * 
+ */ +@Slf4j +@Service("userService") +public class UserDetailsServiceImpl implements UserDetailsService { + + @Autowired + UserMapper userRepository; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + User user = userRepository.findByUsername(username); + if(user == null){ + log.info("登录用户[{}]没注册!",username); + throw new UsernameNotFoundException("登录用户["+username + "]没注册!"); + } + return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthority()); + } + + private List getAuthority() { + return Arrays.asList(new SimpleGrantedAuthority("ROLE_ADMIN")); +// return Arrays.asList(Collections.emptyList()); + } +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/web/controller/LoginController.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/web/controller/LoginController.java new file mode 100644 index 0000000..8653602 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/web/controller/LoginController.java @@ -0,0 +1,35 @@ +package org.muses.jeeplatform.oauth.web.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.servlet.ModelAndView; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/05/06 18:11  修改内容:
+ * 
+ */ +@Controller +public class LoginController { + + @GetMapping(value = {"/login"}) + public ModelAndView toLogin(){ + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("login"); + return modelAndView; + } + + @GetMapping(value = {"/index"}) + public ModelAndView toIndex() { + ModelAndView modelAndView = new ModelAndView(); + modelAndView.addObject("msg","This is great!"); + modelAndView.setViewName("index"); + return modelAndView; + } +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/web/controller/UserController.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/web/controller/UserController.java new file mode 100644 index 0000000..6c342ce --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/web/controller/UserController.java @@ -0,0 +1,25 @@ +package org.muses.jeeplatform.oauth.web.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.security.Principal; + +/** + *
+ *
+ * 
+ * + *
+ * @author mazq
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2020/05/07 16:52  修改内容:
+ * 
+ */ +@RestController +public class UserController { + @GetMapping("/user") + public Principal getCurrentUser(Principal principal) { + return principal; + } +} \ No newline at end of file diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/application.properties b/code/jeeplatform-sso-oauth2/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/application.yml b/code/jeeplatform-sso-oauth2/src/main/resources/application.yml new file mode 100644 index 0000000..111096a --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/application.yml @@ -0,0 +1,52 @@ +server: + port: + 8888 +spring: + datasource: + url: jdbc:mysql://192.168.0.152:33306/jeeplatform?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false + username: root + password: minstone + driver-class-name: com.mysql.jdbc.Driver + #添加Thymeleaf配置,除了cache在项目没上线前建议关了,其它配置都可以不用配的,本博客只是列举一下有这些配置 + thymeleaf: + # cache默认开启的,这里可以关了,项目上线之前,项目上线后可以开启 + cache: false + # 这个prefix可以注释,因为默认就是templates的,您可以改成其它的自定义路径 + prefix: classpath:/templates/ + suffix: .html + mode: HTML5 + # 指定一下编码为utf8 + encoding: UTF-8 + # context-type为text/html,也可以不指定,因为boot可以自动识别 + servlet: + content-type: text/html + messages: + basename: i18n.messages +# cache-duration: + encoding: UTF-8 + +# JWT 配置 +jwt: + # 存放Token的Header Key + header: Authorization + # 密匙key + secret: mySecret + # 过期时间 单位秒 7天后过期 604800 + expiration: 3600 + # 自定义token 前缀字符 + tokenHead: Bearer- + # 超时时间 单位秒 + access_token: 3600 + # 刷新token时间 单位秒 + refresh_token: 3600 + route: + authentication: + path: login/entry + refresh: oauth/refresh + register: login/account + + +# 不需要拦截的url地址 +#mySecurity: +# exclude: +# antMatchers: /oauth/**,/login,/home \ No newline at end of file diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/i18n/messages.properties b/code/jeeplatform-sso-oauth2/src/main/resources/i18n/messages.properties new file mode 100644 index 0000000..3b1e4e8 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/i18n/messages.properties @@ -0,0 +1,5 @@ +messages.loginBtnName=登录~ +messages.password=密码~ +messages.rememberMe=记住我~ +messages.tip=请登录~ +messages.username=用户名~ diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/i18n/messages_en_US.properties b/code/jeeplatform-sso-oauth2/src/main/resources/i18n/messages_en_US.properties new file mode 100644 index 0000000..72c6ae6 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/i18n/messages_en_US.properties @@ -0,0 +1,5 @@ +messages.loginBtnName=login +messages.password=password +messages.rememberMe=Remember me +messages.tip=Oauth2.0 SSO login in +messages.username=userName diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/i18n/messages_zh_CN.properties b/code/jeeplatform-sso-oauth2/src/main/resources/i18n/messages_zh_CN.properties new file mode 100644 index 0000000..c36ee74 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/i18n/messages_zh_CN.properties @@ -0,0 +1,5 @@ +messages.loginBtnName=登录 +messages.password=密码 +messages.rememberMe=记住我 +messages.tip=统一认证登录 +messages.username=用户名 diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/sql/schema.sql b/code/jeeplatform-sso-oauth2/src/main/resources/sql/schema.sql new file mode 100644 index 0000000..27c5c50 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/sql/schema.sql @@ -0,0 +1,22 @@ +/* +SQLyog Ultimate v11.5 (64 bit) +MySQL - 5.7.27 +********************************************************************* +*/ +/*!40101 SET NAMES utf8 */; + +create table `oauth_client_details` ( + `client_id` varchar (768), + `resource_ids` varchar (768), + `client_secret` varchar (768), + `scope` varchar (768), + `authorized_grant_types` varchar (768), + `web_server_redirect_uri` varchar (768), + `authorities` varchar (768), + `access_token_validity` int (11), + `refresh_token_validity` int (11), + `additional_information` varchar (12288), + `autoapprove` varchar (768) +); +insert into `oauth_client_details` (`client_id`, `resource_ids`, `client_secret`, `scope`, `authorized_grant_types`, `web_server_redirect_uri`, `authorities`, `access_token_validity`, `refresh_token_validity`, `additional_information`, `autoapprove`) values('cms',NULL,'{noop}secret','all','authorization_code','http://localhost:8084/cms/login',NULL,'60','60',NULL,'true'); +insert into `oauth_client_details` (`client_id`, `resource_ids`, `client_secret`, `scope`, `authorized_grant_types`, `web_server_redirect_uri`, `authorities`, `access_token_validity`, `refresh_token_validity`, `additional_information`, `autoapprove`) values('oa',NULL,'{noop}secret','all','authorization_code','http://localhost:8082/oa/login',NULL,'60','60',NULL,'true'); diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/bootstrap.min.css b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/bootstrap.min.css new file mode 100644 index 0000000..6561b6f --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0 (https://getbootstrap.com) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-control{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-control::before{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{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);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#6c757d!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/dashboard.css b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/dashboard.css new file mode 100644 index 0000000..ef40fe7 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/dashboard.css @@ -0,0 +1,93 @@ +body { + font-size: .875rem; +} + +.feather { + width: 16px; + height: 16px; + vertical-align: text-bottom; +} + +/* + * Sidebar + */ + +.sidebar { + position: fixed; + top: 0; + bottom: 0; + left: 0; + z-index: 100; /* Behind the navbar */ + padding: 0; + box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1); +} + +.sidebar-sticky { + position: -webkit-sticky; + position: sticky; + top: 48px; /* Height of navbar */ + height: calc(100vh - 48px); + padding-top: .5rem; + overflow-x: hidden; + overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ +} + +.sidebar .nav-link { + font-weight: 500; + color: #333; +} + +.sidebar .nav-link .feather { + margin-right: 4px; + color: #999; +} + +.sidebar .nav-link.active { + color: #007bff; +} + +.sidebar .nav-link:hover .feather, +.sidebar .nav-link.active .feather { + color: inherit; +} + +.sidebar-heading { + font-size: .75rem; + text-transform: uppercase; +} + +/* + * Navbar + */ + +.navbar-brand { + padding-top: .75rem; + padding-bottom: .75rem; + font-size: 1rem; + background-color: rgba(0, 0, 0, .25); + box-shadow: inset -1px 0 0 rgba(0, 0, 0, .25); +} + +.navbar .form-control { + padding: .75rem 1rem; + border-width: 0; + border-radius: 0; +} + +.form-control-dark { + color: #fff; + background-color: rgba(255, 255, 255, .1); + border-color: rgba(255, 255, 255, .1); +} + +.form-control-dark:focus { + border-color: transparent; + box-shadow: 0 0 0 3px rgba(255, 255, 255, .25); +} + +/* + * Utilities + */ + +.border-top { border-top: 1px solid #e5e5e5; } +.border-bottom { border-bottom: 1px solid #e5e5e5; } diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/signin.css b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/signin.css new file mode 100644 index 0000000..4257b0e --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/signin.css @@ -0,0 +1,49 @@ +html, +body { + height: 100%; +} + +body { + display: -ms-flexbox; + display: -webkit-box; + display: flex; + -ms-flex-align: center; + -ms-flex-pack: center; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + padding-top: 40px; + padding-bottom: 40px; + /*background-color: #f5f5f5;*/ +} + +.form-signin { + width: 100%; + max-width: 330px; + padding: 15px; + margin: 0 auto; +} +.form-signin .checkbox { + font-weight: 400; +} +.form-signin .form-control { + position: relative; + box-sizing: border-box; + height: auto; + padding: 10px; + font-size: 16px; +} +.form-signin .form-control:focus { + z-index: 2; +} +.form-signin input[type="email"] { + margin-bottom: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.form-signin input[type="password"] { + margin-bottom: 10px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/img/bootstrap-solid.svg b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/img/bootstrap-solid.svg new file mode 100644 index 0000000..b624a02 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/img/bootstrap-solid.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/Chart.min.js b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/Chart.min.js new file mode 100644 index 0000000..2130e2a --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/Chart.min.js @@ -0,0 +1,10 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.7.1 + * + * Copyright 2017 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Chart=t()}}(function(){return function t(e,n,i){function a(r,l){if(!n[r]){if(!e[r]){var s="function"==typeof require&&require;if(!l&&s)return s(r,!0);if(o)return o(r,!0);var u=new Error("Cannot find module '"+r+"'");throw u.code="MODULE_NOT_FOUND",u}var d=n[r]={exports:{}};e[r][0].call(d.exports,function(t){var n=e[r][1][t];return a(n||t)},d,d.exports,t,e,n,i)}return n[r].exports}for(var o="function"==typeof require&&require,r=0;rn?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,o=2*a-1,r=n.alpha()-i.alpha(),l=((o*r==-1?o:(o+r)/(1+o*r))+1)/2,s=1-l;return this.rgb(l*n.red()+s*i.red(),l*n.green()+s*i.green(),l*n.blue()+s*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new o,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]}function d(t){var e,n,i,a=u(t),o=a[0],r=a[1],l=a[2];return o/=95.047,r/=100,l/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,l=l>.008856?Math.pow(l,1/3):7.787*l+16/116,e=116*r-16,n=500*(o-r),i=200*(r-l),[e,n,i]}function c(t){var e,n,i,a,o,r=t[0]/360,l=t[1]/100,s=t[2]/100;if(0==l)return o=255*s,[o,o,o];e=2*s-(n=s<.5?s*(1+l):s+l-s*l),a=[0,0,0];for(var u=0;u<3;u++)(i=r+1/3*-(u-1))<0&&i++,i>1&&i--,o=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*o;return a}function h(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-n),l=255*i*(1-n*o),s=255*i*(1-n*(1-o)),i=255*i;switch(a){case 0:return[i,s,r];case 1:return[l,i,r];case 2:return[r,i,s];case 3:return[r,l,i];case 4:return[s,r,i];case 5:return[i,r,l]}}function f(t){var e,n,i,a,o=t[0]/360,l=t[1]/100,s=t[2]/100,u=l+s;switch(u>1&&(l/=u,s/=u),e=Math.floor(6*o),n=1-s,i=6*o-e,0!=(1&e)&&(i=1-i),a=l+i*(n-l),e){default:case 6:case 0:r=n,g=a,b=l;break;case 1:r=a,g=n,b=l;break;case 2:r=l,g=n,b=a;break;case 3:r=l,g=a,b=n;break;case 4:r=a,g=l,b=n;break;case 5:r=n,g=l,b=a}return[255*r,255*g,255*b]}function p(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100,l=t[3]/100;return e=1-Math.min(1,a*(1-l)+l),n=1-Math.min(1,o*(1-l)+l),i=1-Math.min(1,r*(1-l)+l),[255*e,255*n,255*i]}function v(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*a+-1.5372*o+-.4986*r,n=-.9689*a+1.8758*o+.0415*r,i=.0557*a+-.204*o+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function m(t){var e,n,i,a=t[0],o=t[1],r=t[2];return a/=95.047,o/=100,r/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,n=500*(a-o),i=200*(o-r),[e,n,i]}function x(t){var e,n,i,a,o=t[0],r=t[1],l=t[2];return o<=8?a=(n=100*o/903.3)/100*7.787+16/116:(n=100*Math.pow((o+16)/116,3),a=Math.pow(n/100,1/3)),e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i=i/108.883<=.008859?i=108.883*(a-l/200-16/116)/7.787:108.883*Math.pow(a-l/200,3),[e,n,i]}function y(t){var e,n,i,a=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),(n=360*e/2/Math.PI)<0&&(n+=360),i=Math.sqrt(o*o+r*r),[a,i,n]}function k(t){return v(x(t))}function w(t){var e,n,i,a=t[0],o=t[1];return i=t[2]/360*2*Math.PI,e=o*Math.cos(i),n=o*Math.sin(i),[a,e,n]}function M(t){return S[t]}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:l,rgb2keyword:s,rgb2xyz:u,rgb2lab:d,rgb2lch:function(t){return y(d(t))},hsl2rgb:c,hsl2hsv:function(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,a*=o<=1?o:2-o,n=(o+a)/2,e=2*a/(o+a),[i,100*e,100*n])},hsl2hwb:function(t){return o(c(t))},hsl2cmyk:function(t){return l(c(t))},hsl2keyword:function(t){return s(c(t))},hsv2rgb:h,hsv2hsl:function(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return n=(2-a)*o,e=a*o,e/=n<=1?n:2-n,e=e||0,n/=2,[i,100*e,100*n]},hsv2hwb:function(t){return o(h(t))},hsv2cmyk:function(t){return l(h(t))},hsv2keyword:function(t){return s(h(t))},hwb2rgb:f,hwb2hsl:function(t){return i(f(t))},hwb2hsv:function(t){return a(f(t))},hwb2cmyk:function(t){return l(f(t))},hwb2keyword:function(t){return s(f(t))},cmyk2rgb:p,cmyk2hsl:function(t){return i(p(t))},cmyk2hsv:function(t){return a(p(t))},cmyk2hwb:function(t){return o(p(t))},cmyk2keyword:function(t){return s(p(t))},keyword2rgb:M,keyword2hsl:function(t){return i(M(t))},keyword2hsv:function(t){return a(M(t))},keyword2hwb:function(t){return o(M(t))},keyword2cmyk:function(t){return l(M(t))},keyword2lab:function(t){return d(M(t))},keyword2xyz:function(t){return u(M(t))},xyz2rgb:v,xyz2lab:m,xyz2lch:function(t){return y(m(t))},lab2xyz:x,lab2rgb:k,lab2lch:y,lch2lab:w,lch2xyz:function(t){return x(w(t))},lch2rgb:function(t){return k(w(t))}};var S={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},C={};for(var _ in S)C[JSON.stringify(S[_])]=_},{}],5:[function(t,e,n){var i=t(4),a=function(){return new u};for(var o in i){a[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),l=r[1],s=r[2];(a[l]=a[l]||{})[s]=a[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if("string"==typeof n||void 0===n)return n;for(var a=0;a0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index=0&&a>0)&&(v+=a));return o=c.getPixelForValue(v),r=c.getPixelForValue(v+f),l=(r-o)/2,{size:l,base:o,head:r,center:r+l/2}},calculateBarIndexPixels:function(t,e,n){var i,a,r,l,s,u,d=this,c=n.scale.options,h=d.getStackIndex(t),f=n.pixels,g=f[e],p=f.length,v=n.start,m=n.end;return 1===p?(i=g>v?g-v:m-g,a=g0&&(i=(g-f[e-1])/2,e===p-1&&(a=i)),e');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),r=e.datasets[0],l=a.data[i],s=l&&l.custom||{},u=o.valueAtIndexOrDefault,d=t.options.elements.arc;return{text:n,fillStyle:s.backgroundColor?s.backgroundColor:u(r.backgroundColor,i,d.backgroundColor),strokeStyle:s.borderColor?s.borderColor:u(r.borderColor,i,d.borderColor),lineWidth:s.borderWidth?s.borderWidth:u(r.borderWidth,i,d.borderWidth),hidden:isNaN(r.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n=Math.PI?-1:g<-Math.PI?1:0))+f,v={x:Math.cos(g),y:Math.sin(g)},m={x:Math.cos(p),y:Math.sin(p)},b=g<=0&&p>=0||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,w=h/100,M={x:y?-1:Math.min(v.x*(v.x<0?1:w),m.x*(m.x<0?1:w)),y:k?-1:Math.min(v.y*(v.y<0?1:w),m.y*(m.y<0?1:w))},S={x:b?1:Math.max(v.x*(v.x>0?1:w),m.x*(m.x>0?1:w)),y:x?1:Math.max(v.y*(v.y>0?1:w),m.y*(m.y>0?1:w))},C={width:.5*(S.x-M.x),height:.5*(S.y-M.y)};u=Math.min(l/C.width,s/C.height),d={x:-.5*(S.x+M.x),y:-.5*(S.y+M.y)}}n.borderWidth=e.getMaxBorderWidth(c.data),n.outerRadius=Math.max((u-n.borderWidth)/2,0),n.innerRadius=Math.max(h?n.outerRadius/100*h:0,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),n.offsetX=d.x*n.outerRadius,n.offsetY=d.y*n.outerRadius,c.total=e.calculateTotal(),e.outerRadius=n.outerRadius-n.radiusLength*e.getRingIndex(e.index),e.innerRadius=Math.max(e.outerRadius-n.radiusLength,0),o.each(c.data,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){var i=this,a=i.chart,r=a.chartArea,l=a.options,s=l.animation,u=(r.left+r.right)/2,d=(r.top+r.bottom)/2,c=l.rotation,h=l.rotation,f=i.getDataset(),g=n&&s.animateRotate?0:t.hidden?0:i.calculateCircumference(f.data[e])*(l.circumference/(2*Math.PI)),p=n&&s.animateScale?0:i.innerRadius,v=n&&s.animateScale?0:i.outerRadius,m=o.valueAtIndexOrDefault;o.extend(t,{_datasetIndex:i.index,_index:e,_model:{x:u+a.offsetX,y:d+a.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:v,innerRadius:p,label:m(f.label,e,a.data.labels[e])}});var b=t._model;this.removeHoverStyle(t),n&&s.animateRotate||(b.startAngle=0===e?l.rotation:i.getMeta().data[e-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return o.each(n.data,function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))}),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,n,i=0,a=this.index,o=t.length,r=0;r(i=e>i?e:i)?n:i;return i}})}},{25:25,40:40,45:45}],18:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}}),e.exports=function(t){function e(t,e){return o.valueOrDefault(t.showLine,e.showLines)}t.controllers.line=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,update:function(t){var n,i,a,r=this,l=r.getMeta(),s=l.dataset,u=l.data||[],d=r.chart.options,c=d.elements.line,h=r.getScaleForId(l.yAxisID),f=r.getDataset(),g=e(f,d);for(g&&(a=s.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),s._scale=h,s._datasetIndex=r.index,s._children=u,s._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:a.tension?a.tension:o.valueOrDefault(f.lineTension,c.tension),backgroundColor:a.backgroundColor?a.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:a.borderWidth?a.borderWidth:f.borderWidth||c.borderWidth,borderColor:a.borderColor?a.borderColor:f.borderColor||c.borderColor,borderCapStyle:a.borderCapStyle?a.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:a.borderDash?a.borderDash:f.borderDash||c.borderDash,borderDashOffset:a.borderDashOffset?a.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:a.borderJoinStyle?a.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:a.fill?a.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:a.steppedLine?a.steppedLine:o.valueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:a.cubicInterpolationMode?a.cubicInterpolationMode:o.valueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)},s.pivot()),n=0,i=u.length;n');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),r=e.datasets[0],l=a.data[i].custom||{},s=o.valueAtIndexOrDefault,u=t.options.elements.arc;return{text:n,fillStyle:l.backgroundColor?l.backgroundColor:s(r.backgroundColor,i,u.backgroundColor),strokeStyle:l.borderColor?l.borderColor:s(r.borderColor,i,u.borderColor),lineWidth:l.borderWidth?l.borderWidth:s(r.borderWidth,i,u.borderWidth),hidden:isNaN(r.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n0&&!isNaN(t)?2*Math.PI/e:0}})}},{25:25,40:40,45:45}],20:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}}),e.exports=function(t){t.controllers.radar=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,linkScales:o.noop,update:function(t){var e=this,n=e.getMeta(),i=n.dataset,a=n.data,r=i.custom||{},l=e.getDataset(),s=e.chart.options.elements.line,u=e.chart.scale;void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),o.extend(n.dataset,{_datasetIndex:e.index,_scale:u,_children:a,_loop:!0,_model:{tension:r.tension?r.tension:o.valueOrDefault(l.lineTension,s.tension),backgroundColor:r.backgroundColor?r.backgroundColor:l.backgroundColor||s.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:l.borderWidth||s.borderWidth,borderColor:r.borderColor?r.borderColor:l.borderColor||s.borderColor,fill:r.fill?r.fill:void 0!==l.fill?l.fill:s.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:l.borderCapStyle||s.borderCapStyle,borderDash:r.borderDash?r.borderDash:l.borderDash||s.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:l.borderDashOffset||s.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:l.borderJoinStyle||s.borderJoinStyle}}),n.dataset.pivot(),o.each(a,function(n,i){e.updateElement(n,i,t)},e),e.updateBezierControlPoints()},updateElement:function(t,e,n){var i=this,a=t.custom||{},r=i.getDataset(),l=i.chart.scale,s=i.chart.options.elements.point,u=l.getPointPositionForValue(e,r.data[e]);void 0!==r.radius&&void 0===r.pointRadius&&(r.pointRadius=r.radius),void 0!==r.hitRadius&&void 0===r.pointHitRadius&&(r.pointHitRadius=r.hitRadius),o.extend(t,{_datasetIndex:i.index,_index:e,_scale:l,_model:{x:n?l.xCenter:u.x,y:n?l.yCenter:u.y,tension:a.tension?a.tension:o.valueOrDefault(r.lineTension,i.chart.options.elements.line.tension),radius:a.radius?a.radius:o.valueAtIndexOrDefault(r.pointRadius,e,s.radius),backgroundColor:a.backgroundColor?a.backgroundColor:o.valueAtIndexOrDefault(r.pointBackgroundColor,e,s.backgroundColor),borderColor:a.borderColor?a.borderColor:o.valueAtIndexOrDefault(r.pointBorderColor,e,s.borderColor),borderWidth:a.borderWidth?a.borderWidth:o.valueAtIndexOrDefault(r.pointBorderWidth,e,s.borderWidth),pointStyle:a.pointStyle?a.pointStyle:o.valueAtIndexOrDefault(r.pointStyle,e,s.pointStyle),hitRadius:a.hitRadius?a.hitRadius:o.valueAtIndexOrDefault(r.pointHitRadius,e,s.hitRadius)}}),t._model.skip=a.skip?a.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,e=this.getMeta();o.each(e.data,function(n,i){var a=n._model,r=o.splineCurve(o.previousItem(e.data,i,!0)._model,a,o.nextItem(e.data,i,!0)._model,a.tension);a.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),a.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),a.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),a.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),n.pivot()})},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model;a.radius=n.hoverRadius?n.hoverRadius:o.valueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),a.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:o.valueAtIndexOrDefault(e.pointHoverBackgroundColor,i,o.getHoverColor(a.backgroundColor)),a.borderColor=n.hoverBorderColor?n.hoverBorderColor:o.valueAtIndexOrDefault(e.pointHoverBorderColor,i,o.getHoverColor(a.borderColor)),a.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:o.valueAtIndexOrDefault(e.pointHoverBorderWidth,i,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model,r=this.chart.options.elements.point;a.radius=n.radius?n.radius:o.valueAtIndexOrDefault(e.pointRadius,i,r.radius),a.backgroundColor=n.backgroundColor?n.backgroundColor:o.valueAtIndexOrDefault(e.pointBackgroundColor,i,r.backgroundColor),a.borderColor=n.borderColor?n.borderColor:o.valueAtIndexOrDefault(e.pointBorderColor,i,r.borderColor),a.borderWidth=n.borderWidth?n.borderWidth:o.valueAtIndexOrDefault(e.pointBorderWidth,i,r.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(t,e,n){"use strict";t(25)._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}}),e.exports=function(t){t.controllers.scatter=t.controllers.line}},{25:25}],22:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:o.noop,onComplete:o.noop}}),e.exports=function(t){t.Animation=a.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a,o,r=this.animations;for(e.chart=t,i||(t.animating=!0),a=0,o=r.length;a1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+n);var i=Date.now();t.dropFrames+=(i-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var e,n,i=this.animations,a=0;a=e.numSteps?(o.callback(e.onAnimationComplete,[e],n),n.animating=!1,i.splice(a,1)):++a}},Object.defineProperty(t.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{25:25,26:26,45:45}],23:[function(t,e,n){"use strict";var i=t(25),a=t(45),o=t(28),r=t(48);e.exports=function(t){function e(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=a.configMerge(i.global,i[t.type],t.options||{}),t}function n(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}function l(t){return"top"===t||"bottom"===t}var s=t.plugins;t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(n,i){var o=this;i=e(i);var l=r.acquireContext(n,i),s=l&&l.canvas,u=s&&s.height,d=s&&s.width;o.id=a.uid(),o.ctx=l,o.canvas=s,o.config=i,o.width=d,o.height=u,o.aspectRatio=u?d/u:null,o.options=i.options,o._bufferedRender=!1,o.chart=o,o.controller=o,t.instances[o.id]=o,Object.defineProperty(o,"data",{get:function(){return o.config.data},set:function(t){o.config.data=t}}),l&&s?(o.initialize(),o.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return s.notify(t,"beforeInit"),a.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),s.notify(t,"afterInit"),t},clear:function(){return a.canvas.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,o=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(a.getMaximumWidth(i))),l=Math.max(0,Math.floor(o?r/o:a.getMaximumHeight(i)));if((e.width!==r||e.height!==l)&&(i.width=e.width=r,i.height=e.height=l,i.style.width=r+"px",i.style.height=l+"px",a.retinaScale(e,n.devicePixelRatio),!t)){var u={width:r,height:l};s.notify(e,"resize",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),n&&(n.id=n.id||"scale")},buildScales:function(){var e=this,n=e.options,i=e.scales={},o=[];n.scales&&(o=o.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),n.scale&&o.push({options:n.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),a.each(o,function(n){var o=n.options,r=a.valueOrDefault(o.type,n.dtype),s=t.scaleService.getScaleConstructor(r);if(s){l(o.position)!==l(n.dposition)&&(o.position=n.dposition);var u=new s({id:o.id,options:o,ctx:e.ctx,chart:e});i[u.id]=u,u.mergeTicksOptions(),n.isDefault&&(e.scale=u)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,n=[],i=[];return a.each(e.data.datasets,function(a,o){var r=e.getDatasetMeta(o),l=a.type||e.config.type;if(r.type&&r.type!==l&&(e.destroyDatasetMeta(o),r=e.getDatasetMeta(o)),r.type=l,n.push(r.type),r.controller)r.controller.updateIndex(o);else{var s=t.controllers[r.type];if(void 0===s)throw new Error('"'+r.type+'" is not a chart type.');r.controller=new s(e,o),i.push(r.controller)}},e),i},resetElements:function(){var t=this;a.each(t.data.datasets,function(e,n){t.getDatasetMeta(n).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),n(e),!1!==s.notify(e,"beforeUpdate")){e.tooltip._data=e.data;var i=e.buildOrUpdateControllers();a.each(e.data.datasets,function(t,n){e.getDatasetMeta(n).controller.buildOrUpdateElements()},e),e.updateLayout(),a.each(i,function(t){t.reset()}),e.updateDatasets(),e.tooltip.initialize(),e.lastActive=[],s.notify(e,"afterUpdate"),e._bufferedRender?e._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:e.render(t)}},updateLayout:function(){var e=this;!1!==s.notify(e,"beforeLayout")&&(t.layoutService.update(this,this.width,this.height),s.notify(e,"afterScaleUpdate"),s.notify(e,"afterLayout"))},updateDatasets:function(){var t=this;if(!1!==s.notify(t,"beforeDatasetsUpdate")){for(var e=0,n=t.data.datasets.length;e=0;--n)e.isDatasetVisible(n)&&e.drawDataset(n,t);s.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n=this,i=n.getDatasetMeta(t),a={meta:i,index:t,easingValue:e};!1!==s.notify(n,"beforeDatasetDraw",[a])&&(i.controller.draw(e),s.notify(n,"afterDatasetDraw",[a]))},_drawTooltip:function(t){var e=this,n=e.tooltip,i={tooltip:n,easingValue:t};!1!==s.notify(e,"beforeTooltipDraw",[i])&&(n.draw(),s.notify(e,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return o.modes.single(this,t)},getElementsAtEvent:function(t){return o.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return o.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=o.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return o.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e0||(a.forEach(function(e){delete t[e]}),delete t._chartjs)}}var a=["push","pop","shift","splice","unshift"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&n(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],o=i.data;for(t=0,e=a.length;ti&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n=n[e].length&&n[e].push({}),!n[e][r].type||s.type&&s.type!==n[e][r].type?o.merge(n[e][r],[t.scaleService.getScaleDefaults(l),s]):o.merge(n[e][r],s)}else o._merger(e,n,i,a)}})},o.where=function(t,e){if(o.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return o.each(t,function(t){e(t)&&n.push(t)}),n},o.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i=0;i--){var a=t[i];if(e(a))return a}},o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,n){return Math.abs(t-e)t},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),o=Math.atan2(i,n);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},o.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},o.aliasPixel=function(t){return t%2==0?0:.5},o.splineCurve=function(t,e,n,i){var a=t.skip?e:t,o=e,r=n.skip?e:n,l=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),s=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),u=l/(l+s),d=s/(l+s),c=i*(u=isNaN(u)?0:u),h=i*(d=isNaN(d)?0:d);return{previous:{x:o.x-c*(r.x-a.x),y:o.y-c*(r.y-a.y)},next:{x:o.x+h*(r.x-a.x),y:o.y+h*(r.y-a.y)}}},o.EPSILON=Number.EPSILON||1e-14,o.splineCurveMonotone=function(t){var e,n,i,a,r=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),l=r.length;for(e=0;e0?r[e-1]:null,(a=e0?r[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},o.niceNum=function(t,e){var n=Math.floor(o.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},o.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},o.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.currentTarget||t.srcElement,l=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var u=parseFloat(o.getStyle(r,"padding-left")),d=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=l.right-l.left-u-c,g=l.bottom-l.top-d-h;return n=Math.round((n-l.left-u)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-l.top-d)/g*r.height/e.currentDevicePixelRatio),{x:n,y:i}},o.getConstraintWidth=function(t){return r(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return r(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode;if(!e)return t.clientWidth;var n=parseInt(o.getStyle(e,"padding-left"),10),i=parseInt(o.getStyle(e,"padding-right"),10),a=e.clientWidth-n-i,r=o.getConstraintWidth(t);return isNaN(r)?a:Math.min(a,r)},o.getMaximumHeight=function(t){var e=t.parentNode;if(!e)return t.clientHeight;var n=parseInt(o.getStyle(e,"padding-top"),10),i=parseInt(o.getStyle(e,"padding-bottom"),10),a=e.clientHeight-n-i,r=o.getConstraintHeight(t);return isNaN(r)?a:Math.min(a,r)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,o=t.width;i.height=a*n,i.width=o*n,t.ctx.scale(n,n),i.style.height=a+"px",i.style.width=o+"px"}},o.fontString=function(t,e,n){return e+" "+t+"px "+n},o.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var l=0;o.each(n,function(e){void 0!==e&&null!==e&&!0!==o.isArray(e)?l=o.measureText(t,a,r,l,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(l=o.measureText(t,a,r,l,e))})});var s=r.length/2;if(s>n.length){for(var u=0;ui&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.color=i?function(t){return t instanceof CanvasGradient&&(t=a.global.defaultColor),i(t)}:function(t){return console.error("Color.js not found!"),t},o.getHoverColor=function(t){return t instanceof CanvasPattern?t:o.color(t).saturate(.5).darken(.1).rgbString()}}},{25:25,3:3,45:45}],28:[function(t,e,n){"use strict";function i(t,e){return t.native?{x:t.x,y:t.y}:u.getRelativePosition(t,e)}function a(t,e){var n,i,a,o,r;for(i=0,o=t.data.datasets.length;i0&&(u=t.getDatasetMeta(u[0]._datasetIndex).data),u},"x-axis":function(t,e){return s(t,e,{intersect:!1})},point:function(t,e){return o(t,i(e,t))},nearest:function(t,e,n){var a=i(e,t);n.axis=n.axis||"xy";var o=l(n.axis),s=r(t,a,n.intersect,o);return s.length>1&&s.sort(function(t,e){var n=t.getArea()-e.getArea();return 0===n&&(n=t._datasetIndex-e._datasetIndex),n}),s.slice(0,1)},x:function(t,e,n){var o=i(e,t),r=[],l=!1;return a(t,function(t){t.inXRange(o.x)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),n.intersect&&!l&&(r=[]),r},y:function(t,e,n){var o=i(e,t),r=[],l=!1;return a(t,function(t){t.inYRange(o.y)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),n.intersect&&!l&&(r=[]),r}}}},{45:45}],29:[function(t,e,n){"use strict";t(25)._set("global",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.Chart=t,t}},{25:25}],30:[function(t,e,n){"use strict";var i=t(45);e.exports=function(t){function e(t,e){return i.where(t,function(t){return t.position===e})}function n(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i._tmpIndex_-a._tmpIndex_:i.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],o=a.length,r=0;rh&&st.maxHeight){s--;break}s++,c=u*d}t.labelRotation=s},afterCalculateTickRotation:function(){l.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){l.callback(this.options.beforeFit,[this])},fit:function(){var t=this,a=t.minSize={width:0,height:0},o=i(t._ticks),r=t.options,u=r.ticks,d=r.scaleLabel,c=r.gridLines,h=r.display,f=t.isHorizontal(),g=n(u),p=r.gridLines.tickMarkLength;if(a.width=f?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:h&&c.drawTicks?p:0,a.height=f?h&&c.drawTicks?p:0:t.maxHeight,d.display&&h){var v=s(d)+l.options.toPadding(d.padding).height;f?a.height+=v:a.width+=v}if(u.display&&h){var m=l.longestText(t.ctx,g.font,o,t.longestTextCache),b=l.numberOfLabelLines(o),x=.5*g.size,y=t.options.ticks.padding;if(f){t.longestLabelWidth=m;var k=l.toRadians(t.labelRotation),w=Math.cos(k),M=Math.sin(k)*m+g.size*b+x*(b-1)+x;a.height=Math.min(t.maxHeight,a.height+M+y),t.ctx.font=g.font;var S=e(t.ctx,o[0],g.font),C=e(t.ctx,o[o.length-1],g.font);0!==t.labelRotation?(t.paddingLeft="bottom"===r.position?w*S+3:w*x+3,t.paddingRight="bottom"===r.position?w*x+3:w*C+3):(t.paddingLeft=S/2+3,t.paddingRight=C/2+3)}else u.mirror?m=0:m+=y+x,a.width=Math.min(t.maxWidth,a.width+m),t.paddingTop=g.size/2,t.paddingBottom=g.size/2}t.handleMargins(),t.width=a.width,t.height=a.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){l.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(l.isNullOrUndef(t))return NaN;if("number"==typeof t&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:l.noop,getPixelForValue:l.noop,getValueForPixel:l.noop,getPixelForTick:function(t){var e=this,n=e.options.offset;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(n?0:1),1),a=i*t+e.paddingLeft;n&&(a+=i/2);var o=e.left+Math.round(a);return o+=e.isFullWidth()?e.margins.left:0}var r=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(r/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,i=e.left+Math.round(n);return i+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},_autoSkip:function(t){var e,n,i,a,o=this,r=o.isHorizontal(),s=o.options.ticks.minor,u=t.length,d=l.toRadians(o.labelRotation),c=Math.cos(d),h=o.longestLabelWidth*c,f=[];for(s.maxTicksLimit&&(a=s.maxTicksLimit),r&&(e=!1,(h+s.autoSkipPadding)*u>o.width-(o.paddingLeft+o.paddingRight)&&(e=1+Math.floor((h+s.autoSkipPadding)*u/(o.width-(o.paddingLeft+o.paddingRight)))),a&&u>a&&(e=Math.max(e,Math.floor(u/a)))),n=0;n1&&n%e>0||n%e==0&&n+e>=u)&&n!==u-1&&delete i.label,f.push(i);return f},draw:function(t){var e=this,i=e.options;if(i.display){var r=e.ctx,u=o.global,d=i.ticks.minor,c=i.ticks.major||d,h=i.gridLines,f=i.scaleLabel,g=0!==e.labelRotation,p=e.isHorizontal(),v=d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),m=l.valueOrDefault(d.fontColor,u.defaultFontColor),b=n(d),x=l.valueOrDefault(c.fontColor,u.defaultFontColor),y=n(c),k=h.drawTicks?h.tickMarkLength:0,w=l.valueOrDefault(f.fontColor,u.defaultFontColor),M=n(f),S=l.options.toPadding(f.padding),C=l.toRadians(e.labelRotation),_=[],D="right"===i.position?e.left:e.right-k,I="right"===i.position?e.left+k:e.right,P="bottom"===i.position?e.top:e.bottom-k,A="bottom"===i.position?e.top+k:e.bottom;if(l.each(v,function(n,o){if(!l.isNullOrUndef(n.label)){var r,s,c,f,m=n.label;o===e.zeroLineIndex&&i.offset===h.offsetGridLines?(r=h.zeroLineWidth,s=h.zeroLineColor,c=h.zeroLineBorderDash,f=h.zeroLineBorderDashOffset):(r=l.valueAtIndexOrDefault(h.lineWidth,o),s=l.valueAtIndexOrDefault(h.color,o),c=l.valueOrDefault(h.borderDash,u.borderDash),f=l.valueOrDefault(h.borderDashOffset,u.borderDashOffset));var b,x,y,w,M,S,T,F,O,R,L="middle",z="middle",B=d.padding;if(p){var W=k+B;"bottom"===i.position?(z=g?"middle":"top",L=g?"right":"center",R=e.top+W):(z=g?"middle":"bottom",L=g?"left":"center",R=e.bottom-W);var N=a(e,o,h.offsetGridLines&&v.length>1);N1);H0)n=t.stepSize;else{var o=i.niceNum(e.max-e.min,!1);n=i.niceNum(o/(t.maxTicks-1),!0)}var r=Math.floor(e.min/n)*n,l=Math.ceil(e.max/n)*n;t.min&&t.max&&t.stepSize&&i.almostWhole((t.max-t.min)/t.stepSize,n/1e3)&&(r=t.min,l=t.max);var s=(l-r)/n;s=i.almostEquals(s,Math.round(s),n/1e3)?Math.round(s):Math.ceil(s),a.push(void 0!==t.min?t.min:r);for(var u=1;u3?n[2]-n[1]:n[1]-n[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var o=i.log10(Math.abs(a)),r="";if(0!==t){var l=-1*Math.floor(o);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var a=t/Math.pow(10,Math.floor(i.log10(t)));return 0===t?"0":1===a||2===a||5===a||0===e||e===n.length-1?t.toExponential():""}}}},{45:45}],35:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:o.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?n=o.xLabel:a>0&&o.indexi.height-e.height&&(r="bottom");var l,s,u,d,c,h=(a.left+a.right)/2,f=(a.top+a.bottom)/2;"center"===r?(l=function(t){return t<=h},s=function(t){return t>h}):(l=function(t){return t<=e.width/2},s=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?"top":"bottom"},l(n.x)?(o="left",u(n.x)&&(o="center",r=c(n.y))):s(n.x)&&(o="right",d(n.x)&&(o="center",r=c(n.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:o,yAlign:g.yAlign?g.yAlign:r}}function d(t,e,n){var i=t.x,a=t.y,o=t.caretSize,r=t.caretPadding,l=t.cornerRadius,s=n.xAlign,u=n.yAlign,d=o+r,c=l+r;return"right"===s?i-=e.width:"center"===s&&(i-=e.width/2),"top"===u?a+=d:a-="bottom"===u?e.height+d:e.height/2,"center"===u?"left"===s?i+=d:"right"===s&&(i-=d):"left"===s?i-=c:"right"===s&&(i+=c),{x:i,y:a}}t.Tooltip=a.extend({initialize:function(){this._model=l(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options.callbacks,i=e.beforeTitle.apply(t,arguments),a=e.title.apply(t,arguments),o=e.afterTitle.apply(t,arguments),r=[];return r=n(r,i),r=n(r,a),r=n(r,o)},getBeforeBody:function(){var t=this._options.callbacks.beforeBody.apply(this,arguments);return o.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,e){var i=this,a=i._options.callbacks,r=[];return o.each(t,function(t){var o={before:[],lines:[],after:[]};n(o.before,a.beforeLabel.call(i,t,e)),n(o.lines,a.label.call(i,t,e)),n(o.after,a.afterLabel.call(i,t,e)),r.push(o)}),r},getAfterBody:function(){var t=this._options.callbacks.afterBody.apply(this,arguments);return o.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this,e=t._options.callbacks,i=e.beforeFooter.apply(t,arguments),a=e.footer.apply(t,arguments),o=e.afterFooter.apply(t,arguments),r=[];return r=n(r,i),r=n(r,a),r=n(r,o)},update:function(e){var n,i,a=this,c=a._options,h=a._model,f=a._model=l(c),g=a._active,p=a._data,v={xAlign:h.xAlign,yAlign:h.yAlign},m={x:h.x,y:h.y},b={width:h.width,height:h.height},x={x:h.caretX,y:h.caretY};if(g.length){f.opacity=1;var y=[],k=[];x=t.Tooltip.positioners[c.position].call(a,g,a._eventPosition);var w=[];for(n=0,i=g.length;n0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(this.drawBackground(i,e,t,n,a),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,a),this.drawBody(i,e,t,a),this.drawFooter(i,e,t,a))}},handleEvent:function(t){var e=this,n=e._options,i=!1;if(e._lastActive=e._lastActive||[],"mouseout"===t.type?e._active=[]:e._active=e._chart.getElementsAtEventForMode(t,n.mode,n),!(i=!o.arrayEquals(e._active,e._lastActive)))return!1;if(e._lastActive=e._active,n.enabled||n.custom){e._eventPosition={x:t.x,y:t.y};var a=e._model;e.update(!0),e.pivot(),i|=a.x!==e._model.x||a.y!==e._model.y}return i}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,o=0;for(e=0,n=t.length;es;)a-=2*Math.PI;for(;a=l&&a<=s,d=r>=n.innerRadius&&r<=n.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})},{25:25,26:26,45:45}],37:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45),r=i.global;i._set("global",{elements:{line:{tension:.4,backgroundColor:r.defaultColor,borderWidth:3,borderColor:r.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}}),e.exports=a.extend({draw:function(){var t,e,n,i,a=this,l=a._view,s=a._chart.ctx,u=l.spanGaps,d=a._children.slice(),c=r.elements.line,h=-1;for(a._loop&&d.length&&d.push(d[0]),s.save(),s.lineCap=l.borderCapStyle||c.borderCapStyle,s.setLineDash&&s.setLineDash(l.borderDash||c.borderDash),s.lineDashOffset=l.borderDashOffset||c.borderDashOffset,s.lineJoin=l.borderJoinStyle||c.borderJoinStyle,s.lineWidth=l.borderWidth||c.borderWidth,s.strokeStyle=l.borderColor||r.defaultColor,s.beginPath(),h=-1,t=0;te?1:-1,r=1,l=u.borderSkipped||"left"):(e=u.x-u.width/2,n=u.x+u.width/2,i=u.y,o=1,r=(a=u.base)>i?1:-1,l=u.borderSkipped||"bottom"),d){var c=Math.min(Math.abs(e-n),Math.abs(i-a)),h=(d=d>c?c:d)/2,f=e+("left"!==l?h*o:0),g=n+("right"!==l?-h*o:0),p=i+("top"!==l?h*r:0),v=a+("bottom"!==l?-h*r:0);f!==g&&(i=p,a=v),p!==v&&(e=f,n=g)}s.beginPath(),s.fillStyle=u.backgroundColor,s.strokeStyle=u.borderColor,s.lineWidth=d;var m=[[e,a],[e,i],[n,i],[n,a]],b=["bottom","left","top","right"].indexOf(l,0);-1===b&&(b=0);var x=t(0);s.moveTo(x[0],x[1]);for(var y=1;y<4;y++)x=t(y),s.lineTo(x[0],x[1]);s.fill(),d&&s.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var n=!1;if(this._view){var i=a(this);n=t>=i.left&&t<=i.right&&e>=i.top&&e<=i.bottom}return n},inLabelRange:function(t,e){var n=this;if(!n._view)return!1;var o=a(n);return i(n)?t>=o.left&&t<=o.right:e>=o.top&&e<=o.bottom},inXRange:function(t){var e=a(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=a(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,e,n=this._view;return i(this)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})},{25:25,26:26}],40:[function(t,e,n){"use strict";e.exports={},e.exports.Arc=t(36),e.exports.Line=t(37),e.exports.Point=t(38),e.exports.Rectangle=t(39)},{36:36,37:37,38:38,39:39}],41:[function(t,e,n){"use strict";var i=t(42),n=e.exports={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,o){if(o){var r=Math.min(o,i/2),l=Math.min(o,a/2);t.moveTo(e+r,n),t.lineTo(e+i-r,n),t.quadraticCurveTo(e+i,n,e+i,n+l),t.lineTo(e+i,n+a-l),t.quadraticCurveTo(e+i,n+a,e+i-r,n+a),t.lineTo(e+r,n+a),t.quadraticCurveTo(e,n+a,e,n+a-l),t.lineTo(e,n+l),t.quadraticCurveTo(e,n,e+r,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a){var o,r,l,s,u,d;if(!e||"object"!=typeof e||"[object HTMLImageElement]"!==(o=e.toString())&&"[object HTMLCanvasElement]"!==o){if(!(isNaN(n)||n<=0)){switch(e){default:t.beginPath(),t.arc(i,a,n,0,2*Math.PI),t.closePath(),t.fill();break;case"triangle":t.beginPath(),u=(r=3*n/Math.sqrt(3))*Math.sqrt(3)/2,t.moveTo(i-r/2,a+u/3),t.lineTo(i+r/2,a+u/3),t.lineTo(i,a-2*u/3),t.closePath(),t.fill();break;case"rect":d=1/Math.SQRT2*n,t.beginPath(),t.fillRect(i-d,a-d,2*d,2*d),t.strokeRect(i-d,a-d,2*d,2*d);break;case"rectRounded":var c=n/Math.SQRT2,h=i-c,f=a-c,g=Math.SQRT2*n;t.beginPath(),this.roundedRect(t,h,f,g,g,n/2),t.closePath(),t.fill();break;case"rectRot":d=1/Math.SQRT2*n,t.beginPath(),t.moveTo(i-d,a),t.lineTo(i,a+d),t.lineTo(i+d,a),t.lineTo(i,a-d),t.closePath(),t.fill();break;case"cross":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case"crossRot":t.beginPath(),l=Math.cos(Math.PI/4)*n,s=Math.sin(Math.PI/4)*n,t.moveTo(i-l,a-s),t.lineTo(i+l,a+s),t.moveTo(i-l,a+s),t.lineTo(i+l,a-s),t.closePath();break;case"star":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),l=Math.cos(Math.PI/4)*n,s=Math.sin(Math.PI/4)*n,t.moveTo(i-l,a-s),t.lineTo(i+l,a+s),t.moveTo(i-l,a+s),t.lineTo(i+l,a-s),t.closePath();break;case"line":t.beginPath(),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case"dash":t.beginPath(),t.moveTo(i,a),t.lineTo(i+n,a),t.closePath()}t.stroke()}}else t.drawImage(e,i-e.width/2,a-e.height/2,e.width,e.height)},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){if(n.steppedLine)return"after"===n.steppedLine&&!i||"after"!==n.steppedLine&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y),void t.lineTo(n.x,n.y);n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}};i.clear=n.clear,i.drawRoundedRectangle=function(t){t.beginPath(),n.roundedRect.apply(n,arguments),t.closePath()}},{42:42}],42:[function(t,e,n){"use strict";var i={noop:function(){},uid:function(){var t=0;return function(){return t++}}(),isNullOrUndef:function(t){return null===t||void 0===t},isArray:Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return i.valueOrDefault(i.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&"function"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,a){var o,r,l;if(i.isArray(t))if(r=t.length,a)for(o=r-1;o>=0;o--)e.call(n,t[o],o);else for(o=0;o=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-a.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*a.easeInBounce(2*t):.5*a.easeOutBounce(2*t-1)+.5}};e.exports={effects:a},i.easingEffects=a},{42:42}],44:[function(t,e,n){"use strict";var i=t(42);e.exports={toLineHeight:function(t,e){var n=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!n||"normal"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,n,a,o;return i.isObject(t)?(e=+t.top||0,n=+t.right||0,a=+t.bottom||0,o=+t.left||0):e=n=a=o=+t||0,{top:e,right:n,bottom:a,left:o,height:e+a,width:o+n}},resolve:function(t,e,n){var a,o,r;for(a=0,o=t.length;a
';var a=e.childNodes[0],r=e.childNodes[1];e._reset=function(){a.scrollLeft=1e6,a.scrollTop=1e6,r.scrollLeft=1e6,r.scrollTop=1e6};var l=function(){e._reset(),t()};return o(a,"scroll",l.bind(a,"expand")),o(r,"scroll",l.bind(r,"shrink")),e}function c(t,e){var n=t[m]||(t[m]={}),i=n.renderProxy=function(t){t.animationName===y&&e()};v.each(k,function(e){o(t,e,i)}),n.reflow=!!t.offsetParent,t.classList.add(x)}function h(t){var e=t[m]||{},n=e.renderProxy;n&&(v.each(k,function(e){r(t,e,n)}),delete e.renderProxy),t.classList.remove(x)}function f(t,e,n){var i=t[m]||(t[m]={}),a=i.resizer=d(u(function(){if(i.resizer)return e(l("resize",n))}));c(t,function(){if(i.resizer){var e=t.parentNode;e&&e!==a.parentNode&&e.insertBefore(a,e.firstChild),a._reset()}})}function g(t){var e=t[m]||{},n=e.resizer;delete e.resizer,h(t),n&&n.parentNode&&n.parentNode.removeChild(n)}function p(t,e){var n=t._style||document.createElement("style");t._style||(t._style=n,e="/* Chart.js */\n"+e,n.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(n)),n.appendChild(document.createTextNode(e))}var v=t(45),m="$chartjs",b="chartjs-",x=b+"render-monitor",y=b+"render-animation",k=["animationstart","webkitAnimationStart"],w={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},M=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};e.exports={_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,initialize:function(){var t="from{opacity:0.99}to{opacity:1}";p(this,"@-webkit-keyframes "+y+"{"+t+"}@keyframes "+y+"{"+t+"}."+x+"{-webkit-animation:"+y+" 0.001s;animation:"+y+" 0.001s;}")},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(a(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e[m]){var n=e[m].initial;["height","width"].forEach(function(t){var i=n[t];v.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)}),v.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e[m]}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=n[m]||(n[m]={});o(i,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){n(s(e,t))})}else f(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=((n[m]||{}).proxies||{})[t.id+"_"+e];a&&r(i,e,a)}else g(i)}},v.addEvent=o,v.removeEvent=r},{45:45}],48:[function(t,e,n){"use strict";var i=t(45),a=t(46),o=t(47),r=o._enabled?o:a;e.exports=i.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},r)},{45:45,46:46,47:47}],49:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("global",{plugins:{filler:{propagate:!0}}}),e.exports=function(){function t(t,e,n){var i,a=t._model||{},o=a.fill;if(void 0===o&&(o=!!a.backgroundColor),!1===o||null===o)return!1;if(!0===o)return"origin";if(i=parseFloat(o,10),isFinite(i)&&Math.floor(i)===i)return"-"!==o[0]&&"+"!==o[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function e(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?o=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?o=n.scaleZero:i.getBasePosition?o=i.getBasePosition():i.getBasePixel&&(o=i.getBasePixel()),void 0!==o&&null!==o){if(void 0!==o.x&&void 0!==o.y)return o;if("number"==typeof o&&isFinite(o))return e=i.isHorizontal(),{x:e?o:null,y:e?null:o}}return null}function n(t,e,n){var i,a=t[e].fill,o=[e];if(!n)return a;for(;!1!==a&&-1===o.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;o.push(a),a=i.fill}return!1}function r(t){var e=t.fill,n="dataset";return!1===e?null:(isFinite(e)||(n="boundary"),d[n](t))}function l(t){return t&&!t.skip}function s(t,e,n,i,a){var r;if(i&&a){for(t.moveTo(e[0].x,e[0].y),r=1;r0;--r)o.canvas.lineTo(t,n[r],n[r-1],!0)}}function u(t,e,n,i,a,o){var r,u,d,c,h,f,g,p=e.length,v=i.spanGaps,m=[],b=[],x=0,y=0;for(t.beginPath(),r=0,u=p+!!o;r');for(var n=0;n'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push("");return e.push(""),e.join("")}}),e.exports=function(t){function e(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}function n(e,n){var i=new t.Legend({ctx:e.ctx,options:n,chart:e});r.configure(e,i,n),r.addBox(e,i),e.legend=i}var r=t.layoutService,l=o.noop;return t.Legend=a.extend({initialize:function(t){o.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:l,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:l,beforeSetDimensions:l,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:l,beforeBuildLabels:l,buildLabels:function(){var t=this,e=t.options.labels||{},n=o.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter(function(n){return e.filter(n,t.chart.data)})),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:l,beforeFit:l,fit:function(){var t=this,n=t.options,a=n.labels,r=n.display,l=t.ctx,s=i.global,u=o.valueOrDefault,d=u(a.fontSize,s.defaultFontSize),c=u(a.fontStyle,s.defaultFontStyle),h=u(a.fontFamily,s.defaultFontFamily),f=o.fontString(d,c,h),g=t.legendHitBoxes=[],p=t.minSize,v=t.isHorizontal();if(v?(p.width=t.maxWidth,p.height=r?10:0):(p.width=r?10:0,p.height=t.maxHeight),r)if(l.font=f,v){var m=t.lineWidths=[0],b=t.legendItems.length?d+a.padding:0;l.textAlign="left",l.textBaseline="top",o.each(t.legendItems,function(n,i){var o=e(a,d)+d/2+l.measureText(n.text).width;m[m.length-1]+o+a.padding>=t.width&&(b+=d+a.padding,m[m.length]=t.left),g[i]={left:0,top:0,width:o,height:d},m[m.length-1]+=o+a.padding}),p.height+=b}else{var x=a.padding,y=t.columnWidths=[],k=a.padding,w=0,M=0,S=d+x;o.each(t.legendItems,function(t,n){var i=e(a,d)+d/2+l.measureText(t.text).width;M+S>p.height&&(k+=w+a.padding,y.push(w),w=0,M=0),w=Math.max(w,i),M+=S,g[n]={left:0,top:0,width:i,height:d}}),k+=w,y.push(w),p.width+=k}t.width=p.width,t.height=p.height},afterFit:l,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,n=t.options,a=n.labels,r=i.global,l=r.elements.line,s=t.width,u=t.lineWidths;if(n.display){var d,c=t.ctx,h=o.valueOrDefault,f=h(a.fontColor,r.defaultFontColor),g=h(a.fontSize,r.defaultFontSize),p=h(a.fontStyle,r.defaultFontStyle),v=h(a.fontFamily,r.defaultFontFamily),m=o.fontString(g,p,v);c.textAlign="left",c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=m;var b=e(a,g),x=t.legendHitBoxes,y=function(t,e,i){if(!(isNaN(b)||b<=0)){c.save(),c.fillStyle=h(i.fillStyle,r.defaultColor),c.lineCap=h(i.lineCap,l.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,l.borderDashOffset),c.lineJoin=h(i.lineJoin,l.borderJoinStyle),c.lineWidth=h(i.lineWidth,l.borderWidth),c.strokeStyle=h(i.strokeStyle,r.defaultColor);var a=0===h(i.lineWidth,l.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,l.borderDash)),n.labels&&n.labels.usePointStyle){var s=g*Math.SQRT2/2,u=s/Math.SQRT2,d=t+u,f=e+u;o.canvas.drawPoint(c,i.pointStyle,s,d,f)}else a||c.strokeRect(t,e,b,g),c.fillRect(t,e,b,g);c.restore()}},k=function(t,e,n,i){var a=g/2,o=b+a+t,r=e+a;c.fillText(n.text,o,r),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(o,r),c.lineTo(o+i,r),c.stroke())},w=t.isHorizontal();d=w?{x:t.left+(s-u[0])/2,y:t.top+a.padding,line:0}:{x:t.left+a.padding,y:t.top+a.padding,line:0};var M=g+a.padding;o.each(t.legendItems,function(e,n){var i=c.measureText(e.text).width,o=b+g/2+i,r=d.x,l=d.y;w?r+o>=s&&(l=d.y+=M,d.line++,r=d.x=t.left+(s-u[d.line])/2):l+M>t.bottom&&(r=d.x=r+t.columnWidths[d.line]+a.padding,l=d.y=t.top+a.padding,d.line++),y(r,l,e),x[n].left=r,x[n].top=l,k(r,l,e,i),w?d.x+=o+a.padding:d.y+=M})}},handleEvent:function(t){var e=this,n=e.options,i="mouseup"===t.type?"click":t.type,a=!1;if("mousemove"===i){if(!n.onHover)return}else{if("click"!==i)return;if(!n.onClick)return}var o=t.x,r=t.y;if(o>=e.left&&o<=e.right&&r>=e.top&&r<=e.bottom)for(var l=e.legendHitBoxes,s=0;s=u.left&&o<=u.left+u.width&&r>=u.top&&r<=u.top+u.height){if("click"===i){n.onClick.call(e,t.native,e.legendItems[s]),a=!0;break}if("mousemove"===i){n.onHover.call(e,t.native,e.legendItems[s]),a=!0;break}}}return a}}),{id:"legend",beforeInit:function(t){var e=t.options.legend;e&&n(t,e)},beforeUpdate:function(t){var e=t.options.legend,a=t.legend;e?(o.mergeIf(e,i.global.legend),a?(r.configure(t,a,e),a.options=e):n(t,e)):a&&(r.removeBox(t,a),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}}}},{25:25,26:26,45:45}],51:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,lineHeight:1.2,padding:10,position:"top",text:"",weight:2e3}}),e.exports=function(t){function e(e,i){var a=new t.Title({ctx:e.ctx,options:i,chart:e});n.configure(e,a,i),n.addBox(e,a),e.titleBlock=a}var n=t.layoutService,r=o.noop;return t.Title=a.extend({initialize:function(t){var e=this;o.extend(e,t),e.legendHitBoxes=[]},beforeUpdate:r,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:r,beforeSetDimensions:r,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:r,beforeBuildLabels:r,buildLabels:r,afterBuildLabels:r,beforeFit:r,fit:function(){var t=this,e=o.valueOrDefault,n=t.options,a=n.display,r=e(n.fontSize,i.global.defaultFontSize),l=t.minSize,s=o.isArray(n.text)?n.text.length:1,u=o.options.toLineHeight(n.lineHeight,r),d=a?s*u+2*n.padding:0;t.isHorizontal()?(l.width=t.maxWidth,l.height=d):(l.width=d,l.height=t.maxHeight),t.width=l.width,t.height=l.height},afterFit:r,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=o.valueOrDefault,a=t.options,r=i.global;if(a.display){var l,s,u,d=n(a.fontSize,r.defaultFontSize),c=n(a.fontStyle,r.defaultFontStyle),h=n(a.fontFamily,r.defaultFontFamily),f=o.fontString(d,c,h),g=o.options.toLineHeight(a.lineHeight,d),p=g/2+a.padding,v=0,m=t.top,b=t.left,x=t.bottom,y=t.right;e.fillStyle=n(a.fontColor,r.defaultFontColor),e.font=f,t.isHorizontal()?(s=b+(y-b)/2,u=m+p,l=y-b):(s="left"===a.position?b+p:y-p,u=m+(x-m)/2,l=x-m,v=Math.PI*("left"===a.position?-.5:.5)),e.save(),e.translate(s,u),e.rotate(v),e.textAlign="center",e.textBaseline="middle";var k=a.text;if(o.isArray(k))for(var w=0,M=0;Me.max&&(e.max=i))})});e.min=isFinite(e.min)&&!isNaN(e.min)?e.min:0,e.max=isFinite(e.max)&&!isNaN(e.max)?e.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var t,e=this,n=e.options.ticks;if(e.isHorizontal())t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.width/50));else{var o=a.valueOrDefault(n.fontSize,i.global.defaultFontSize);t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.height/(2*o)))}return t},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,n=this,i=n.start,a=+n.getRightValue(t),o=n.end-i;return n.isHorizontal()?(e=n.left+n.width/o*(a-i),Math.round(e)):(e=n.bottom-n.height/o*(a-i),Math.round(e))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=n?e.width:e.height,a=(n?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",n,e)}},{25:25,34:34,45:45}],54:[function(t,e,n){"use strict";var i=t(45),a=t(34);e.exports=function(t){var e=i.noop;t.LinearScaleBase=t.Scale.extend({getRightValue:function(e){return"string"==typeof e?+e:t.Scale.prototype.getRightValue.call(this,e)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=i.sign(t.min),a=i.sign(t.max);n<0&&a<0?t.max=0:n>0&&a>0&&(t.min=0)}var o=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),o!==r&&t.min>=t.max&&(o?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:e,handleDirectionalChanges:e,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),o={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,stepSize:i.valueOrDefault(e.fixedStepSize,e.stepSize)},r=t.ticks=a.generators.linear(o,t);t.handleDirectionalChanges(),t.max=i.max(r),t.min=i.min(r),e.reverse?(r.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{34:34,45:45}],55:[function(t,e,n){"use strict";var i=t(45),a=t(34);e.exports=function(t){var e={position:"left",ticks:{callback:a.formatters.logarithmic}},n=t.Scale.extend({determineDataLimits:function(){function t(t){return s?t.xAxisID===e.id:t.yAxisID===e.id}var e=this,n=e.options,a=n.ticks,o=e.chart,r=o.data.datasets,l=i.valueOrDefault,s=e.isHorizontal();e.min=null,e.max=null,e.minNotZero=null;var u=n.stacked;if(void 0===u&&i.each(r,function(e,n){if(!u){var i=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(u=!0)}}),n.stacked||u){var d={};i.each(r,function(a,r){var l=o.getDatasetMeta(r),s=[l.type,void 0===n.stacked&&void 0===l.stack?r:"",l.stack].join(".");o.isDatasetVisible(r)&&t(l)&&(void 0===d[s]&&(d[s]=[]),i.each(a.data,function(t,i){var a=d[s],o=+e.getRightValue(t);isNaN(o)||l.data[i].hidden||(a[i]=a[i]||0,n.relativePoints?a[i]=100:a[i]+=o)}))}),i.each(d,function(t){var n=i.min(t),a=i.max(t);e.min=null===e.min?n:Math.min(e.min,n),e.max=null===e.max?a:Math.max(e.max,a)})}else i.each(r,function(n,a){var r=o.getDatasetMeta(a);o.isDatasetVisible(a)&&t(r)&&i.each(n.data,function(t,n){var i=+e.getRightValue(t);isNaN(i)||r.data[n].hidden||(null===e.min?e.min=i:ie.max&&(e.max=i),0!==i&&(null===e.minNotZero||ia?{start:e-n-5,end:e}:{start:e,end:e+n+5}}function s(t){var i,o,s,u=n(t),d=Math.min(t.height/2,t.width/2),c={r:t.width,l:0,t:t.height,b:0},h={};t.ctx.font=u.font,t._pointLabelSizes=[];var f=e(t);for(i=0;ic.r&&(c.r=v.end,h.r=g),m.startc.b&&(c.b=m.end,h.b=g)}t.setReductions(d,c,h)}function u(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function d(t){return 0===t||180===t?"center":t<180?"left":"right"}function c(t,e,n,i){if(a.isArray(e))for(var o=n.y,r=1.5*i,l=0;l270||t<90)&&(n.y-=e.h)}function f(t){var i=t.ctx,o=a.valueOrDefault,r=t.options,l=r.angleLines,s=r.pointLabels;i.lineWidth=l.lineWidth,i.strokeStyle=l.color;var u=t.getDistanceFromCenterForValue(r.ticks.reverse?t.min:t.max),f=n(t);i.textBaseline="top";for(var g=e(t)-1;g>=0;g--){if(l.display){var p=t.getPointPosition(g,u);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(p.x,p.y),i.stroke(),i.closePath()}if(s.display){var m=t.getPointPosition(g,u+5),b=o(s.fontColor,v.defaultFontColor);i.font=f.font,i.fillStyle=b;var x=t.getIndexAngle(g),y=a.toDegrees(x);i.textAlign=d(y),h(y,t._pointLabelSizes[g],m),c(i,t.pointLabels[g]||"",m,f.size)}}}function g(t,n,i,o){var r=t.ctx;if(r.strokeStyle=a.valueAtIndexOrDefault(n.color,o-1),r.lineWidth=a.valueAtIndexOrDefault(n.lineWidth,o-1),t.options.gridLines.circular)r.beginPath(),r.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),r.closePath(),r.stroke();else{var l=e(t);if(0===l)return;r.beginPath();var s=t.getPointPosition(0,i);r.moveTo(s.x,s.y);for(var u=1;u0&&n>0?e:0)},draw:function(){var t=this,e=t.options,n=e.gridLines,i=e.ticks,o=a.valueOrDefault;if(e.display){var r=t.ctx,l=this.getIndexAngle(0),s=o(i.fontSize,v.defaultFontSize),u=o(i.fontStyle,v.defaultFontStyle),d=o(i.fontFamily,v.defaultFontFamily),c=a.fontString(s,u,d);a.each(t.ticks,function(e,a){if(a>0||i.reverse){var u=t.getDistanceFromCenterForValue(t.ticksAsNumbers[a]);if(n.display&&0!==a&&g(t,n,u,a),i.display){var d=o(i.fontColor,v.defaultFontColor);if(r.font=c,r.save(),r.translate(t.xCenter,t.yCenter),r.rotate(l),i.showLabelBackdrop){var h=r.measureText(e).width;r.fillStyle=i.backdropColor,r.fillRect(-h/2-i.backdropPaddingX,-u-s/2-i.backdropPaddingY,h+2*i.backdropPaddingX,s+2*i.backdropPaddingY)}r.textAlign="center",r.textBaseline="middle",r.fillStyle=d,r.fillText(e,0,-u),r.restore()}}}),(e.angleLines.display||e.pointLabels.display)&&f(t)}}});t.scaleService.registerScaleType("radialLinear",b,m)}},{25:25,34:34,45:45}],57:[function(t,e,n){"use strict";function i(t,e){return t-e}function a(t){var e,n,i,a={},o=[];for(e=0,n=t.length;ee&&l=0&&r<=l;){if(i=r+l>>1,a=t[i-1]||null,o=t[i],!a)return{lo:null,hi:o};if(o[e]n))return{lo:a,hi:o};l=i-1}}return{lo:o,hi:null}}function l(t,e,n,i){var a=r(t,e,n),o=a.lo?a.hi?a.lo:t[t.length-2]:t[0],l=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=l[e]-o[e],u=s?(n-o[e])/s:0,d=(l[i]-o[i])*u;return o[i]+d}function s(t,e){var n=e.parser,i=e.parser||e.format;return"function"==typeof n?n(t):"string"==typeof t&&"string"==typeof i?m(t,i):(t instanceof m||(t=m(t)),t.isValid()?t:"function"==typeof i?i(t):t)}function u(t,e){if(x.isNullOrUndef(t))return null;var n=e.options.time,i=s(e.getRightValue(t),n);return i.isValid()?(n.round&&i.startOf(n.round),i.valueOf()):null}function d(t,e,n,i){var a,o,r,l=e-t,s=w[n],u=s.size,d=s.steps;if(!d)return Math.ceil(l/((i||1)*u));for(a=0,o=d.length;a=M.indexOf(e);a--)if(o=M[a],w[o].common&&r.as(o)>=t.length)return o;return M[e?M.indexOf(e):0]}function f(t){for(var e=M.indexOf(t)+1,n=M.length;e1?e[1]:i,r=e[0],s=(l(t,"time",o,"pos")-l(t,"time",r,"pos"))/2),a.time.max||(o=e[e.length-1],r=e.length>1?e[e.length-2]:n,u=(l(t,"time",o,"pos")-l(t,"time",r,"pos"))/2)),{left:s,right:u}}function v(t,e){var n,i,a,o,r=[];for(n=0,i=t.length;n=a&&n<=r&&c.push(n);return i.min=a,i.max=r,i._unit=s.unit||h(c,s.minUnit,i.min,i.max),i._majorUnit=f(i._unit),i._table=o(i._timestamps.data,a,r,l.distribution),i._offsets=p(i._table,c,a,r,l),v(c,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.options.time,o=i.labels&&t=0&&t0?i:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(n){t(n).trigger(e.end)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var s in n)if(Object.prototype.hasOwnProperty.call(n,s)){var r=n[s],o=e[s],a=o&&i.isElement(o)?"element":(l=o,{}.toString.call(l).match(/\s([a-zA-Z]+)/)[1].toLowerCase());if(!new RegExp(r).test(a))throw new Error(t.toUpperCase()+': Option "'+s+'" provided type "'+a+'" but expected type "'+r+'".')}var l}};return e=("undefined"==typeof window||!window.QUnit)&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,i.supportsTransitionEnd()&&(t.event.special[i.TRANSITION_END]={bindType:e.end,delegateType:e.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),i}(e),L=(a="alert",h="."+(l="bs.alert"),c=(o=e).fn[a],u={CLOSE:"close"+h,CLOSED:"closed"+h,CLICK_DATA_API:"click"+h+".data-api"},f="alert",d="fade",_="show",g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.removeData(this._element,l),this._element=null},e._getRootElement=function(t){var e=P.getSelectorFromElement(t),n=!1;return e&&(n=o(e)[0]),n||(n=o(t).closest("."+f)[0]),n},e._triggerCloseEvent=function(t){var e=o.Event(u.CLOSE);return o(t).trigger(e),e},e._removeElement=function(t){var e=this;o(t).removeClass(_),P.supportsTransitionEnd()&&o(t).hasClass(d)?o(t).one(P.TRANSITION_END,function(n){return e._destroyElement(t,n)}).emulateTransitionEnd(150):this._destroyElement(t)},e._destroyElement=function(t){o(t).detach().trigger(u.CLOSED).remove()},t._jQueryInterface=function(e){return this.each(function(){var n=o(this),i=n.data(l);i||(i=new t(this),n.data(l,i)),"close"===e&&i[e](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),o(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),o.fn[a]=g._jQueryInterface,o.fn[a].Constructor=g,o.fn[a].noConflict=function(){return o.fn[a]=c,g._jQueryInterface},g),R=(m="button",E="."+(v="bs.button"),T=".data-api",y=(p=e).fn[m],C="active",I="btn",A="focus",b='[data-toggle^="button"]',D='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+T,FOCUS_BLUR_DATA_API:"focus"+E+T+" blur"+E+T},k=function(){function t(t){this._element=t}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=p(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&p(this._element).hasClass(C))t=!1;else{var s=p(n).find(w)[0];s&&p(s).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!p(this._element).hasClass(C),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!p(this._element).hasClass(C)),t&&p(this._element).toggleClass(C)},e.dispose=function(){p.removeData(this._element,v),this._element=null},t._jQueryInterface=function(e){return this.each(function(){var n=p(this).data(v);n||(n=new t(this),p(this).data(v,n)),"toggle"===e&&n[e]()})},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),p(document).on(O.CLICK_DATA_API,b,function(t){t.preventDefault();var e=t.target;p(e).hasClass(I)||(e=p(e).closest(N)),k._jQueryInterface.call(p(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,b,function(t){var e=p(t.target).closest(N)[0];p(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),p.fn[m]=k._jQueryInterface,p.fn[m].Constructor=k,p.fn[m].noConflict=function(){return p.fn[m]=y,k._jQueryInterface},k),j=function(t){var e="carousel",n="bs.carousel",i="."+n,o=t.fn[e],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h="next",c="prev",u="left",f="right",d={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},_="carousel",g="active",p="slide",m="carousel-item-right",v="carousel-item-left",E="carousel-item-next",T="carousel-item-prev",y={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},C=function(){function o(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(y.INDICATORS)[0],this._addEventListeners()}var C=o.prototype;return C.next=function(){this._isSliding||this._slide(h)},C.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},C.prev=function(){this._isSliding||this._slide(c)},C.pause=function(e){e||(this._isPaused=!0),t(this._element).find(y.NEXT_PREV)[0]&&P.supportsTransitionEnd()&&(P.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},C.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},C.to=function(e){var n=this;this._activeElement=t(this._element).find(y.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?h:c;this._slide(s,this._items[e])}},C.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},C._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},C._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},C._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},C._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(y.ITEM)),this._items.indexOf(e)},C._getItemByDirection=function(t,e){var n=t===h,i=t===c,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===c?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},C._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(y.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},C._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(y.ACTIVE).removeClass(g);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(g)}},C._slide=function(e,n){var i,s,r,o=this,a=t(this._element).find(y.ACTIVE_ITEM)[0],l=this._getItemIndex(a),c=n||a&&this._getItemByDirection(e,a),_=this._getItemIndex(c),C=Boolean(this._interval);if(e===h?(i=v,s=E,r=u):(i=m,s=T,r=f),c&&t(c).hasClass(g))this._isSliding=!1;else if(!this._triggerSlideEvent(c,r).isDefaultPrevented()&&a&&c){this._isSliding=!0,C&&this.pause(),this._setActiveIndicatorElement(c);var I=t.Event(d.SLID,{relatedTarget:c,direction:r,from:l,to:_});P.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(c).addClass(s),P.reflow(c),t(a).addClass(i),t(c).addClass(i),t(a).one(P.TRANSITION_END,function(){t(c).removeClass(i+" "+s).addClass(g),t(a).removeClass(g+" "+s+" "+i),o._isSliding=!1,setTimeout(function(){return t(o._element).trigger(I)},0)}).emulateTransitionEnd(600)):(t(a).removeClass(g),t(c).addClass(g),this._isSliding=!1,t(this._element).trigger(I)),C&&this.cycle()}},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},a,t(this).data());"object"==typeof e&&(s=r({},s,e));var l="string"==typeof e?e:s.slide;if(i||(i=new o(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof l){if("undefined"==typeof i[l])throw new TypeError('No method named "'+l+'"');i[l]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(e){var i=P.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(_)){var a=r({},t(s).data(),t(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(t(s),a),l&&t(s).data(n).to(l),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(d.CLICK_DATA_API,y.DATA_SLIDE,C._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(y.DATA_RIDE).each(function(){var e=t(this);C._jQueryInterface.call(e,e.data())})}),t.fn[e]=C._jQueryInterface,t.fn[e].Constructor=C,t.fn[e].noConflict=function(){return t.fn[e]=o,C._jQueryInterface},C}(e),H=function(t){var e="collapse",n="bs.collapse",i="."+n,o=t.fn[e],a={toggle:!0,parent:""},l={toggle:"boolean",parent:"(string|element)"},h={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},c="show",u="collapse",f="collapsing",d="collapsed",_="width",g="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},m=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s0&&(this._selector=o,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var o=i.prototype;return o.toggle=function(){t(this._element).hasClass(c)?this.hide():this.show()},o.show=function(){var e,s,r=this;if(!this._isTransitioning&&!t(this._element).hasClass(c)&&(this._parent&&0===(e=t.makeArray(t(this._parent).find(p.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(e=null),!(e&&(s=t(e).not(this._selector).data(n))&&s._isTransitioning))){var o=t.Event(h.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){e&&(i._jQueryInterface.call(t(e).not(this._selector),"hide"),s||t(e).data(n,null));var a=this._getDimension();t(this._element).removeClass(u).addClass(f),this._element.style[a]=0,this._triggerArray.length>0&&t(this._triggerArray).removeClass(d).attr("aria-expanded",!0),this.setTransitioning(!0);var l=function(){t(r._element).removeClass(f).addClass(u).addClass(c),r._element.style[a]="",r.setTransitioning(!1),t(r._element).trigger(h.SHOWN)};if(P.supportsTransitionEnd()){var _="scroll"+(a[0].toUpperCase()+a.slice(1));t(this._element).one(P.TRANSITION_END,l).emulateTransitionEnd(600),this._element.style[a]=this._element[_]+"px"}else l()}}},o.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(c)){var n=t.Event(h.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",P.reflow(this._element),t(this._element).addClass(f).removeClass(u).removeClass(c),this._triggerArray.length>0)for(var s=0;s0&&t(n).toggleClass(d,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(e){var n=P.getSelectorFromElement(e);return n?t(n)[0]:null},i._jQueryInterface=function(e){return this.each(function(){var s=t(this),o=s.data(n),l=r({},a,s.data(),"object"==typeof e&&e);if(!o&&l.toggle&&/show|hide/.test(e)&&(l.toggle=!1),o||(o=new i(this,l),s.data(n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),i}();return t(document).on(h.CLICK_DATA_API,p.DATA_TOGGLE,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var i=t(this),s=P.getSelectorFromElement(this);t(s).each(function(){var e=t(this),s=e.data(n)?"toggle":i.data();m._jQueryInterface.call(e,s)})}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),W=function(t){var e="dropdown",i="bs.dropdown",o="."+i,a=".data-api",l=t.fn[e],h=new RegExp("38|40|27"),c={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,CLICK:"click"+o,CLICK_DATA_API:"click"+o+a,KEYDOWN_DATA_API:"keydown"+o+a,KEYUP_DATA_API:"keyup"+o+a},u="disabled",f="show",d="dropup",_="dropright",g="dropleft",p="dropdown-menu-right",m="dropdown-menu-left",v="position-static",E='[data-toggle="dropdown"]',T=".dropdown form",y=".dropdown-menu",C=".navbar-nav",I=".dropdown-menu .dropdown-item:not(.disabled)",A="top-start",b="top-end",D="bottom-start",S="bottom-end",w="right-start",N="left-start",O={offset:0,flip:!0,boundary:"scrollParent"},k={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},L=function(){function a(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var l=a.prototype;return l.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(u)){var e=a._getParentFromElement(this._element),i=t(this._menu).hasClass(f);if(a._clearMenus(),!i){var s={relatedTarget:this._element},r=t.Event(c.SHOW,s);if(t(e).trigger(r),!r.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof n)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var o=this._element;t(e).hasClass(d)&&(t(this._menu).hasClass(m)||t(this._menu).hasClass(p))&&(o=e),"scrollParent"!==this._config.boundary&&t(e).addClass(v),this._popper=new n(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===t(e).closest(C).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(f),t(e).toggleClass(f).trigger(t.Event(c.SHOWN,s))}}}},l.dispose=function(){t.removeData(this._element,i),t(this._element).off(o),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},l.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},l._addEventListeners=function(){var e=this;t(this._element).on(c.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},l._getConfig=function(n){return n=r({},this.constructor.Default,t(this._element).data(),n),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},l._getMenuElement=function(){if(!this._menu){var e=a._getParentFromElement(this._element);this._menu=t(e).find(y)[0]}return this._menu},l._getPlacement=function(){var e=t(this._element).parent(),n=D;return e.hasClass(d)?(n=A,t(this._menu).hasClass(p)&&(n=b)):e.hasClass(_)?n=w:e.hasClass(g)?n=N:t(this._menu).hasClass(p)&&(n=S),n},l._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},l._getPopperConfig=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset,{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new a(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},a._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(E)),s=0;s0&&r--,40===e.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},f="show",d="out",_={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,INSERTED:"inserted"+o,CLICK:"click"+o,FOCUSIN:"focusin"+o,FOCUSOUT:"focusout"+o,MOUSEENTER:"mouseenter"+o,MOUSELEAVE:"mouseleave"+o},g="fade",p="show",m=".tooltip-inner",v=".arrow",E="hover",T="focus",y="click",C="manual",I=function(){function a(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var I=a.prototype;return I.enable=function(){this._isEnabled=!0},I.disable=function(){this._isEnabled=!1},I.toggleEnabled=function(){this._isEnabled=!this._isEnabled},I.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},I.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},I.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),o=P.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&t(r).addClass(g);var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:v},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d&&e._leave(null,e)};P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(this.tip).one(P.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},I.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==f&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,this._activeTrigger[E]=!1,P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(i).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},I.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},I.isWithContent=function(){return Boolean(this.getTitle())},I.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},I.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},I.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(m),this.getTitle()),e.removeClass(g+" "+p)},I.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},I.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},I._getAttachment=function(t){return c[t.toUpperCase()]},I._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==C){var i=n===E?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===E?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},I._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},I._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T:E]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===f?n._hoverState=f:(clearTimeout(n._timeout),n._hoverState=f,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===f&&n.show()},n.config.delay.show):n.show())},I._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T:E]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d&&n.hide()},n.config.delay.hide):n.hide())},I._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},I._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},I._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},I._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},I._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},I._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(g),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return o}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),x=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},U.Default,{placement:"right",trigger:"click",content:"",template:''}),h=r({},U.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",d=".popover-body",_={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},g=function(r){var o,g;function p(){return r.apply(this,arguments)||this}g=r,(o=p).prototype=Object.create(g.prototype),o.prototype.constructor=o,o.__proto__=g;var m=p.prototype;return m.isWithContent=function(){return this.getTitle()||this._getContent()},m.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},m.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},m.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(d),n),e.removeClass(c+" "+u)},m._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},m._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},p._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new p(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(p,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),p}(U);return t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),K=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,o=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},c="dropdown-item",u="active",f={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d="offset",_="position",g=function(){function o(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+f.NAV_LINKS+","+this._config.target+" "+f.LIST_ITEMS+","+this._config.target+" "+f.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var g=o.prototype;return g.refresh=function(){var e=this,n=this._scrollElement===this._scrollElement.window?d:_,i="auto"===this._config.method?n:this._config.method,s=i===_?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n,r=P.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var o=n.getBoundingClientRect();if(o.width||o.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},g.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},g._getConfig=function(n){if("string"!=typeof(n=r({},a,n)).target){var i=t(n.target).attr("id");i||(i=P.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return P.typeCheckConfig(e,n,l),n},g._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},g._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},g._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},g._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=P,t.Alert=L,t.Button=R,t.Carousel=j,t.Collapse=H,t.Dropdown=W,t.Modal=M,t.Popover=x,t.Scrollspy=K,t.Tab=V,t.Tooltip=U,Object.defineProperty(t,"__esModule",{value:!0})}); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/feather.min.js b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/feather.min.js new file mode 100644 index 0000000..307d788 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/feather.min.js @@ -0,0 +1,7 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.feather=n():e.feather=n()}("undefined"!=typeof self?self:this,function(){return function(e){function n(t){if(i[t])return i[t].exports;var l=i[t]={i:t,l:!1,exports:{}};return e[t].call(l.exports,l,l.exports,n),l.l=!0,l.exports}var i={};return n.m=e,n.c=i,n.d=function(e,i,t){n.o(e,i)||Object.defineProperty(e,i,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var i=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(i,"a",i),i},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n(n.s=49)}([function(e,n,i){var t=i(36)("wks"),l=i(15),r=i(1).Symbol,o="function"==typeof r;(e.exports=function(e){return t[e]||(t[e]=o&&r[e]||(o?r:l)("Symbol."+e))}).store=t},function(e,n){var i=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=i)},function(e,n){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,n,i){var t=i(1),l=i(7),r=i(8),o=i(10),a=i(11),c=function(e,n,i){var y,p,h,x,s=e&c.F,u=e&c.G,f=e&c.S,d=e&c.P,v=e&c.B,g=u?t:f?t[n]||(t[n]={}):(t[n]||{}).prototype,m=u?l:l[n]||(l[n]={}),w=m.prototype||(m.prototype={});u&&(i=n);for(y in i)p=!s&&g&&void 0!==g[y],h=(p?g:i)[y],x=v&&p?a(h,t):d&&"function"==typeof h?a(Function.call,h):h,g&&o(g,y,h,e&c.U),m[y]!=h&&r(m,y,x),d&&w[y]!=h&&(w[y]=h)};t.core=l,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},function(e,n,i){var t=i(9),l=i(29),r=i(31),o=Object.defineProperty;n.f=i(5)?Object.defineProperty:function(e,n,i){if(t(e),n=r(n,!0),t(i),l)try{return o(e,n,i)}catch(e){}if("get"in i||"set"in i)throw TypeError("Accessors not supported!");return"value"in i&&(e[n]=i.value),e}},function(e,n,i){e.exports=!i(12)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,n){var i={}.hasOwnProperty;e.exports=function(e,n){return i.call(e,n)}},function(e,n){var i=e.exports={version:"2.5.3"};"number"==typeof __e&&(__e=i)},function(e,n,i){var t=i(4),l=i(14);e.exports=i(5)?function(e,n,i){return t.f(e,n,l(1,i))}:function(e,n,i){return e[n]=i,e}},function(e,n,i){var t=i(2);e.exports=function(e){if(!t(e))throw TypeError(e+" is not an object!");return e}},function(e,n,i){var t=i(1),l=i(8),r=i(6),o=i(15)("src"),a=Function.toString,c=(""+a).split("toString");i(7).inspectSource=function(e){return a.call(e)},(e.exports=function(e,n,i,a){var y="function"==typeof i;y&&(r(i,"name")||l(i,"name",n)),e[n]!==i&&(y&&(r(i,o)||l(i,o,e[n]?""+e[n]:c.join(String(n)))),e===t?e[n]=i:a?e[n]?e[n]=i:l(e,n,i):(delete e[n],l(e,n,i)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[o]||a.call(this)})},function(e,n,i){var t=i(32);e.exports=function(e,n,i){if(t(e),void 0===n)return e;switch(i){case 1:return function(i){return e.call(n,i)};case 2:return function(i,t){return e.call(n,i,t)};case 3:return function(i,t,l){return e.call(n,i,t,l)}}return function(){return e.apply(n,arguments)}}},function(e,n){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,n){e.exports={}},function(e,n){e.exports=function(e,n){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:n}}},function(e,n){var i=0,t=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++i+t).toString(36))}},function(e,n,i){var t=i(34),l=i(19);e.exports=function(e){return t(l(e))}},function(e,n,i){var t=i(11),l=i(38),r=i(39),o=i(9),a=i(22),c=i(40),y={},p={},n=e.exports=function(e,n,i,h,x){var s,u,f,d,v=x?function(){return e}:c(e),g=t(i,h,n?2:1),m=0;if("function"!=typeof v)throw TypeError(e+" is not iterable!");if(r(v)){for(s=a(e.length);s>m;m++)if((d=n?g(o(u=e[m])[0],u[1]):g(e[m]))===y||d===p)return d}else for(f=v.call(e);!(u=f.next()).done;)if((d=l(f,g,u.value,n))===y||d===p)return d};n.BREAK=y,n.RETURN=p},function(e,n){var i=Math.ceil,t=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?t:i)(e)}},function(e,n){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,n,i){"use strict";var t=i(52),l=i(3),r=i(10),o=i(8),a=i(6),c=i(13),y=i(53),p=i(24),h=i(59),x=i(0)("iterator"),s=!([].keys&&"next"in[].keys()),u=function(){return this};e.exports=function(e,n,i,f,d,v,g){y(i,n,f);var m,w,M,b=function(e){if(!s&&e in z)return z[e];switch(e){case"keys":case"values":return function(){return new i(this,e)}}return function(){return new i(this,e)}},_=n+" Iterator",A="values"==d,k=!1,z=e.prototype,S=z[x]||z["@@iterator"]||d&&z[d],H=!s&&S||b(d),V=d?A?b("entries"):H:void 0,O="Array"==n?z.entries||S:S;if(O&&(M=h(O.call(new e)))!==Object.prototype&&M.next&&(p(M,_,!0),t||a(M,x)||o(M,x,u)),A&&S&&"values"!==S.name&&(k=!0,H=function(){return S.call(this)}),t&&!g||!s&&!k&&z[x]||o(z,x,H),c[n]=H,c[_]=u,d)if(m={values:A?H:b("values"),keys:v?H:b("keys"),entries:V},g)for(w in m)w in z||r(z,w,m[w]);else l(l.P+l.F*(s||k),n,m);return m}},function(e,n,i){var t=i(55),l=i(37);e.exports=Object.keys||function(e){return t(e,l)}},function(e,n,i){var t=i(18),l=Math.min;e.exports=function(e){return e>0?l(t(e),9007199254740991):0}},function(e,n,i){var t=i(36)("keys"),l=i(15);e.exports=function(e){return t[e]||(t[e]=l(e))}},function(e,n,i){var t=i(4).f,l=i(6),r=i(0)("toStringTag");e.exports=function(e,n,i){e&&!l(e=i?e:e.prototype,r)&&t(e,r,{configurable:!0,value:n})}},function(e,n,i){var t=i(19);e.exports=function(e){return Object(t(e))}},function(e,n,i){var t=i(35),l=i(0)("toStringTag"),r="Arguments"==t(function(){return arguments}()),o=function(e,n){try{return e[n]}catch(e){}};e.exports=function(e){var n,i,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(i=o(n=Object(e),l))?i:r?t(n):"Object"==(a=t(n))&&"function"==typeof n.callee?"Arguments":a}},function(e,n,i){"use strict";function t(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(n,"__esModule",{value:!0});var l=i(86),r=t(l),o=i(88),a=t(o),c=i(89),y=t(c);n.default=Object.keys(a.default).map(function(e){return new r.default(e,a.default[e],y.default[e])}).reduce(function(e,n){return e[n.name]=n,e},{})},function(e,n,i){"use strict";var t=i(51)(!0);i(20)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,n=this._t,i=this._i;return i>=n.length?{value:void 0,done:!0}:(e=t(n,i),this._i+=e.length,{value:e,done:!1})})},function(e,n,i){e.exports=!i(5)&&!i(12)(function(){return 7!=Object.defineProperty(i(30)("div"),"a",{get:function(){return 7}}).a})},function(e,n,i){var t=i(2),l=i(1).document,r=t(l)&&t(l.createElement);e.exports=function(e){return r?l.createElement(e):{}}},function(e,n,i){var t=i(2);e.exports=function(e,n){if(!t(e))return e;var i,l;if(n&&"function"==typeof(i=e.toString)&&!t(l=i.call(e)))return l;if("function"==typeof(i=e.valueOf)&&!t(l=i.call(e)))return l;if(!n&&"function"==typeof(i=e.toString)&&!t(l=i.call(e)))return l;throw TypeError("Can't convert object to primitive value")}},function(e,n){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,n,i){var t=i(9),l=i(54),r=i(37),o=i(23)("IE_PROTO"),a=function(){},c=function(){var e,n=i(30)("iframe"),t=r.length;for(n.style.display="none",i(58).appendChild(n),n.src="javascript:",e=n.contentWindow.document,e.open(),e.write(" - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/includes/top.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/includes/top.jsp deleted file mode 100644 index 85cb24b..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/includes/top.jsp +++ /dev/null @@ -1,33 +0,0 @@ - - -<%@ page pageEncoding="UTF-8" %> -<%@ page contentType="text/html; charset=UTF-8" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> -<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - - - - - - CAS – Central Authentication Service - - - - - - - " /> - " type="image/x-icon" /> - - - - -
-
- -

Central Authentication Service (CAS)

-
-
diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp deleted file mode 100644 index a9fcb96..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - -
-

-

-
- diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp deleted file mode 100644 index 2624d1d..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/errors.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/errors.jsp deleted file mode 100644 index ed48be6..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/errors.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewConfig.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewConfig.jsp deleted file mode 100644 index 0a380a8..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewConfig.jsp +++ /dev/null @@ -1,74 +0,0 @@ -<%@include file="/WEB-INF/view/jsp/default/ui/includes/top.jsp"%> - - - - - - - -
-

- - -
-

-
- "> -
-
- -
-
- -
-
-

-
-
-
- - - - - - - - - - - - - - -
-
- -
- -
-
- "> -
-
- -
-<%@include file="/WEB-INF/view/jsp/default/ui/includes/bottom.jsp" %> diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewSsoSessions.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewSsoSessions.jsp deleted file mode 100644 index 58bcc17..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewSsoSessions.jsp +++ /dev/null @@ -1,323 +0,0 @@ -<%@include file="/WEB-INF/view/jsp/default/ui/includes/top.jsp"%> - - - -
-

- -
-

-
- "> -
-
- -
-
- -
-
-

-
-
-
-
-
-
-
-
-
- -
-
-
0
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
0
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
0
-
-
-
-
-
-
- <%--
graph
--%> -
-
- -
-
- - - -
- - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - -
   
UserTGTAuth_DateUsage_Count
-
-
- -
- "> -
-
-
-
-
-<%@include file="/WEB-INF/view/jsp/default/ui/includes/bottom.jsp" %> diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewStatistics.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewStatistics.jsp deleted file mode 100644 index 22c8ced..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewStatistics.jsp +++ /dev/null @@ -1,218 +0,0 @@ -<%@include file="/WEB-INF/view/jsp/default/ui/includes/top.jsp"%> - - - -
Loading...
- -
-

- -
- <%-- Registry Ticket Section --%> -

-
-
-
-
-
-
-
-
${unexpiredTgts}
-
-
-
-
-
-
-
-
-
-
-
-
${unexpiredSts}
-
-
-
-
-
-
-
-
-
-
-
-
${expiredTgts}
-
-
-
-
-
-
-
-
-
-
-
-
${expiredSts}
-
-
-
-
-
-
-
- -
-
- -

-
- <%-- JVM Server Section --%> -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
${serverIpAddress} (${serverHostName})
${casTicketSuffix}
${startTime}
${upTime}
${freeMemory} MB
${totalMemory} MB
${maxMemory} MB
${availableProcessors}
-
-
-
-
- -
- <%-- Thread Dump Section --%> -
-

-
-

-                    
-                
-
-
- -
- <%-- Metrics Section --%> -
-

- -
-
-
- - - - - - -<%@include file="/WEB-INF/view/jsp/default/ui/includes/bottom.jsp" %> diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxyFailureView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxyFailureView.jsp deleted file mode 100644 index 6e8d26e..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxyFailureView.jsp +++ /dev/null @@ -1,7 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - - ${fn:escapeXml(description)} - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxySuccessView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxySuccessView.jsp deleted file mode 100644 index 2a948ff..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxySuccessView.jsp +++ /dev/null @@ -1,7 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - - ${fn:escapeXml(ticket)} - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationFailure.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationFailure.jsp deleted file mode 100644 index cdeaebe..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationFailure.jsp +++ /dev/null @@ -1,7 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - - ${fn:escapeXml(description)} - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp deleted file mode 100644 index 8c1434f..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp +++ /dev/null @@ -1,18 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> - - - ${fn:escapeXml(principal.id)} - - ${pgtIou} - - - - - ${fn:escapeXml(proxy.principal.id)} - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationFailure.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationFailure.jsp deleted file mode 100644 index cdeaebe..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationFailure.jsp +++ /dev/null @@ -1,7 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - - ${fn:escapeXml(description)} - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationSuccess.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationSuccess.jsp deleted file mode 100644 index 6c7c996..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationSuccess.jsp +++ /dev/null @@ -1,36 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ page import="java.util.*, java.util.Map.Entry" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> - - - ${fn:escapeXml(principal.id)} - - ${pgtIou} - - - - - ${fn:escapeXml(proxy.principal.id)} - - - - - - - - - - ${fn:escapeXml(attrval)} - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/casPostResponseView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/casPostResponseView.jsp deleted file mode 100644 index 0c2a471..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/casPostResponseView.jsp +++ /dev/null @@ -1,17 +0,0 @@ -<%@ page language="java" session="false"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - -
" method="post"> -
- - - -
- -
- - \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassFailure.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassFailure.jsp deleted file mode 100644 index 8e3a273..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassFailure.jsp +++ /dev/null @@ -1,5 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - ${fn:escapeXml(description)} - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassSuccess.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassSuccess.jsp deleted file mode 100644 index aa85b18..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassSuccess.jsp +++ /dev/null @@ -1,8 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> - - - ${fn:escapeXml(credentials)} - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/oauth/confirm.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/oauth/confirm.jsp deleted file mode 100644 index defed10..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/oauth/confirm.jsp +++ /dev/null @@ -1,13 +0,0 @@ - -
-

- -

- -

- -

- -

-
- diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationFailureView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationFailureView.jsp deleted file mode 100644 index 8e376b0..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationFailureView.jsp +++ /dev/null @@ -1 +0,0 @@ -<%= "openid.mode:cancel\n" %> \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationSuccessView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationSuccessView.jsp deleted file mode 100644 index dea573d..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationSuccessView.jsp +++ /dev/null @@ -1,9 +0,0 @@ -<%@ page import="java.util.Set, java.util.Map, java.util.Iterator" %><% - Map parameters = (Map)request.getAttribute("parameters"); - Iterator iterator = parameters.keySet().iterator(); - while (iterator.hasNext()) { - String key = (String)iterator.next(); - String parameter = (String)parameters.get(key); - out.print(key+":"+parameter+"\n"); - } -%> \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceFailureView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceFailureView.jsp deleted file mode 100644 index 31150f3..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceFailureView.jsp +++ /dev/null @@ -1 +0,0 @@ -<%= "openid.mode:id_res\nis_valid:false\n" %> \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceSuccessView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceSuccessView.jsp deleted file mode 100644 index d108cde..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceSuccessView.jsp +++ /dev/null @@ -1 +0,0 @@ -<%= "openid.mode:id_res\nis_valid:true\n" %> \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/user.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/user.jsp deleted file mode 100644 index 05a1dbc..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/user.jsp +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/web.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/web.xml deleted file mode 100644 index 7cbeb61..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/web.xml +++ /dev/null @@ -1,258 +0,0 @@ - - - Central Authentication System (CAS) - - - isLog4jAutoInitializationDisabled - true - - - org.apache.logging.log4j.web.Log4jServletContextListener - - - - contextConfigLocation - - /WEB-INF/spring-configuration/*.xml - /WEB-INF/deployerConfigContext.xml - - classpath*:/META-INF/spring/*.xml - - - - - characterEncodingFilter - org.springframework.web.filter.DelegatingFilterProxy - true - - - characterEncodingFilter - /* - - - - CAS Client Info Logging Filter - org.jasig.inspektr.common.web.ClientInfoThreadLocalFilter - true - - - CAS Client Info Logging Filter - /* - - - - requestParameterSecurityFilter - org.springframework.web.filter.DelegatingFilterProxy - true - - - requestParameterSecurityFilter - /* - - - - responseHeadersSecurityFilter - org.springframework.web.filter.DelegatingFilterProxy - true - - - responseHeadersSecurityFilter - /* - - - - - - org.springframework.web.context.ContextLoaderListener - - - - - org.jasig.cas.CasEnvironmentContextListener - - - - - - cas - - org.springframework.web.servlet.DispatcherServlet - - - contextConfigLocation - - /WEB-INF/cas-servlet.xml,classpath*:/META-INF/cas-servlet-*.xml,/WEB-INF/cas-servlet-*.xml - - - publishContext - false - - 1 - true - - - - cas - /login - - - - cas - /logout - - - - cas - /validate - - - - cas - /serviceValidate - - - - cas - /p3/serviceValidate - - - - cas - /proxy - - - - cas - /proxyValidate - - - - cas - /p3/proxyValidate - - - - cas - /CentralAuthenticationService - - - - cas - /status - - - - cas - /statistics - - - - cas - /statistics/ping - - - - cas - /statistics/metrics - - - - cas - /statistics/threads - - - - cas - /statistics/healthcheck - - - - cas - /statistics/ssosessions/* - - - - cas - /statistics/ssosessions - - - - cas - /status/config/* - - - - cas - /status/config - - - - cas - /authorizationFailure.html - - - - cas - /v1/tickets/* - - - cas - /v1/services/* - - - - - 5 - COOKIE - - true - - - - - 401 - /authorizationFailure.html - - - - 403 - /authorizationFailure.html - - - - 404 - / - - - - 500 - /WEB-INF/view/jsp/errors.jsp - - - - 501 - /WEB-INF/view/jsp/errors.jsp - - - - 503 - /WEB-INF/view/jsp/errors.jsp - - - - index.jsp - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/login/login-webflow.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/login/login-webflow.xml deleted file mode 100644 index e4bd281..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/login/login-webflow.xml +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/logout/logout-webflow.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/logout/logout-webflow.xml deleted file mode 100644 index 100ccc3..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/logout/logout-webflow.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/cas.css b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/cas.css deleted file mode 100644 index 9b9eaf6..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/cas.css +++ /dev/null @@ -1,528 +0,0 @@ -/*@import url(https://fonts.googleapis.com/css?family=Lato);*/ -@import url(https://fonts.googleapis.com/css?family=Lato:700,400,300,100); - -html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, -address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, -b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, -thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, -hgroup, menu, nav, section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - outline: 0; - font-size: 100%; - vertical-align: baseline; - background: transparent; -} -body { line-height: 1; } -nav ul { list-style: none; } -blockquote, q { quotes: none; } -blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } -a { margin: 0; padding: 0; font-size: 100%; vertical-align: baseline; background: transparent; } -ins { background-color: #ff9; color: #000; text-decoration: none; } -mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; } -del { text-decoration: line-through; } -abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; } -table { border-collapse: collapse; border-spacing: 0; } -hr { display: block; height: 1px; border: 0; border-top: 1px solid #cccccc; margin: 1em 0; padding: 0; } -input, select { vertical-align: middle; } -body { font-family: Verdana, sans-serif; font-size: 11px; line-height: 1.4em; background: #eee; } - -#container { width: 960px; margin: 0 auto; } - - - -@media screen and (min-width: 960px) { - #container { width: 960px; } -} - -@media screen and (min-width: 1280px) { - #ssosessions-page #container { width: 1280px; } -} - -@media only screen and (max-width: 960px) { - #container { width: 100%; } - #content { - -webkit-border-bottom-right-radius: 0px; - -webkit-border-bottom-left-radius: 0px; - -moz-border-radius-bottomright: 0px; - -moz-border-radius-bottomleft: 0px; - border-bottom-right-radius: 0px; - border-bottom-left-radius: 0px; - } -} - -body#cas { - background: #153e50; /* Old browsers */ -} - -a:link, a:visited { - color: #257bb2; -} - -a:hover { - color: #a0b757; -} - -p { - margin-bottom: 1.4em; -} - -header { - overflow: hidden; - padding: 20px 0; -} - -#logo { - display: block; - background: url(../images/logo.png) no-repeat; - text-indent: -999em; - float: left; - height: 100px; - width: 80%; - margin-right: 40px; - border: 0px; -} - -header h1 { - float: right; - width: 119px; - height: 60px; - background: url(../images/cas-logo.png) no-repeat; - text-indent: -999em; -} - -#content { - overflow: hidden; - background: #fff; - padding: 20px; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; -} - -#msg { - padding: 20px; - margin-bottom: 40px; -} - -#msg.errors { - border: 1px dotted #BB0000; - color: #BB0000; - padding-left: 100px; - background: url(../images/error.png) no-repeat 20px center; -} - -#msg.success { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../images/success.png) no-repeat 20px center; } -#msg.info { border: 1px dotted #008; color: #008; padding-left: 100px; background: url(../images/info.png) no-repeat 20px center; } -#msg.question { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../images/question.png) no-repeat 20px center; } -#msg.warn { border: 1px dotted #960; color: #960; padding-left: 100px; background: #ffbc8f url(../images/info.png) no-repeat 20px center; } - -.errors { - border: 1px dotted #BB0000; - color: #BB0000; - padding-left: 100px; - padding-top:5px; - margin-bottom:5px; - background: url(../images/error.png) no-repeat 20px center; -} - -#serviceui.serviceinfo { - border: 1px dotted #0066FF; - color: black; - padding-left: 10px; - padding-top: 5px; -} - -#servicedesc { - vertical-align:middle; - padding-left: 30px; - width: 90%; -} - -#login { - width: 320px; - float: left; - margin-right: 20px; -} - -#login h2 { - font-weight: normal; - font-size: 1.4em; - margin-bottom: 20px; -} - -#login .row { - padding: 10px 0; -} - -#login label { - display: block; - margin-bottom: 2px; -} - -#login .check label { - display: inline; -} - -#login input[type=text], #login input[type=password] { - font-size: 1.4em; - padding: 5px; -} - -#login .btn-submit { - background: #70ba61; - border: 0; - padding: 10px 20px; - font-weight: bold; - color: white; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-reset { - background: #eee; - padding: 10px 20px; - border: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-submit:hover, #login .btn-reset:hover { - cursor: pointer; -} - -#login .btn-submit:hover { - background: #7fd36e; -} - -#login .btn-reset:hover { - background: #d4d4d4; -} - -#sidebar { - width: auto; - height: 100%; -} - -#sidebar-content { - padding-left: 20px; -} - -#list-providers ul { - margin-bottom: 3em; -} - -#list-languages h3, #list-providers h3 { - margin-bottom: 1.4em; -} - -#list-languages ul li, #list-providers ul li { - list-style: none; - display: inline-block; - margin-right: 2em; -} - -footer { - padding: 20px; - color: white; -} - -footer a:link, footer a:visited { - color: white; -} - -@media only screen and (max-width: 960px) { - header { padding: 20px; } - #container { width: 100%; } - #content { - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; - } -} - -@media only screen and (max-width: 855px) { - #logo { display: none; } - header h1 { font-size: 1em; width: 70px; height: 40px; background-size: 70px 40px; } - #login { float: none; width: 100%; } - #fm1 .row input[type=text], - #fm1 .row input[type=password] { width: 100%; padding: 10px; box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; } - #fm1 .row .btn-submit { outline: none; -webkit-appearance: none; -webkit-border-radius: 0; border: 0; background: #70ba61; color: white; font-weight: bold; width: 100%; padding: 10px 20px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } - #fm1 .row .btn-reset { display: none; } - #sidebar { margin-top: 20px; } - #sidebar .sidebar-content { padding: 0; } -} - - -/** - * SSO Sessions Styles - */ -#loadingMessage { - font-size: 14px; -} - -#cas-sessions, #no-cas-sessions { - display: none; -} -#no-cas-sessions div { - margin-top: 2em; -} - -.ssoSessions #content { - border-radius: 4px; - padding: 20px; -} - -#container-stable { - margin: 20px 0 20px; -} - -.ssoSessions .btn-success { - background: #70ba61; - border: 0; - padding: 10px 20px; - font-weight: bold; - color: white; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.ssoSessions .sorting_desc, .ssoSessions .sorting_asc { - background-color: rgba(239, 239, 239, 0.8); -} -.ssoSessions #removeAllSessionsButton.btn .badge { - color: #000; - padding-right: 9px; -} - -.ssoSessions .adminPanels { - border-bottom: 1px solid #efefef; - margin-bottom: 2em; - margin-top: 1em; - padding-bottom: 1em; -} - -.ssoSessions .adminPanels .panel-default>.panel-heading { - background-color: #fff; - border-bottom: none; -} -.ssoSessions .adminPanels .panel-default>.panel-heading h3 { - font-family: 'Lato', sans-serif; - font-weight: 300; - font-size: 20pt; -} - -.ssoSessions .adminPanels .panel-default > .panel-heading:after { - position: absolute; - font-family: FontAwesome; - top: -5px; - right: 30px; - font-size: 70pt; - color: #153e50; - opacity: 0.1; -} -.adminPanels .users-panel.panel-default > .panel-heading:after { - content: "\f0c0"; -} - -.adminPanels .usage-panel.panel-default > .panel-heading:after { - content: "\f201"; -} - -.adminPanels .tickets-panel.panel-default > .panel-heading:after { - content: "\f145"; -} - - -.ssoSessions td.details-control { - cursor: pointer; - font-family: FontAwesome; - font-size: 10pt; - color: #337ab7; -} -.ssoSessions td.details-control:after { - content: "\f067"; - /*content: "\002B"; - thinner plus sign */ -} -.ssoSessions tr.shown td.details-control:after { - content: "\f068"; - /*content: "\002D"; - thinner minus sign */ -} - -.row-detail-wrapper { - /*background-color: cornsilk;*/ - background-color: #d9edf7; -} -.ssoSessions .row-detail thead { - display: none; -} -.ssoSessions .row-detail { - /*font-size: 8pt;*/ - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} -.ssoSessions .field-label { - /*font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;*/ - /*font-size: 8pt;*/ - /*font-weight: bold;*/ -} - -.principal_attributes td:first-child { - width: 30%; -} -table.principal_attributes>tbody>tr>td { - border-top-color: #E6E6E6; -} - -.adminPanels .panel-body { - padding-top: 5px; -} -.adminPanels .panel-body span { - font-family: 'Lato', sans-serif; - font-size: 30pt; - font-weight: 100; -} - -.row-eq-height { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; -} - -#alertBox { - display: none; -} - -/** - SB Admin Styles - */ - -.huge { - font-size: 30pt; - font-family: 'Lato', sans-serif; - font-weight: 300; -} - -.semi-huge { - font-size: 18pt; - font-family: 'Lato', sans-serif; - font-weight: 300; -} -/** - * Statistics View - */ - -.statisticsView { - display: none; -} - -.statisticsView .progress-meter .background { - fill: #DFEAFD; -} -.statisticsView .progress-meter .foreground { - fill: #2E7AF9; -} -.statisticsView .progress-meter text { - font-family: 'Lato' sans-serif; - font-size: 25pt; - font-weight: 300; -} -.statisticsView .progress-meter .text2 { - font-family: 'Georgia' sans-serif; - font-size: 10pt; -} - -.modal { - display: none; -} - -/** - * Runtime Statistics Gauge styles - */ -.statisticsView .runtimeStatistics .background { - fill: #DFEAFD; -} -.statisticsView .runtimeStatistics .foreground { - fill: #2E7AF9; -} -.statisticsView .runtimeStatistics text { - font-family: 'Lato' sans-serif; - font-size: 25pt; - font-weight: 300; -} -.statisticsView .runtimeStatistics .text2 { - font-family: 'Georgia' sans-serif; - font-size: 10pt; -} -#uptime-panel { - display: none; -} -#uptime { - font-family: 'Lato', sans-serif; - font-size: 16pt; -} - -.thread-dump-view { - height: 600px; - overflow-y: auto; -} - -#metricsGauges strong { - display: block; -} - -#metricsGauges .panel { - width: 100%; -} - -#metricsGauges ul { - height : auto; - overflow : hidden; -} - -#metricsGauges li { - float : left; - width : 80px; - height: 80px; - margin: 0 0 10px 10px; - background : #d8d8d8; - -} -#metricsGauges ul li:nth-child(5n + 1) { - clear : left; -} - - -.statisticsView .equal, .statisticsView .equal > div[class*='col-'] { - display: -webkit-box; - display: -moz-box; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - flex:1 1 auto; -} - -.statisticsView .section { - margin-bottom: 25px; -} - -#viewSsoSessions { - color: white; -} - -.statisticsView .adminPanels.container-fluid { - padding-right: 0; -} - -/** - * View Configuration Styles - */ -#viewConfigError { - display: none; -} -#view-configuration { - display: none; -} diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/ssosessions.css b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/ssosessions.css deleted file mode 100644 index 793d0ba..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/ssosessions.css +++ /dev/null @@ -1,130 +0,0 @@ -/* -/* --------------- CUSTOM STYLES -*/ - -body,html { - background: #153e50; -} - -/*body,html,*/ - -#cas-sessions, -#container-stable, -.ui-widget { - font-family: 'Lato', sans-serif !important; - font-size: 14px; -} - - -/* Navigation -- */ -.navbar-default .navbar-brand, -.navbar-default .navbar-toggle { - color: #ffffff; -} -.navbar-default .navbar-brand { - font-family: 'Open Sans', sans-serif; - color: #ffffff; - line-height: 32px; - font-size: 20px; - padding: 0; - position: relative; - top: 8px; - left: 5px; -} -.navbar-default .navbar-brand:hover { - color: #ffffff; -} -.navbar-default .navbar-brand img { - margin-right: 8px; - width: 32px; -} -.navbar-default .navbar-brand .logo { - text-transform: uppercase; - font-size: 26px; -} -.navbar-default .navbar-brand .logo .heavy { - font-weight: 700; -} - -@media (min-width: 768px) { - .navbar-brand { - display: block; - padding: 6px 15px 0; - box-sizing: border-box; - top: auto; - left: auto; - } - .navbar-brand img { - display: inline-block; - width: 32px; - } -} - - - -#navbar > .navbar-nav > li > a { - color: #ffffff; - font-size: 12px; -} -.navbar-default { - border-bottom: 1px solid #dadada; - background-color: #346288; -} -.navbar-default .navbar-header a { - color: #ffffff; -} -.navbar-default .navbar-header a.toggle-sidebar { - padding: 15px 20px; - float: left; -} -#top-navbar .nav > li .navbar-text { - color: #ffffff; - padding: 15px 14px; - margin: 0; -} -#top-navbar .nav > li > a { - color: #ffffff; - padding: 15px 14px; - margin: 0; -} -#top-navbar .nav > li > a:hover, -#top-navbar .nav > li > a:focus { - background-color: #36a9e1; -} - -/* Main content block --*/ -/*#content {*/ - /*border-radius: 4px;*/ -/*}*/ - -/* Session container --*/ -#container-stable { - margin: 40px 0 20px; -} -#container-stable h3, -#container-stable table th, -#container-stable table td { - /*font-family: Arial,"Helvetica Neue",Helvetica,sans-serif;*/ -} -#container-stable table th { - text-align: left; -} - -/* Tables */ -#table-monitor-hdr { - font-weight: bold; - margin-left: 16px; - text-align: center -} - - -/* UI controls */ -.ui-accordion .ui-accordion-header { - margin: 15px 0 0; -} - -.btn.active, .btn:active { - color: #fff; - background-color: #286090; - border-color: #204d74; -} \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/6inchbrand-64.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/6inchbrand-64.png deleted file mode 100644 index 0b97048..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/6inchbrand-64.png and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/cas-logo.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/cas-logo.png deleted file mode 100644 index febd0bc..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/cas-logo.png and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/confirm.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/confirm.gif deleted file mode 100644 index 533bbba..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/confirm.gif and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/error.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/error.gif deleted file mode 100644 index b5f4c03..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/error.gif and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/error.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/error.png deleted file mode 100644 index 7815bfb..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/error.png and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/green.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/green.gif deleted file mode 100644 index 8d4f802..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/green.gif and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/info.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/info.gif deleted file mode 100644 index 4aef02a..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/info.gif and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/info.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/info.png deleted file mode 100644 index e244822..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/info.png and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_bl.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_bl.gif deleted file mode 100644 index fe6f825..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_bl.gif and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_br.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_br.gif deleted file mode 100644 index ba5f51b..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_br.gif and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_tl.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_tl.gif deleted file mode 100644 index 87d7cd0..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_tl.gif and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_tr.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_tr.gif deleted file mode 100644 index 602127a..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_tr.gif and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/logo.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/logo.png deleted file mode 100644 index 6df4a29..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/logo.png and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/question.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/question.png deleted file mode 100644 index 145e38b..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/question.png and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/red.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/red.gif deleted file mode 100644 index 8362124..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/red.gif and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/success.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/success.png deleted file mode 100644 index 7b7f03b..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/success.png and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/warning.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/warning.png deleted file mode 100644 index bd4b0a0..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/warning.png and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/webapp.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/webapp.png deleted file mode 100644 index c2ea89b..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/webapp.png and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/index.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/index.jsp deleted file mode 100644 index 08a5002..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/index.jsp +++ /dev/null @@ -1,6 +0,0 @@ -<%@ page language="java" session="false" %> - -<% -final String queryString = request.getQueryString(); -final String url = request.getContextPath() + "/login" + (queryString != null ? '?' + queryString : ""); -response.sendRedirect(response.encodeURL(url));%> diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/cas.js b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/cas.js deleted file mode 100644 index f5a2055..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/cas.js +++ /dev/null @@ -1,62 +0,0 @@ - -head.ready(document, function() { - head.load("https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js", loadjQueryUI); -}); - -function loadjQueryUI() { - head.load("https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js", loadjQueryCookies); -} - -function loadjQueryCookies() { - head.load("https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js", resourceLoadedSuccessfully); -} - -function areCookiesEnabled() { - $.cookie('cookiesEnabled', 'true'); - var value = $.cookie('cookiesEnabled'); - if (value != undefined) { - $.removeCookie('cookiesEnabled'); - return true; - } - return false; -} - -function resourceLoadedSuccessfully() { - $(document).ready(function() { - - if ($(":focus").length === 0){ - $("input:visible:enabled:first").focus(); - } - - - if (areCookiesEnabled()) { - $('#cookiesDisabled').hide(); - } else { - $('#cookiesDisabled').show(); - $('#cookiesDisabled').animate({ backgroundColor: 'rgb(187,0,0)' }, 30).animate({ backgroundColor: 'rgb(255,238,221)' }, 500); - } - - //flash error box - $('#msg.errors').animate({ backgroundColor: 'rgb(187,0,0)' }, 30).animate({ backgroundColor: 'rgb(255,238,221)' }, 500); - - //flash success box - $('#msg.success').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - //flash confirm box - $('#msg.question').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - $('#capslock-on').hide(); - $('#password').keypress(function(e) { - var s = String.fromCharCode( e.which ); - if ( s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey ) { - $('#capslock-on').show(); - } else { - $('#capslock-on').hide(); - } - }); - if (typeof(jqueryReady) == "function") { - jqueryReady(); - } - }); - -}; diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/ssosessions.js b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/ssosessions.js deleted file mode 100644 index c1c1269..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/ssosessions.js +++ /dev/null @@ -1,181 +0,0 @@ -var ssoSessions = (function () { - var urls = { - destroy: { - all: '/cas/statistics/ssosessions/destroySsoSessions', - single: '/cas/statistics/ssosessions/destroySsoSession' - }, - getSessions: '/cas/statistics/ssosessions/getSsoSessions' - }; - - var createDataTable = function() { - $('#ssoSessions').DataTable( { - "order": [[ 3, "desc" ]], - "initComplete": function(settings, json) { - - if (!json || json.activeSsoSessions.length == 0) { - $('#loadingMessage').hide(); - $('#no-cas-sessions').show(); - } else { - updateAdminPanels( json ); - - $('#loadingMessage').hide(); - $("#no-cas-sessions").hide(); - $("#cas-sessions").show(); - } - }, - "language": { - //"infoEmpty": "No active sessions were found", - "emptyTable": "No sessions found", - "zeroRecords": "No matching sessions found" - }, - "processing": true, - "ajax": { - "url": '/cas/statistics/ssosessions/getSsoSessions', - "dataSrc": "activeSsoSessions" - }, - - columnDefs: [ - { - "targets": 0, - "className": 'details-control', - "orderable": false, - "data": null, - "defaultContent": '' - }, - { - "targets": 1, - "data": 'is_proxied', - 'className': 'col-xs-2 col-md-1', - "render" : function ( data, type, full, meta ) { - if ( data === true) { - return 'Proxy'; - } else { - return ' '; - } - } - }, - { - "targets": 2, - "data": 'authenticated_principal', - "className": 'col-xs-4 col-md-2', - "render": function ( data, type, full, meta ) { - return type === 'display' && data.length > 20 ? - ''+data.substr( 0, 18 )+'...' : - data; - } - }, - { - "targets": 3, - "data": 'ticket_granting_ticket', - "className": 'hidden-xs hidden-sm col-md-4', - "render": function ( data, type, full, meta ) { - return type === 'display' && data.length > 20 ? - ''+data.substr( 0, 40 )+'...' : - data; - } - }, - { - "targets": 4, - "data": 'authentication_date_formatted', - "className": 'col-xs-4 col-sm-4 col-md-2' - }, - { - "targets": 5, - "data": 'number_of_uses', - "className": 'hidden-xs hidden-sm visible-md-* col-md-2' - }, - { - "targets": 6, - "data": "ticket_granting_ticket", - "className": 'col-xs-2 col-sm-2 col-md-1', - "render": function (data, type, full, meta ) { - return ''; - }, - "orderable": false - }, - ] - } ); - }; - - var addEventHandlers = function() { - - /** - * The Bulk remove button - */ - $('#removeAllSessionsButton').on('click', function(e) { - e.preventDefault(); - removeSession(this.value); - }); - - /** - * Individual removal button - */ - $(document).on('click', '#ssoSessions tbody tr td:last-child button.btn-danger', function (e) { - e.preventDefault(); - removeSession( this.value ); - }); - - /** - * The filter buttons - */ - $('#filterButtons .btn').click(function() { - - var filter = $(this).data('filter'); - var table = $('#ssoSessions').DataTable(); - - // Create Filter RegEx: - if ( filter == 'proxied') { - var filterRegex = '^Proxy$'; - var deleteValue = 'PROXIED'; - var btnText = 'Remove xx Proxied Sessions'; - } else if ( filter == 'non-proxied') { - var filterRegex = '^ $'; - var deleteValue = 'DIRECT'; - var btnText = 'Remove xx Non-Proxied Sessions'; - } else { - var filterRegex = ''; - var deleteValue = 'ALL'; - var btnText = 'Remove All Sessions'; - } - - var searchTerm = table.column( 1 ).search(filterRegex, true, false).draw(); - - $('#removeAllSessionsButton').val( deleteValue ).html(btnText.replace('xx', searchTerm.page.info().recordsDisplay )) - }); - - - // Add event listener for opening and closing details - $(document).on('click', '#ssoSessions tbody td.details-control', function () { - var table = $('#ssoSessions').DataTable(); - var tr = $(this).closest('tr'); - var row = table.row( tr ); - - if ( row.child.isShown() ) { - // This row is already open - close it - row.child.hide(); - tr.removeClass('shown'); - } - else { - // Open this row - row.child( format(row.data()), 'info' ).show(); - tr.addClass('shown'); - } - } ); - - - - }; - - // initialization ******* - ( function init () { - addEventHandlers(); - createDataTable(); - })(); - - // Public Methods - return { - /** - * Not used - */ - }; -})(); diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/statisticsview.js b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/statisticsview.js deleted file mode 100644 index ac2513a..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/statisticsview.js +++ /dev/null @@ -1,138 +0,0 @@ -var Gauge = function (wrapper, percent, options) { - if (!wrapper || !percent) { - //console.error('wrapper and percentage are required. Please check your code.'); - return; - } - - var label = (!options.label) ? '' : options.label; - - var textClass = options.textClass || 'progress-meter'; - - var width = options.width || 200, - height = options.height || 200, - twoPi = 2 * Math.PI, - progress = 0, - total = 100, - formatPercent = d3.format(".0%"); - - var colorScale = d3.scale.linear() - .domain([0, 0.40, 0.50, 1]) - .range(["green", "green", "goldenrod", "red"]); - - var arc = d3.svg.arc() - .startAngle(0) - .innerRadius(width * 0.4) - .outerRadius(width * 0.5) - ; - - var svg = d3.select(wrapper).append("svg") - .attr("width", width) - .attr("height", height) - - .attr('fill', '#2E7AF9') - .append("g") - .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); - - var meter = svg.append("g") - .attr("class", textClass); - - meter.append("path") - .attr("class", "background") - .attr("d", arc.endAngle(twoPi)); - - var foreground = meter.append("path") - .attr("class", "foreground"); - - var text = meter.append("text") - .attr("text-anchor", "middle"); - - var text2 = meter.append("text") - .attr('y', height * 0.15) - .attr("text-anchor", "middle") - .attr("class", "text2"); - - text2.text(label); - - var animate = function (percentage) { - var i = d3.interpolate(progress, percentage); - - foreground.transition().duration(2000) - .tween("progress", function () { - - return function (t) { - progress = i(t); - - foreground.style('fill', colorScale(progress)); - foreground.attr("d", arc.endAngle(twoPi * progress)); - text.text(formatPercent(progress)); - }; - }); - }; - - // init - (function () { - setTimeout(function () { - animate(percent); - }, 500); - })(); - - return { - update: function (newPercent) { - animate(newPercent); - } - }; -}; - - -function upTime(countTo, el) { - var wrapper = document.getElementById('uptime-panel'); - var element = document.getElementById(el); - var now = new Date(); - countTo = new Date(countTo); - var difference = (now - countTo); - - var days = Math.floor(difference / (60 * 60 * 1000 * 24) * 1); - var hours = Math.floor((difference % (60 * 60 * 1000 * 24)) / (60 * 60 * 1000) * 1); - var mins = Math.floor(((difference % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) / (60 * 1000) * 1); - var secs = Math.floor((((difference % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) % (60 * 1000)) / 1000 * 1); - - clearTimeout(upTime.to); - - if (isNaN(days) || isNaN(hours) || isNaN(mins) || isNaN(secs) ) { - wrapper.style.display = 'none'; - } else { - days = (days == 1) ? days + ' day ' : days + ' days '; - hours = (hours == 1) ? hours + ' hour ' : hours + ' hours '; - mins = (mins == 1) ? mins + ' minute ' : mins + ' minutes '; - secs = (secs == 1) ? secs + ' second ' : secs + ' seconds'; - - var timeString = '' + days + hours + mins + secs + ''; - element.innerHTML = timeString; - wrapper.style.display = 'block'; - - upTime.to = setTimeout(function() { - upTime(countTo, el); - },1000); - - } -} - - -// Fill modal with content from link href -$("#threadDumpModal").on("show.bs.modal", function (e) { - var link = $(e.relatedTarget); - $(this).find(".modal-body pre").load(link.val()); -}); - -/** - * Thread Dump Preview - * Returnes the xx amount of characters from the end of the thread dump for preview sake. - * The length can be changed by passing ini a value, otherwise it defaults to 400. - */ -function getThreadDumpPreview(len) { - var len = len || 400; - $.get($('#threadDumpViewButton').val(), function (data) { - $('#threadDumpPreview').html(data.substr(-len)); - }); -} - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/test_data.json b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/test_data.json deleted file mode 100644 index 016225c..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/test_data.json +++ /dev/null @@ -1,1117 +0,0 @@ -{ - "activeSsoSessions": [ - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - } - ] -} \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/viewConfig.js b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/viewConfig.js deleted file mode 100644 index 3c536fc..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/viewConfig.js +++ /dev/null @@ -1,59 +0,0 @@ -var viewConfigs = (function () { - var createDataTable = function() { - $('#viewConfigsTable').DataTable( { - "initComplete": function(settings, json) { - if (!json || json.length == 0) { - $('#loadingMessage').hide(); - $('#viewConfigError').show(); - $("#view-configuration").hide(); - } else { - $('#loadingMessage').hide(); - $('#viewConfigError').hide(); - $("#view-configuration").show(); - } - }, - "drawCallback": function( settings ) { - var api = this.api(); - if (api.page.info().pages > 1) { - $('#' + $.fn.dataTable.tables()[0].id + '_paginate')[0].style.display = "block"; - } else { - $('#' + $.fn.dataTable.tables()[0].id + '_paginate')[0].style.display = "none"; - } - }, - "processing": true, - "ajax": { - "url": '/cas/status/config/getProperties', - "dataSrc": function (json) { - var return_data = new Array(); - for(var i=0;i< json.length; i++){ - var obj = json[i]; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - return_data.push({ - 'key': key, - 'value' : obj[key], - }) - } - } - } - return return_data; - } - }, - "columns": [ - { "data": "key", 'className': 'col-xs-6' }, - { "data": "value", 'className': 'col-xs-6' } - ], - } ); - }; - // initialization ******* - ( function init () { - createDataTable(); - })(); - - // Public Methods - return { - /** - * Not used - */ - }; -})(); diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/css/cas.css b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/css/cas.css deleted file mode 100644 index 844c94b..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/css/cas.css +++ /dev/null @@ -1,198 +0,0 @@ -html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; outline: 0; font-size: 100%; vertical-align: baseline; background: transparent; } -body { line-height: 1; } -nav ul { list-style: none; } -blockquote, q { quotes: none; } -blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } -a { margin: 0; padding: 0; font-size: 100%; vertical-align: baseline; background: transparent; } -ins { background-color: #ff9; color: #000; text-decoration: none; } -mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; } -del { text-decoration: line-through; } -abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; } -table { border-collapse: collapse; border-spacing: 0; } -hr { display: block; height: 1px; border: 0; border-top: 1px solid #cccccc; margin: 1em 0; padding: 0; } -input, select { vertical-align: middle; } -body { font-family: Helvetica, Arial, sans-serif; font-size: 12px; line-height: 1.4em; background: #eee; } - -#container { width: 960px; margin: 0 auto; } - -@media only screen and (max-width: 960px) { - #container { width: 100%; } - #content { -webkit-border-bottom-right-radius: 0px; -webkit-border-bottom-left-radius: 0px; -moz-border-radius-bottomright: 0px; -moz-border-radius-bottomleft: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; } -} - -body { - background: url(../images/bg-tile.gif); /* Old browsers */ -} - -a:link, a:visited { - color: #257bb2; -} - -a:hover { - color: #a0b757; -} - -p { - margin-bottom: 1.4em; -} - -header { - overflow: hidden; - padding: 40px 0; -} - -#logo { - display: block; - width: 250px; - height: 52px; - background: url(../images/apereo-logo.png) no-repeat; - text-indent: -999em; - float: left; - - margin-right: 40px; - border-right: 1px solid rgba(255,255,255,0.25); -} - -header h1 { - display: none; -} - -#content { - overflow: hidden; - background: #fff; - padding: 20px; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; - -webkit-box-shadow: 0 0 8px 0 rgba(0,0,0,0.15); - box-shadow: 0 0 8px 0 rgba(0,0,0,0.15); -} - -#msg { - padding: 20px; - margin-bottom: 40px; -} - -#msg.errors { - border: 1px dotted #BB0000; - color: #BB0000; - padding-left: 100px; - background: url(../../../images/error.png) no-repeat 20px center; -} - -#msg.success { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../../../images/success.png) no-repeat 20px center; } -#msg.info { border: 1px dotted #008; color: #008; padding-left: 100px; background: url(../../../images/info.png) no-repeat 20px center; } -#msg.question { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../../../images/question.png) no-repeat 20px center; } -#msg.warn { border: 1px dotted #960; color: #960; padding-left: 100px; background: #ffbc8f url(../../../images/info.png) no-repeat 20px center; } - -#login { - width: 320px; - float: left; - margin-right: 20px; -} - -#login h2 { - font-weight: normal; - font-size: 1.4em; - margin-bottom: 20px; -} - -#login .row { - padding: 10px 0; -} - -#login label { - display: block; - margin-bottom: 2px; -} - -#login .check label { - display: inline; -} - -#login input[type=text], #login input[type=password] { - font-size: 1.4em; - padding: 5px; -} - -#login .btn-submit { - background: #2aa4a5; - border: 0; - padding: 10px 20px; - font-weight: bold; - color: white; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-reset { - background: #eee; - padding: 10px 20px; - border: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-submit:hover, #login .btn-reset:hover { - cursor: pointer; -} - -#login .btn-submit:hover { - background: #30bfbf; -} - -#login .btn-reset:hover { - background: #d4d4d4; -} - -#sidebar { - width: auto; - height: 100%; -} - -#sidebar-content { - padding-left: 20px; -} - -#list-languages h3 { - margin-bottom: 1.4em; -} - -#list-languages ul li { - list-style: none; - display: inline-block; - margin-right: 2em; -} - -footer { - padding: 20px; - color: black; -} - -footer a:link, footer a:visited { - color: black; -} - -@media only screen and (max-width: 960px) { - header { padding: 20px; } - #container { width: 100%; } - #content { - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; - } -} - -@media only screen and (max-width: 799px) { - header { padding: 10px;} - #logo { width: 156px; height: 32px; background-size: 156px 32px; margin-right: 20px; } - #login { float: none; width: 100%; } - #fm1 .row input[type=text], - #fm1 .row input[type=password] { width: 100%; padding: 10px; box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; } - #fm1 .row .btn-submit { outline: none; -webkit-appearance: none; -webkit-border-radius: 0; border: 0; background: #2aa4a5; color: white; font-weight: bold; width: 100%; padding: 10px 20px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } - #fm1 .row .btn-reset { display: none; } - #sidebar { margin-top: 20px; } - #sidebar .sidebar-content { padding: 0; } -} \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/images/apereo-logo.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/images/apereo-logo.png deleted file mode 100644 index b40f22c..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/images/apereo-logo.png and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/images/bg-tile.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/images/bg-tile.gif deleted file mode 100644 index 41332ee..0000000 Binary files a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/images/bg-tile.gif and /dev/null differ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/js/cas.js b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/js/cas.js deleted file mode 100644 index 7e22762..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/js/cas.js +++ /dev/null @@ -1,20 +0,0 @@ -$(document).ready(function(){ - //focus username field - if ($(":focus").length === 0){ - $("input:visible:enabled:first").focus(); - } - - //flash error box - $('#msg.errors').animate({ backgroundColor: 'rgb(187,0,0)' }, 30).animate({ backgroundColor: 'rgb(255,238,221)' }, 500); - - //flash success box - $('#msg.success').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - //flash confirm box - $('#msg.question').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - /* - * Using the JavaScript Debug library, you may issue log messages such as: - * debug.log("Welcome to Central Authentication Service"); - */ -}); diff --git a/code/jeeplatform-sso/pom.xml b/code/jeeplatform-sso/pom.xml deleted file mode 100644 index 233e088..0000000 --- a/code/jeeplatform-sso/pom.xml +++ /dev/null @@ -1,162 +0,0 @@ - - 4.0.0 - - org.muses.jeeplatform - jeeplatform - 1.0-SNAPSHOT - - - jeeplatform-sso - jeeplatform-sso - ${jeeplatform-sso.version} - war - - - - UTF-8 - 4.2.7 - 2.3.2 - 2.0.0-RC1 - 2.8.2 - 3.3.6 - 1.1.1-RELEASE - - - - - org.jasig.cas - cas-server-webapp - ${cas.version} - war - runtime - - - org.jasig.cas - cas-server-core - ${cas.version} - - - - org.jasig.cas - cas-server-webapp-actions - ${cas.version} - - - - org.jasig.cas - cas-server-support-rest-services - ${cas.version} - - - - org.jasig.cas - cas-server-support-jdbc - ${cas.version} - - - - org.jasig.cas - cas-server-core-logout - ${cas.version} - - - - org.apache.logging.log4j - log4j-api - ${log4j2.version} - - - org.apache.logging.log4j - log4j-core - ${log4j2.version} - - - org.apache.logging.log4j - log4j-web - ${log4j2.version} - - - - com.lmax - disruptor - ${disruptor.version} - - - - com.alibaba - fastjson - ${fastjson.version} - - - - - - com.github.penggle - kaptcha - ${kaptcha.version} - - - - - - - - - - cas - - - org.apache.maven.plugins - maven-war-plugin - 2.6 - - cas - - - org.jasig.cas - cas-server-webapp - - WEB-INF/cas.properties - WEB-INF/classes/log4j2.xml - WEB-INF/classes/message*.properties - WEB-INF/classes/services - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - 1.8 - 1.8 - - - - - - diff --git a/code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/providers/CostomUsernamePasswordAuthentication.java b/code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/providers/CostomUsernamePasswordAuthentication.java deleted file mode 100644 index eb92d16..0000000 --- a/code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/providers/CostomUsernamePasswordAuthentication.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.muses.jeeplatform.cas.authentication.security.providers; - -import org.jasig.cas.authentication.HandlerResult; -import org.jasig.cas.authentication.PreventedException; -import org.jasig.cas.authentication.UsernamePasswordCredential; -import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; - -import javax.security.auth.login.FailedLoginException; -import java.security.GeneralSecurityException; - -/** - *
- *  CAS单点登录验证
- * 
- * - * @author nicky.ma - *
- * 修改记录
- *    修改后版本:     修改人:  修改日期: 2019年05月19日  修改内容:
- * 
- */ -public class CostomUsernamePasswordAuthentication extends AbstractUsernamePasswordAuthenticationHandler { - - - @Override - protected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential usernamePasswordCredential) throws GeneralSecurityException, PreventedException { - if (usernamePasswordCredential == null) { - throw new FailedLoginException("No user can be accepted because none is defined"); - } - return doAuthentication(usernamePasswordCredential); - } - - /** - * 用户密码验证 - * @param credential - * @return - */ - private HandlerResult doAuthentication(UsernamePasswordCredential credential) { - String username = credential.getUsername(); - String password = credential.getPassword(); - - String fullUserName = username; - return createHandlerResult(credential , this.principalFactory.createPrincipal(username), null); - } -} diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/cas-servlet.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/cas-servlet.xml deleted file mode 100644 index 1298744..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/cas-servlet.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml deleted file mode 100644 index 07af7e3..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - memberOf - - faculty - staff - org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/log4j2.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/log4j2.xml deleted file mode 100644 index d627943..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/log4j2.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Apereo-10000002.json b/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Apereo-10000002.json deleted file mode 100644 index 04403d3..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Apereo-10000002.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "@class" : "org.jasig.cas.services.RegexRegisteredService", - "serviceId" : "^https://www.apereo.org", - "name" : "Apereo", - "theme" : "apereo", - "id" : 10000002, - "description" : "Apereo foundation sample service", - "proxyPolicy" : { - "@class" : "org.jasig.cas.services.RefuseRegisteredServiceProxyPolicy" - }, - "evaluationOrder" : 1, - "usernameAttributeProvider" : { - "@class" : "org.jasig.cas.services.DefaultRegisteredServiceUsernameProvider" - }, - "logoutType" : "BACK_CHANNEL", - "attributeReleasePolicy" : { - "@class" : "org.jasig.cas.services.ReturnAllowedAttributeReleasePolicy", - "principalAttributesRepository" : { - "@class" : "org.jasig.cas.authentication.principal.DefaultPrincipalAttributesRepository" - }, - "authorizedToReleaseCredentialPassword" : false, - "authorizedToReleaseProxyGrantingTicket" : false - }, - "accessStrategy" : { - "@class" : "org.jasig.cas.services.DefaultRegisteredServiceAccessStrategy", - "enabled" : true, - "ssoEnabled" : true - } -} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json b/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json deleted file mode 100644 index 7e1ba78..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "@class" : "org.jasig.cas.services.RegexRegisteredService", - "serviceId" : "^(https|http|imaps)://.*", - "name" : "HTTPS and IMAPS", - "id" : 10000001, - "description" : "This service definition authorized all application urls that support HTTPS and IMAPS protocols.", - "proxyPolicy" : { - "@class" : "org.jasig.cas.services.RefuseRegisteredServiceProxyPolicy" - }, - "evaluationOrder" : 10000, - "usernameAttributeProvider" : { - "@class" : "org.jasig.cas.services.DefaultRegisteredServiceUsernameProvider" - }, - "logoutType" : "BACK_CHANNEL", - "attributeReleasePolicy" : { - "@class" : "org.jasig.cas.services.ReturnAllowedAttributeReleasePolicy", - "principalAttributesRepository" : { - "@class" : "org.jasig.cas.authentication.principal.DefaultPrincipalAttributesRepository" - }, - "authorizedToReleaseCredentialPassword" : false, - "authorizedToReleaseProxyGrantingTicket" : false - }, - "accessStrategy" : { - "@class" : "org.jasig.cas.services.DefaultRegisteredServiceAccessStrategy", - "enabled" : true, - "ssoEnabled" : true - } -} diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/spring-configuration/propertyFileConfigurer.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/spring-configuration/propertyFileConfigurer.xml deleted file mode 100644 index 3e300c0..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/spring-configuration/propertyFileConfigurer.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - This file lets CAS know where you've stored the cas.properties file which details some of the configuration - options - that are specific to your environment. You can specify the location of the file here. You may wish to place the - file outside - of the Servlet context if you have options that are specific to a tier (i.e. test vs. production) so that the - WAR file - can be moved between tiers without modification. - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAcceptableUsagePolicyView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAcceptableUsagePolicyView.jsp deleted file mode 100644 index 4ee34fd..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAcceptableUsagePolicyView.jsp +++ /dev/null @@ -1,26 +0,0 @@ - -
- - -

Acceptable Usage Policy

-
- The purpose of this policy is to establish acceptable and unacceptable use of electronic devices and network resources in conjunction with the established culture of ethical and lawful behavior, openness, trust, and integrity. - -

- By using these resources, you agree to abide by the Acceptable Usage Policy. -

- -

Click '' to continue. Otherwise, click ''.

-
- -
- - - " type="submit" /> - " type="button" - onclick="location.href = location.href;" /> -
-
-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountDisabledView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountDisabledView.jsp deleted file mode 100644 index 0deddbf..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountDisabledView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountLockedView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountLockedView.jsp deleted file mode 100644 index c41bccd..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountLockedView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadHoursView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadHoursView.jsp deleted file mode 100644 index ace5f80..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadHoursView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadWorkstationView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadWorkstationView.jsp deleted file mode 100644 index 6f5ead2..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadWorkstationView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casConfirmView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casConfirmView.jsp deleted file mode 100644 index 5d8cc96..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casConfirmView.jsp +++ /dev/null @@ -1,5 +0,0 @@ - -
-

-
- \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casExpiredPassView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casExpiredPassView.jsp deleted file mode 100644 index 8ae8775..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casExpiredPassView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casGenericSuccessView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casGenericSuccessView.jsp deleted file mode 100644 index 956ed44..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casGenericSuccessView.jsp +++ /dev/null @@ -1,8 +0,0 @@ - -
-

-

-

-
- - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp deleted file mode 100644 index 716cac3..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - -
-

Authentication Succeeded with Warnings

- - -

${message.text}

-
- -
- - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.jsp deleted file mode 100644 index 3a81dc7..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.jsp +++ /dev/null @@ -1,199 +0,0 @@ - - - -<%-- -
-

-

-
-
--%> - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

${fn:escapeXml(registeredServiceName)}

-

${fn:escapeXml(registeredServiceDescription)}

-
-
-

- - -

- - - - -

- -
- - - - - " /> - - - - - - -
- -
- - <%-- - NOTE: Certain browsers will offer the option of caching passwords for a user. There is a non-standard attribute, - "autocomplete" that when set to "off" will tell certain browsers not to prompt to cache credentials. For more - information, see the following web page: - http://www.technofundo.com/tech/web/ie_autocomplete.html - --%> - - - -
- - - -
- - - - - " tabindex="6" type="submit" /> - " tabindex="7" type="reset" /> -
-
-
- - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLogoutView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLogoutView.jsp deleted file mode 100644 index 187c52a..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLogoutView.jsp +++ /dev/null @@ -1,7 +0,0 @@ - -
-

-

-

-
- \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casMustChangePassView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casMustChangePassView.jsp deleted file mode 100644 index 47772dd..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casMustChangePassView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/bottom.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/bottom.jsp deleted file mode 100644 index 0bde3a8..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/bottom.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - -
- - - -
- - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/top.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/top.jsp deleted file mode 100644 index 85cb24b..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/top.jsp +++ /dev/null @@ -1,33 +0,0 @@ - - -<%@ page pageEncoding="UTF-8" %> -<%@ page contentType="text/html; charset=UTF-8" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> -<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - - - - - - CAS – Central Authentication Service - - - - - - - " /> - " type="image/x-icon" /> - - - - -
-
- -

Central Authentication Service (CAS)

-
-
diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp deleted file mode 100644 index a9fcb96..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp deleted file mode 100644 index 2624d1d..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 688d448..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,260 +0,0 @@ - - - Central Authentication System (CAS) - - - - - contextConfigLocation - - /WEB-INF/spring-configuration/*.xml - /WEB-INF/deployerConfigContext.xml - - classpath*:/META-INF/spring/*.xml - - - - - characterEncodingFilter - org.springframework.web.filter.DelegatingFilterProxy - true - - - characterEncodingFilter - /* - - - - CAS Client Info Logging Filter - org.jasig.inspektr.common.web.ClientInfoThreadLocalFilter - true - - - CAS Client Info Logging Filter - /* - - - - requestParameterSecurityFilter - org.springframework.web.filter.DelegatingFilterProxy - true - - - requestParameterSecurityFilter - /* - - - - responseHeadersSecurityFilter - org.springframework.web.filter.DelegatingFilterProxy - true - - - responseHeadersSecurityFilter - /* - - - - - - org.springframework.web.context.ContextLoaderListener - - - - - org.jasig.cas.CasEnvironmentContextListener - - - - - - cas - - org.springframework.web.servlet.DispatcherServlet - - - contextConfigLocation - - /WEB-INF/cas-servlet.xml,classpath*:/META-INF/cas-servlet-*.xml,/WEB-INF/cas-servlet-*.xml - - - publishContext - false - - 1 - true - - - - cas - /login - - - - cas - /logout - - - - cas - /validate - - - - cas - /serviceValidate - - - - cas - /p3/serviceValidate - - - - cas - /proxy - - - - cas - /proxyValidate - - - - cas - /p3/proxyValidate - - - - cas - /CentralAuthenticationService - - - - cas - /status - - - - cas - /statistics - - - - cas - /statistics/ping - - - - cas - /statistics/metrics - - - - cas - /statistics/threads - - - - cas - /statistics/healthcheck - - - - cas - /statistics/ssosessions/* - - - - cas - /statistics/ssosessions - - - - cas - /status/config/* - - - - cas - /status/config - - - - cas - /authorizationFailure.html - - - - cas - /v1/tickets/* - - - cas - /v1/services/* - - - - - 5 - COOKIE - - true - - - - - 401 - /authorizationFailure.html - - - - 403 - /authorizationFailure.html - - - - 404 - / - - - - 500 - /WEB-INF/view/jsp/errors.jsp - - - - 501 - /WEB-INF/view/jsp/errors.jsp - - - - 503 - /WEB-INF/view/jsp/errors.jsp - - - - index.jsp - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/login/login-webflow.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/login/login-webflow.xml deleted file mode 100644 index e4bd281..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/login/login-webflow.xml +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/logout/logout-webflow.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/logout/logout-webflow.xml deleted file mode 100644 index 100ccc3..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/logout/logout-webflow.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/cas.properties b/code/jeeplatform-sso/src/main/webapp/cas.properties deleted file mode 100644 index 515c342..0000000 --- a/code/jeeplatform-sso/src/main/webapp/cas.properties +++ /dev/null @@ -1,720 +0,0 @@ -server.name=http://localhost:8080 -server.prefix=${server.name}/cas - -## -# Datasource config -platform.jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/jeeplatform?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false -platform.jdbc.username=root -platform.jdbc.password=root -#platform.jdbc.publickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKZijIzzXp1dyksL1ZSejBmuVz1Y0vgiQVbcQ/13p4pwHRo8gU3pd6YaWutOlBTEWvHBbnGxIdnrhxnQZGwU1O0CAwEAAQ== -platform.jdbc.initialSize=10 -platform.jdbc.minIdle=10 -platform.jdbc.maxActive=50 - -# security configuration based on IP address to access the /status and /statistics pages -# cas.securityContext.adminpages.ip=127\.0\.0\.1 - -## -# Unique CAS node name -# host.name is used to generate unique Service Ticket IDs and SAMLArtifacts. This is usually set to the specific -# hostname of the machine running the CAS node, but it could be any label so long as it is unique in the cluster. -# host.name= - -## -# JPA Ticket Registry Database Configuration -# -# ticketreg.database.ddl.auto=create-drop -# ticketreg.database.dialect=org.hibernate.dialect.OracleDialect|MySQLInnoDBDialect|HSQLDialect -# ticketreg.database.batchSize=10 -# ticketreg.database.driverClass=org.hsqldb.jdbcDriver -# ticketreg.database.url=jdbc:hsqldb:mem:cas-ticket-registry -# ticketreg.database.user=sa -# ticketreg.database.password= -# ticketreg.database.pool.minSize=6 -# ticketreg.database.pool.maxSize=18 -# ticketreg.database.pool.maxWait=10000 -# ticketreg.database.pool.maxIdleTime=120 -# ticketreg.database.pool.acquireIncrement=6 -# ticketreg.database.pool.idleConnectionTestPeriod=30 -# ticketreg.database.pool.connectionHealthQuery=select 1 -# ticketreg.database.pool.acquireRetryAttempts=5 -# ticketreg.database.pool.acquireRetryDelay=2000 -# ticketreg.database.pool.connectionHealthQuery=select 1 - -## -# JPA Service Registry Database Configuration -# -# svcreg.database.ddl.auto=create-drop -# svcreg.database.hibernate.dialect=org.hibernate.dialect.OracleDialect|MySQLInnoDBDialect|HSQLDialect -# svcreg.database.hibernate.batchSize=10 -# svcreg.database.driverClass=org.hsqldb.jdbcDriver -# svcreg.database.url=jdbc:hsqldb:mem:cas-ticket-registry -# svcreg.database.user=sa -# svcreg.database.password= -# svcreg.database.pool.minSize=6 -# svcreg.database.pool.maxSize=18 -# svcreg.database.pool.maxWait=10000 -# svcreg.database.pool.maxIdleTime=120 -# svcreg.database.pool.acquireIncrement=6 -# svcreg.database.pool.idleConnectionTestPeriod=30 -# svcreg.database.pool.connectionHealthQuery=select 1 -# svcreg.database.pool.acquireRetryAttempts=5 -# svcreg.database.pool.acquireRetryDelay=2000 -# svcreg.database.pool.connectionHealthQuery=select 1 - -## -# CAS SSO Cookie Generation & Security -# See https://github.com/mitreid-connect/json-web-key-generator -# -# Do note that the following settings MUST be generated per deployment. -# -# The encryption secret key. By default, must be a octet string of size 256. -# tgc.encryption.key= - -# The signing secret key. By default, must be a octet string of size 512. -# tgc.signing.key= - -# Decides whether SSO cookie should be created only under secure connections. - tgc.secure=false - -# The expiration value of the SSO cookie -# tgc.maxAge=-1 - -# The name of the SSO cookie -# tgc.name=TGC - -# The path to which the SSO cookie will be scoped -# tgc.path=/cas - -# The expiration value of the SSO cookie for long-term authentications -# tgc.remember.me.maxAge=1209600 - -# Decides whether SSO Warning cookie should be created only under secure connections. - warn.cookie.secure=false - -# The expiration value of the SSO Warning cookie -# warn.cookie.maxAge=-1 - -# The name of the SSO Warning cookie -# warn.cookie.name=CASPRIVACY - -# The path to which the SSO Warning cookie will be scoped -# warn.cookie.path=/cas - -# Whether we should track the most recent session by keeping the latest service ticket -# tgt.onlyTrackMostRecentSession = true - -## -# CAS UI Theme Resolution -# -# cas.themeResolver.defaultThemeName=cas-theme-default -# cas.themeResolver.pathprefix=/WEB-INF/view/jsp/ -# cas.themeResolver.param.name=theme -# Location of the Spring xml config file where views may be collected -# cas.viewResolver.xmlFile=/META-INF/spring/views.xml - -## -# CAS Logout Behavior -# WEB-INF/cas-servlet.xml -# -# Specify whether CAS should redirect to the specified service parameter on /logout requests - cas.logout.followServiceRedirects=false - -## -# CAS Cached Attributes Timeouts -# Controls the cached attribute expiration policy -# -# Notes the duration in which attributes will be kept alive -# cas.attrs.timeToExpireInHours=2 - -## -# Single Sign-On Session -# -# Indicates whether an SSO session should be created for renewed authentication requests. -# create.sso.renewed.authn=true -# -# Indicates whether an SSO session can be created if no service is present. -# create.sso.missing.service=true - -## -# CAS Authentication Policy -# -# cas.authn.policy.any.tryall=false -# cas.authn.policy.req.tryall=false -# cas.authn.policy.req.handlername=handlerName - -## -# CAS PersonDirectory Principal Resolution -# -# cas.principal.resolver.persondir.principal.attribute=cn -# cas.principal.resolver.persondir.return.null=false - -## -# CAS Internationalization -# - locale.default=zh_CN - locale.param.name=locale - message.bundle.encoding=UTF-8 - message.bundle.cacheseconds=180 - message.bundle.fallback.systemlocale=false - message.bundle.usecode.message=true -# message.bundle.basenames=classpath:custom_messages,classpath:messages -message.bundle.basenames=WEB-INF/locale/messages - -## -# CAS Authentication Throttling -# -#cas.throttle.failure.threshold= -#cas.throttle.failure.range.seconds= -#cas.throttle.username.parameter= -#cas.throttle.appcode= -#cas.throttle.authn.failurecode= -#cas.throttle.audit.query= - -## -# CAS Health Monitoring -# -# cas.monitor.st.warn.threshold=5000 -# cas.monitor.tgt.warn.threshold=10000 -# cas.monitor.free.mem.threshold=10 - -## -# CAS MongoDB Service Registry -# -# mongodb.host=mongodb database url -# mongodb.port=mongodb database port -# mongodb.userId=mongodb userid to bind -# mongodb.userPassword=mongodb password to bind -# cas.service.registry.mongo.db=Collection name to store service definitions -# mongodb.timeout=5000 - -## -# Spring Webflow Web Application Session -# Define the settings that are required to encrypt and persist the CAS web application session. -# See the cas-servlet.xml file to understand how these properties are used. -# -# The encryption secret key. By default, must be a octet string of size 256. -# webflow.encryption.key= - -# The signing secret key. By default, must be a octet string of size 512. -# webflow.signing.key= - -## -# Remote User Authentication -# -# ip.address.range= - -## -# Apache Shiro Authentication -# -# shiro.authn.requiredRoles= -# shiro.authn.requiredPermissions= -# shiro.authn.config.file=classpath:shiro.ini - -## -# YubiKey Authentication -# -# yubikey.client.id= -# yubikey.secret.key= - -## -# JDBC Authentication -# -# cas.jdbc.authn.query.encode.sql= -# cas.jdbc.authn.query.encode.alg= -# cas.jdbc.authn.query.encode.salt.static= -# cas.jdbc.authn.query.encode.password= -# cas.jdbc.authn.query.encode.salt= -# cas.jdbc.authn.query.encode.iterations.field= -# cas.jdbc.authn.query.encode.iterations= - -# cas.jdbc.authn.query.sql= - -# cas.jdbc.authn.search.password= -# cas.jdbc.authn.search.user= -# cas.jdbc.authn.search.table= - -## -# Duo security 2fa authentication provider -# https://www.duosecurity.com/docs/duoweb#1.-generate-an-akey -# -# cas.duo.api.host= -# cas.duo.integration.key= -# cas.duo.secret.key= -# cas.duo.application.key= - -## -# File Authentication -# -# file.authn.filename=classpath:people.txt -# file.authn.separator=:: - -## -# General Authentication -# -# cas.principal.transform.upperCase=false -# cas.authn.password.encoding.char=UTF-8 -# cas.authn.password.encoding.alg=SHA-256 -# cas.principal.transform.prefix= -# cas.principal.transform.suffix= - -## -# X509 Authentication -# -# cas.x509.authn.crl.checkAll=false -# cas.x509.authn.crl.throw.failure=true -# cas.x509.authn.crl.refresh.interval= -# cas.x509.authn.revocation.policy.threshold= -# cas.x509.authn.trusted.issuer.dnpattern= -# cas.x509.authn.max.path.length= -# cas.x509.authn.max.path.length.unspecified= -# cas.x509.authn.check.key.usage= -# cas.x509.authn.require.key.usage= -# cas.x509.authn.subject.dnpattern= -# cas.x509.authn.principal.descriptor= -# cas.x509.authn.principal.serial.no.prefix= -# cas.x509.authn.principal.value.delim= - -## -# Accepted Users Authentication -# -accept.authn.users=casuser::Mellon - -## -# Rejected Users Authentication -# -# reject.authn.users= - -## -# JAAS Authentication -# -# cas.authn.jaas.realm=CAS -# cas.authn.jaas.kerb.realm= -# cas.authn.jaas.kerb.kdc= - -## -# Single Sign-On Session TGT Timeouts -# -# Inactivity Timeout Policy -# tgt.timeout.maxTimeToLiveInSeconds=28800 - -# Hard Timeout Policy -# tgt.timeout.hard.maxTimeToLiveInSeconds -# -# Throttled Timeout Policy -# tgt.throttled.maxTimeToLiveInSeconds=28800 -# tgt.throttled.timeInBetweenUsesInSeconds=5 - -# Default Expiration Policy -# tgt.maxTimeToLiveInSeconds=28800 -# tgt.timeToKillInSeconds=7200 - -## -# Service Ticket Timeout -# -# st.timeToKillInSeconds=10 -# st.numberOfUses=1 - -## -# Http Client Settings -# -# The http client read timeout in milliseconds -# http.client.read.timeout=5000 - -# The http client connection timeout in milliseconds -# http.client.connection.timeout=5000 -# -# The http client truststore file, in addition to the default's -# http.client.truststore.file=classpath:truststore.jks -# -# The http client truststore's password -# http.client.truststore.psw=changeit - -## -# Single Logout Out Callbacks -# -# To turn off all back channel SLO requests set this to true -# slo.callbacks.disabled=false -# -# To send callbacks to endpoints synchronously, set this to false -# slo.callbacks.asynchronous=true - -## -# CAS Protocol Security Filter -# -# Are multi-valued parameters accepted? -# cas.http.allow.multivalue.params=false - -# Define the list of request parameters to examine for sanity -# cas.http.check.params=ticket,service,renew,gateway,warn,target,SAMLart,pgtUrl,pgt,pgtId,pgtIou,targetService - -# Define the list of request parameters only allowed via POST -# cas.http.allow.post.params=username,password - -## -# JSON Service Registry -# -# Directory location where JSON service files may be found. -# service.registry.config.location=classpath:services - -## -# Service Registry Periodic Reloading Scheduler -# Default sourced from WEB-INF/spring-configuration/applicationContext.xml -# -# Force a startup delay of 2 minutes. -# service.registry.quartz.reloader.startDelay=120000 -# -# Reload services every 2 minutes -# service.registry.quartz.reloader.repeatInterval=120000 - -## -# Background Scheduler -# -# Wait for scheduler to finish running before shutting down CAS. -# scheduler.shutdown.wait=true -# -# Attempt to interrupt background jobs when shutting down CAS -# scheduler.shutdown.interruptJobs=true - -## -# Audits -# -# Use single line format for audit blocks -# cas.audit.singleline=true -# Separator to use between each fields in a single audit event -# cas.audit.singleline.separator=| -# Application code for audits -# cas.audit.appcode=CAS -# -## JDBC Audits -# -#cas.audit.max.agedays= -#cas.audit.database.dialect= -#cas.audit.database.batchSize= -#cas.audit.database.ddl.auto= -#cas.audit.database.gen.ddl= -#cas.audit.database.show.sql= -#cas.audit.database.driverClass= -#cas.audit.database.url= -#cas.audit.database.user= -#cas.audit.database.password= -#cas.audit.database.pool.minSize= -#cas.audit.database.pool.minSize= -#cas.audit.database.pool.maxSize= -#cas.audit.database.pool.maxIdleTime= -#cas.audit.database.pool.maxWait= -#cas.audit.database.pool.acquireIncrement= -#cas.audit.database.pool.acquireRetryAttempts= -#cas.audit.database.pool.acquireRetryDelay= -#cas.audit.database.pool.idleConnectionTestPeriod= -#cas.audit.database.pool.connectionHealthQuery= - -## -# Metrics -# Default sourced from WEB-INF/spring-configuration/metricsConfiguration.xml: -# -# Define how often should metric data be reported. Default is 30 seconds. -# metrics.refresh.interval=30s - -## -# Encoding -# -# Set the encoding to use for requests. Default is UTF-8 -# httprequest.web.encoding=UTF-8 - -# Default is true. Switch this to "false" to not enforce the specified encoding in any case, -# applying it as default response encoding as well. -# httprequest.web.encoding.force=true - -## -# Response Headers -# -# httpresponse.header.cache=false -# httpresponse.header.hsts=false -# httpresponse.header.xframe=false -# httpresponse.header.xcontent=false -# httpresponse.header.xss=false - -## -# SAML -# -# Indicates the SAML response issuer -# cas.saml.response.issuer=localhost -# -# Indicates the skew allowance which controls the issue instant of the SAML response -# cas.saml.response.skewAllowance=0 -# -# Indicates whether SAML ticket id generation should be saml2-compliant. -# cas.saml.ticketid.saml2=false - -## -# Default Ticket Registry -# -# default.ticket.registry.initialcapacity=1000 -# default.ticket.registry.loadfactor=1 -# default.ticket.registry.concurrency=20 - -## -# Ticket Registry Cleaner -# -# Indicates how frequently the Ticket Registry cleaner should run. Configured in seconds. -# ticket.registry.cleaner.startdelay=20 -# ticket.registry.cleaner.repeatinterval=5000 - -## -# Ticket ID Generation -# -# lt.ticket.maxlength=20 -# st.ticket.maxlength=20 -# tgt.ticket.maxlength=50 -# pgt.ticket.maxlength=50 - -## -# Google Apps public/private key -# -# cas.saml.googleapps.publickey.file=file:/etc/cas/public.key -# cas.saml.googleapps.privatekey.file=file:/etc/cas/private.p8 -# cas.saml.googleapps.key.alg=RSA - -## -# WS-FED -# -# The claim from ADFS that should be used as the user's identifier. -# cas.wsfed.idp.idattribute=upn -# -# Federation Service identifier -# cas.wsfed.idp.id=https://adfs.example.org/adfs/services/trust -# -# The ADFS login url. -# cas.wsfed.idp.url=https://adfs.example.org/adfs/ls/ -# -# Identifies resource(s) that point to ADFS's signing certificates. -# These are used verify the WS Federation token that is returned by ADFS. -# Multiple certificates may be separated by comma. -# cas.wsfed.idp.signingcerts=classpath:adfs-signing.crt -# -# Unique identifier that will be set in the ADFS configuration. -# cas.wsfed.rp.id=urn:cas:localhost -# -# Slack dealing with time-drift between the ADFS Server and the CAS Server. -# cas.wsfed.idp.tolerance=10000 -# -# Decides which bundle of attributes should be resolved during WS-FED authentication. -# cas.wsfed.idp.attribute.resolver.enabled=true -# cas.wsfed.idp.attribute.resolver.type=WSFED -# -# Private/Public keypair used to decrypt assertions, if any. -# cas.wsfed.idp.enc.privateKey=classpath:private.key -# cas.wsfed.idp.enc.cert=classpath:certificate.crt -# cas.wsfed.idp.enc.privateKeyPassword=NONE - -## -# LDAP User Details -# -# ldap.userdetails.service.user.attr= -# ldap.userdetails.service.role.attr= - -## -# LDAP Service Registry -# -# svcreg.ldap.baseDn=dc=example,dc=org - -## -# Password Policy -# -# Warn all users of expiration date regardless of warningDays value. -# password.policy.warnAll=false - -# Threshold number of days to begin displaying password expiration warnings. -# password.policy.warningDays=30 - -# URL to which the user will be redirected to change the password. -# password.policy.url=https://password.example.edu/change - -# password.policy.warn.attribute.name=attributeName -# password.policy.warn.attribute.value=attributeValue -# password.policy.warn.display.matched=true - -## -# CAS REST API Services -# -# cas.rest.services.attributename= -# cas.rest.services.attributevalue= - -## -# Ticket Registry -# -# Secret key to use when encrypting tickets in a distributed ticket registry. -# ticket.encryption.secretkey=C@$W3bSecretKey! - -# Secret key to use when signing tickets in a distributed ticket registry. -# By default, must be a octet string of size 512. -# ticket.signing.secretkey=szxK-5_eJjs-aUj-64MpUZ-GPPzGLhYPLGl0wrYjYNVAGva2P0lLe6UGKGM7k8dWxsOVGutZWgvmY3l5oVPO3w -# Secret key algorithm used -# ticket.secretkey.alg=AES - -## -# Hazelcast Ticket Registry -# -# hz.config.location=file:/etc/cas/hazelcast.xml -# hz.mapname=tickets -# hz.cluster.logging.type=slf4j -# hz.cluster.portAutoIncrement=true -# hz.cluster.port=5701 -# hz.cluster.multicast.enabled=false -# hz.cluster.members=cas1.example.com,cas2.example.com -# hz.cluster.tcpip.enabled=true -# hz.cluster.multicast.enabled=false -# hz.cluster.max.heapsize.percentage=85 -# hz.cluster.max.heartbeat.seconds=300 -# hz.cluster.eviction.percentage=10 -# hz.cluster.eviction.policy=LRU -# hz.cluster.instance.name=${host.name} - -## -# Ehcache Ticket Registry -# -# ehcache.config.file=classpath:ehcache-replicated.xml -# ehcache.cachemanager.shared=false -# ehcache.cachemanager.name=ticketRegistryCacheManager -# ehcache.disk.expiry.interval.seconds=0 -# ehcache.disk.persistent=false -# ehcache.eternal=false -# ehcache.max.elements.memory=10000 -# ehcache.max.elements.disk=0 -# ehcache.eviction.policy=LRU -# ehcache.overflow.disk=false -# ehcache.cache.st.name=org.jasig.cas.ticket.ServiceTicket -# ehcache.cache.st.timeIdle=0 -# ehcache.cache.st.timeAlive=300 -# ehcache.cache.tgt.name=org.jasig.cas.ticket.TicketGrantingTicket -# ehcache.cache.tgt.timeIdle=7201 -# ehcache.cache.tgt.timeAlive=0 -# ehcache.cache.loader.async=true -# ehcache.cache.loader.chunksize=5000000 -# ehcache.repl.async.interval=10000 -# ehcache.repl.async.batch.size=100 -# ehcache.repl.sync.puts=true -# ehcache.repl.sync.putscopy=true -# ehcache.repl.sync.updates=true -# ehcache.repl.sync.updatesCopy=true -# ehcache.repl.sync.removals=true - -## -# Ehcache Monitoring -# -# cache.monitor.warn.free.threshold=10 -# cache.monitor.eviction.threshold=0 - -## -# Memcached Ticket Registry -# -# memcached.servers=localhost:11211 -# memcached.hashAlgorithm=FNV1_64_HASH -# memcached.protocol=BINARY -# memcached.locatorType=ARRAY_MOD -# memcached.failureMode=Redistribute - -## -# Memcached Monitoring -# -# cache.monitor.warn.free.threshold=10 -# cache.monitor.eviction.threshold=0 - -## -# RADIUS Authentication Server -# -# cas.radius.client.inetaddr=localhost -# cas.radius.client.port.acct= -# cas.radius.client.socket.timeout=60 -# cas.radius.client.port.authn= -# cas.radius.client.sharedsecret=N0Sh@ar3d$ecReT -# cas.radius.server.protocol=EAP_MSCHAPv2 -# cas.radius.server.retries=3 -# cas.radius.server.nasIdentifier= -# cas.radius.server.nasPort=-1 -# cas.radius.server.nasPortId=-1 -# cas.radius.server.nasRealPort=-1 -# cas.radius.server.nasPortType=-1 -# cas.radius.server.nasIpAddress= -# cas.radius.server.nasIpv6Address= -# cas.radius.failover.authn=false -# cas.radius.failover.exception=false - -## -# SPNEGO Authentication -# -# cas.spnego.ldap.attribute=spnegoattribute -# cas.spnego.ldap.filter=host={0} -# cas.spnego.ldap.basedn= -# cas.spnego.hostname.pattern=.+ -# cas.spnego.ip.pattern= -# cas.spnego.alt.remote.host.attribute -# cas.spengo.use.principal.domain=false -# cas.spnego.ntlm.allowed=true -# cas.spnego.kerb.debug=false -# cas.spnego.kerb.realm=EXAMPLE.COM -# cas.spnego.kerb.kdc=172.10.1.10 -# cas.spnego.login.conf.file=/path/to/login -# cas.spnego.jcifs.domain= -# cas.spnego.jcifs.domaincontroller= -# cas.spnego.jcifs.netbios.cache.policy:600 -# cas.spnego.jcifs.netbios.wins= -# cas.spnego.jcifs.password= -# cas.spnego.jcifs.service.password= -# cas.spnego.jcifs.socket.timeout:300000 -# cas.spnego.jcifs.username= -# cas.spnego.kerb.conf= -# cas.spnego.ntlm=false -# cas.spnego.supportedBrowsers=MSIE,Trident,Firefox,AppleWebKit -# cas.spnego.mixed.mode.authn=false -# cas.spnego.send.401.authn.failure=false -# cas.spnego.principal.resolver.transform=NONE -# cas.spnego.service.principal=HTTP/cas.example.com@EXAMPLE.COM - -## -# NTLM Authentication -# -# ntlm.authn.domain.controller= -# ntlm.authn.include.pattern= -# ntlm.authn.load.balance=true - -## -# Authentication delegation using pac4j -# -# cas.pac4j.client.authn.typedidused=true -# cas.pac4j.facebook.id= -# cas.pac4j.facebook.secret= -# cas.pac4j.facebook.scope= -# cas.pac4j.facebook.fields= -# cas.pac4j.twitter.id= -# cas.pac4j.twitter.secret= -# cas.pac4j.saml.keystorePassword= -# cas.pac4j.saml.privateKeyPassword= -# cas.pac4j.saml.keystorePath= -# cas.pac4j.saml.identityProviderMetadataPath= -# cas.pac4j.saml.maximumAuthenticationLifetime= -# cas.pac4j.saml.serviceProviderEntityId= -# cas.pac4j.saml.serviceProviderMetadataPath= -# cas.pac4j.cas.loginUrl= -# cas.pac4j.cas.protocol= -# cas.pac4j.oidc.id= -# cas.pac4j.oidc.secret= -# cas.pac4j.oidc.discoveryUri= -# cas.pac4j.oidc.useNonce= -# cas.pac4j.oidc.preferredJwsAlgorithm= -# cas.pac4j.oidc.maxClockSkew= -# cas.pac4j.oidc.customParamKey1= -# cas.pac4j.oidc.customParamValue1= -# cas.pac4j.oidc.customParamKey2= -# cas.pac4j.oidc.customParamValue2= - -## -# CAS Acceptable Usage Policy Settings -# -# cas.aup.ldap.search.filter=cn={0} -# cas.aup.ldap.url=ldap://127.0.0.1:1389 -# cas.aup.ldap.ssl=false -# cas.aup.ldap.startTLS=false -# cas.aup.ldap.basedn=dc=example,dc=org -# cas.aup.attribute= diff --git a/code/jeeplatform-sso/src/main/webapp/css/cas.css b/code/jeeplatform-sso/src/main/webapp/css/cas.css deleted file mode 100644 index 9b9eaf6..0000000 --- a/code/jeeplatform-sso/src/main/webapp/css/cas.css +++ /dev/null @@ -1,528 +0,0 @@ -/*@import url(https://fonts.googleapis.com/css?family=Lato);*/ -@import url(https://fonts.googleapis.com/css?family=Lato:700,400,300,100); - -html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, -address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, -b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, -thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, -hgroup, menu, nav, section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - outline: 0; - font-size: 100%; - vertical-align: baseline; - background: transparent; -} -body { line-height: 1; } -nav ul { list-style: none; } -blockquote, q { quotes: none; } -blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } -a { margin: 0; padding: 0; font-size: 100%; vertical-align: baseline; background: transparent; } -ins { background-color: #ff9; color: #000; text-decoration: none; } -mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; } -del { text-decoration: line-through; } -abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; } -table { border-collapse: collapse; border-spacing: 0; } -hr { display: block; height: 1px; border: 0; border-top: 1px solid #cccccc; margin: 1em 0; padding: 0; } -input, select { vertical-align: middle; } -body { font-family: Verdana, sans-serif; font-size: 11px; line-height: 1.4em; background: #eee; } - -#container { width: 960px; margin: 0 auto; } - - - -@media screen and (min-width: 960px) { - #container { width: 960px; } -} - -@media screen and (min-width: 1280px) { - #ssosessions-page #container { width: 1280px; } -} - -@media only screen and (max-width: 960px) { - #container { width: 100%; } - #content { - -webkit-border-bottom-right-radius: 0px; - -webkit-border-bottom-left-radius: 0px; - -moz-border-radius-bottomright: 0px; - -moz-border-radius-bottomleft: 0px; - border-bottom-right-radius: 0px; - border-bottom-left-radius: 0px; - } -} - -body#cas { - background: #153e50; /* Old browsers */ -} - -a:link, a:visited { - color: #257bb2; -} - -a:hover { - color: #a0b757; -} - -p { - margin-bottom: 1.4em; -} - -header { - overflow: hidden; - padding: 20px 0; -} - -#logo { - display: block; - background: url(../images/logo.png) no-repeat; - text-indent: -999em; - float: left; - height: 100px; - width: 80%; - margin-right: 40px; - border: 0px; -} - -header h1 { - float: right; - width: 119px; - height: 60px; - background: url(../images/cas-logo.png) no-repeat; - text-indent: -999em; -} - -#content { - overflow: hidden; - background: #fff; - padding: 20px; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; -} - -#msg { - padding: 20px; - margin-bottom: 40px; -} - -#msg.errors { - border: 1px dotted #BB0000; - color: #BB0000; - padding-left: 100px; - background: url(../images/error.png) no-repeat 20px center; -} - -#msg.success { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../images/success.png) no-repeat 20px center; } -#msg.info { border: 1px dotted #008; color: #008; padding-left: 100px; background: url(../images/info.png) no-repeat 20px center; } -#msg.question { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../images/question.png) no-repeat 20px center; } -#msg.warn { border: 1px dotted #960; color: #960; padding-left: 100px; background: #ffbc8f url(../images/info.png) no-repeat 20px center; } - -.errors { - border: 1px dotted #BB0000; - color: #BB0000; - padding-left: 100px; - padding-top:5px; - margin-bottom:5px; - background: url(../images/error.png) no-repeat 20px center; -} - -#serviceui.serviceinfo { - border: 1px dotted #0066FF; - color: black; - padding-left: 10px; - padding-top: 5px; -} - -#servicedesc { - vertical-align:middle; - padding-left: 30px; - width: 90%; -} - -#login { - width: 320px; - float: left; - margin-right: 20px; -} - -#login h2 { - font-weight: normal; - font-size: 1.4em; - margin-bottom: 20px; -} - -#login .row { - padding: 10px 0; -} - -#login label { - display: block; - margin-bottom: 2px; -} - -#login .check label { - display: inline; -} - -#login input[type=text], #login input[type=password] { - font-size: 1.4em; - padding: 5px; -} - -#login .btn-submit { - background: #70ba61; - border: 0; - padding: 10px 20px; - font-weight: bold; - color: white; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-reset { - background: #eee; - padding: 10px 20px; - border: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-submit:hover, #login .btn-reset:hover { - cursor: pointer; -} - -#login .btn-submit:hover { - background: #7fd36e; -} - -#login .btn-reset:hover { - background: #d4d4d4; -} - -#sidebar { - width: auto; - height: 100%; -} - -#sidebar-content { - padding-left: 20px; -} - -#list-providers ul { - margin-bottom: 3em; -} - -#list-languages h3, #list-providers h3 { - margin-bottom: 1.4em; -} - -#list-languages ul li, #list-providers ul li { - list-style: none; - display: inline-block; - margin-right: 2em; -} - -footer { - padding: 20px; - color: white; -} - -footer a:link, footer a:visited { - color: white; -} - -@media only screen and (max-width: 960px) { - header { padding: 20px; } - #container { width: 100%; } - #content { - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; - } -} - -@media only screen and (max-width: 855px) { - #logo { display: none; } - header h1 { font-size: 1em; width: 70px; height: 40px; background-size: 70px 40px; } - #login { float: none; width: 100%; } - #fm1 .row input[type=text], - #fm1 .row input[type=password] { width: 100%; padding: 10px; box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; } - #fm1 .row .btn-submit { outline: none; -webkit-appearance: none; -webkit-border-radius: 0; border: 0; background: #70ba61; color: white; font-weight: bold; width: 100%; padding: 10px 20px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } - #fm1 .row .btn-reset { display: none; } - #sidebar { margin-top: 20px; } - #sidebar .sidebar-content { padding: 0; } -} - - -/** - * SSO Sessions Styles - */ -#loadingMessage { - font-size: 14px; -} - -#cas-sessions, #no-cas-sessions { - display: none; -} -#no-cas-sessions div { - margin-top: 2em; -} - -.ssoSessions #content { - border-radius: 4px; - padding: 20px; -} - -#container-stable { - margin: 20px 0 20px; -} - -.ssoSessions .btn-success { - background: #70ba61; - border: 0; - padding: 10px 20px; - font-weight: bold; - color: white; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.ssoSessions .sorting_desc, .ssoSessions .sorting_asc { - background-color: rgba(239, 239, 239, 0.8); -} -.ssoSessions #removeAllSessionsButton.btn .badge { - color: #000; - padding-right: 9px; -} - -.ssoSessions .adminPanels { - border-bottom: 1px solid #efefef; - margin-bottom: 2em; - margin-top: 1em; - padding-bottom: 1em; -} - -.ssoSessions .adminPanels .panel-default>.panel-heading { - background-color: #fff; - border-bottom: none; -} -.ssoSessions .adminPanels .panel-default>.panel-heading h3 { - font-family: 'Lato', sans-serif; - font-weight: 300; - font-size: 20pt; -} - -.ssoSessions .adminPanels .panel-default > .panel-heading:after { - position: absolute; - font-family: FontAwesome; - top: -5px; - right: 30px; - font-size: 70pt; - color: #153e50; - opacity: 0.1; -} -.adminPanels .users-panel.panel-default > .panel-heading:after { - content: "\f0c0"; -} - -.adminPanels .usage-panel.panel-default > .panel-heading:after { - content: "\f201"; -} - -.adminPanels .tickets-panel.panel-default > .panel-heading:after { - content: "\f145"; -} - - -.ssoSessions td.details-control { - cursor: pointer; - font-family: FontAwesome; - font-size: 10pt; - color: #337ab7; -} -.ssoSessions td.details-control:after { - content: "\f067"; - /*content: "\002B"; - thinner plus sign */ -} -.ssoSessions tr.shown td.details-control:after { - content: "\f068"; - /*content: "\002D"; - thinner minus sign */ -} - -.row-detail-wrapper { - /*background-color: cornsilk;*/ - background-color: #d9edf7; -} -.ssoSessions .row-detail thead { - display: none; -} -.ssoSessions .row-detail { - /*font-size: 8pt;*/ - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} -.ssoSessions .field-label { - /*font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;*/ - /*font-size: 8pt;*/ - /*font-weight: bold;*/ -} - -.principal_attributes td:first-child { - width: 30%; -} -table.principal_attributes>tbody>tr>td { - border-top-color: #E6E6E6; -} - -.adminPanels .panel-body { - padding-top: 5px; -} -.adminPanels .panel-body span { - font-family: 'Lato', sans-serif; - font-size: 30pt; - font-weight: 100; -} - -.row-eq-height { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; -} - -#alertBox { - display: none; -} - -/** - SB Admin Styles - */ - -.huge { - font-size: 30pt; - font-family: 'Lato', sans-serif; - font-weight: 300; -} - -.semi-huge { - font-size: 18pt; - font-family: 'Lato', sans-serif; - font-weight: 300; -} -/** - * Statistics View - */ - -.statisticsView { - display: none; -} - -.statisticsView .progress-meter .background { - fill: #DFEAFD; -} -.statisticsView .progress-meter .foreground { - fill: #2E7AF9; -} -.statisticsView .progress-meter text { - font-family: 'Lato' sans-serif; - font-size: 25pt; - font-weight: 300; -} -.statisticsView .progress-meter .text2 { - font-family: 'Georgia' sans-serif; - font-size: 10pt; -} - -.modal { - display: none; -} - -/** - * Runtime Statistics Gauge styles - */ -.statisticsView .runtimeStatistics .background { - fill: #DFEAFD; -} -.statisticsView .runtimeStatistics .foreground { - fill: #2E7AF9; -} -.statisticsView .runtimeStatistics text { - font-family: 'Lato' sans-serif; - font-size: 25pt; - font-weight: 300; -} -.statisticsView .runtimeStatistics .text2 { - font-family: 'Georgia' sans-serif; - font-size: 10pt; -} -#uptime-panel { - display: none; -} -#uptime { - font-family: 'Lato', sans-serif; - font-size: 16pt; -} - -.thread-dump-view { - height: 600px; - overflow-y: auto; -} - -#metricsGauges strong { - display: block; -} - -#metricsGauges .panel { - width: 100%; -} - -#metricsGauges ul { - height : auto; - overflow : hidden; -} - -#metricsGauges li { - float : left; - width : 80px; - height: 80px; - margin: 0 0 10px 10px; - background : #d8d8d8; - -} -#metricsGauges ul li:nth-child(5n + 1) { - clear : left; -} - - -.statisticsView .equal, .statisticsView .equal > div[class*='col-'] { - display: -webkit-box; - display: -moz-box; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - flex:1 1 auto; -} - -.statisticsView .section { - margin-bottom: 25px; -} - -#viewSsoSessions { - color: white; -} - -.statisticsView .adminPanels.container-fluid { - padding-right: 0; -} - -/** - * View Configuration Styles - */ -#viewConfigError { - display: none; -} -#view-configuration { - display: none; -} diff --git a/code/jeeplatform-sso/src/main/webapp/css/ssosessions.css b/code/jeeplatform-sso/src/main/webapp/css/ssosessions.css deleted file mode 100644 index 793d0ba..0000000 --- a/code/jeeplatform-sso/src/main/webapp/css/ssosessions.css +++ /dev/null @@ -1,130 +0,0 @@ -/* -/* --------------- CUSTOM STYLES -*/ - -body,html { - background: #153e50; -} - -/*body,html,*/ - -#cas-sessions, -#container-stable, -.ui-widget { - font-family: 'Lato', sans-serif !important; - font-size: 14px; -} - - -/* Navigation -- */ -.navbar-default .navbar-brand, -.navbar-default .navbar-toggle { - color: #ffffff; -} -.navbar-default .navbar-brand { - font-family: 'Open Sans', sans-serif; - color: #ffffff; - line-height: 32px; - font-size: 20px; - padding: 0; - position: relative; - top: 8px; - left: 5px; -} -.navbar-default .navbar-brand:hover { - color: #ffffff; -} -.navbar-default .navbar-brand img { - margin-right: 8px; - width: 32px; -} -.navbar-default .navbar-brand .logo { - text-transform: uppercase; - font-size: 26px; -} -.navbar-default .navbar-brand .logo .heavy { - font-weight: 700; -} - -@media (min-width: 768px) { - .navbar-brand { - display: block; - padding: 6px 15px 0; - box-sizing: border-box; - top: auto; - left: auto; - } - .navbar-brand img { - display: inline-block; - width: 32px; - } -} - - - -#navbar > .navbar-nav > li > a { - color: #ffffff; - font-size: 12px; -} -.navbar-default { - border-bottom: 1px solid #dadada; - background-color: #346288; -} -.navbar-default .navbar-header a { - color: #ffffff; -} -.navbar-default .navbar-header a.toggle-sidebar { - padding: 15px 20px; - float: left; -} -#top-navbar .nav > li .navbar-text { - color: #ffffff; - padding: 15px 14px; - margin: 0; -} -#top-navbar .nav > li > a { - color: #ffffff; - padding: 15px 14px; - margin: 0; -} -#top-navbar .nav > li > a:hover, -#top-navbar .nav > li > a:focus { - background-color: #36a9e1; -} - -/* Main content block --*/ -/*#content {*/ - /*border-radius: 4px;*/ -/*}*/ - -/* Session container --*/ -#container-stable { - margin: 40px 0 20px; -} -#container-stable h3, -#container-stable table th, -#container-stable table td { - /*font-family: Arial,"Helvetica Neue",Helvetica,sans-serif;*/ -} -#container-stable table th { - text-align: left; -} - -/* Tables */ -#table-monitor-hdr { - font-weight: bold; - margin-left: 16px; - text-align: center -} - - -/* UI controls */ -.ui-accordion .ui-accordion-header { - margin: 15px 0 0; -} - -.btn.active, .btn:active { - color: #fff; - background-color: #286090; - border-color: #204d74; -} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/favicon.ico b/code/jeeplatform-sso/src/main/webapp/favicon.ico deleted file mode 100644 index 635bac5..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/favicon.ico and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/6inchbrand-64.png b/code/jeeplatform-sso/src/main/webapp/images/6inchbrand-64.png deleted file mode 100644 index 0b97048..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/6inchbrand-64.png and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/cas-logo.png b/code/jeeplatform-sso/src/main/webapp/images/cas-logo.png deleted file mode 100644 index febd0bc..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/cas-logo.png and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/confirm.gif b/code/jeeplatform-sso/src/main/webapp/images/confirm.gif deleted file mode 100644 index 533bbba..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/confirm.gif and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/error.gif b/code/jeeplatform-sso/src/main/webapp/images/error.gif deleted file mode 100644 index b5f4c03..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/error.gif and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/error.png b/code/jeeplatform-sso/src/main/webapp/images/error.png deleted file mode 100644 index 7815bfb..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/error.png and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/green.gif b/code/jeeplatform-sso/src/main/webapp/images/green.gif deleted file mode 100644 index 8d4f802..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/green.gif and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/info.gif b/code/jeeplatform-sso/src/main/webapp/images/info.gif deleted file mode 100644 index 4aef02a..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/info.gif and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/info.png b/code/jeeplatform-sso/src/main/webapp/images/info.png deleted file mode 100644 index e244822..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/info.png and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/key-point_bl.gif b/code/jeeplatform-sso/src/main/webapp/images/key-point_bl.gif deleted file mode 100644 index fe6f825..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/key-point_bl.gif and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/key-point_br.gif b/code/jeeplatform-sso/src/main/webapp/images/key-point_br.gif deleted file mode 100644 index ba5f51b..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/key-point_br.gif and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/key-point_tl.gif b/code/jeeplatform-sso/src/main/webapp/images/key-point_tl.gif deleted file mode 100644 index 87d7cd0..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/key-point_tl.gif and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/key-point_tr.gif b/code/jeeplatform-sso/src/main/webapp/images/key-point_tr.gif deleted file mode 100644 index 602127a..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/key-point_tr.gif and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/logo.png b/code/jeeplatform-sso/src/main/webapp/images/logo.png deleted file mode 100644 index 6df4a29..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/logo.png and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/question.png b/code/jeeplatform-sso/src/main/webapp/images/question.png deleted file mode 100644 index 145e38b..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/question.png and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/red.gif b/code/jeeplatform-sso/src/main/webapp/images/red.gif deleted file mode 100644 index 8362124..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/red.gif and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/success.png b/code/jeeplatform-sso/src/main/webapp/images/success.png deleted file mode 100644 index 7b7f03b..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/success.png and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/warning.png b/code/jeeplatform-sso/src/main/webapp/images/warning.png deleted file mode 100644 index bd4b0a0..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/warning.png and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/images/webapp.png b/code/jeeplatform-sso/src/main/webapp/images/webapp.png deleted file mode 100644 index c2ea89b..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/images/webapp.png and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/index.jsp b/code/jeeplatform-sso/src/main/webapp/index.jsp deleted file mode 100644 index 08a5002..0000000 --- a/code/jeeplatform-sso/src/main/webapp/index.jsp +++ /dev/null @@ -1,6 +0,0 @@ -<%@ page language="java" session="false" %> - -<% -final String queryString = request.getQueryString(); -final String url = request.getContextPath() + "/login" + (queryString != null ? '?' + queryString : ""); -response.sendRedirect(response.encodeURL(url));%> diff --git a/code/jeeplatform-sso/src/main/webapp/js/cas.js b/code/jeeplatform-sso/src/main/webapp/js/cas.js deleted file mode 100644 index f5a2055..0000000 --- a/code/jeeplatform-sso/src/main/webapp/js/cas.js +++ /dev/null @@ -1,62 +0,0 @@ - -head.ready(document, function() { - head.load("https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js", loadjQueryUI); -}); - -function loadjQueryUI() { - head.load("https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js", loadjQueryCookies); -} - -function loadjQueryCookies() { - head.load("https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js", resourceLoadedSuccessfully); -} - -function areCookiesEnabled() { - $.cookie('cookiesEnabled', 'true'); - var value = $.cookie('cookiesEnabled'); - if (value != undefined) { - $.removeCookie('cookiesEnabled'); - return true; - } - return false; -} - -function resourceLoadedSuccessfully() { - $(document).ready(function() { - - if ($(":focus").length === 0){ - $("input:visible:enabled:first").focus(); - } - - - if (areCookiesEnabled()) { - $('#cookiesDisabled').hide(); - } else { - $('#cookiesDisabled').show(); - $('#cookiesDisabled').animate({ backgroundColor: 'rgb(187,0,0)' }, 30).animate({ backgroundColor: 'rgb(255,238,221)' }, 500); - } - - //flash error box - $('#msg.errors').animate({ backgroundColor: 'rgb(187,0,0)' }, 30).animate({ backgroundColor: 'rgb(255,238,221)' }, 500); - - //flash success box - $('#msg.success').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - //flash confirm box - $('#msg.question').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - $('#capslock-on').hide(); - $('#password').keypress(function(e) { - var s = String.fromCharCode( e.which ); - if ( s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey ) { - $('#capslock-on').show(); - } else { - $('#capslock-on').hide(); - } - }); - if (typeof(jqueryReady) == "function") { - jqueryReady(); - } - }); - -}; diff --git a/code/jeeplatform-sso/src/main/webapp/js/ssosessions.js b/code/jeeplatform-sso/src/main/webapp/js/ssosessions.js deleted file mode 100644 index c1c1269..0000000 --- a/code/jeeplatform-sso/src/main/webapp/js/ssosessions.js +++ /dev/null @@ -1,181 +0,0 @@ -var ssoSessions = (function () { - var urls = { - destroy: { - all: '/cas/statistics/ssosessions/destroySsoSessions', - single: '/cas/statistics/ssosessions/destroySsoSession' - }, - getSessions: '/cas/statistics/ssosessions/getSsoSessions' - }; - - var createDataTable = function() { - $('#ssoSessions').DataTable( { - "order": [[ 3, "desc" ]], - "initComplete": function(settings, json) { - - if (!json || json.activeSsoSessions.length == 0) { - $('#loadingMessage').hide(); - $('#no-cas-sessions').show(); - } else { - updateAdminPanels( json ); - - $('#loadingMessage').hide(); - $("#no-cas-sessions").hide(); - $("#cas-sessions").show(); - } - }, - "language": { - //"infoEmpty": "No active sessions were found", - "emptyTable": "No sessions found", - "zeroRecords": "No matching sessions found" - }, - "processing": true, - "ajax": { - "url": '/cas/statistics/ssosessions/getSsoSessions', - "dataSrc": "activeSsoSessions" - }, - - columnDefs: [ - { - "targets": 0, - "className": 'details-control', - "orderable": false, - "data": null, - "defaultContent": '' - }, - { - "targets": 1, - "data": 'is_proxied', - 'className': 'col-xs-2 col-md-1', - "render" : function ( data, type, full, meta ) { - if ( data === true) { - return 'Proxy'; - } else { - return ' '; - } - } - }, - { - "targets": 2, - "data": 'authenticated_principal', - "className": 'col-xs-4 col-md-2', - "render": function ( data, type, full, meta ) { - return type === 'display' && data.length > 20 ? - ''+data.substr( 0, 18 )+'...' : - data; - } - }, - { - "targets": 3, - "data": 'ticket_granting_ticket', - "className": 'hidden-xs hidden-sm col-md-4', - "render": function ( data, type, full, meta ) { - return type === 'display' && data.length > 20 ? - ''+data.substr( 0, 40 )+'...' : - data; - } - }, - { - "targets": 4, - "data": 'authentication_date_formatted', - "className": 'col-xs-4 col-sm-4 col-md-2' - }, - { - "targets": 5, - "data": 'number_of_uses', - "className": 'hidden-xs hidden-sm visible-md-* col-md-2' - }, - { - "targets": 6, - "data": "ticket_granting_ticket", - "className": 'col-xs-2 col-sm-2 col-md-1', - "render": function (data, type, full, meta ) { - return ''; - }, - "orderable": false - }, - ] - } ); - }; - - var addEventHandlers = function() { - - /** - * The Bulk remove button - */ - $('#removeAllSessionsButton').on('click', function(e) { - e.preventDefault(); - removeSession(this.value); - }); - - /** - * Individual removal button - */ - $(document).on('click', '#ssoSessions tbody tr td:last-child button.btn-danger', function (e) { - e.preventDefault(); - removeSession( this.value ); - }); - - /** - * The filter buttons - */ - $('#filterButtons .btn').click(function() { - - var filter = $(this).data('filter'); - var table = $('#ssoSessions').DataTable(); - - // Create Filter RegEx: - if ( filter == 'proxied') { - var filterRegex = '^Proxy$'; - var deleteValue = 'PROXIED'; - var btnText = 'Remove xx Proxied Sessions'; - } else if ( filter == 'non-proxied') { - var filterRegex = '^ $'; - var deleteValue = 'DIRECT'; - var btnText = 'Remove xx Non-Proxied Sessions'; - } else { - var filterRegex = ''; - var deleteValue = 'ALL'; - var btnText = 'Remove All Sessions'; - } - - var searchTerm = table.column( 1 ).search(filterRegex, true, false).draw(); - - $('#removeAllSessionsButton').val( deleteValue ).html(btnText.replace('xx', searchTerm.page.info().recordsDisplay )) - }); - - - // Add event listener for opening and closing details - $(document).on('click', '#ssoSessions tbody td.details-control', function () { - var table = $('#ssoSessions').DataTable(); - var tr = $(this).closest('tr'); - var row = table.row( tr ); - - if ( row.child.isShown() ) { - // This row is already open - close it - row.child.hide(); - tr.removeClass('shown'); - } - else { - // Open this row - row.child( format(row.data()), 'info' ).show(); - tr.addClass('shown'); - } - } ); - - - - }; - - // initialization ******* - ( function init () { - addEventHandlers(); - createDataTable(); - })(); - - // Public Methods - return { - /** - * Not used - */ - }; -})(); diff --git a/code/jeeplatform-sso/src/main/webapp/js/statisticsview.js b/code/jeeplatform-sso/src/main/webapp/js/statisticsview.js deleted file mode 100644 index ac2513a..0000000 --- a/code/jeeplatform-sso/src/main/webapp/js/statisticsview.js +++ /dev/null @@ -1,138 +0,0 @@ -var Gauge = function (wrapper, percent, options) { - if (!wrapper || !percent) { - //console.error('wrapper and percentage are required. Please check your code.'); - return; - } - - var label = (!options.label) ? '' : options.label; - - var textClass = options.textClass || 'progress-meter'; - - var width = options.width || 200, - height = options.height || 200, - twoPi = 2 * Math.PI, - progress = 0, - total = 100, - formatPercent = d3.format(".0%"); - - var colorScale = d3.scale.linear() - .domain([0, 0.40, 0.50, 1]) - .range(["green", "green", "goldenrod", "red"]); - - var arc = d3.svg.arc() - .startAngle(0) - .innerRadius(width * 0.4) - .outerRadius(width * 0.5) - ; - - var svg = d3.select(wrapper).append("svg") - .attr("width", width) - .attr("height", height) - - .attr('fill', '#2E7AF9') - .append("g") - .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); - - var meter = svg.append("g") - .attr("class", textClass); - - meter.append("path") - .attr("class", "background") - .attr("d", arc.endAngle(twoPi)); - - var foreground = meter.append("path") - .attr("class", "foreground"); - - var text = meter.append("text") - .attr("text-anchor", "middle"); - - var text2 = meter.append("text") - .attr('y', height * 0.15) - .attr("text-anchor", "middle") - .attr("class", "text2"); - - text2.text(label); - - var animate = function (percentage) { - var i = d3.interpolate(progress, percentage); - - foreground.transition().duration(2000) - .tween("progress", function () { - - return function (t) { - progress = i(t); - - foreground.style('fill', colorScale(progress)); - foreground.attr("d", arc.endAngle(twoPi * progress)); - text.text(formatPercent(progress)); - }; - }); - }; - - // init - (function () { - setTimeout(function () { - animate(percent); - }, 500); - })(); - - return { - update: function (newPercent) { - animate(newPercent); - } - }; -}; - - -function upTime(countTo, el) { - var wrapper = document.getElementById('uptime-panel'); - var element = document.getElementById(el); - var now = new Date(); - countTo = new Date(countTo); - var difference = (now - countTo); - - var days = Math.floor(difference / (60 * 60 * 1000 * 24) * 1); - var hours = Math.floor((difference % (60 * 60 * 1000 * 24)) / (60 * 60 * 1000) * 1); - var mins = Math.floor(((difference % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) / (60 * 1000) * 1); - var secs = Math.floor((((difference % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) % (60 * 1000)) / 1000 * 1); - - clearTimeout(upTime.to); - - if (isNaN(days) || isNaN(hours) || isNaN(mins) || isNaN(secs) ) { - wrapper.style.display = 'none'; - } else { - days = (days == 1) ? days + ' day ' : days + ' days '; - hours = (hours == 1) ? hours + ' hour ' : hours + ' hours '; - mins = (mins == 1) ? mins + ' minute ' : mins + ' minutes '; - secs = (secs == 1) ? secs + ' second ' : secs + ' seconds'; - - var timeString = '' + days + hours + mins + secs + ''; - element.innerHTML = timeString; - wrapper.style.display = 'block'; - - upTime.to = setTimeout(function() { - upTime(countTo, el); - },1000); - - } -} - - -// Fill modal with content from link href -$("#threadDumpModal").on("show.bs.modal", function (e) { - var link = $(e.relatedTarget); - $(this).find(".modal-body pre").load(link.val()); -}); - -/** - * Thread Dump Preview - * Returnes the xx amount of characters from the end of the thread dump for preview sake. - * The length can be changed by passing ini a value, otherwise it defaults to 400. - */ -function getThreadDumpPreview(len) { - var len = len || 400; - $.get($('#threadDumpViewButton').val(), function (data) { - $('#threadDumpPreview').html(data.substr(-len)); - }); -} - diff --git a/code/jeeplatform-sso/src/main/webapp/js/test_data.json b/code/jeeplatform-sso/src/main/webapp/js/test_data.json deleted file mode 100644 index 016225c..0000000 --- a/code/jeeplatform-sso/src/main/webapp/js/test_data.json +++ /dev/null @@ -1,1117 +0,0 @@ -{ - "activeSsoSessions": [ - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - } - ] -} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/js/viewConfig.js b/code/jeeplatform-sso/src/main/webapp/js/viewConfig.js deleted file mode 100644 index 3c536fc..0000000 --- a/code/jeeplatform-sso/src/main/webapp/js/viewConfig.js +++ /dev/null @@ -1,59 +0,0 @@ -var viewConfigs = (function () { - var createDataTable = function() { - $('#viewConfigsTable').DataTable( { - "initComplete": function(settings, json) { - if (!json || json.length == 0) { - $('#loadingMessage').hide(); - $('#viewConfigError').show(); - $("#view-configuration").hide(); - } else { - $('#loadingMessage').hide(); - $('#viewConfigError').hide(); - $("#view-configuration").show(); - } - }, - "drawCallback": function( settings ) { - var api = this.api(); - if (api.page.info().pages > 1) { - $('#' + $.fn.dataTable.tables()[0].id + '_paginate')[0].style.display = "block"; - } else { - $('#' + $.fn.dataTable.tables()[0].id + '_paginate')[0].style.display = "none"; - } - }, - "processing": true, - "ajax": { - "url": '/cas/status/config/getProperties', - "dataSrc": function (json) { - var return_data = new Array(); - for(var i=0;i< json.length; i++){ - var obj = json[i]; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - return_data.push({ - 'key': key, - 'value' : obj[key], - }) - } - } - } - return return_data; - } - }, - "columns": [ - { "data": "key", 'className': 'col-xs-6' }, - { "data": "value", 'className': 'col-xs-6' } - ], - } ); - }; - // initialization ******* - ( function init () { - createDataTable(); - })(); - - // Public Methods - return { - /** - * Not used - */ - }; -})(); diff --git a/code/jeeplatform-sso/src/main/webapp/themes/apereo/css/cas.css b/code/jeeplatform-sso/src/main/webapp/themes/apereo/css/cas.css deleted file mode 100644 index 844c94b..0000000 --- a/code/jeeplatform-sso/src/main/webapp/themes/apereo/css/cas.css +++ /dev/null @@ -1,198 +0,0 @@ -html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; outline: 0; font-size: 100%; vertical-align: baseline; background: transparent; } -body { line-height: 1; } -nav ul { list-style: none; } -blockquote, q { quotes: none; } -blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } -a { margin: 0; padding: 0; font-size: 100%; vertical-align: baseline; background: transparent; } -ins { background-color: #ff9; color: #000; text-decoration: none; } -mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; } -del { text-decoration: line-through; } -abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; } -table { border-collapse: collapse; border-spacing: 0; } -hr { display: block; height: 1px; border: 0; border-top: 1px solid #cccccc; margin: 1em 0; padding: 0; } -input, select { vertical-align: middle; } -body { font-family: Helvetica, Arial, sans-serif; font-size: 12px; line-height: 1.4em; background: #eee; } - -#container { width: 960px; margin: 0 auto; } - -@media only screen and (max-width: 960px) { - #container { width: 100%; } - #content { -webkit-border-bottom-right-radius: 0px; -webkit-border-bottom-left-radius: 0px; -moz-border-radius-bottomright: 0px; -moz-border-radius-bottomleft: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; } -} - -body { - background: url(../images/bg-tile.gif); /* Old browsers */ -} - -a:link, a:visited { - color: #257bb2; -} - -a:hover { - color: #a0b757; -} - -p { - margin-bottom: 1.4em; -} - -header { - overflow: hidden; - padding: 40px 0; -} - -#logo { - display: block; - width: 250px; - height: 52px; - background: url(../images/apereo-logo.png) no-repeat; - text-indent: -999em; - float: left; - - margin-right: 40px; - border-right: 1px solid rgba(255,255,255,0.25); -} - -header h1 { - display: none; -} - -#content { - overflow: hidden; - background: #fff; - padding: 20px; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; - -webkit-box-shadow: 0 0 8px 0 rgba(0,0,0,0.15); - box-shadow: 0 0 8px 0 rgba(0,0,0,0.15); -} - -#msg { - padding: 20px; - margin-bottom: 40px; -} - -#msg.errors { - border: 1px dotted #BB0000; - color: #BB0000; - padding-left: 100px; - background: url(../../../images/error.png) no-repeat 20px center; -} - -#msg.success { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../../../images/success.png) no-repeat 20px center; } -#msg.info { border: 1px dotted #008; color: #008; padding-left: 100px; background: url(../../../images/info.png) no-repeat 20px center; } -#msg.question { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../../../images/question.png) no-repeat 20px center; } -#msg.warn { border: 1px dotted #960; color: #960; padding-left: 100px; background: #ffbc8f url(../../../images/info.png) no-repeat 20px center; } - -#login { - width: 320px; - float: left; - margin-right: 20px; -} - -#login h2 { - font-weight: normal; - font-size: 1.4em; - margin-bottom: 20px; -} - -#login .row { - padding: 10px 0; -} - -#login label { - display: block; - margin-bottom: 2px; -} - -#login .check label { - display: inline; -} - -#login input[type=text], #login input[type=password] { - font-size: 1.4em; - padding: 5px; -} - -#login .btn-submit { - background: #2aa4a5; - border: 0; - padding: 10px 20px; - font-weight: bold; - color: white; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-reset { - background: #eee; - padding: 10px 20px; - border: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-submit:hover, #login .btn-reset:hover { - cursor: pointer; -} - -#login .btn-submit:hover { - background: #30bfbf; -} - -#login .btn-reset:hover { - background: #d4d4d4; -} - -#sidebar { - width: auto; - height: 100%; -} - -#sidebar-content { - padding-left: 20px; -} - -#list-languages h3 { - margin-bottom: 1.4em; -} - -#list-languages ul li { - list-style: none; - display: inline-block; - margin-right: 2em; -} - -footer { - padding: 20px; - color: black; -} - -footer a:link, footer a:visited { - color: black; -} - -@media only screen and (max-width: 960px) { - header { padding: 20px; } - #container { width: 100%; } - #content { - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; - } -} - -@media only screen and (max-width: 799px) { - header { padding: 10px;} - #logo { width: 156px; height: 32px; background-size: 156px 32px; margin-right: 20px; } - #login { float: none; width: 100%; } - #fm1 .row input[type=text], - #fm1 .row input[type=password] { width: 100%; padding: 10px; box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; } - #fm1 .row .btn-submit { outline: none; -webkit-appearance: none; -webkit-border-radius: 0; border: 0; background: #2aa4a5; color: white; font-weight: bold; width: 100%; padding: 10px 20px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } - #fm1 .row .btn-reset { display: none; } - #sidebar { margin-top: 20px; } - #sidebar .sidebar-content { padding: 0; } -} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/themes/apereo/images/apereo-logo.png b/code/jeeplatform-sso/src/main/webapp/themes/apereo/images/apereo-logo.png deleted file mode 100644 index b40f22c..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/themes/apereo/images/apereo-logo.png and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/themes/apereo/images/bg-tile.gif b/code/jeeplatform-sso/src/main/webapp/themes/apereo/images/bg-tile.gif deleted file mode 100644 index 41332ee..0000000 Binary files a/code/jeeplatform-sso/src/main/webapp/themes/apereo/images/bg-tile.gif and /dev/null differ diff --git a/code/jeeplatform-sso/src/main/webapp/themes/apereo/js/cas.js b/code/jeeplatform-sso/src/main/webapp/themes/apereo/js/cas.js deleted file mode 100644 index 7e22762..0000000 --- a/code/jeeplatform-sso/src/main/webapp/themes/apereo/js/cas.js +++ /dev/null @@ -1,20 +0,0 @@ -$(document).ready(function(){ - //focus username field - if ($(":focus").length === 0){ - $("input:visible:enabled:first").focus(); - } - - //flash error box - $('#msg.errors').animate({ backgroundColor: 'rgb(187,0,0)' }, 30).animate({ backgroundColor: 'rgb(255,238,221)' }, 500); - - //flash success box - $('#msg.success').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - //flash confirm box - $('#msg.question').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - /* - * Using the JavaScript Debug library, you may issue log messages such as: - * debug.log("Welcome to Central Authentication Service"); - */ -}); diff --git a/code/pom.xml b/code/pom.xml index 6ebc992..9e93ddc 100755 --- a/code/pom.xml +++ b/code/pom.xml @@ -18,11 +18,12 @@ UTF-8 - 1.0 - 1.0 - 1.0 - 1.0 - + 1.1.0 + 1.1.0 + 1.1.0 + 1.1.0 + 1.1.0 + 1.1.0 1.2.17 5.1.27 @@ -127,73 +128,34 @@ - jeeplatform-core + jeeplatform-provider-api jeeplatform-admin jeeplatform-common - jeeplatform-sso + jeeplatform-sso-cas + jeeplatform-provider + jeeplatform-oa - - - org.springframework.boot - spring-boot-starter-web - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-data-redis - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-data-jpa - ${spring-boot.version} - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - ${mybatis-spring-boot.version} - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - + + org.springframework.boot spring-boot-devtools true - - - com.alibaba - druid - ${druid.version} - - - com.alibaba - druid-spring-boot-starter - ${druid.version} - - + - tk.mybatis - mapper - ${tk.mybatis.mapper.version} - - - javax.persistence - persistence-api - - + org.springframework.boot + spring-boot-starter-test + + - com.github.pagehelper - pagehelper - ${github.pagehelper.version} + org.springframework.boot + spring-boot-configuration-processor + true @@ -203,12 +165,12 @@ ${mysql-connector.version} - - + + + org.projectlombok + lombok + ${lombok.version} + @@ -217,22 +179,22 @@ ${fastjson.version} - - - org.projectlombok - lombok - ${lombok.version} - - + + repos Repository http://maven.aliyun.com/nexus/content/groups/public + + + jitpack.io + https://jitpack.io + diff --git a/db/schema.sql b/db/schema.sql new file mode 100644 index 0000000..27c5c50 --- /dev/null +++ b/db/schema.sql @@ -0,0 +1,22 @@ +/* +SQLyog Ultimate v11.5 (64 bit) +MySQL - 5.7.27 +********************************************************************* +*/ +/*!40101 SET NAMES utf8 */; + +create table `oauth_client_details` ( + `client_id` varchar (768), + `resource_ids` varchar (768), + `client_secret` varchar (768), + `scope` varchar (768), + `authorized_grant_types` varchar (768), + `web_server_redirect_uri` varchar (768), + `authorities` varchar (768), + `access_token_validity` int (11), + `refresh_token_validity` int (11), + `additional_information` varchar (12288), + `autoapprove` varchar (768) +); +insert into `oauth_client_details` (`client_id`, `resource_ids`, `client_secret`, `scope`, `authorized_grant_types`, `web_server_redirect_uri`, `authorities`, `access_token_validity`, `refresh_token_validity`, `additional_information`, `autoapprove`) values('cms',NULL,'{noop}secret','all','authorization_code','http://localhost:8084/cms/login',NULL,'60','60',NULL,'true'); +insert into `oauth_client_details` (`client_id`, `resource_ids`, `client_secret`, `scope`, `authorized_grant_types`, `web_server_redirect_uri`, `authorities`, `access_token_validity`, `refresh_token_validity`, `additional_information`, `autoapprove`) values('oa',NULL,'{noop}secret','all','authorization_code','http://localhost:8082/oa/login',NULL,'60','60',NULL,'true');