diff --git a/doc/01_个人财务管理系统行业和领域调研分析报告.docx b/doc/01_个人财务管理系统行业和领域调研分析报告.docx new file mode 100644 index 0000000..bb3d75a Binary files /dev/null and b/doc/01_个人财务管理系统行业和领域调研分析报告.docx differ diff --git a/doc/02_个人财务管理系统软件设计规格说明书.docx b/doc/02_个人财务管理系统软件设计规格说明书.docx new file mode 100644 index 0000000..29ec5bd Binary files /dev/null and b/doc/02_个人财务管理系统软件设计规格说明书.docx differ diff --git a/doc/03_个人财务管理系统软件需求规格说明书.docx b/doc/03_个人财务管理系统软件需求规格说明书.docx new file mode 100644 index 0000000..f8d8c23 Binary files /dev/null and b/doc/03_个人财务管理系统软件需求规格说明书.docx differ diff --git a/doc/04_个人财务管理系统需求构思及描述.docx b/doc/04_个人财务管理系统需求构思及描述.docx new file mode 100644 index 0000000..3c5a816 Binary files /dev/null and b/doc/04_个人财务管理系统需求构思及描述.docx differ diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..09bdfea --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,46 @@ +###################################################################### +# Build Tools + +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +target/ +!.mvn/wrapper/maven-wrapper.jar + +###################################################################### +# IDE + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### JRebel ### +rebel.xml +### NetBeans ### +nbproject/private/ +build/* +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +###################################################################### +# Others +*.log +*.xml.versionsBackup +*.swp + +!*/build/*.java +!*/build/*.html +!*/build/*.xml \ No newline at end of file diff --git a/src/LICENSE b/src/LICENSE new file mode 100644 index 0000000..8564f29 --- /dev/null +++ b/src/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 RuoYi + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..f7c3352 --- /dev/null +++ b/src/README.md @@ -0,0 +1,102 @@ +

+ logo +

+

RuoYi v4.7.9

+

基于SpringBoot开发的轻量级Java快速开发框架

+

+ + + +

+ +## 平台简介 + +一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。 + +性别男,若依是给女儿取的名字(寓意:你若不离不弃,我必生死相依) + +若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。 + +* 前后端分离版本,请移步[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) +* 感谢 [hplus](https://gitee.com/hplus_admin/hplus) 后台主题 UI 框架。 +* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)   +* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)   + +## 内置功能 + +1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 +2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 +3. 岗位管理:配置系统用户所属担任职务。 +4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 +5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 +6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 +7. 参数管理:对系统动态配置常用参数。 +8. 通知公告:系统通知公告信息发布维护。 +9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 +10. 登录日志:系统登录日志记录查询包含登录异常。 +11. 在线用户:当前系统中活跃用户状态监控。 +12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 +13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 +14. 系统接口:根据业务代码自动生成相关的api接口文档。 +15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 +16. 缓存监控:对系统的缓存查询,删除、清空等操作。 +17. 在线构建器:拖动表单元素生成相应的HTML代码。 +18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 + +## 在线体验 + +- admin/admin123 +- 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 + +演示地址:http://ruoyi.vip +文档地址:http://doc.ruoyi.vip + +## 演示图 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +## 若依交流群 + +QQ群: [![加入QQ群](https://img.shields.io/badge/已满-1389287-blue.svg)](https://jq.qq.com/?_wv=1027&k=5HBAaYN) [![加入QQ群](https://img.shields.io/badge/已满-1679294-blue.svg)](https://jq.qq.com/?_wv=1027&k=5cHeRVW) [![加入QQ群](https://img.shields.io/badge/已满-1529866-blue.svg)](https://jq.qq.com/?_wv=1027&k=53R0L5Z) [![加入QQ群](https://img.shields.io/badge/已满-1772718-blue.svg)](https://jq.qq.com/?_wv=1027&k=5g75dCU) [![加入QQ群](https://img.shields.io/badge/已满-1366522-blue.svg)](https://jq.qq.com/?_wv=1027&k=58cPoHA) [![加入QQ群](https://img.shields.io/badge/已满-1382251-blue.svg)](https://jq.qq.com/?_wv=1027&k=5Ofd4Pb) [![加入QQ群](https://img.shields.io/badge/已满-1145125-blue.svg)](https://jq.qq.com/?_wv=1027&k=5yugASz) [![加入QQ群](https://img.shields.io/badge/已满-86752435-blue.svg)](https://jq.qq.com/?_wv=1027&k=5Rf3d2P) [![加入QQ群](https://img.shields.io/badge/已满-134072510-blue.svg)](https://jq.qq.com/?_wv=1027&k=5ZIjaeP) [![加入QQ群](https://img.shields.io/badge/已满-210336300-blue.svg)](https://jq.qq.com/?_wv=1027&k=5CJw1jY) [![加入QQ群](https://img.shields.io/badge/已满-339522636-blue.svg)](https://jq.qq.com/?_wv=1027&k=5omzbKc) [![加入QQ群](https://img.shields.io/badge/已满-130035985-blue.svg)](https://jq.qq.com/?_wv=1027&k=qPIKBb7s) [![加入QQ群](https://img.shields.io/badge/已满-143151071-blue.svg)](https://jq.qq.com/?_wv=1027&k=4NsjKbtU) [![加入QQ群](https://img.shields.io/badge/已满-158781320-blue.svg)](https://jq.qq.com/?_wv=1027&k=VD2pkz2G) [![加入QQ群](https://img.shields.io/badge/已满-201531282-blue.svg)](https://jq.qq.com/?_wv=1027&k=HlshFwkJ) [![加入QQ群](https://img.shields.io/badge/已满-101526938-blue.svg)](https://jq.qq.com/?_wv=1027&k=0ARRrO9V) [![加入QQ群](https://img.shields.io/badge/已满-264355400-blue.svg)](https://jq.qq.com/?_wv=1027&k=up9k3ZXJ) [![加入QQ群](https://img.shields.io/badge/已满-298522656-blue.svg)](https://jq.qq.com/?_wv=1027&k=540WfdEr) [![加入QQ群](https://img.shields.io/badge/已满-139845794-blue.svg)](https://jq.qq.com/?_wv=1027&k=ss91fC4t) [![加入QQ群](https://img.shields.io/badge/已满-185760789-blue.svg)](https://jq.qq.com/?_wv=1027&k=Cqd66IKe) [![加入QQ群](https://img.shields.io/badge/已满-175104288-blue.svg)](https://jq.qq.com/?_wv=1027&k=7FplYUnR) [![加入QQ群](https://img.shields.io/badge/已满-174942938-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=lqMHu_5Fskm7H2S1vNAQTtzAUokVydwc&authKey=ptw0Fpch5pbNocML3CIJKKqZBaq2DI7cusKuzIgfMNiY3t9Pvd9hP%2BA8WYx3yaY1&noverify=0&group_code=174942938) [![加入QQ群](https://img.shields.io/badge/已满-287843737-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=blYlRDmwZXSXI5pVrPPU7ZJ1stFJ6Q2Q&authKey=ForGBWffHVlPt9NE3d7g4DoOIouBh%2BqvAj2lp1CLReHfZAUaK7SRrdwsChKpRJDJ&noverify=0&group_code=287843737) [![加入QQ群](https://img.shields.io/badge/232896766-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=KTVAIhggR3rR3uZWK9A8kR4yYNREQ4jo&authKey=An4DUV9e7uK8I8VgBbp949z0ypQoDrOoqvVg%2FWOr2vuNNDMZUAMPvqHor6TFMIgz&noverify=0&group_code=232896766) \ No newline at end of file diff --git a/src/bin/clean.bat b/src/bin/clean.bat new file mode 100644 index 0000000..24c0974 --- /dev/null +++ b/src/bin/clean.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [Ϣ] target· +echo. + +%~d0 +cd %~dp0 + +cd .. +call mvn clean + +pause \ No newline at end of file diff --git a/src/bin/package.bat b/src/bin/package.bat new file mode 100644 index 0000000..c693ec0 --- /dev/null +++ b/src/bin/package.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [Ϣ] Weḅwar/jarļ +echo. + +%~d0 +cd %~dp0 + +cd .. +call mvn clean package -Dmaven.test.skip=true + +pause \ No newline at end of file diff --git a/src/bin/run.bat b/src/bin/run.bat new file mode 100644 index 0000000..41efbd0 --- /dev/null +++ b/src/bin/run.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo [Ϣ] ʹJarWeb̡ +echo. + +cd %~dp0 +cd ../ruoyi-admin/target + +set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +java -jar %JAVA_OPTS% ruoyi-admin.jar + +cd bin +pause \ No newline at end of file diff --git a/src/doc/若依环境使用手册.docx b/src/doc/若依环境使用手册.docx new file mode 100644 index 0000000..fa5b62d Binary files /dev/null and b/src/doc/若依环境使用手册.docx differ diff --git a/src/pom.xml b/src/pom.xml new file mode 100644 index 0000000..bcc886a --- /dev/null +++ b/src/pom.xml @@ -0,0 +1,239 @@ + + + 4.0.0 + + com.ruoyi + ruoyi + 4.7.9 + + ruoyi + http://www.ruoyi.vip + 若依管理系统 + + + 4.7.9 + UTF-8 + UTF-8 + 1.8 + 3.1.1 + 1.13.0 + 5.3.33 + 2.1.0 + 1.2.23 + 1.21 + 2.3.3 + 3.0.0 + 1.4.7 + 1.2.83 + 6.6.5 + 2.16.1 + 4.1.2 + 2.3 + + + + + + + + + org.springframework + spring-framework-bom + ${spring-framework.version} + pom + import + + + + + org.springframework.boot + spring-boot-dependencies + 2.5.15 + pom + import + + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + pro.fessional + kaptcha + ${kaptcha.version} + + + + + org.apache.shiro + shiro-core + ${shiro.version} + + + + + org.apache.shiro + shiro-spring + ${shiro.version} + + + + + org.apache.shiro + shiro-ehcache + ${shiro.version} + + + + + com.github.theborakompanioni + thymeleaf-extras-shiro + ${thymeleaf.extras.shiro.version} + + + + + eu.bitwalker + UserAgentUtils + ${bitwalker.version} + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper.boot.version} + + + + + com.github.oshi + oshi-core + ${oshi.version} + + + + + io.springfox + springfox-boot-starter + ${swagger.version} + + + io.swagger + swagger-models + + + + + + + commons-io + commons-io + ${commons.io.version} + + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + + + com.alibaba + fastjson + ${fastjson.version} + + + + + + com.ruoyi + ruoyi-framework + ${ruoyi.version} + + + + + com.ruoyi + ruoyi-system + ${ruoyi.version} + + + + + com.ruoyi + ruoyi-common + ${ruoyi.version} + + + + + + + ruoyi-admin + ruoyi-framework + ruoyi-system + ruoyi-common + + pom + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + false + + + + + \ No newline at end of file diff --git a/src/ruoyi-admin/pom.xml b/src/ruoyi-admin/pom.xml new file mode 100644 index 0000000..3c202c3 --- /dev/null +++ b/src/ruoyi-admin/pom.xml @@ -0,0 +1,129 @@ + + + + ruoyi + com.ruoyi + 4.7.9 + + 4.0.0 + jar + ruoyi-admin + + + web服务入口 + + + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + + org.springframework.boot + spring-boot-devtools + true + + + + + io.springfox + springfox-boot-starter + + + + + io.swagger + swagger-models + 1.6.2 + + + + + mysql + mysql-connector-java + + + + + com.ruoyi + ruoyi-framework + + + + + + + + + src/main/resources + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.5.15 + + true + + + + + repackage + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.0.0 + + false + ${project.artifactId} + + + + + ${project.artifactId} + + + \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/src/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java new file mode 100644 index 0000000..0e890c1 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java @@ -0,0 +1,30 @@ +package com.ruoyi; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; + +/** + * 启动程序 + * + * @author ruoyi + */ +@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) +public class RuoYiApplication +{ + public static void main(String[] args) + { + // System.setProperty("spring.devtools.restart.enabled", "false"); + SpringApplication.run(RuoYiApplication.class, args); + System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); + } +} \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java b/src/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java new file mode 100644 index 0000000..6de67dc --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java @@ -0,0 +1,18 @@ +package com.ruoyi; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * web容器中进行部署 + * + * @author ruoyi + */ +public class RuoYiServletInitializer extends SpringBootServletInitializer +{ + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) + { + return application.sources(RuoYiApplication.class); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java new file mode 100644 index 0000000..afb1b52 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -0,0 +1,166 @@ +package com.ruoyi.web.controller.common; + +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.config.ServerConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.file.FileUtils; + +/** + * 通用请求处理 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/common") +public class CommonController +{ + private static final Logger log = LoggerFactory.getLogger(CommonController.class); + + @Autowired + private ServerConfig serverConfig; + + private static final String FILE_DELIMETER = ","; + + /** + * 通用下载请求 + * + * @param fileName 文件名称 + * @param delete 是否删除 + */ + @GetMapping("/download") + public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) + { + try + { + if (!FileUtils.checkAllowDownload(fileName)) + { + throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); + } + String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); + String filePath = RuoYiConfig.getDownloadPath() + fileName; + + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + if (delete) + { + FileUtils.deleteFile(filePath); + } + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } + + /** + * 通用上传请求(单个) + */ + @PostMapping("/upload") + @ResponseBody + public AjaxResult uploadFile(MultipartFile file) throws Exception + { + try + { + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + AjaxResult ajax = AjaxResult.success(); + ajax.put("url", url); + ajax.put("fileName", fileName); + ajax.put("newFileName", FileUtils.getName(fileName)); + ajax.put("originalFilename", file.getOriginalFilename()); + return ajax; + } + catch (Exception e) + { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 通用上传请求(多个) + */ + @PostMapping("/uploads") + @ResponseBody + public AjaxResult uploadFiles(List files) throws Exception + { + try + { + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + List urls = new ArrayList(); + List fileNames = new ArrayList(); + List newFileNames = new ArrayList(); + List originalFilenames = new ArrayList(); + for (MultipartFile file : files) + { + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + urls.add(url); + fileNames.add(fileName); + newFileNames.add(FileUtils.getName(fileName)); + originalFilenames.add(file.getOriginalFilename()); + } + AjaxResult ajax = AjaxResult.success(); + ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); + ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); + ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); + ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); + return ajax; + } + catch (Exception e) + { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 本地资源通用下载 + */ + @GetMapping("/download/resource") + public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) + throws Exception + { + try + { + if (!FileUtils.checkAllowDownload(resource)) + { + throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource)); + } + // 本地资源路径 + String localPath = RuoYiConfig.getProfile(); + // 数据库资源地址 + String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); + // 下载名称 + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, downloadName); + FileUtils.writeBytes(downloadPath, response.getOutputStream()); + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoDialogController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoDialogController.java new file mode 100644 index 0000000..3030057 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoDialogController.java @@ -0,0 +1,98 @@ +package com.ruoyi.web.controller.demo.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * 模态窗口 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/demo/modal") +public class DemoDialogController +{ + private String prefix = "demo/modal"; + + /** + * 模态窗口 + */ + @GetMapping("/dialog") + public String dialog() + { + return prefix + "/dialog"; + } + + /** + * 弹层组件 + */ + @GetMapping("/layer") + public String layer() + { + return prefix + "/layer"; + } + + /** + * 表单 + */ + @GetMapping("/form") + public String form() + { + return prefix + "/form"; + } + + /** + * 表格 + */ + @GetMapping("/table") + public String table() + { + return prefix + "/table"; + } + + /** + * 表格check + */ + @GetMapping("/check") + public String check() + { + return prefix + "/table/check"; + } + + /** + * 表格radio + */ + @GetMapping("/radio") + public String radio() + { + return prefix + "/table/radio"; + } + + /** + * 表格回传父窗体 + */ + @GetMapping("/parent") + public String parent() + { + return prefix + "/table/parent"; + } + + /** + * 多层窗口frame1 + */ + @GetMapping("/frame1") + public String frame1() + { + return prefix + "/table/frame1"; + } + + /** + * 多层窗口frame2 + */ + @GetMapping("/frame2") + public String frame2() + { + return prefix + "/table/frame2"; + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoFormController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoFormController.java new file mode 100644 index 0000000..7cc6faa --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoFormController.java @@ -0,0 +1,399 @@ +package com.ruoyi.web.controller.demo.controller; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.alibaba.fastjson.JSON; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.CxSelect; +import com.ruoyi.common.json.JSONObject; +import com.ruoyi.common.json.JSONObject.JSONArray; +import com.ruoyi.common.utils.StringUtils; + +/** + * 表单相关 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/demo/form") +public class DemoFormController +{ + private String prefix = "demo/form"; + + private final static List users = new ArrayList(); + { + users.add(new UserFormModel(1, "1000001", "测试1", "15888888888")); + users.add(new UserFormModel(2, "1000002", "测试2", "15666666666")); + users.add(new UserFormModel(3, "1000003", "测试3", "15666666666")); + users.add(new UserFormModel(4, "1000004", "测试4", "15666666666")); + users.add(new UserFormModel(5, "1000005", "测试5", "15666666666")); + } + + /** + * 按钮页 + */ + @GetMapping("/button") + public String button() + { + return prefix + "/button"; + } + + /** + * 下拉框 + */ + @GetMapping("/select") + public String select() + { + return prefix + "/select"; + } + + /** + * 时间轴 + */ + @GetMapping("/timeline") + public String timeline() + { + return prefix + "/timeline"; + } + + /** + * 进度条 + */ + @GetMapping("/progress_bars") + public String progress_bars() + { + return prefix + "/progress_bars"; + } + + /** + * 表单校验 + */ + @GetMapping("/validate") + public String validate() + { + return prefix + "/validate"; + } + + /** + * 功能扩展(包含文件上传) + */ + @GetMapping("/jasny") + public String jasny() + { + return prefix + "/jasny"; + } + + /** + * 拖动排序 + */ + @GetMapping("/sortable") + public String sortable() + { + return prefix + "/sortable"; + } + + /** + * 单据打印 + */ + @GetMapping("/invoice") + public String invoice() + { + return prefix + "/invoice"; + } + + /** + * 标签 & 提示 + */ + @GetMapping("/labels_tips") + public String labels_tips() + { + return prefix + "/labels_tips"; + } + + /** + * 选项卡 & 面板 + */ + @GetMapping("/tabs_panels") + public String tabs_panels() + { + return prefix + "/tabs_panels"; + } + + /** + * 栅格 + */ + @GetMapping("/grid") + public String grid() + { + return prefix + "/grid"; + } + + /** + * 表单向导 + */ + @GetMapping("/wizard") + public String wizard() + { + return prefix + "/wizard"; + } + + /** + * 文件上传 + */ + @GetMapping("/upload") + public String upload() + { + return prefix + "/upload"; + } + + /** + * 日期和时间页 + */ + @GetMapping("/datetime") + public String datetime() + { + return prefix + "/datetime"; + } + + /** + * 左右互选组件 + */ + @GetMapping("/duallistbox") + public String duallistbox() + { + return prefix + "/duallistbox"; + } + + /** + * 基本表单 + */ + @GetMapping("/basic") + public String basic() + { + return prefix + "/basic"; + } + + /** + * 卡片列表 + */ + @GetMapping("/cards") + public String cards() + { + return prefix + "/cards"; + } + + /** + * summernote 富文本编辑器 + */ + @GetMapping("/summernote") + public String summernote() + { + return prefix + "/summernote"; + } + + /** + * 搜索自动补全 + */ + @GetMapping("/autocomplete") + public String autocomplete() + { + return prefix + "/autocomplete"; + } + + /** + * 多级联动下拉 + */ + @GetMapping("/cxselect") + public String cxselect(ModelMap mmap) + { + CxSelect cxSelectTB = new CxSelect(); + cxSelectTB.setN("淘宝"); + cxSelectTB.setV("taobao"); + CxSelect cxSelectTm = new CxSelect(); + cxSelectTm.setN("天猫"); + cxSelectTm.setV("tm"); + CxSelect cxSelectJhs = new CxSelect(); + cxSelectJhs.setN("聚划算"); + cxSelectJhs.setV("jhs"); + List tmList = new ArrayList(); + tmList.add(cxSelectTm); + tmList.add(cxSelectJhs); + cxSelectTB.setS(tmList); + + CxSelect cxSelectJD = new CxSelect(); + cxSelectJD.setN("京东"); + cxSelectJD.setV("jd"); + CxSelect cxSelectCs = new CxSelect(); + cxSelectCs.setN("京东超市"); + cxSelectCs.setV("jdcs"); + CxSelect cxSelectSx = new CxSelect(); + cxSelectSx.setN("京东生鲜"); + cxSelectSx.setV("jdsx"); + List jdList = new ArrayList(); + jdList.add(cxSelectCs); + jdList.add(cxSelectSx); + cxSelectJD.setS(jdList); + + List cxList = new ArrayList(); + cxList.add(cxSelectTB); + cxList.add(cxSelectJD); + + mmap.put("data", JSON.toJSON(cxList)); + return prefix + "/cxselect"; + } + + /** + * 局部刷新 + */ + @GetMapping("/localrefresh") + public String localRefresh(ModelMap mmap) + { + JSONArray list = new JSONArray(); + JSONObject item = new JSONObject(); + item.put("name", "这条任务数据是由ModelMap传递到页面的,点击添加按钮后会将这条数据替换为新数据"); + item.put("type", "默认"); + item.put("date", "2020.06.10"); + list.add(item); + mmap.put("tasks", list); + mmap.put("min", 2); + mmap.put("max", 10); + return prefix + "/localrefresh"; + } + + /** + * 局部刷新-添加任务 + * + * @param fragment 页面中的模板名称 + * @param taskName 任务名称 + */ + @PostMapping("/localrefresh/task") + public String localRefreshTask(String fragment, String taskName, ModelMap mmap) + { + JSONArray list = new JSONArray(); + JSONObject item = new JSONObject(); + item.put("name", StringUtils.defaultIfBlank(taskName, "通过电话销售过程中了解各盛市的设备仪器使用、采购情况及相关重要追踪人")); + item.put("type", "新增"); + item.put("date", "2018.06.10"); + list.add(item); + item = new JSONObject(); + item.put("name", "提高自己电话营销技巧,灵活专业地与客户进行电话交流"); + item.put("type", "新增"); + item.put("date", "2018.06.12"); + list.add(item); + mmap.put("tasks", list); + return prefix + "/localrefresh::" + fragment; + } + + /** + * 模拟数据 + */ + @GetMapping("/cityData") + @ResponseBody + public String cityData() + { + String data = "[{\"n\":\"湖南省\",\"s\":[{\"n\":\"长沙市\",\"s\":[{\"n\":\"芙蓉区\"},{\"n\":\"天心区\"},{\"n\":\"岳麓区\"},{\"n\":\"开福区\"},{\"n\":\"雨花区\"},{\"n\":\"望城区\"},{\"n\":\"长沙县\"},{\"n\":\"宁乡县\"},{\"n\":\"浏阳市\"}]},{\"n\":\"株洲市\",\"s\":[{\"n\":\"荷塘区\"},{\"n\":\"芦淞区\"},{\"n\":\"石峰区\"},{\"n\":\"天元区\"},{\"n\":\"株洲县\"},{\"n\":\"攸县\"},{\"n\":\"茶陵县\"},{\"n\":\"炎陵县\"},{\"n\":\"醴陵市\"}]},{\"n\":\"湘潭市\",\"s\":[{\"n\":\"雨湖区\"},{\"n\":\"岳塘区\"},{\"n\":\"湘潭县\"},{\"n\":\"湘乡市\"},{\"n\":\"韶山市\"}]},{\"n\":\"衡阳市\",\"s\":[{\"n\":\"珠晖区\"},{\"n\":\"雁峰区\"},{\"n\":\"石鼓区\"},{\"n\":\"蒸湘区\"},{\"n\":\"南岳区\"},{\"n\":\"衡阳县\"},{\"n\":\"衡南县\"},{\"n\":\"衡山县\"},{\"n\":\"衡东县\"},{\"n\":\"祁东县\"},{\"n\":\"耒阳市\"},{\"n\":\"常宁市\"}]},{\"n\":\"邵阳市\",\"s\":[{\"n\":\"双清区\"},{\"n\":\"大祥区\"},{\"n\":\"北塔区\"},{\"n\":\"邵东县\"},{\"n\":\"新邵县\"},{\"n\":\"邵阳县\"},{\"n\":\"隆回县\"},{\"n\":\"洞口县\"},{\"n\":\"绥宁县\"},{\"n\":\"新宁县\"},{\"n\":\"城步苗族自治县\"},{\"n\":\"武冈市\"}]},{\"n\":\"岳阳市\",\"s\":[{\"n\":\"岳阳楼区\"},{\"n\":\"云溪区\"},{\"n\":\"君山区\"},{\"n\":\"岳阳县\"},{\"n\":\"华容县\"},{\"n\":\"湘阴县\"},{\"n\":\"平江县\"},{\"n\":\"汨罗市\"},{\"n\":\"临湘市\"}]},{\"n\":\"常德市\",\"s\":[{\"n\":\"武陵区\"},{\"n\":\"鼎城区\"},{\"n\":\"安乡县\"},{\"n\":\"汉寿县\"},{\"n\":\"澧县\"},{\"n\":\"临澧县\"},{\"n\":\"桃源县\"},{\"n\":\"石门县\"},{\"n\":\"津市市\"}]},{\"n\":\"张家界市\",\"s\":[{\"n\":\"永定区\"},{\"n\":\"武陵源区\"},{\"n\":\"慈利县\"},{\"n\":\"桑植县\"}]},{\"n\":\"益阳市\",\"s\":[{\"n\":\"资阳区\"},{\"n\":\"赫山区\"},{\"n\":\"南县\"},{\"n\":\"桃江县\"},{\"n\":\"安化县\"},{\"n\":\"沅江市\"}]},{\"n\":\"郴州市\",\"s\":[{\"n\":\"北湖区\"},{\"n\":\"苏仙区\"},{\"n\":\"桂阳县\"},{\"n\":\"宜章县\"},{\"n\":\"永兴县\"},{\"n\":\"嘉禾县\"},{\"n\":\"临武县\"},{\"n\":\"汝城县\"},{\"n\":\"桂东县\"},{\"n\":\"安仁县\"},{\"n\":\"资兴市\"}]},{\"n\":\"永州市\",\"s\":[{\"n\":\"零陵区\"},{\"n\":\"冷水滩区\"},{\"n\":\"祁阳县\"},{\"n\":\"东安县\"},{\"n\":\"双牌县\"},{\"n\":\"道县\"},{\"n\":\"江永县\"},{\"n\":\"宁远县\"},{\"n\":\"蓝山县\"},{\"n\":\"新田县\"},{\"n\":\"江华瑶族自治县\"}]},{\"n\":\"怀化市\",\"s\":[{\"n\":\"鹤城区\"},{\"n\":\"中方县\"},{\"n\":\"沅陵县\"},{\"n\":\"辰溪县\"},{\"n\":\"溆浦县\"},{\"n\":\"会同县\"},{\"n\":\"麻阳苗族自治县\"},{\"n\":\"新晃侗族自治县\"},{\"n\":\"芷江侗族自治县\"},{\"n\":\"靖州苗族侗族自治县\"},{\"n\":\"通道侗族自治县\"},{\"n\":\"洪江市\"}]},{\"n\":\"娄底市\",\"s\":[{\"n\":\"娄星区\"},{\"n\":\"双峰县\"},{\"n\":\"新化县\"},{\"n\":\"冷水江市\"},{\"n\":\"涟源市\"}]},{\"n\":\"湘西土家族苗族自治州\",\"s\":[{\"n\":\"吉首市\"},{\"n\":\"泸溪县\"},{\"n\":\"凤凰县\"},{\"n\":\"花垣县\"},{\"n\":\"保靖县\"},{\"n\":\"古丈县\"},{\"n\":\"永顺县\"},{\"n\":\"龙山县\"}]}]},{\"n\":\"广东省\",\"s\":[{\"n\":\"广州市\",\"s\":[{\"n\":\"荔湾区\"},{\"n\":\"越秀区\"},{\"n\":\"海珠区\"},{\"n\":\"天河区\"},{\"n\":\"白云区\"},{\"n\":\"黄埔区\"},{\"n\":\"番禺区\"},{\"n\":\"花都区\"},{\"n\":\"南沙区\"},{\"n\":\"萝岗区\"},{\"n\":\"增城市\"},{\"n\":\"从化市\"}]},{\"n\":\"韶关市\",\"s\":[{\"n\":\"武江区\"},{\"n\":\"浈江区\"},{\"n\":\"曲江区\"},{\"n\":\"始兴县\"},{\"n\":\"仁化县\"},{\"n\":\"翁源县\"},{\"n\":\"乳源瑶族自治县\"},{\"n\":\"新丰县\"},{\"n\":\"乐昌市\"},{\"n\":\"南雄市\"}]},{\"n\":\"深圳市\",\"s\":[{\"n\":\"罗湖区\"},{\"n\":\"福田区\"},{\"n\":\"南山区\"},{\"n\":\"宝安区\"},{\"n\":\"龙岗区\"},{\"n\":\"盐田区\"}]},{\"n\":\"珠海市\",\"s\":[{\"n\":\"香洲区\"},{\"n\":\"斗门区\"},{\"n\":\"金湾区\"}]},{\"n\":\"汕头市\",\"s\":[{\"n\":\"龙湖区\"},{\"n\":\"金平区\"},{\"n\":\"濠江区\"},{\"n\":\"潮阳区\"},{\"n\":\"潮南区\"},{\"n\":\"澄海区\"},{\"n\":\"南澳县\"}]},{\"n\":\"佛山市\",\"s\":[{\"n\":\"禅城区\"},{\"n\":\"南海区\"},{\"n\":\"顺德区\"},{\"n\":\"三水区\"},{\"n\":\"高明区\"}]},{\"n\":\"江门市\",\"s\":[{\"n\":\"蓬江区\"},{\"n\":\"江海区\"},{\"n\":\"新会区\"},{\"n\":\"台山市\"},{\"n\":\"开平市\"},{\"n\":\"鹤山市\"},{\"n\":\"恩平市\"}]},{\"n\":\"湛江市\",\"s\":[{\"n\":\"赤坎区\"},{\"n\":\"霞山区\"},{\"n\":\"坡头区\"},{\"n\":\"麻章区\"},{\"n\":\"遂溪县\"},{\"n\":\"徐闻县\"},{\"n\":\"廉江市\"},{\"n\":\"雷州市\"},{\"n\":\"吴川市\"}]},{\"n\":\"茂名市\",\"s\":[{\"n\":\"茂南区\"},{\"n\":\"茂港区\"},{\"n\":\"电白县\"},{\"n\":\"高州市\"},{\"n\":\"化州市\"},{\"n\":\"信宜市\"}]},{\"n\":\"肇庆市\",\"s\":[{\"n\":\"端州区\"},{\"n\":\"鼎湖区\"},{\"n\":\"广宁县\"},{\"n\":\"怀集县\"},{\"n\":\"封开县\"},{\"n\":\"德庆县\"},{\"n\":\"高要市\"},{\"n\":\"四会市\"}]},{\"n\":\"惠州市\",\"s\":[{\"n\":\"惠城区\"},{\"n\":\"惠阳区\"},{\"n\":\"博罗县\"},{\"n\":\"惠东县\"},{\"n\":\"龙门县\"}]},{\"n\":\"梅州市\",\"s\":[{\"n\":\"梅江区\"},{\"n\":\"梅县\"},{\"n\":\"大埔县\"},{\"n\":\"丰顺县\"},{\"n\":\"五华县\"},{\"n\":\"平远县\"},{\"n\":\"蕉岭县\"},{\"n\":\"兴宁市\"}]},{\"n\":\"汕尾市\",\"s\":[{\"n\":\"城区\"},{\"n\":\"海丰县\"},{\"n\":\"陆河县\"},{\"n\":\"陆丰市\"}]},{\"n\":\"河源市\",\"s\":[{\"n\":\"源城区\"},{\"n\":\"紫金县\"},{\"n\":\"龙川县\"},{\"n\":\"连平县\"},{\"n\":\"和平县\"},{\"n\":\"东源县\"}]},{\"n\":\"阳江市\",\"s\":[{\"n\":\"江城区\"},{\"n\":\"阳西县\"},{\"n\":\"阳东县\"},{\"n\":\"阳春市\"}]},{\"n\":\"清远市\",\"s\":[{\"n\":\"清城区\"},{\"n\":\"清新区\"},{\"n\":\"佛冈县\"},{\"n\":\"阳山县\"},{\"n\":\"连山壮族瑶族自治县\"},{\"n\":\"连南瑶族自治县\"},{\"n\":\"英德市\"},{\"n\":\"连州市\"}]},{\"n\":\"东莞市\"},{\"n\":\"中山市\"},{\"n\":\"潮州市\",\"s\":[{\"n\":\"湘桥区\"},{\"n\":\"潮安区\"},{\"n\":\"饶平县\"}]},{\"n\":\"揭阳市\",\"s\":[{\"n\":\"榕城区\"},{\"n\":\"揭东区\"},{\"n\":\"揭西县\"},{\"n\":\"惠来县\"},{\"n\":\"普宁市\"}]},{\"n\":\"云浮市\",\"s\":[{\"n\":\"云城区\"},{\"n\":\"新兴县\"},{\"n\":\"郁南县\"},{\"n\":\"云安县\"},{\"n\":\"罗定市\"}]}]}]"; + return data; + } + + /** + * 获取用户数据 + */ + @GetMapping("/userModel") + @ResponseBody + public AjaxResult userModel() + { + AjaxResult ajax = new AjaxResult(); + + ajax.put("code", 200); + ajax.put("value", users); + return ajax; + } + + /** + * 获取数据集合 + */ + @GetMapping("/collection") + @ResponseBody + public AjaxResult collection() + { + String[] array = { "ruoyi 1", "ruoyi 2", "ruoyi 3", "ruoyi 4", "ruoyi 5" }; + AjaxResult ajax = new AjaxResult(); + ajax.put("value", array); + return ajax; + } +} + +class UserFormModel +{ + /** 用户ID */ + private int userId; + + /** 用户编号 */ + private String userCode; + + /** 用户姓名 */ + private String userName; + + /** 用户手机 */ + private String userPhone; + + public UserFormModel() + { + + } + + public UserFormModel(int userId, String userCode, String userName, String userPhone) + { + this.userId = userId; + this.userCode = userCode; + this.userName = userName; + this.userPhone = userPhone; + } + + public int getUserId() + { + return userId; + } + + public void setUserId(int userId) + { + this.userId = userId; + } + + public String getUserCode() + { + return userCode; + } + + public void setUserCode(String userCode) + { + this.userCode = userCode; + } + + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getUserPhone() + { + return userPhone; + } + + public void setUserPhone(String userPhone) + { + this.userPhone = userPhone; + } + +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoIconController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoIconController.java new file mode 100644 index 0000000..b6884cc --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoIconController.java @@ -0,0 +1,35 @@ +package com.ruoyi.web.controller.demo.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * 图标相关 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/demo/icon") +public class DemoIconController +{ + private String prefix = "demo/icon"; + + /** + * FontAwesome图标 + */ + @GetMapping("/fontawesome") + public String fontAwesome() + { + return prefix + "/fontawesome"; + } + + /** + * Glyphicons图标 + */ + @GetMapping("/glyphicons") + public String glyphicons() + { + return prefix + "/glyphicons"; + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoOperateController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoOperateController.java new file mode 100644 index 0000000..18cb90a --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoOperateController.java @@ -0,0 +1,326 @@ +package com.ruoyi.web.controller.demo.controller; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.web.controller.demo.domain.CustomerModel; +import com.ruoyi.web.controller.demo.domain.UserOperateModel; + +/** + * 操作控制 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/demo/operate") +public class DemoOperateController extends BaseController +{ + private String prefix = "demo/operate"; + + private final static Map users = new LinkedHashMap(); + { + users.put(1, new UserOperateModel(1, "1000001", "测试1", "0", "15888888888", "ry@qq.com", 150.0, "0")); + users.put(2, new UserOperateModel(2, "1000002", "测试2", "1", "15666666666", "ry@qq.com", 180.0, "1")); + users.put(3, new UserOperateModel(3, "1000003", "测试3", "0", "15666666666", "ry@qq.com", 110.0, "1")); + users.put(4, new UserOperateModel(4, "1000004", "测试4", "1", "15666666666", "ry@qq.com", 220.0, "1")); + users.put(5, new UserOperateModel(5, "1000005", "测试5", "0", "15666666666", "ry@qq.com", 140.0, "1")); + users.put(6, new UserOperateModel(6, "1000006", "测试6", "1", "15666666666", "ry@qq.com", 330.0, "1")); + users.put(7, new UserOperateModel(7, "1000007", "测试7", "0", "15666666666", "ry@qq.com", 160.0, "1")); + users.put(8, new UserOperateModel(8, "1000008", "测试8", "1", "15666666666", "ry@qq.com", 170.0, "1")); + users.put(9, new UserOperateModel(9, "1000009", "测试9", "0", "15666666666", "ry@qq.com", 180.0, "1")); + users.put(10, new UserOperateModel(10, "1000010", "测试10", "0", "15666666666", "ry@qq.com", 210.0, "1")); + users.put(11, new UserOperateModel(11, "1000011", "测试11", "1", "15666666666", "ry@qq.com", 110.0, "1")); + users.put(12, new UserOperateModel(12, "1000012", "测试12", "0", "15666666666", "ry@qq.com", 120.0, "1")); + users.put(13, new UserOperateModel(13, "1000013", "测试13", "1", "15666666666", "ry@qq.com", 380.0, "1")); + users.put(14, new UserOperateModel(14, "1000014", "测试14", "0", "15666666666", "ry@qq.com", 280.0, "1")); + users.put(15, new UserOperateModel(15, "1000015", "测试15", "0", "15666666666", "ry@qq.com", 570.0, "1")); + users.put(16, new UserOperateModel(16, "1000016", "测试16", "1", "15666666666", "ry@qq.com", 260.0, "1")); + users.put(17, new UserOperateModel(17, "1000017", "测试17", "1", "15666666666", "ry@qq.com", 210.0, "1")); + users.put(18, new UserOperateModel(18, "1000018", "测试18", "1", "15666666666", "ry@qq.com", 340.0, "1")); + users.put(19, new UserOperateModel(19, "1000019", "测试19", "1", "15666666666", "ry@qq.com", 160.0, "1")); + users.put(20, new UserOperateModel(20, "1000020", "测试20", "1", "15666666666", "ry@qq.com", 220.0, "1")); + users.put(21, new UserOperateModel(21, "1000021", "测试21", "1", "15666666666", "ry@qq.com", 120.0, "1")); + users.put(22, new UserOperateModel(22, "1000022", "测试22", "1", "15666666666", "ry@qq.com", 130.0, "1")); + users.put(23, new UserOperateModel(23, "1000023", "测试23", "1", "15666666666", "ry@qq.com", 490.0, "1")); + users.put(24, new UserOperateModel(24, "1000024", "测试24", "1", "15666666666", "ry@qq.com", 570.0, "1")); + users.put(25, new UserOperateModel(25, "1000025", "测试25", "1", "15666666666", "ry@qq.com", 250.0, "1")); + users.put(26, new UserOperateModel(26, "1000026", "测试26", "1", "15666666666", "ry@qq.com", 250.0, "1")); + } + + /** + * 表格 + */ + @GetMapping("/table") + public String table() + { + return prefix + "/table"; + } + + /** + * 其他 + */ + @GetMapping("/other") + public String other() + { + return prefix + "/other"; + } + + /** + * 查询数据 + */ + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(UserOperateModel userModel) + { + TableDataInfo rspData = new TableDataInfo(); + List userList = new ArrayList(users.values()); + // 查询条件过滤 + if (StringUtils.isNotEmpty(userModel.getSearchValue())) + { + userList.clear(); + for (Map.Entry entry : users.entrySet()) + { + if (entry.getValue().getUserName().equals(userModel.getSearchValue())) + { + userList.add(entry.getValue()); + } + } + } + else if (StringUtils.isNotEmpty(userModel.getUserName())) + { + userList.clear(); + for (Map.Entry entry : users.entrySet()) + { + if (entry.getValue().getUserName().equals(userModel.getUserName())) + { + userList.add(entry.getValue()); + } + } + } + PageDomain pageDomain = TableSupport.buildPageRequest(); + if (null == pageDomain.getPageNum() || null == pageDomain.getPageSize()) + { + rspData.setRows(userList); + rspData.setTotal(userList.size()); + return rspData; + } + Integer pageNum = (pageDomain.getPageNum() - 1) * 10; + Integer pageSize = pageDomain.getPageNum() * 10; + if (pageSize > userList.size()) + { + pageSize = userList.size(); + } + rspData.setRows(userList.subList(pageNum, pageSize)); + rspData.setTotal(userList.size()); + return rspData; + } + + /** + * 新增用户 + */ + @GetMapping("/add") + public String add(ModelMap mmap) + { + return prefix + "/add"; + } + + /** + * 新增保存用户 + */ + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(UserOperateModel user) + { + Integer userId = users.size() + 1; + user.setUserId(userId); + return AjaxResult.success(users.put(userId, user)); + } + + /** + * 新增保存主子表信息 + */ + @PostMapping("/customer/add") + @ResponseBody + public AjaxResult addSave(CustomerModel customerModel) + { + System.out.println(customerModel.toString()); + return AjaxResult.success(); + } + + /** + * 修改用户 + */ + @GetMapping("/edit/{userId}") + public String edit(@PathVariable("userId") Integer userId, ModelMap mmap) + { + mmap.put("user", users.get(userId)); + return prefix + "/edit"; + } + + /** + * 修改保存用户 + */ + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(UserOperateModel user) + { + return AjaxResult.success(users.put(user.getUserId(), user)); + } + + /** + * 导出 + */ + @PostMapping("/export") + @ResponseBody + public AjaxResult export(UserOperateModel user) + { + List list = new ArrayList(users.values()); + ExcelUtil util = new ExcelUtil(UserOperateModel.class); + return util.exportExcel(list, "用户数据"); + } + + /** + * 下载模板 + */ + @GetMapping("/importTemplate") + @ResponseBody + public AjaxResult importTemplate() + { + ExcelUtil util = new ExcelUtil(UserOperateModel.class); + return util.importTemplateExcel("用户数据"); + } + + /** + * 导入数据 + */ + @PostMapping("/importData") + @ResponseBody + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception + { + ExcelUtil util = new ExcelUtil(UserOperateModel.class); + List userList = util.importExcel(file.getInputStream()); + String message = importUser(userList, updateSupport); + return AjaxResult.success(message); + } + + /** + * 删除用户 + */ + @PostMapping("/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + Integer[] userIds = Convert.toIntArray(ids); + for (Integer userId : userIds) + { + users.remove(userId); + } + return AjaxResult.success(); + } + + /** + * 查看详细 + */ + @GetMapping("/detail/{userId}") + public String detail(@PathVariable("userId") Integer userId, ModelMap mmap) + { + mmap.put("user", users.get(userId)); + return prefix + "/detail"; + } + + @PostMapping("/clean") + @ResponseBody + public AjaxResult clean() + { + users.clear(); + return success(); + } + + /** + * 导入用户数据 + * + * @param userList 用户数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @return 结果 + */ + public String importUser(List userList, Boolean isUpdateSupport) + { + if (StringUtils.isNull(userList) || userList.size() == 0) + { + throw new ServiceException("导入用户数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + for (UserOperateModel user : userList) + { + try + { + // 验证是否存在这个用户 + boolean userFlag = false; + for (Map.Entry entry : users.entrySet()) + { + if (entry.getValue().getUserName().equals(user.getUserName())) + { + userFlag = true; + break; + } + } + if (!userFlag) + { + Integer userId = users.size() + 1; + user.setUserId(userId); + users.put(userId, user); + successNum++; + successMsg.append("
" + successNum + "、用户 " + user.getUserName() + " 导入成功"); + } + else if (isUpdateSupport) + { + users.put(user.getUserId(), user); + successNum++; + successMsg.append("
" + successNum + "、用户 " + user.getUserName() + " 更新成功"); + } + else + { + failureNum++; + failureMsg.append("
" + failureNum + "、用户 " + user.getUserName() + " 已存在"); + } + } + catch (Exception e) + { + failureNum++; + String msg = "
" + failureNum + "、账号 " + user.getUserName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + } + } + if (failureNum > 0) + { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } + else + { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoReportController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoReportController.java new file mode 100644 index 0000000..6101008 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoReportController.java @@ -0,0 +1,53 @@ +package com.ruoyi.web.controller.demo.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * 报表 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/demo/report") +public class DemoReportController +{ + private String prefix = "demo/report"; + + /** + * 百度ECharts + */ + @GetMapping("/echarts") + public String echarts() + { + return prefix + "/echarts"; + } + + /** + * 图表插件 + */ + @GetMapping("/peity") + public String peity() + { + return prefix + "/peity"; + } + + /** + * 线状图插件 + */ + @GetMapping("/sparkline") + public String sparkline() + { + return prefix + "/sparkline"; + } + + /** + * 图表组合 + */ + @GetMapping("/metrics") + public String metrics() + { + return prefix + "/metrics"; + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoTableController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoTableController.java new file mode 100644 index 0000000..bd15891 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoTableController.java @@ -0,0 +1,1023 @@ +package com.ruoyi.web.controller.demo.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; + +/** + * 表格相关 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/demo/table") +public class DemoTableController extends BaseController +{ + private String prefix = "demo/table"; + + private final static List users = new ArrayList(); + { + users.add(new UserTableModel(1, "1000001", "测试1", "0", "15888888888", "ry@qq.com", 150.0, "0")); + users.add(new UserTableModel(2, "1000002", "测试2", "1", "15666666666", "ry@qq.com", 180.0, "1")); + users.add(new UserTableModel(3, "1000003", "测试3", "0", "15666666666", "ry@qq.com", 110.0, "1")); + users.add(new UserTableModel(4, "1000004", "测试4", "1", "15666666666", "ry@qq.com", 220.0, "1")); + users.add(new UserTableModel(5, "1000005", "测试5", "0", "15666666666", "ry@qq.com", 140.0, "1")); + users.add(new UserTableModel(6, "1000006", "测试6", "1", "15666666666", "ry@qq.com", 330.0, "1")); + users.add(new UserTableModel(7, "1000007", "测试7", "0", "15666666666", "ry@qq.com", 160.0, "1")); + users.add(new UserTableModel(8, "1000008", "测试8", "1", "15666666666", "ry@qq.com", 170.0, "1")); + users.add(new UserTableModel(9, "1000009", "测试9", "0", "15666666666", "ry@qq.com", 180.0, "1")); + users.add(new UserTableModel(10, "1000010", "测试10", "0", "15666666666", "ry@qq.com", 210.0, "1")); + users.add(new UserTableModel(11, "1000011", "测试11", "1", "15666666666", "ry@qq.com", 110.0, "1")); + users.add(new UserTableModel(12, "1000012", "测试12", "0", "15666666666", "ry@qq.com", 120.0, "1")); + users.add(new UserTableModel(13, "1000013", "测试13", "1", "15666666666", "ry@qq.com", 380.0, "1")); + users.add(new UserTableModel(14, "1000014", "测试14", "0", "15666666666", "ry@qq.com", 280.0, "1")); + users.add(new UserTableModel(15, "1000015", "测试15", "0", "15666666666", "ry@qq.com", 570.0, "1")); + users.add(new UserTableModel(16, "1000016", "测试16", "1", "15666666666", "ry@qq.com", 260.0, "1")); + users.add(new UserTableModel(17, "1000017", "测试17", "1", "15666666666", "ry@qq.com", 210.0, "1")); + users.add(new UserTableModel(18, "1000018", "测试18", "1", "15666666666", "ry@qq.com", 340.0, "1")); + users.add(new UserTableModel(19, "1000019", "测试19", "1", "15666666666", "ry@qq.com", 160.0, "1")); + users.add(new UserTableModel(20, "1000020", "测试20", "1", "15666666666", "ry@qq.com", 220.0, "1")); + users.add(new UserTableModel(21, "1000021", "测试21", "1", "15666666666", "ry@qq.com", 120.0, "1")); + users.add(new UserTableModel(22, "1000022", "测试22", "1", "15666666666", "ry@qq.com", 130.0, "1")); + users.add(new UserTableModel(23, "1000023", "测试23", "1", "15666666666", "ry@qq.com", 490.0, "1")); + users.add(new UserTableModel(24, "1000024", "测试24", "1", "15666666666", "ry@qq.com", 570.0, "1")); + users.add(new UserTableModel(25, "1000025", "测试25", "1", "15666666666", "ry@qq.com", 250.0, "1")); + users.add(new UserTableModel(26, "1000026", "测试26", "1", "15666666666", "ry@qq.com", 250.0, "1")); + } + + private final static List areas = new ArrayList(); + { + areas.add(new AreaModel(1, 0, "广东省", "440000", "GDS", "GuangDongSheng", 1)); + areas.add(new AreaModel(2, 0, "湖南省", "430000", "HNS", "HuNanSheng", 1)); + areas.add(new AreaModel(3, 0, "河南省", "410000", "HNS", "HeNanSheng", 0)); + areas.add(new AreaModel(4, 0, "湖北省", "420000", "HBS", "HuBeiSheng", 0)); + areas.add(new AreaModel(5, 0, "辽宁省", "210000", "LNS", "LiaoNingSheng", 0)); + areas.add(new AreaModel(6, 0, "山东省", "370000", "SDS", "ShanDongSheng", 0)); + areas.add(new AreaModel(7, 0, "陕西省", "610000", "SXS", "ShanXiSheng", 0)); + areas.add(new AreaModel(8, 0, "贵州省", "520000", "GZS", "GuiZhouSheng", 0)); + areas.add(new AreaModel(9, 0, "上海市", "310000", "SHS", "ShangHaiShi", 0)); + areas.add(new AreaModel(10, 0, "重庆市", "500000", "CQS", "ChongQingShi", 0)); + areas.add(new AreaModel(11, 0, "若依省", "666666", "YYS", "RuoYiSheng", 0)); + areas.add(new AreaModel(12, 0, "安徽省", "340000", "AHS", "AnHuiSheng", 0)); + areas.add(new AreaModel(13, 0, "福建省", "350000", "FJS", "FuJianSheng", 0)); + areas.add(new AreaModel(14, 0, "海南省", "460000", "HNS", "HaiNanSheng", 0)); + areas.add(new AreaModel(15, 0, "江苏省", "320000", "JSS", "JiangSuSheng", 0)); + areas.add(new AreaModel(16, 0, "青海省", "630000", "QHS", "QingHaiSheng", 0)); + areas.add(new AreaModel(17, 0, "广西壮族自治区", "450000", "GXZZZZQ", "GuangXiZhuangZuZiZhiQu", 0)); + areas.add(new AreaModel(18, 0, "宁夏回族自治区", "640000", "NXHZZZQ", "NingXiaHuiZuZiZhiQu", 0)); + areas.add(new AreaModel(19, 0, "内蒙古自治区", "150000", "NMGZZQ", "NeiMengGuZiZhiQu", 0)); + areas.add(new AreaModel(20, 0, "新疆维吾尔自治区", "650000", "XJWWEZZQ", "XinJiangWeiWuErZiZhiQu", 0)); + areas.add(new AreaModel(21, 0, "江西省", "360000", "JXS", "JiangXiSheng", 0)); + areas.add(new AreaModel(22, 0, "浙江省", "330000", "ZJS", "ZheJiangSheng", 0)); + areas.add(new AreaModel(23, 0, "河北省", "130000", "HBS", "HeBeiSheng", 0)); + areas.add(new AreaModel(24, 0, "天津市", "120000", "TJS", "TianJinShi", 0)); + areas.add(new AreaModel(25, 0, "山西省", "140000", "SXS", "ShanXiSheng", 0)); + areas.add(new AreaModel(26, 0, "台湾省", "710000", "TWS", "TaiWanSheng", 0)); + areas.add(new AreaModel(27, 0, "甘肃省", "620000", "GSS", "GanSuSheng", 0)); + areas.add(new AreaModel(28, 0, "四川省", "510000", "SCS", "SiChuanSheng", 0)); + areas.add(new AreaModel(29, 0, "云南省", "530000", "YNS", "YunNanSheng", 0)); + areas.add(new AreaModel(30, 0, "北京市", "110000", "BJS", "BeiJingShi", 0)); + areas.add(new AreaModel(31, 0, "香港特别行政区", "810000", "XGTBXZQ", "XiangGangTeBieXingZhengQu", 0)); + areas.add(new AreaModel(32, 0, "澳门特别行政区", "820000", "AMTBXZQ", "AoMenTeBieXingZhengQu", 0)); + + areas.add(new AreaModel(100, 1, "深圳市", "440300", "SZS", "ShenZhenShi", 1)); + areas.add(new AreaModel(101, 1, "广州市", "440100", "GZS", "GuangZhouShi", 0)); + areas.add(new AreaModel(102, 1, "东莞市", "441900", "DGS", "DongGuanShi", 0)); + areas.add(new AreaModel(103, 2, "长沙市", "410005", "CSS", "ChangShaShi", 1)); + areas.add(new AreaModel(104, 2, "岳阳市", "414000", "YYS", "YueYangShi", 0)); + + areas.add(new AreaModel(1000, 100, "龙岗区", "518172", "LGQ", "LongGangQu", 0)); + areas.add(new AreaModel(1001, 100, "南山区", "518051", "NSQ", "NanShanQu", 0)); + areas.add(new AreaModel(1002, 100, "宝安区", "518101", "BAQ", "BaoAnQu", 0)); + areas.add(new AreaModel(1003, 100, "福田区", "518081", "FTQ", "FuTianQu", 0)); + areas.add(new AreaModel(1004, 103, "天心区", "410004", "TXQ", "TianXinQu", 0)); + areas.add(new AreaModel(1005, 103, "开福区", "410008", "KFQ", "KaiFuQu", 0)); + areas.add(new AreaModel(1006, 103, "芙蓉区", "410011", "FRQ", "FuRongQu", 0)); + areas.add(new AreaModel(1007, 103, "雨花区", "410011", "YHQ", "YuHuaQu", 0)); + } + + private final static List columns = new ArrayList(); + { + columns.add(new UserTableColumn("用户ID", "userId")); + columns.add(new UserTableColumn("用户编号", "userCode")); + columns.add(new UserTableColumn("用户姓名", "userName")); + columns.add(new UserTableColumn("用户手机", "userPhone")); + columns.add(new UserTableColumn("用户邮箱", "userEmail")); + columns.add(new UserTableColumn("用户状态", "status")); + } + + private final static List documents = new ArrayList(); + { + documents.add(new DocumentModel(1, "247-XW·2024-D10-0001", "新闻热线[2024]000001", "索尼射击游戏《Concord》停止运营,玩家将获全额退款", "索尼宣布多人射击游戏《Concord》将于9月6日停止运营,玩家将获得全额退款。游戏总监Ryan Ellis在给玩家的信中表示,这款游戏首次发布“并没有像我们预期的那样顺利”。《Concord》的开发历时8年,投资超过1.5亿美元。游戏在Steam平台的售价为40美元,采用买断制销售模式。据SteamDB统计,游戏上市后的最高同时在线人数为697人。")); + documents.add(new DocumentModel(2, "247-XW·2024-D30-0002", "新闻热线[2024]000002", "网红账号被封,央媒:如此炫富毒瘤早就该拔了", "在社交平台上分享自己的生活日常,本来无可厚非。但无底线地展示物欲、宣扬拜金,取笑甚至嘲讽工薪者的烟火生活,就会遮蔽普通人的平凡质朴和坚韧奋斗,在无形中消解芸芸众生脚踏实地、自立自强的社会正气。对这种助长金钱至上、刺激公众焦虑,既污染网络生态,又撕裂社会和谐的炫富“毒瘤”,必须坚决拔除之。在国家有关部门的部署下,近日,多个网络平台开展“不良价值导向内容专项治理”行动,对“奢靡浪费”“炫富拜金”等问题从严打击,倡导理性、文明的消费观和价值观。")); + documents.add(new DocumentModel(3, "CT01-XW·2024-Y-0003", "新闻热线[2024]000003", "重庆一夫妻被骗至缅甸,家属:两人已被解救,预计很快能回国", "5月25日,重庆一对夫妻在前往泰国后失联,疑被诈骗集团骗至缅甸的消息引发广泛关注。警方已对此事立案调查,而这对夫妻的亲属则每天生活在焦急和不安之中。亲属:家都瘫痪了,事情一经曝光,迅速登上了热搜,成为公众热议的话题。据了解,这对夫妻原计划是去泰国谈生意,但不幸的是,他们的泰国之行变成了一场噩梦。亲属李先生透露,4月14日,他们夫妻二人抵达泰国,不久后便疑似被人以10万元的价格卖到缅甸,目前被困在缅甸妙瓦底的一个电信诈骗园区。")); + documents.add(new DocumentModel(4, "CT01-XW·2024-Y-0004", "新闻热线[2024]000004", "江滨社区联合派出所、金霞消防站开展电动自行车安全隐患夜查活动", "近日,长沙市开福区江滨社区联合派出所、金霞消防站深入居民小区、单位场所,以电动车自行车火灾防范为重点,开展消防安全夜查行动。此次夜查紧紧围绕老旧居民区、“三合一”场所、沿街门店、夜间经营使用场所等场所开展监督检查,重点检查电动自行车违规停放充电、堵塞疏散通道和安全出口,架空层违规作为电动自行车停放充电场所,电动自行车违规“进楼入户”“飞线充电”,电动自行车擅自改装等五大类问题。")); + documents.add(new DocumentModel(5, "CT01-XW·2024-Y-0005", "新闻热线[2024]000005", "《黑神话》让海外玩家迷上“悟空”", "备受全球玩家瞩目的首款国产3A游戏《黑神话:悟空》日前正式发布。精美绝伦的东方美学世界、精彩纷呈的中国神话故事、酣畅淋漓的游戏体验,这款游戏为全球玩家带来一场视觉与文化的双重盛宴。从“悟空”成功出海的背后,海外人士看到了中国游戏产业的巨大进步,感受到了中国文化的多元精彩,并对下一个“悟空”的诞生及更多中国文化产品走向世界充满期待。")); + documents.add(new DocumentModel(6, "CT01-XW·2024-Y-0006", "新闻热线[2024]000006", "市场状况充满挑战!极星宣布裁员全球约15%的员工", "据路透社报道,极星周五以“充满挑战的市场状况”为由,宣布计划在全球范围内裁减约450个职位。此次裁员之际,许多人都对电动汽车需求降温表示担忧,而且极星预计汽车业务最早将在2025年开始实现收支平衡。极星发言人表示:“作为该商业计划的一部分,我们需要调整我们的业务和运营规模。” “这涉及减少外部支出,遗憾的是,还包括我们的员工数量。”该公司还表示,希望减少对沃尔沃及其母公司吉利外部融资的依赖,最近还表示希望削减成本并提高电动汽车的利润率。")); + documents.add(new DocumentModel(7, "CT01-XW·2024-Y-0007", "新闻热线[2024]000007", "浙江隐秘富豪涉百亿非法集资案,部分资金流入新造车公司", "5月10日、11日,上海北广投资管理有限公司(下称“北广投”)非法集资案在上海黄浦区人民法院一审公开开庭审理,北广投实控人周敏、法定代表人朱江等30余名中高管被控非法吸收公众存款罪。根据财新报道,这一案件中,非法集资的资金有部分流入了两家新能源车企——爱驰汽车、万象汽车。同时,有多位投资人引述与经侦部门沟通时的说法称,该案事发时未兑付金额有130余亿元,其中去往广微控股45亿元、万象汽车63亿元、爱驰汽车15亿元。")); + documents.add(new DocumentModel(8, "CT01-XW·2024-Y-0008", "新闻热线[2024]000008", "特斯拉宣布Model Y升级:搭载HW4.0硬件,售价仍25.89万元起", "2月1日,特斯拉官方宣布ModelY升级。外观上,新增ModelY专属色“快银车漆”,并采用烈焰红代替中国红、星空灰代替冷光银;性能上,ModelY全系配备全新一代自动辅助驾驶硬件(HW4.0),通过搭载超远距离双目摄像头,ModelY的最远探测距离达424米。由此,特斯拉全系车型均配备了自动辅助驾驶硬件HW4.0。在售价方面,特斯拉中国官网显示,ModelY车型依然保持原价。ModelY后轮驱动版25.89万元起、ModelY长续航版29.99万元起、ModelY高性能版售价36.39万元起。")); + documents.add(new DocumentModel(9, "CT01-XW·2024-D10-0009", "新闻热线[2024]000009", "华为手机归来,谁最受伤?", "低迷周期下的智能手机市场在2023年下半年迎来了华为的回归,这也给本就竞争激烈的市场环境带来了更大变数。1月29日,有消息称,华为已注册“星耀手机”品牌商标,定位中端手机市场,但上述消息并未获得华为方面确认。“目前星耀的相关信息我们看到了,但是没有获得产品信息以及启动线下铺货的通知。对于和其他品牌的二选一问题,听其他省份的经销商说过,但目前(华为渠道)这边也没有更多动作。”一位广东区域的华为核心经销商对记者说。但华为手机的反扑已经开始。在多家调研机构公布的2023年四季度智能手机出货数据中,华为手机的量正在明显上升,当季增幅在35%到47%之间。不过,从全年数据来看,并未登上前五榜单。")); + documents.add(new DocumentModel(10, "CT01-XW·2024-D10-0010", "新闻热线[2024]000010", "疯狂裁员的硅谷大厂:除了AI,其它都是将就", "放眼望去,近期科技企业财报形势一片大好,裁员浪潮却仍在不断蔓延。国内职场动态看脉脉,那硅谷裁员情况就得看layoff.fyi了。数据显示,2024年,103家科技企业进行了裁员,28963位员工失去了饭碗。其中,电子支付公司PayPal大笔一挥,裁掉2500人,微软则在开年就裁掉1900人。回望2023年,谷歌、Meta、亚马逊、微软均为裁员重灾区,裁员人数在一万左右。具体而言,谷歌近日披露的财报指出,2023年谷歌解雇了12000多名员工,光是在遣散费和其他费用上就花费了21亿美元。而且裁员费用还在不断增加,2024年刚过去一个月,谷歌就已经花费了7亿美元用来裁员。")); + documents.add(new DocumentModel(11, "CT01-XW·2024-D30-0011", "新闻热线[2024]000011", "国产手机品牌重新崛起背后:市场正在逐步恢复活力,竞争也愈发激烈", "2024年伊始,随着全球经济的逐渐复苏,手机消费市场也展现出勃勃生机。中国信通院最新数据显示,2023年中国市场手机出货量实现了6.5%的同比增长,其中5G手机增长势头更为强劲,占比高达82.8%。1月25日,国际数据公司(IDC)发布了最新手机季度跟踪报告,揭示了中国智能手机市场在2023年第四季度的出货量情况。报告显示,该季度中国智能手机市场出货量达到了约7363万台,同比增长1.2%。这是在连续十个季度同比下降后,中国智能手机市场首次实现反弹。这一积极信号表明,市场正在逐步恢复活力,各大品牌之间的竞争也愈发激烈。")); + documents.add(new DocumentModel(12, "CT01-XW·2024-D30-0012", "新闻热线[2024]000012", "SpaceX将于1月31日向国际空间站发射天鹅号货运飞船", "1月29日消息,美国太空探索技术公司SpaceX计划于当地时间1月30日,利用“猎鹰9号”火箭从佛罗里达州肯尼迪航天中心发射诺斯罗普·格鲁曼公司的“天鹅号”货运飞船至国际空间站。此次任务是执行NG-20商业补给,将运送约8200多磅的物资、设备及科学实验器材。")); + } + + /** + * 搜索相关 + */ + @GetMapping("/search") + public String search() + { + return prefix + "/search"; + } + + /** + * 数据汇总 + */ + @GetMapping("/footer") + public String footer() + { + return prefix + "/footer"; + } + + /** + * 组合表头 + */ + @GetMapping("/groupHeader") + public String groupHeader() + { + return prefix + "/groupHeader"; + } + + /** + * 表格导出 + */ + @GetMapping("/export") + public String export() + { + return prefix + "/export"; + } + + /** + * 表格导出选择列 + */ + @GetMapping("/exportSelected") + public String exportSelected() + { + return prefix + "/exportSelected"; + } + + /** + * 导出数据 + */ + @PostMapping("/exportData") + @ResponseBody + public AjaxResult exportSelected(UserTableModel userModel, String userIds) + { + List userList = new ArrayList(Arrays.asList(new UserTableModel[users.size()])); + Collections.copy(userList, users); + + // 条件过滤 + if (StringUtils.isNotEmpty(userIds)) + { + userList.clear(); + for (Long userId : Convert.toLongArray(userIds)) + { + for (UserTableModel user : users) + { + if (user.getUserId() == userId) + { + userList.add(user); + } + } + } + } + ExcelUtil util = new ExcelUtil(UserTableModel.class); + return util.exportExcel(userList, "用户数据"); + } + + /** + * 翻页记住选择 + */ + @GetMapping("/remember") + public String remember() + { + return prefix + "/remember"; + } + + /** + * 表格保存状态 + */ + @GetMapping("/cookie") + public String cookie() + { + return prefix + "/cookie"; + } + + /** + * 跳转至指定页 + */ + @GetMapping("/pageGo") + public String pageGo() + { + return prefix + "/pageGo"; + } + + /** + * 自定义查询参数 + */ + @GetMapping("/params") + public String params() + { + return prefix + "/params"; + } + + /** + * 多表格 + */ + @GetMapping("/multi") + public String multi() + { + return prefix + "/multi"; + } + + /** + * 点击按钮加载表格 + */ + @GetMapping("/button") + public String button() + { + return prefix + "/button"; + } + + /** + * 直接加载表格数据 + */ + @GetMapping("/data") + public String data(ModelMap mmap) + { + mmap.put("users", users); + return prefix + "/data"; + } + + /** + * 表格冻结列 + */ + @GetMapping("/fixedColumns") + public String fixedColumns() + { + return prefix + "/fixedColumns"; + } + + /** + * 自定义触发事件 + */ + @GetMapping("/event") + public String event() + { + return prefix + "/event"; + } + + /** + * 表格细节视图 + */ + @GetMapping("/detail") + public String detail() + { + return prefix + "/detail"; + } + + /** + * 表格父子视图 + */ + @GetMapping("/child") + public String child() + { + return prefix + "/child"; + } + + /** + * 表格图片预览 + */ + @GetMapping("/image") + public String image() + { + return prefix + "/image"; + } + + /** + * 动态增删改查 + */ + @GetMapping("/curd") + public String curd() + { + return prefix + "/curd"; + } + + /** + * 表格行拖拽操作 + */ + @GetMapping("/reorderRows") + public String reorderRows() + { + return prefix + "/reorderRows"; + } + + /** + * 表格列拖拽操作 + */ + @GetMapping("/reorderColumns") + public String reorderColumns() + { + return prefix + "/reorderColumns"; + } + + /** + * 表格列宽拖动 + */ + @GetMapping("/resizable") + public String resizable() + { + return prefix + "/resizable"; + } + + /** + * 表格行内编辑操作 + */ + @GetMapping("/editable") + public String editable() + { + return prefix + "/editable"; + } + + /** + * 主子表提交 + */ + @GetMapping("/subdata") + public String subdata() + { + return prefix + "/subdata"; + } + + /** + * 表格自动刷新 + */ + @GetMapping("/refresh") + public String refresh() + { + return prefix + "/refresh"; + } + + /** + * 表格打印配置 + */ + @GetMapping("/print") + public String print() + { + return prefix + "/print"; + } + + /** + * 表格标题格式化 + */ + @GetMapping("/headerStyle") + public String headerStyle() + { + return prefix + "/headerStyle"; + } + + /** + * 表格动态列 + */ + @GetMapping("/dynamicColumns") + public String dynamicColumns() + { + return prefix + "/dynamicColumns"; + } + + /** + * 表格虚拟滚动 + */ + @GetMapping("/virtualScroll") + public String virtualScroll() + { + return prefix + "/virtualScroll"; + } + + /** + * 自定义视图分页 + */ + @GetMapping("/customView") + public String customView() + { + return prefix + "/customView"; + } + + /** + * 全文索引 + */ + @GetMapping("/textSearch") + public String textSearch() + { + return prefix + "/textSearch"; + } + + /** + * 异步加载表格树 + */ + @GetMapping("/asynTree") + public String asynTree() + { + return prefix + "/asynTree"; + } + + /** + * 表格其他操作 + */ + @GetMapping("/other") + public String other() + { + return prefix + "/other"; + } + + /** + * 动态获取列 + */ + @PostMapping("/ajaxColumns") + @ResponseBody + public AjaxResult ajaxColumns(UserTableColumn userColumn) + { + List columnList = new ArrayList(Arrays.asList(new UserTableColumn[columns.size()])); + Collections.copy(columnList, columns); + if (userColumn != null && "userBalance".equals(userColumn.getField())) + { + columnList.add(new UserTableColumn("用户余额", "userBalance")); + } + return AjaxResult.success(columnList); + } + + /** + * 查询数据 + */ + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(UserTableModel userModel) + { + TableDataInfo rspData = new TableDataInfo(); + List userList = new ArrayList(Arrays.asList(new UserTableModel[users.size()])); + Collections.copy(userList, users); + // 查询条件过滤 + if (StringUtils.isNotEmpty(userModel.getUserName())) + { + userList.clear(); + for (UserTableModel user : users) + { + if (user.getUserName().equals(userModel.getUserName())) + { + userList.add(user); + } + } + } + PageDomain pageDomain = TableSupport.buildPageRequest(); + if (null == pageDomain.getPageNum() || null == pageDomain.getPageSize()) + { + rspData.setRows(userList); + rspData.setTotal(userList.size()); + return rspData; + } + Integer pageNum = (pageDomain.getPageNum() - 1) * 10; + Integer pageSize = pageDomain.getPageNum() * 10; + if (pageSize > userList.size()) + { + pageSize = userList.size(); + } + rspData.setRows(userList.subList(pageNum, pageSize)); + rspData.setTotal(userList.size()); + return rspData; + } + + /** + * 查询全文索引数据 + */ + @PostMapping("/text/list") + @ResponseBody + public TableDataInfo textList(BaseEntity baseEntity) + { + TableDataInfo rspData = new TableDataInfo(); + List documentList = new ArrayList(Arrays.asList(new DocumentModel[documents.size()])); + Collections.copy(documentList, documents); + // 查询条件过滤 + if (StringUtils.isNotEmpty(baseEntity.getSearchValue())) + { + documentList.clear(); + for (DocumentModel document : documents) + { + boolean indexFlag = false; + if (document.getTitle().contains(baseEntity.getSearchValue())) + { + indexFlag = true; + document.setTitle(document.getTitle().replace(baseEntity.getSearchValue(), "" + baseEntity.getSearchValue() + "")); + } + if (document.getContent().contains(baseEntity.getSearchValue())) + { + indexFlag = true; + document.setContent(document.getContent().replace(baseEntity.getSearchValue(), "" + baseEntity.getSearchValue() + "")); + } + if (indexFlag) + { + documentList.add(document); + } + } + } + PageDomain pageDomain = TableSupport.buildPageRequest(); + if (null == pageDomain.getPageNum() || null == pageDomain.getPageSize()) + { + rspData.setRows(documentList); + rspData.setTotal(documentList.size()); + return rspData; + } + Integer pageNum = (pageDomain.getPageNum() - 1) * 10; + Integer pageSize = pageDomain.getPageNum() * 10; + if (pageSize > documentList.size()) + { + pageSize = documentList.size(); + } + rspData.setRows(documentList.subList(pageNum, pageSize)); + rspData.setTotal(documentList.size()); + return rspData; + } + + /** + * 查询树表数据 + */ + @PostMapping("/tree/list") + @ResponseBody + public TableDataInfo treeList(AreaModel areaModel) + { + TableDataInfo rspData = new TableDataInfo(); + List areaList = new ArrayList(Arrays.asList(new AreaModel[areas.size()])); + // 默认查询条件 parentId 0 + Collections.copy(areaList, areas); + areaList.clear(); + if (StringUtils.isNotEmpty(areaModel.getAreaName())) + { + for (AreaModel area : areas) + { + if (area.getParentId() == 0 && area.getAreaName().equals(areaModel.getAreaName())) + { + areaList.add(area); + } + } + } + else + { + for (AreaModel area : areas) + { + if (area.getParentId() == 0) + { + areaList.add(area); + } + } + } + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = (pageDomain.getPageNum() - 1) * pageDomain.getPageSize(); + Integer pageSize = pageDomain.getPageNum() * pageDomain.getPageSize(); + if (pageSize > areaList.size()) + { + pageSize = areaList.size(); + } + rspData.setRows(areaList.subList(pageNum, pageSize)); + rspData.setTotal(areaList.size()); + return rspData; + } + + /** + * 查询树表子节点数据 + */ + @PostMapping("/tree/listChild") + @ResponseBody + public List listChild(AreaModel areaModel) + { + List areaList = new ArrayList(Arrays.asList(new AreaModel[areas.size()])); + // 查询条件 parentId + Collections.copy(areaList, areas); + areaList.clear(); + if (StringUtils.isNotEmpty(areaModel.getAreaName())) + { + for (AreaModel area : areas) + { + if (area.getParentId().intValue() == areaModel.getParentId().intValue() && area.getAreaName().equals(areaModel.getAreaName())) + { + areaList.add(area); + } + } + } + else + { + for (AreaModel area : areas) + { + if (area.getParentId().intValue() == areaModel.getParentId().intValue()) + { + areaList.add(area); + } + } + } + return areaList; + } +} + +class UserTableColumn +{ + /** 表头 */ + private String title; + /** 字段 */ + private String field; + + public UserTableColumn() + { + + } + + public UserTableColumn(String title, String field) + { + this.title = title; + this.field = field; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public String getField() + { + return field; + } + + public void setField(String field) + { + this.field = field; + } +} + +class UserTableModel +{ + /** 用户ID */ + private int userId; + + /** 用户编号 */ + @Excel(name = "用户编号", cellType = ColumnType.NUMERIC) + private String userCode; + + /** 用户姓名 */ + @Excel(name = "用户姓名") + private String userName; + + /** 用户性别 */ + private String userSex; + + /** 用户手机 */ + @Excel(name = "用户手机") + private String userPhone; + + /** 用户邮箱 */ + @Excel(name = "用户邮箱") + private String userEmail; + + /** 用户余额 */ + @Excel(name = "用户余额", cellType = ColumnType.NUMERIC) + private double userBalance; + + /** 用户状态(0正常 1停用) */ + private String status; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + public UserTableModel() + { + + } + + public UserTableModel(int userId, String userCode, String userName, String userSex, String userPhone, + String userEmail, double userBalance, String status) + { + this.userId = userId; + this.userCode = userCode; + this.userName = userName; + this.userSex = userSex; + this.userPhone = userPhone; + this.userEmail = userEmail; + this.userBalance = userBalance; + this.status = status; + this.createTime = DateUtils.getNowDate(); + } + + public int getUserId() + { + return userId; + } + + public void setUserId(int userId) + { + this.userId = userId; + } + + public String getUserCode() + { + return userCode; + } + + public void setUserCode(String userCode) + { + this.userCode = userCode; + } + + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getUserSex() + { + return userSex; + } + + public void setUserSex(String userSex) + { + this.userSex = userSex; + } + + public String getUserPhone() + { + return userPhone; + } + + public void setUserPhone(String userPhone) + { + this.userPhone = userPhone; + } + + public String getUserEmail() + { + return userEmail; + } + + public void setUserEmail(String userEmail) + { + this.userEmail = userEmail; + } + + public double getUserBalance() + { + return userBalance; + } + + public void setUserBalance(double userBalance) + { + this.userBalance = userBalance; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public Date getCreateTime() + { + return createTime; + } + + public void setCreateTime(Date createTime) + { + this.createTime = createTime; + } +} +class AreaModel +{ + /** 编号 */ + private Long id; + + /** 父编号 */ + private Long parentId; + + /** 区域名称 */ + private String areaName; + + /** 区域代码 */ + private String areaCode; + + /** 名称首字母 */ + private String simplePy; + + /** 名称全拼 */ + private String pinYin; + + /** 是否有子节点(0无 1有) */ + private Integer isTreeLeaf = 1; + + public AreaModel() + { + + } + + public AreaModel(int id, int parentId, String areaName, String areaCode, String simplePy, String pinYin, Integer isTreeLeaf) + { + this.id = Long.valueOf(id); + this.parentId = Long.valueOf(parentId); + this.areaName = areaName; + this.areaCode = areaCode; + this.simplePy = simplePy; + this.pinYin = pinYin; + this.isTreeLeaf = isTreeLeaf; + } + + public Long getId() + { + return id; + } + + public void setId(Long id) + { + this.id = id; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + public String getAreaName() + { + return areaName; + } + + public void setAreaName(String areaName) + { + this.areaName = areaName; + } + + public String getAreaCode() + { + return areaCode; + } + + public void setAreaCode(String areaCode) + { + this.areaCode = areaCode; + } + + public String getSimplePy() + { + return simplePy; + } + + public void setSimplePy(String simplePy) + { + this.simplePy = simplePy; + } + + public String getPinYin() + { + return pinYin; + } + + public void setPinYin(String pinYin) + { + this.pinYin = pinYin; + } + + public Integer getIsTreeLeaf() + { + return isTreeLeaf; + } + + public void setIsTreeLeaf(Integer isTreeLeaf) + { + this.isTreeLeaf = isTreeLeaf; + } +} + +class DocumentModel +{ + /** 编号 */ + private int tableId; + + /** 档号 */ + private String archiveNo; + + /** 文件编号 */ + private String docNo; + + /** 标题 */ + private String title; + + /** 内容 */ + private String content; + + public DocumentModel() + { + + } + + public DocumentModel(int tableId, String archiveNo, String docNo, String title, String content) + { + this.tableId = tableId; + this.archiveNo = archiveNo; + this.docNo = docNo; + this.title = title; + this.content = content; + } + + public int getTableId() + { + return tableId; + } + + public String getArchiveNo() + { + return archiveNo; + } + + public String getDocNo() + { + return docNo; + } + + public String getTitle() + { + return title; + } + + public String getContent() + { + return content; + } + + public void setTableId(int tableId) + { + this.tableId = tableId; + } + + public void setArchiveNo(String archiveNo) + { + this.archiveNo = archiveNo; + } + + public void setDocNo(String docNo) + { + this.docNo = docNo; + } + + public void setTitle(String title) + { + this.title = title; + } + + public void setContent(String content) + { + this.content = content; + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/CustomerModel.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/CustomerModel.java new file mode 100644 index 0000000..5e7d6e5 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/CustomerModel.java @@ -0,0 +1,116 @@ +package com.ruoyi.web.controller.demo.domain; + +import java.util.List; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 客户测试信息 + * + * @author ruoyi + */ +public class CustomerModel +{ + /** + * 客户姓名 + */ + private String name; + + /** + * 客户手机 + */ + private String phonenumber; + + /** + * 客户性别 + */ + private String sex; + + /** + * 客户生日 + */ + private String birthday; + + /** + * 客户描述 + */ + private String remark; + + /** + * 商品信息 + */ + private List goods; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getPhonenumber() + { + return phonenumber; + } + + public void setPhonenumber(String phonenumber) + { + this.phonenumber = phonenumber; + } + + + public String getSex() + { + return sex; + } + + public void setSex(String sex) + { + this.sex = sex; + } + + public String getBirthday() + { + return birthday; + } + + public void setBirthday(String birthday) + { + this.birthday = birthday; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } + + public List getGoods() + { + return goods; + } + + public void setGoods(List goods) + { + this.goods = goods; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("name", getName()) + .append("phonenumber", getPhonenumber()) + .append("sex", getSex()) + .append("birthday", getBirthday()) + .append("goods", getGoods()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/GoodsModel.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/GoodsModel.java new file mode 100644 index 0000000..b25542a --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/GoodsModel.java @@ -0,0 +1,99 @@ +package com.ruoyi.web.controller.demo.domain; + +import java.util.Date; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 商品测试信息 + * + * @author ruoyi + */ +public class GoodsModel +{ + /** + * 商品名称 + */ + private String name; + + /** + * 商品重量 + */ + private Integer weight; + + /** + * 商品价格 + */ + private Double price; + + /** + * 商品日期 + */ + private Date date; + + /** + * 商品种类 + */ + private String type; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public Integer getWeight() + { + return weight; + } + + public void setWeight(Integer weight) + { + this.weight = weight; + } + + public Double getPrice() + { + return price; + } + + public void setPrice(Double price) + { + this.price = price; + } + + public Date getDate() + { + return date; + } + + public void setDate(Date date) + { + this.date = date; + } + + public String getType() + { + return type; + } + + public void setType(String type) + { + this.type = type; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("name", getName()) + .append("weight", getWeight()) + .append("price", getPrice()) + .append("date", getDate()) + .append("type", getType()) + .toString(); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/UserOperateModel.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/UserOperateModel.java new file mode 100644 index 0000000..8b158aa --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/UserOperateModel.java @@ -0,0 +1,149 @@ +package com.ruoyi.web.controller.demo.domain; + +import java.util.Date; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.Type; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.utils.DateUtils; + +public class UserOperateModel extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + private int userId; + + @Excel(name = "用户编号") + private String userCode; + + @Excel(name = "用户姓名") + private String userName; + + @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") + private String userSex; + + @Excel(name = "用户手机") + private String userPhone; + + @Excel(name = "用户邮箱") + private String userEmail; + + @Excel(name = "用户余额") + private double userBalance; + + @Excel(name = "用户状态", readConverterExp = "0=正常,1=停用") + private String status; + + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) + private Date createTime; + + public UserOperateModel() + { + + } + + public UserOperateModel(int userId, String userCode, String userName, String userSex, String userPhone, + String userEmail, double userBalance, String status) + { + this.userId = userId; + this.userCode = userCode; + this.userName = userName; + this.userSex = userSex; + this.userPhone = userPhone; + this.userEmail = userEmail; + this.userBalance = userBalance; + this.status = status; + this.createTime = DateUtils.getNowDate(); + } + + public int getUserId() + { + return userId; + } + + public void setUserId(int userId) + { + this.userId = userId; + } + + public String getUserCode() + { + return userCode; + } + + public void setUserCode(String userCode) + { + this.userCode = userCode; + } + + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getUserSex() + { + return userSex; + } + + public void setUserSex(String userSex) + { + this.userSex = userSex; + } + + public String getUserPhone() + { + return userPhone; + } + + public void setUserPhone(String userPhone) + { + this.userPhone = userPhone; + } + + public String getUserEmail() + { + return userEmail; + } + + public void setUserEmail(String userEmail) + { + this.userEmail = userEmail; + } + + public double getUserBalance() + { + return userBalance; + } + + public void setUserBalance(double userBalance) + { + this.userBalance = userBalance; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public Date getCreateTime() + { + return createTime; + } + + @Override + public void setCreateTime(Date createTime) + { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java new file mode 100644 index 0000000..baeb2b8 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java @@ -0,0 +1,90 @@ +package com.ruoyi.web.controller.monitor; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.framework.web.service.CacheService; + +/** + * 缓存监控 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/monitor/cache") +public class CacheController extends BaseController +{ + private String prefix = "monitor/cache"; + + @Autowired + private CacheService cacheService; + + @RequiresPermissions("monitor:cache:view") + @GetMapping() + public String cache(ModelMap mmap) + { + mmap.put("cacheNames", cacheService.getCacheNames()); + return prefix + "/cache"; + } + + @RequiresPermissions("monitor:cache:view") + @PostMapping("/getNames") + public String getCacheNames(String fragment, ModelMap mmap) + { + mmap.put("cacheNames", cacheService.getCacheNames()); + return prefix + "/cache::" + fragment; + } + + @RequiresPermissions("monitor:cache:view") + @PostMapping("/getKeys") + public String getCacheKeys(String fragment, String cacheName, ModelMap mmap) + { + mmap.put("cacheName", cacheName); + mmap.put("cacheKeys", cacheService.getCacheKeys(cacheName)); + return prefix + "/cache::" + fragment; + } + + @RequiresPermissions("monitor:cache:view") + @PostMapping("/getValue") + public String getCacheValue(String fragment, String cacheName, String cacheKey, ModelMap mmap) + { + mmap.put("cacheName", cacheName); + mmap.put("cacheKey", cacheKey); + mmap.put("cacheValue", cacheService.getCacheValue(cacheName, cacheKey)); + return prefix + "/cache::" + fragment; + } + + @RequiresPermissions("monitor:cache:view") + @PostMapping("/clearCacheName") + @ResponseBody + public AjaxResult clearCacheName(String cacheName, ModelMap mmap) + { + cacheService.clearCacheName(cacheName); + return AjaxResult.success(); + } + + @RequiresPermissions("monitor:cache:view") + @PostMapping("/clearCacheKey") + @ResponseBody + public AjaxResult clearCacheKey(String cacheName, String cacheKey, ModelMap mmap) + { + cacheService.clearCacheKey(cacheName, cacheKey); + return AjaxResult.success(); + } + + @RequiresPermissions("monitor:cache:view") + @GetMapping("/clearAll") + @ResponseBody + public AjaxResult clearAll(ModelMap mmap) + { + cacheService.clearAll(); + return AjaxResult.success(); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/DruidController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/DruidController.java new file mode 100644 index 0000000..a51bf20 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/DruidController.java @@ -0,0 +1,26 @@ +package com.ruoyi.web.controller.monitor; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import com.ruoyi.common.core.controller.BaseController; + +/** + * druid 监控 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/monitor/data") +public class DruidController extends BaseController +{ + private String prefix = "/druid"; + + @RequiresPermissions("monitor:data:view") + @GetMapping() + public String index() + { + return redirect(prefix + "/index.html"); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java new file mode 100644 index 0000000..386b5c7 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java @@ -0,0 +1,31 @@ +package com.ruoyi.web.controller.monitor; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.framework.web.domain.Server; + +/** + * 服务器监控 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/monitor/server") +public class ServerController extends BaseController +{ + private String prefix = "monitor/server"; + + @RequiresPermissions("monitor:server:view") + @GetMapping() + public String server(ModelMap mmap) throws Exception + { + Server server = new Server(); + server.copyTo(); + mmap.put("server", server); + return prefix + "/server"; + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java new file mode 100644 index 0000000..0d30e42 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java @@ -0,0 +1,94 @@ +package com.ruoyi.web.controller.monitor; + +import java.util.List; +import com.ruoyi.framework.shiro.service.SysPasswordService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.SysLogininfor; +import com.ruoyi.system.service.ISysLogininforService; + +/** + * 系统访问记录 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/monitor/logininfor") +public class SysLogininforController extends BaseController +{ + private String prefix = "monitor/logininfor"; + + @Autowired + private ISysLogininforService logininforService; + + @Autowired + private SysPasswordService passwordService; + + @RequiresPermissions("monitor:logininfor:view") + @GetMapping() + public String logininfor() + { + return prefix + "/logininfor"; + } + + @RequiresPermissions("monitor:logininfor:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(SysLogininfor logininfor) + { + startPage(); + List list = logininforService.selectLogininforList(logininfor); + return getDataTable(list); + } + + @Log(title = "登录日志", businessType = BusinessType.EXPORT) + @RequiresPermissions("monitor:logininfor:export") + @PostMapping("/export") + @ResponseBody + public AjaxResult export(SysLogininfor logininfor) + { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil util = new ExcelUtil(SysLogininfor.class); + return util.exportExcel(list, "登录日志"); + } + + @RequiresPermissions("monitor:logininfor:remove") + @Log(title = "登录日志", businessType = BusinessType.DELETE) + @PostMapping("/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(logininforService.deleteLogininforByIds(ids)); + } + + @RequiresPermissions("monitor:logininfor:remove") + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @PostMapping("/clean") + @ResponseBody + public AjaxResult clean() + { + logininforService.cleanLogininfor(); + return success(); + } + + @RequiresPermissions("monitor:logininfor:unlock") + @Log(title = "账户解锁", businessType = BusinessType.OTHER) + @PostMapping("/unlock") + @ResponseBody + public AjaxResult unlock(String loginName) + { + passwordService.clearLoginRecordCache(loginName); + return success(); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java new file mode 100644 index 0000000..cddd972 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java @@ -0,0 +1,90 @@ +package com.ruoyi.web.controller.monitor; + +import java.util.List; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.SysOperLog; +import com.ruoyi.system.service.ISysOperLogService; + +/** + * 操作日志记录 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/monitor/operlog") +public class SysOperlogController extends BaseController +{ + private String prefix = "monitor/operlog"; + + @Autowired + private ISysOperLogService operLogService; + + @RequiresPermissions("monitor:operlog:view") + @GetMapping() + public String operlog() + { + return prefix + "/operlog"; + } + + @RequiresPermissions("monitor:operlog:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(SysOperLog operLog) + { + startPage(); + List list = operLogService.selectOperLogList(operLog); + return getDataTable(list); + } + + @Log(title = "操作日志", businessType = BusinessType.EXPORT) + @RequiresPermissions("monitor:operlog:export") + @PostMapping("/export") + @ResponseBody + public AjaxResult export(SysOperLog operLog) + { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil util = new ExcelUtil(SysOperLog.class); + return util.exportExcel(list, "操作日志"); + } + + @Log(title = "操作日志", businessType = BusinessType.DELETE) + @RequiresPermissions("monitor:operlog:remove") + @PostMapping("/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(operLogService.deleteOperLogByIds(ids)); + } + + @RequiresPermissions("monitor:operlog:detail") + @GetMapping("/detail/{operId}") + public String detail(@PathVariable("operId") Long operId, ModelMap mmap) + { + mmap.put("operLog", operLogService.selectOperLogById(operId)); + return prefix + "/detail"; + } + + @Log(title = "操作日志", businessType = BusinessType.CLEAN) + @RequiresPermissions("monitor:operlog:remove") + @PostMapping("/clean") + @ResponseBody + public AjaxResult clean() + { + operLogService.cleanOperLog(); + return success(); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysAccountController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysAccountController.java new file mode 100644 index 0000000..377a4cd --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysAccountController.java @@ -0,0 +1,76 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.ShiroConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.CookieUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.shiro.service.SysPasswordService; +import com.ruoyi.system.domain.SysAccount; +import com.ruoyi.system.service.ISysAccountService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 首页 业务处理 + * + * @author ruoyi + */ +@Controller +public class SysAccountController extends BaseController +{ + + @Autowired + private ISysAccountService accountService; + + // 账户管理 + @GetMapping("/account") + public String account() + { + return "ky/account"; + } + + // 查询账户信息 + @PostMapping("/account/getList") + @ResponseBody + public AjaxResult getList(SysAccount account) + { + account.setUserId(getUserId()); + return AjaxResult.success(accountService.selectSysAccounts(account)); + } + + // 新增账户 + @PostMapping("/account/insert") + @ResponseBody + public AjaxResult insert(SysAccount account) + { + account.setUserId(getUserId()); + return toAjax(accountService.insertSysAccount(account)); + } + + // 修改账户 + @PostMapping("/account/update") + @ResponseBody + public AjaxResult update(SysAccount account) + { + return toAjax(accountService.updateSysAccount(account)); + } + + // 删除账户 + @PostMapping("/account/delete") + @ResponseBody + public AjaxResult delete(String ids) + { + return toAjax(accountService.deleteSysAccount(Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList()))); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysBalanceLogController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysBalanceLogController.java new file mode 100644 index 0000000..02059b9 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysBalanceLogController.java @@ -0,0 +1,160 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.SysBalanceLog; +import com.ruoyi.system.domain.SysPayYz; +import com.ruoyi.system.service.ISysBalanceLogService; +import org.apache.commons.io.FileUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.stereotype.Controller; +import org.springframework.util.StreamUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 首页 业务处理 + * + * @author ruoyi + */ +@Controller +public class SysBalanceLogController extends BaseController +{ + + @Autowired + private ISysBalanceLogService balanceLogService; + + @Autowired + private ResourceLoader resourceLoader; + + // 支出管理 + @GetMapping("/zhichu") + public String zhichu() + { + return "ky/zhichu"; + } + + // 收入管理 + @GetMapping("/income") + public String income() + { + return "ky/income"; + } + + // 查询支出预算 + @PostMapping("/zhichu/getYsInfo") + @ResponseBody + public SysPayYz getYsInfo() + { + return balanceLogService.selectPayYz(getUserId()); + } + + // 编辑支出预算 + @PostMapping("/zhichu/updateYsInfo") + @ResponseBody + public AjaxResult updateYsInfo(SysPayYz payYz) + { + payYz.setUserId(getUserId()); + return toAjax(balanceLogService.updateYsInfo(payYz)); + } + + // 查询收支记录 + @PostMapping("/balance/getList") + @ResponseBody + public List getList(SysBalanceLog balanceLog) + { + balanceLog.setUserId(getUserId()); +// PageHelper.startPage(balanceLog.getPage(), balanceLog.getPageSize()); + return balanceLogService.selectSysBalanceLog(balanceLog); + } + + // 新增账户 + @PostMapping("/balance/insert") + @ResponseBody + public AjaxResult insert(SysBalanceLog balanceLog) + { + balanceLog.setUserId(getUserId()); + return toAjax(balanceLogService.insertSysBalanceLog(balanceLog)); + } + + // 修改账户 + @PostMapping("/balance/update") + @ResponseBody + public AjaxResult update(SysBalanceLog balanceLog) + { + balanceLog.setUserId(getUserId()); + return toAjax(balanceLogService.updateSysBalanceLog(balanceLog)); + } + + // 删除账户 + @PostMapping("/balance/delete") + @ResponseBody + public AjaxResult delete(String ids) + { + + return toAjax(balanceLogService.deleteSysBalanceLog(Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList()))); + } + + /** + * 文件下载 isOnline默认为false + */ + @GetMapping("/balance/download") + public void download(HttpServletResponse response) throws IOException { + InputStream is = null; + OutputStream os = null; + try { + is = SysBalanceLogController.class.getClassLoader().getResourceAsStream("income.xlsx"); + os = response.getOutputStream(); + byte[] bytes = StreamUtils.copyToByteArray(is); + response.reset(); + //下面这两行是为了解决跨域,如果没有跨域这两行可以删除 + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); + response.setContentType("application/octet-stream;charset=utf-8"); + response.addHeader("Content-Disposition", "attachment;filename=income.xlsx"); + response.addHeader("Content-Length", "" + bytes.length); + os.write(bytes); + os.flush(); + }catch (Exception e) { + e.printStackTrace(); + }finally { + try { + if(os != null) { + os.close(); + } + if (is != null) { + is.close(); + } + }catch (Exception e) { + e.printStackTrace(); + } + } + } + + @PostMapping("/balance/importData") + @ResponseBody + public AjaxResult importData(MultipartFile file_data) throws Exception + { + ExcelUtil util = new ExcelUtil<>(SysBalanceLog.class); + List balanceLogs = util.importExcel(file_data.getInputStream()); + String message = balanceLogService.importBalanceLog(balanceLogs, getUserId()); + if (StringUtils.isNotEmpty(message)) { + return AjaxResult.error(message); + } + return AjaxResult.success(); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysCaptchaController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysCaptchaController.java new file mode 100644 index 0000000..739c469 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysCaptchaController.java @@ -0,0 +1,92 @@ +package com.ruoyi.web.controller.system; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +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; +import com.google.code.kaptcha.Constants; +import com.google.code.kaptcha.Producer; +import com.ruoyi.common.core.controller.BaseController; + +/** + * 图片验证码(支持算术形式) + * + * @author ruoyi + */ +@Controller +@RequestMapping("/captcha") +public class SysCaptchaController extends BaseController +{ + @Resource(name = "captchaProducer") + private Producer captchaProducer; + + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; + + /** + * 验证码生成 + */ + @GetMapping(value = "/captchaImage") + public ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response) + { + ServletOutputStream out = null; + try + { + HttpSession session = request.getSession(); + response.setDateHeader("Expires", 0); + response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); + response.addHeader("Cache-Control", "post-check=0, pre-check=0"); + response.setHeader("Pragma", "no-cache"); + response.setContentType("image/jpeg"); + + String type = request.getParameter("type"); + String capStr = null; + String code = null; + BufferedImage bi = null; + if ("math".equals(type)) + { + String capText = captchaProducerMath.createText(); + capStr = capText.substring(0, capText.lastIndexOf("@")); + code = capText.substring(capText.lastIndexOf("@") + 1); + bi = captchaProducerMath.createImage(capStr); + } + else if ("char".equals(type)) + { + capStr = code = captchaProducer.createText(); + bi = captchaProducer.createImage(capStr); + } + session.setAttribute(Constants.KAPTCHA_SESSION_KEY, code); + out = response.getOutputStream(); + ImageIO.write(bi, "jpg", out); + out.flush(); + + } + catch (Exception e) + { + e.printStackTrace(); + } + finally + { + try + { + if (out != null) + { + out.close(); + } + } + catch (IOException e) + { + e.printStackTrace(); + } + } + return null; + } +} \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDatasisController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDatasisController.java new file mode 100644 index 0000000..d97b151 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDatasisController.java @@ -0,0 +1,91 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.SysAccount; +import com.ruoyi.system.domain.SysBalanceLog; +import com.ruoyi.system.service.ISysAccountService; +import com.ruoyi.system.service.ISysBalanceLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 首页 业务处理 + * + * @author ruoyi + */ +@Controller +public class SysDatasisController extends BaseController +{ + + @Autowired + private ISysBalanceLogService balanceLogService; + + // 数据分析 + @GetMapping("/datasis") + public String datasis() + { + return "ky/datasis"; + } + + + @PostMapping("/datasis/getSz") + @ResponseBody + public List getSz() + { + return balanceLogService.selectSZ(getUserId()); + } + + @PostMapping("/datasis/getSr") + @ResponseBody + public List getSr() + { + return balanceLogService.selectSr(getUserId()); + } + @PostMapping("/datasis/getZc") + @ResponseBody + public List getZc() + { + return balanceLogService.selectZc(getUserId()); + } + + @PostMapping("/datasis/getYs") + @ResponseBody + public BigDecimal getYs() + { + return balanceLogService.getYs(getUserId()); + } + + @PostMapping("/datasis/insertYs") + @ResponseBody + public AjaxResult insertYs(BigDecimal price) + { + balanceLogService.insertYs(getUserId(), price); + return AjaxResult.success(); + } + + @PostMapping("/datasis/getCurYs") + @ResponseBody + public String getCurYs() + { + return balanceLogService.getCurYs(getUserId()); + } + + @PostMapping("/datasis/getSrAndZc") + @ResponseBody + public List getSrAndZc() + { + return balanceLogService.selectSrAndZc(getUserId()); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java new file mode 100644 index 0000000..ddac5de --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java @@ -0,0 +1,104 @@ +package com.ruoyi.web.controller.system; + +import java.util.Date; +import java.util.List; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.system.domain.SysIndex; +import com.ruoyi.system.mapper.SysBalanceLogMapper; +import com.ruoyi.system.service.ISysBalanceLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.ShiroConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.CookieUtils; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.shiro.service.SysPasswordService; + +/** + * 首页 业务处理 + * + * @author ruoyi + */ +@Controller +public class SysIndexController extends BaseController +{ + + @Autowired + private SysPasswordService passwordService; + @Autowired + private ISysBalanceLogService balanceLogService; + + // 系统首页 + @GetMapping("/index") + public String index(ModelMap mmap) + { + // 取身份信息 + SysUser user = getSysUser(); + SysIndex index = balanceLogService.selectIndexInfo(user.getUserId()); + mmap.put("user", user); + mmap.put("info", index); + return "ky/index"; + } + + // 锁定屏幕 + @GetMapping("/lockscreen") + public String lockscreen(ModelMap mmap) + { + mmap.put("user", getSysUser()); + ServletUtils.getSession().setAttribute(ShiroConstants.LOCK_SCREEN, true); + return "lock"; + } + + // 解锁屏幕 + @PostMapping("/unlockscreen") + @ResponseBody + public AjaxResult unlockscreen(String password) + { + SysUser user = getSysUser(); + if (StringUtils.isNull(user)) + { + return AjaxResult.error("服务器超时,请重新登录"); + } + if (passwordService.matches(user, password)) + { + ServletUtils.getSession().removeAttribute(ShiroConstants.LOCK_SCREEN); + return AjaxResult.success(); + } + return AjaxResult.error("密码不正确,请重新输入。"); + } + + // 切换主题 + @GetMapping("/system/switchSkin") + public String switchSkin() + { + return "skin"; + } + + // 切换菜单 + @GetMapping("/system/menuStyle/{style}") + public void menuStyle(@PathVariable String style, HttpServletResponse response) + { + CookieUtils.setCookie(response, "nav-style", style); + } + + // 系统介绍 + @GetMapping("/system/main") + public String main(ModelMap mmap) + { + mmap.put("version", RuoYiConfig.getVersion()); + return "main"; + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysJkController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysJkController.java new file mode 100644 index 0000000..ec23c8c --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysJkController.java @@ -0,0 +1,76 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.system.domain.SysAccount; +import com.ruoyi.system.domain.SysJk; +import com.ruoyi.system.service.ISysAccountService; +import com.ruoyi.system.service.ISysJkService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +/** + * 首页 业务处理 + * + * @author ruoyi + */ +@Controller +public class SysJkController extends BaseController +{ + + @Autowired + private ISysJkService jkService; + + // 账户管理 + @GetMapping("/jiance") + public String account() + { + return "ky/jiance"; + } + + // 查询通知信息 + @PostMapping("/jiance/getList") + @ResponseBody + public AjaxResult getList() + { + return AjaxResult.success(jkService.selectSysJkNotice(getUserId())); + } + + // 查询监控配置 + @PostMapping("/jiance/getJkList") + @ResponseBody + public AjaxResult getJkList() + { + return AjaxResult.success(jkService.selectSysJks(getUserId())); + } + + // 新增监控信息 + @PostMapping("/jiance/insert") + @ResponseBody + public AjaxResult insert(SysJk jk) + { + jk.setUserId(getUserId()); + return toAjax(jkService.insertSysJk(jk)); + } + + // 修改监控信息 + @PostMapping("/jiance/update") + @ResponseBody + public AjaxResult update(SysJk jk) + { + return toAjax(jkService.updateSysJk(jk)); + } + + // 删除账户 + @PostMapping("/jiance/delete") + @ResponseBody + public AjaxResult delete(Long id) + { + return toAjax(jkService.deleteSysJk(id)); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java new file mode 100644 index 0000000..4958f31 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -0,0 +1,64 @@ +package com.ruoyi.web.controller.system; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * 登录验证 + * + * @author ruoyi + */ +@Controller +public class SysLoginController extends BaseController +{ + @GetMapping("/login") + public String login(HttpServletRequest request, HttpServletResponse response) + { + // 如果是Ajax请求,返回Json字符串。 + if (ServletUtils.isAjaxRequest(request)) + { + return ServletUtils.renderString(response, "{\"code\":\"1\",\"msg\":\"未登录或登录超时。请重新登录\"}"); + } + return "ky/login"; + } + + @PostMapping("/login") + @ResponseBody + public AjaxResult ajaxLogin(String username, String password) + { + UsernamePasswordToken token = new UsernamePasswordToken(username, password, false); + Subject subject = SecurityUtils.getSubject(); + try + { + subject.login(token); + return success(); + } + catch (AuthenticationException e) + { + String msg = "用户或密码错误"; + if (StringUtils.isNotEmpty(e.getMessage())) + { + msg = e.getMessage(); + } + return error(msg); + } + } + + @GetMapping("/unauth") + public String unauth() + { + return "error/unauth"; + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java new file mode 100644 index 0000000..46bbad9 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -0,0 +1,170 @@ +package com.ruoyi.web.controller.system; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.file.MimeTypeUtils; +import com.ruoyi.framework.shiro.service.SysPasswordService; +import com.ruoyi.system.service.ISysUserService; + +/** + * 个人信息 业务处理 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/system/user/profile") +public class SysProfileController extends BaseController +{ + private static final Logger log = LoggerFactory.getLogger(SysProfileController.class); + + private String prefix = "system/user/profile"; + + @Autowired + private ISysUserService userService; + + @Autowired + private SysPasswordService passwordService; + + /** + * 个人信息 + */ + @GetMapping() + public String profile(ModelMap mmap) + { + SysUser user = getSysUser(); + mmap.put("user", user); + return prefix + "/profile"; + } + + @GetMapping("/checkPassword") + @ResponseBody + public boolean checkPassword(String password) + { + SysUser user = getSysUser(); + return passwordService.matches(user, password); + } + + @GetMapping("/resetPwd") + public String resetPwd(ModelMap mmap) + { + SysUser user = getSysUser(); + mmap.put("user", userService.selectUserById(user.getUserId())); + return prefix + "/resetPwd"; + } + + @Log(title = "重置密码", businessType = BusinessType.UPDATE) + @PostMapping("/resetPwd") + @ResponseBody + public AjaxResult resetPwd(String oldPassword, String newPassword) + { + SysUser user = getSysUser(); + if (!passwordService.matches(user, oldPassword)) + { + return error("修改密码失败,旧密码错误"); + } + if (passwordService.matches(user, newPassword)) + { + return error("新密码不能与旧密码相同"); + } + user.setSalt(ShiroUtils.randomSalt()); + user.setPassword(passwordService.encryptPassword(user.getLoginName(), newPassword, user.getSalt())); + user.setPwdUpdateDate(DateUtils.getNowDate()); + if (userService.resetUserPwd(user) > 0) + { + setSysUser(userService.selectUserById(user.getUserId())); + return success(); + } + return error("修改密码异常,请联系管理员"); + } + + /** + * 修改用户 + */ + @GetMapping("/edit") + public String edit(ModelMap mmap) + { + SysUser user = getSysUser(); + mmap.put("user", userService.selectUserById(user.getUserId())); + return prefix + "/edit"; + } + + /** + * 修改头像 + */ + @GetMapping("/avatar") + public String avatar(ModelMap mmap) + { + SysUser user = getSysUser(); + mmap.put("user", userService.selectUserById(user.getUserId())); + return prefix + "/avatar"; + } + + /** + * 修改用户 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PostMapping("/update") + @ResponseBody + public AjaxResult update(SysUser user) + { + SysUser currentUser = getSysUser(); + currentUser.setEmail(user.getEmail()); + if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser)) + { + return error("修改用户'" + currentUser.getLoginName() + "'失败,邮箱账号已存在"); + } + if (userService.updateUserInfo(currentUser) > 0) + { + setSysUser(userService.selectUserById(currentUser.getUserId())); + return success(); + } + return error(); + } + + /** + * 保存头像 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PostMapping("/updateAvatar") + @ResponseBody + public AjaxResult updateAvatar(@RequestParam("avatarfile") MultipartFile file) + { + SysUser currentUser = getSysUser(); + try + { + if (!file.isEmpty()) + { + if (userService.updateUserInfo(currentUser) > 0) + { + setSysUser(userService.selectUserById(currentUser.getUserId())); + return success(); + } + } + return error(); + } + catch (Exception e) + { + log.error("修改头像失败!", e); + return error(e.getMessage()); + } + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java new file mode 100644 index 0000000..660c5bc --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java @@ -0,0 +1,38 @@ +package com.ruoyi.web.controller.system; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.shiro.service.SysRegisterService; + +/** + * 注册验证 + * + * @author ruoyi + */ +@Controller +public class SysRegisterController extends BaseController +{ + @Autowired + private SysRegisterService registerService; + + @GetMapping("/register") + public String register() + { + return "ky/register"; + } + + @PostMapping("/register") + @ResponseBody + public AjaxResult ajaxRegister(SysUser user) + { + String msg = registerService.register(user); + return StringUtils.isEmpty(msg) ? success() : error(msg); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/BuildController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/BuildController.java new file mode 100644 index 0000000..4d3c128 --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/BuildController.java @@ -0,0 +1,26 @@ +package com.ruoyi.web.controller.tool; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import com.ruoyi.common.core.controller.BaseController; + +/** + * build 表单构建 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/tool/build") +public class BuildController extends BaseController +{ + private String prefix = "tool/build"; + + @RequiresPermissions("tool:build:view") + @GetMapping() + public String build() + { + return prefix + "/build"; + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/SwaggerController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/SwaggerController.java new file mode 100644 index 0000000..de2ae6c --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/SwaggerController.java @@ -0,0 +1,24 @@ +package com.ruoyi.web.controller.tool; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import com.ruoyi.common.core.controller.BaseController; + +/** + * swagger 接口 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/tool/swagger") +public class SwaggerController extends BaseController +{ + @RequiresPermissions("tool:swagger:view") + @GetMapping() + public String index() + { + return redirect("/swagger-ui/index.html"); + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java new file mode 100644 index 0000000..b4f6bac --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java @@ -0,0 +1,183 @@ +package com.ruoyi.web.controller.tool; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; + +/** + * swagger 用户测试方法 + * + * @author ruoyi + */ +@Api("用户信息管理") +@RestController +@RequestMapping("/test/user") +public class TestController extends BaseController +{ + private final static Map users = new LinkedHashMap(); + { + users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); + users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); + } + + @ApiOperation("获取用户列表") + @GetMapping("/list") + public R> userList() + { + List userList = new ArrayList(users.values()); + return R.ok(userList); + } + + @ApiOperation("获取用户详细") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @GetMapping("/{userId}") + public R getUser(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + return R.ok(users.get(userId)); + } + else + { + return R.fail("用户不存在"); + } + } + + @ApiOperation("新增用户") + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class) + }) + @PostMapping("/save") + public R save(UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("更新用户") + @PutMapping("/update") + public R update(@RequestBody UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + if (users.isEmpty() || !users.containsKey(user.getUserId())) + { + return R.fail("用户不存在"); + } + users.remove(user.getUserId()); + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("删除用户信息") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @DeleteMapping("/{userId}") + public R delete(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + users.remove(userId); + return R.ok(); + } + else + { + return R.fail("用户不存在"); + } + } +} + +@ApiModel(value = "UserEntity", description = "用户实体") +class UserEntity +{ + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("用户名称") + private String username; + + @ApiModelProperty("用户密码") + private String password; + + @ApiModelProperty("用户手机") + private String mobile; + + public UserEntity() + { + + } + + public UserEntity(Integer userId, String username, String password, String mobile) + { + this.userId = userId; + this.username = username; + this.password = password; + this.mobile = mobile; + } + + public Integer getUserId() + { + return userId; + } + + public void setUserId(Integer userId) + { + this.userId = userId; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getMobile() + { + return mobile; + } + + public void setMobile(String mobile) + { + this.mobile = mobile; + } +} diff --git a/src/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java b/src/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java new file mode 100644 index 0000000..e18d2cc --- /dev/null +++ b/src/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java @@ -0,0 +1,67 @@ +package com.ruoyi.web.core.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.ruoyi.common.config.RuoYiConfig; +import io.swagger.annotations.ApiOperation; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +/** + * Swagger2的接口配置 + * + * @author ruoyi + */ +@Configuration +public class SwaggerConfig +{ + /** 是否开启swagger */ + @Value("${swagger.enabled}") + private boolean enabled; + + /** + * 创建API + */ + @Bean + public Docket createRestApi() + { + return new Docket(DocumentationType.OAS_30) + // 是否启用Swagger + .enable(enabled) + // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) + .apiInfo(apiInfo()) + // 设置哪些接口暴露给Swagger展示 + .select() + // 扫描所有有注解的api,用这种方式更灵活 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 扫描指定包中的swagger注解 + //.apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger")) + // 扫描所有 .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build(); + } + + /** + * 添加摘要信息 + */ + private ApiInfo apiInfo() + { + // 用ApiInfoBuilder进行定制 + return new ApiInfoBuilder() + // 设置标题 + .title("标题:若依管理系统_接口文档") + // 描述 + .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") + // 作者信息 + .contact(new Contact(RuoYiConfig.getName(), null, null)) + // 版本 + .version("版本号:" + RuoYiConfig.getVersion()) + .build(); + } +} diff --git a/src/ruoyi-admin/src/main/resources/application-druid.yml b/src/ruoyi-admin/src/main/resources/application-druid.yml new file mode 100644 index 0000000..3ad7a64 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/application-druid.yml @@ -0,0 +1,61 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://rm-m5e3u8r97i93wh3r5lo.mysql.rds.aliyuncs.com:3306/cwbs?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: Yyy990602 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/application.yml b/src/ruoyi-admin/src/main/resources/application.yml new file mode 100644 index 0000000..1c29b77 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/application.yml @@ -0,0 +1,142 @@ +# 项目相关配置 +ruoyi: + # 名称 + name: RuoYi + # 版本 + version: 4.7.9 + # 版权年份 + copyrightYear: 2024 + # 实例演示开关 + demoEnabled: true + # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) + profile: D:/ruoyi/uploadPath + # 获取ip地址开关 + addressEnabled: false + +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为80 + port: 80 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 1000 + threads: + # tomcat最大线程数,默认为200 + max: 800 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 100 + +# 日志配置 +logging: + level: + com.ruoyi: debug + org.springframework: warn + +# 用户配置 +user: + password: + # 密码错误{maxRetryCount}次锁定10分钟 + maxRetryCount: 5 + +# Spring配置 +spring: + # 模板引擎 + thymeleaf: + mode: HTML + encoding: utf-8 + # 禁用缓存 + cache: false + # 资源信息 + messages: + # 国际化资源文件路径 + basename: static/i18n/messages + jackson: + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + profiles: + active: druid + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true + +# MyBatis +mybatis: + # 搜索指定包别名 + typeAliasesPackage: com.ruoyi.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + +# PageHelper分页插件 +pagehelper: + helperDialect: mysql + supportMethodsArguments: true + params: count=countSql + +# Shiro +shiro: + user: + # 登录地址 + loginUrl: /login + # 权限认证失败地址 + unauthorizedUrl: /unauth + # 首页地址 + indexUrl: /index + # 验证码开关 + captchaEnabled: true + # 验证码类型 math 数字计算 char 字符验证 + captchaType: math + cookie: + # 设置Cookie的域名 默认空,即当前访问的域名 + domain: + # 设置cookie的有效访问路径 + path: / + # 设置HttpOnly属性 + httpOnly: true + # 设置Cookie的过期时间,天为单位 + maxAge: 30 + # 设置密钥,务必保持唯一性(生成方式,直接拷贝到main运行即可)Base64.encodeToString(CipherUtils.generateNewKey(128, "AES").getEncoded()) (默认启动生成随机秘钥,随机秘钥会导致之前客户端RememberMe Cookie无效,如设置固定秘钥RememberMe Cookie则有效) + cipherKey: + session: + # Session超时时间,-1代表永不过期(默认30分钟) + expireTime: 30 + # 同步session到数据库的周期(默认1分钟) + dbSyncPeriod: 1 + # 相隔多久检查一次session的有效性,默认就是10分钟 + validationInterval: 10 + # 同一个用户最大会话数,比如2的意思是同一个账号允许最多同时两个人登录(默认-1不限制) + maxSession: -1 + # 踢出之前登录的/之后登录的用户,默认踢出之前登录的用户 + kickoutAfter: false + rememberMe: + # 是否开启记住我 + enabled: true + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice/* + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* + +# Swagger配置 +swagger: + # 是否开启swagger + enabled: true diff --git a/src/ruoyi-admin/src/main/resources/banner.txt b/src/ruoyi-admin/src/main/resources/banner.txt new file mode 100644 index 0000000..0931cb8 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/banner.txt @@ -0,0 +1,24 @@ +Application Version: ${ruoyi.version} +Spring Boot Version: ${spring-boot.version} +//////////////////////////////////////////////////////////////////// +// _ooOoo_ // +// o8888888o // +// 88" . "88 // +// (| ^_^ |) // +// O\ = /O // +// ____/`---'\____ // +// .' \\| |// `. // +// / \\||| : |||// \ // +// / _||||| -:- |||||- \ // +// | | \\\ - /// | | // +// | \_| ''\---/'' | | // +// \ .-\__ `-` ___/-. / // +// ___`. .' /--.--\ `. . ___ // +// ."" '< `.___\_<|>_/___.' >'"". // +// | | : `- \`.;`\ _ /`;.`/ - ` : | | // +// \ \ `-. \_ __\ /__ _/ .-` / / // +// ========`-.____`-.___\_____/___.-`____.-'======== // +// `=---=' // +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // +// 佛祖保佑 永不宕机 永无BUG // +//////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/ehcache/ehcache-shiro.xml b/src/ruoyi-admin/src/main/resources/ehcache/ehcache-shiro.xml new file mode 100644 index 0000000..7bf080f --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/ehcache/ehcache-shiro.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/income.xlsx b/src/ruoyi-admin/src/main/resources/income.xlsx new file mode 100644 index 0000000..153fe90 Binary files /dev/null and b/src/ruoyi-admin/src/main/resources/income.xlsx differ diff --git a/src/ruoyi-admin/src/main/resources/logback.xml b/src/ruoyi-admin/src/main/resources/logback.xml new file mode 100644 index 0000000..a360583 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/logback.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml b/src/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 0000000..ac47c03 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/beautifyhtml/beautifyhtml.js b/src/ruoyi-admin/src/main/resources/static/ajax/libs/beautifyhtml/beautifyhtml.js new file mode 100644 index 0000000..ea69dec --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/beautifyhtml/beautifyhtml.js @@ -0,0 +1,617 @@ +/*jshint curly:true, eqeqeq:true, laxbreak:true, noempty:false */ +/* + + The MIT License (MIT) + + Copyright (c) 2007-2013 Einar Lielmanis and contributors. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + + + Style HTML +--------------- + + Written by Nochum Sossonko, (nsossonko@hotmail.com) + + Based on code initially developed by: Einar Lielmanis, + http://jsbeautifier.org/ + + Usage: + style_html(html_source); + + style_html(html_source, options); + + The options are: + indent_size (default 4) — indentation size, + indent_char (default space) — character to indent with, + max_char (default 250) - maximum amount of characters per line (0 = disable) + brace_style (default "collapse") - "collapse" | "expand" | "end-expand" + put braces on the same line as control statements (default), or put braces on own line (Allman / ANSI style), or just put end braces on own line. + unformatted (defaults to inline tags) - list of tags, that shouldn't be reformatted + indent_scripts (default normal) - "keep"|"separate"|"normal" + + e.g. + + style_html(html_source, { + 'indent_size': 2, + 'indent_char': ' ', + 'max_char': 78, + 'brace_style': 'expand', + 'unformatted': ['a', 'sub', 'sup', 'b', 'i', 'u'] + }); +*/ + +(function() { + + function style_html(html_source, options, js_beautify, css_beautify) { + //Wrapper function to invoke all the necessary constructors and deal with the output. + + var multi_parser, + indent_size, + indent_character, + max_char, + brace_style, + unformatted; + + options = options || {}; + indent_size = options.indent_size || 4; + indent_character = options.indent_char || ' '; + brace_style = options.brace_style || 'collapse'; + max_char = options.max_char === 0 ? Infinity : options.max_char || 250; + unformatted = options.unformatted || ['a', 'span', 'bdo', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'sub', 'sup', 'tt', 'i', 'b', 'big', 'small', 'u', 's', 'strike', 'font', 'ins', 'del', 'pre', 'address', 'dt', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']; + + function Parser() { + + this.pos = 0; //Parser position + this.token = ''; + this.current_mode = 'CONTENT'; //reflects the current Parser mode: TAG/CONTENT + this.tags = { //An object to hold tags, their position, and their parent-tags, initiated with default values + parent: 'parent1', + parentcount: 1, + parent1: '' + }; + this.tag_type = ''; + this.token_text = this.last_token = this.last_text = this.token_type = ''; + + this.Utils = { //Uilities made available to the various functions + whitespace: "\n\r\t ".split(''), + single_token: 'br,input,link,meta,!doctype,basefont,base,area,hr,wbr,param,img,isindex,?xml,embed,?php,?,?='.split(','), //all the single tags for HTML + extra_liners: 'head,body,/html'.split(','), //for tags that need a line of whitespace before them + in_array: function (what, arr) { + for (var i=0; i= this.input.length) { + return content.length?content.join(''):['', 'TK_EOF']; + } + + input_char = this.input.charAt(this.pos); + this.pos++; + this.line_char_count++; + + if (this.Utils.in_array(input_char, this.Utils.whitespace)) { + if (content.length) { + space = true; + } + this.line_char_count--; + continue; //don't want to insert unnecessary space + } + else if (space) { + if (this.line_char_count >= this.max_char) { //insert a line when the max_char is reached + content.push('\n'); + for (var i=0; i', 'igm'); + reg_match.lastIndex = this.pos; + var reg_array = reg_match.exec(this.input); + var end_script = reg_array?reg_array.index:this.input.length; //absolute end of script + if(this.pos < end_script) { //get everything in between the script tags + content = this.input.substring(this.pos, end_script); + this.pos = end_script; + } + return content; + }; + + this.record_tag = function (tag){ //function to record a tag and its parent in this.tags Object + if (this.tags[tag + 'count']) { //check for the existence of this tag type + this.tags[tag + 'count']++; + this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level + } + else { //otherwise initialize this tag type + this.tags[tag + 'count'] = 1; + this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level + } + this.tags[tag + this.tags[tag + 'count'] + 'parent'] = this.tags.parent; //set the parent (i.e. in the case of a div this.tags.div1parent) + this.tags.parent = tag + this.tags[tag + 'count']; //and make this the current parent (i.e. in the case of a div 'div1') + }; + + this.retrieve_tag = function (tag) { //function to retrieve the opening tag to the corresponding closer + if (this.tags[tag + 'count']) { //if the openener is not in the Object we ignore it + var temp_parent = this.tags.parent; //check to see if it's a closable tag. + while (temp_parent) { //till we reach '' (the initial value); + if (tag + this.tags[tag + 'count'] === temp_parent) { //if this is it use it + break; + } + temp_parent = this.tags[temp_parent + 'parent']; //otherwise keep on climbing up the DOM Tree + } + if (temp_parent) { //if we caught something + this.indent_level = this.tags[tag + this.tags[tag + 'count']]; //set the indent_level accordingly + this.tags.parent = this.tags[temp_parent + 'parent']; //and set the current parent + } + delete this.tags[tag + this.tags[tag + 'count'] + 'parent']; //delete the closed tags parent reference... + delete this.tags[tag + this.tags[tag + 'count']]; //...and the tag itself + if (this.tags[tag + 'count'] === 1) { + delete this.tags[tag + 'count']; + } + else { + this.tags[tag + 'count']--; + } + } + }; + + this.get_tag = function (peek) { //function to get a full tag and parse its type + var input_char = '', + content = [], + comment = '', + space = false, + tag_start, tag_end, + orig_pos = this.pos, + orig_line_char_count = this.line_char_count; + + peek = peek !== undefined ? peek : false; + + do { + if (this.pos >= this.input.length) { + if (peek) { + this.pos = orig_pos; + this.line_char_count = orig_line_char_count; + } + return content.length?content.join(''):['', 'TK_EOF']; + } + + input_char = this.input.charAt(this.pos); + this.pos++; + this.line_char_count++; + + if (this.Utils.in_array(input_char, this.Utils.whitespace)) { //don't want to insert unnecessary space + space = true; + this.line_char_count--; + continue; + } + + if (input_char === "'" || input_char === '"') { + if (!content[1] || content[1] !== '!') { //if we're in a comment strings don't get treated specially + input_char += this.get_unformatted(input_char); + space = true; + } + } + + if (input_char === '=') { //no space before = + space = false; + } + + if (content.length && content[content.length-1] !== '=' && input_char !== '>' && space) { + //no space after = or before > + if (this.line_char_count >= this.max_char) { + this.print_newline(false, content); + this.line_char_count = 0; + } + else { + content.push(' '); + this.line_char_count++; + } + space = false; + } + if (input_char === '<') { + tag_start = this.pos - 1; + } + content.push(input_char); //inserts character at-a-time (or string) + } while (input_char !== '>'); + + var tag_complete = content.join(''); + var tag_index; + if (tag_complete.indexOf(' ') !== -1) { //if there's whitespace, thats where the tag name ends + tag_index = tag_complete.indexOf(' '); + } + else { //otherwise go with the tag ending + tag_index = tag_complete.indexOf('>'); + } + var tag_check = tag_complete.substring(1, tag_index).toLowerCase(); + if (tag_complete.charAt(tag_complete.length-2) === '/' || + this.Utils.in_array(tag_check, this.Utils.single_token)) { //if this tag name is a single tag type (either in the list or has a closing /) + if ( ! peek) { + this.tag_type = 'SINGLE'; + } + } + else if (tag_check === 'script') { //for later script handling + if ( ! peek) { + this.record_tag(tag_check); + this.tag_type = 'SCRIPT'; + } + } + else if (tag_check === 'style') { //for future style handling (for now it justs uses get_content) + if ( ! peek) { + this.record_tag(tag_check); + this.tag_type = 'STYLE'; + } + } + else if (this.is_unformatted(tag_check, unformatted)) { // do not reformat the "unformatted" tags + comment = this.get_unformatted('', tag_complete); //...delegate to get_unformatted function + content.push(comment); + // Preserve collapsed whitespace either before or after this tag. + if (tag_start > 0 && this.Utils.in_array(this.input.charAt(tag_start - 1), this.Utils.whitespace)){ + content.splice(0, 0, this.input.charAt(tag_start - 1)); + } + tag_end = this.pos - 1; + if (this.Utils.in_array(this.input.charAt(tag_end + 1), this.Utils.whitespace)){ + content.push(this.input.charAt(tag_end + 1)); + } + this.tag_type = 'SINGLE'; + } + else if (tag_check.charAt(0) === '!') { //peek for so... + comment = this.get_unformatted('-->', tag_complete); //...delegate to get_unformatted + content.push(comment); + } + if ( ! peek) { + this.tag_type = 'START'; + } + } + else if (tag_check.indexOf('[endif') !== -1) {//peek for ', tag_complete); + content.push(comment); + this.tag_type = 'SINGLE'; + } + } + else if ( ! peek) { + if (tag_check.charAt(0) === '/') { //this tag is a double tag so check for tag-ending + this.retrieve_tag(tag_check.substring(1)); //remove it and all ancestors + this.tag_type = 'END'; + } + else { //otherwise it's a start-tag + this.record_tag(tag_check); //push it on the tag stack + this.tag_type = 'START'; + } + if (this.Utils.in_array(tag_check, this.Utils.extra_liners)) { //check if this double needs an extra line + this.print_newline(true, this.output); + } + } + + if (peek) { + this.pos = orig_pos; + this.line_char_count = orig_line_char_count; + } + + return content.join(''); //returns fully formatted tag + }; + + this.get_unformatted = function (delimiter, orig_tag) { //function to return unformatted content in its entirety + + if (orig_tag && orig_tag.toLowerCase().indexOf(delimiter) !== -1) { + return ''; + } + var input_char = ''; + var content = ''; + var space = true; + do { + + if (this.pos >= this.input.length) { + return content; + } + + input_char = this.input.charAt(this.pos); + this.pos++; + + if (this.Utils.in_array(input_char, this.Utils.whitespace)) { + if (!space) { + this.line_char_count--; + continue; + } + if (input_char === '\n' || input_char === '\r') { + content += '\n'; + /* Don't change tab indention for unformatted blocks. If using code for html editing, this will greatly affect
 tags if they are specified in the 'unformatted array'
+                for (var i=0; i]*>\s*$/);
+
+            // if next_tag comes back but is not an isolated tag, then
+            // let's treat the 'a' tag as having content
+            // and respect the unformatted option
+            if (!tag || this.Utils.in_array(tag, unformatted)){
+                return true;
+            } else {
+                return false;
+            }
+        };
+
+        this.printer = function (js_source, indent_character, indent_size, max_char, brace_style) { //handles input/output and some other printing functions
+
+          this.input = js_source || ''; //gets the input for the Parser
+          this.output = [];
+          this.indent_character = indent_character;
+          this.indent_string = '';
+          this.indent_size = indent_size;
+          this.brace_style = brace_style;
+          this.indent_level = 0;
+          this.max_char = max_char;
+          this.line_char_count = 0; //count to see if max_char was exceeded
+
+          for (var i=0; i 0) {
+              this.indent_level--;
+            }
+          };
+        };
+        return this;
+      }
+
+      /*_____________________--------------------_____________________*/
+
+      multi_parser = new Parser(); //wrapping functions Parser
+      multi_parser.printer(html_source, indent_character, indent_size, max_char, brace_style); //initialize starting values
+
+      while (true) {
+          var t = multi_parser.get_token();
+          multi_parser.token_text = t[0];
+          multi_parser.token_type = t[1];
+
+        if (multi_parser.token_type === 'TK_EOF') {
+          break;
+        }
+
+        switch (multi_parser.token_type) {
+          case 'TK_TAG_START':
+            multi_parser.print_newline(false, multi_parser.output);
+            multi_parser.print_token(multi_parser.token_text);
+            multi_parser.indent();
+            multi_parser.current_mode = 'CONTENT';
+            break;
+          case 'TK_TAG_STYLE':
+          case 'TK_TAG_SCRIPT':
+            multi_parser.print_newline(false, multi_parser.output);
+            multi_parser.print_token(multi_parser.token_text);
+            multi_parser.current_mode = 'CONTENT';
+            break;
+          case 'TK_TAG_END':
+            //Print new line only if the tag has no content and has child
+            if (multi_parser.last_token === 'TK_CONTENT' && multi_parser.last_text === '') {
+                var tag_name = multi_parser.token_text.match(/\w+/)[0];
+                var tag_extracted_from_last_output = multi_parser.output[multi_parser.output.length -1].match(/<\s*(\w+)/);
+                if (tag_extracted_from_last_output === null || tag_extracted_from_last_output[1] !== tag_name) {
+                    multi_parser.print_newline(true, multi_parser.output);
+                }
+            }
+            multi_parser.print_token(multi_parser.token_text);
+            multi_parser.current_mode = 'CONTENT';
+            break;
+          case 'TK_TAG_SINGLE':
+            // Don't add a newline before elements that should remain unformatted.
+            var tag_check = multi_parser.token_text.match(/^\s*<([a-z]+)/i);
+            if (!tag_check || !multi_parser.Utils.in_array(tag_check[1], unformatted)){
+                multi_parser.print_newline(false, multi_parser.output);
+            }
+            multi_parser.print_token(multi_parser.token_text);
+            multi_parser.current_mode = 'CONTENT';
+            break;
+          case 'TK_CONTENT':
+            if (multi_parser.token_text !== '') {
+              multi_parser.print_token(multi_parser.token_text);
+            }
+            multi_parser.current_mode = 'TAG';
+            break;
+          case 'TK_STYLE':
+          case 'TK_SCRIPT':
+            if (multi_parser.token_text !== '') {
+              multi_parser.output.push('\n');
+              var text = multi_parser.token_text,
+                  _beautifier,
+                  script_indent_level = 1;
+              if (multi_parser.token_type === 'TK_SCRIPT') {
+                _beautifier = typeof js_beautify === 'function' && js_beautify;
+              } else if (multi_parser.token_type === 'TK_STYLE') {
+                _beautifier = typeof css_beautify === 'function' && css_beautify;
+              }
+
+              if (options.indent_scripts === "keep") {
+                script_indent_level = 0;
+              } else if (options.indent_scripts === "separate") {
+                script_indent_level = -multi_parser.indent_level;
+              }
+
+              var indentation = multi_parser.get_full_indent(script_indent_level);
+              if (_beautifier) {
+                // call the Beautifier if avaliable
+                text = _beautifier(text.replace(/^\s*/, indentation), options);
+              } else {
+                // simply indent the string otherwise
+                var white = text.match(/^\s*/)[0];
+                var _level = white.match(/[^\n\r]*$/)[0].split(multi_parser.indent_string).length - 1;
+                var reindent = multi_parser.get_full_indent(script_indent_level -_level);
+                text = text.replace(/^\s*/, indentation)
+                       .replace(/\r\n|\r|\n/g, '\n' + reindent)
+                       .replace(/\s*$/, '');
+              }
+              if (text) {
+                multi_parser.print_token(text);
+                multi_parser.print_newline(true, multi_parser.output);
+              }
+            }
+            multi_parser.current_mode = 'TAG';
+            break;
+        }
+        multi_parser.last_token = multi_parser.token_type;
+        multi_parser.last_text = multi_parser.token_text;
+      }
+      return multi_parser.output.join('');
+    }
+
+    // If we're running a web page and don't have either of the above, add our one global
+    window.html_beautify = function(html_source, options) {
+        return style_html(html_source, options, window.js_beautify, window.css_beautify);
+    };
+
+}());
diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/blockUI/jquery.blockUI.js b/src/ruoyi-admin/src/main/resources/static/ajax/libs/blockUI/jquery.blockUI.js
new file mode 100644
index 0000000..552613d
--- /dev/null
+++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/blockUI/jquery.blockUI.js
@@ -0,0 +1,620 @@
+/*!
+ * jQuery blockUI plugin
+ * Version 2.70.0-2014.11.23
+ * Requires jQuery v1.7 or later
+ *
+ * Examples at: http://malsup.com/jquery/block/
+ * Copyright (c) 2007-2013 M. Alsup
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Thanks to Amir-Hossein Sobhi for some excellent contributions!
+ */
+
+;(function() {
+/*jshint eqeqeq:false curly:false latedef:false */
+"use strict";
+
+	function setup($) {
+		$.fn._fadeIn = $.fn.fadeIn;
+
+		var noOp = $.noop || function() {};
+
+		// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
+		// confusing userAgent strings on Vista)
+		var msie = /MSIE/.test(navigator.userAgent);
+		var ie6  = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent);
+		var mode = document.documentMode || 0;
+		var setExpr = $.isFunction( document.createElement('div').style.setExpression );
+
+		// global $ methods for blocking/unblocking the entire page
+		$.blockUI   = function(opts) { install(window, opts); };
+		$.unblockUI = function(opts) { remove(window, opts); };
+
+		// convenience method for quick growl-like notifications  (http://www.google.com/search?q=growl)
+		$.growlUI = function(title, message, timeout, onClose) {
+			var $m = $('
'); + if (title) $m.append('

'+title+'

'); + if (message) $m.append('

'+message+'

'); + if (timeout === undefined) timeout = 3000; + + // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications + var callBlock = function(opts) { + opts = opts || {}; + + $.blockUI({ + message: $m, + fadeIn : typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700, + fadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000, + timeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout, + centerY: false, + showOverlay: false, + onUnblock: onClose, + css: $.blockUI.defaults.growlCSS + }); + }; + + callBlock(); + var nonmousedOpacity = $m.css('opacity'); + $m.mouseover(function() { + callBlock({ + fadeIn: 0, + timeout: 30000 + }); + + var displayBlock = $('.blockMsg'); + displayBlock.stop(); // cancel fadeout if it has started + displayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency + }).mouseout(function() { + $('.blockMsg').fadeOut(1000); + }); + // End konapun additions + }; + + // plugin method for blocking element content + $.fn.block = function(opts) { + if ( this[0] === window ) { + $.blockUI( opts ); + return this; + } + var fullOpts = $.extend({}, $.blockUI.defaults, opts || {}); + this.each(function() { + var $el = $(this); + if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked')) + return; + $el.unblock({ fadeOut: 0 }); + }); + + return this.each(function() { + if ($.css(this,'position') == 'static') { + this.style.position = 'relative'; + $(this).data('blockUI.static', true); + } + this.style.zoom = 1; // force 'hasLayout' in ie + install(this, opts); + }); + }; + + // plugin method for unblocking element content + $.fn.unblock = function(opts) { + if ( this[0] === window ) { + $.unblockUI( opts ); + return this; + } + return this.each(function() { + remove(this, opts); + }); + }; + + $.blockUI.version = 2.70; // 2nd generation blocking at no extra cost! + + // override these in your code to change the default behavior and style + $.blockUI.defaults = { + // message displayed when blocking (use null for no message) + message: '
加载中......
', + + title: null, // title string; only used when theme == true + draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded) + + theme: false, // set to true to use with jQuery UI themes + + // styles for the message when blocking; if you wish to disable + // these and use an external stylesheet then do this in your code: + // $.blockUI.defaults.css = {}; + css: { + padding: 0, + margin: 0, + width: '30%', + top: '40%', + left: '35%', + textAlign: 'center', + color: '#000', + border: '0px', + backgroundColor:'transparent', + cursor: 'wait' + }, + + // minimal style set used when themes are used + themedCSS: { + width: '30%', + top: '40%', + left: '35%' + }, + + // styles for the overlay + overlayCSS: { + backgroundColor: '#000', + opacity: 0.6, + cursor: 'wait' + }, + + // style to replace wait cursor before unblocking to correct issue + // of lingering wait cursor + cursorReset: 'default', + + // styles applied when using $.growlUI + growlCSS: { + width: '350px', + top: '10px', + left: '', + right: '10px', + border: 'none', + padding: '5px', + opacity: 0.6, + cursor: 'default', + color: '#fff', + backgroundColor: '#000', + '-webkit-border-radius':'10px', + '-moz-border-radius': '10px', + 'border-radius': '10px' + }, + + // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w + // (hat tip to Jorge H. N. de Vasconcelos) + /*jshint scripturl:true */ + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank', + + // force usage of iframe in non-IE browsers (handy for blocking applets) + forceIframe: false, + + // z-index for the blocking overlay + baseZ: 1000, + + // set these to true to have the message automatically centered + centerX: true, // <-- only effects element blocking (page block controlled via css above) + centerY: true, + + // allow body element to be stetched in ie6; this makes blocking look better + // on "short" pages. disable if you wish to prevent changes to the body height + allowBodyStretch: true, + + // enable if you want key and mouse events to be disabled for content that is blocked + bindEvents: true, + + // be default blockUI will supress tab navigation from leaving blocking content + // (if bindEvents is true) + constrainTabKey: true, + + // fadeIn time in millis; set to 0 to disable fadeIn on block + fadeIn: 200, + + // fadeOut time in millis; set to 0 to disable fadeOut on unblock + fadeOut: 400, + + // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock + timeout: 0, + + // disable if you don't want to show the overlay + showOverlay: true, + + // if true, focus will be placed in the first available input field when + // page blocking + focusInput: true, + + // elements that can receive focus + focusableElements: ':input:enabled:visible', + + // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity) + // no longer needed in 2012 + // applyPlatformOpacityRules: true, + + // callback method invoked when fadeIn has completed and blocking message is visible + onBlock: null, + + // callback method invoked when unblocking has completed; the callback is + // passed the element that has been unblocked (which is the window object for page + // blocks) and the options that were passed to the unblock call: + // onUnblock(element, options) + onUnblock: null, + + // callback method invoked when the overlay area is clicked. + // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used. + onOverlayClick: null, + + // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493 + quirksmodeOffsetHack: 4, + + // class name of the message block + blockMsgClass: 'blockMsg', + + // if it is already blocked, then ignore it (don't unblock and reblock) + ignoreIfBlocked: false + }; + + // private data and functions follow... + + var pageBlock = null; + var pageBlockEls = []; + + function install(el, opts) { + var css, themedCSS; + var full = (el == window); + var msg = (opts && opts.message !== undefined ? opts.message : undefined); + opts = $.extend({}, $.blockUI.defaults, opts || {}); + + if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked')) + return; + + opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {}); + css = $.extend({}, $.blockUI.defaults.css, opts.css || {}); + if (opts.onOverlayClick) + opts.overlayCSS.cursor = 'pointer'; + + themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {}); + msg = msg === undefined ? opts.message : msg; + + // remove the current block (if there is one) + if (full && pageBlock) + remove(window, {fadeOut:0}); + + // if an existing element is being used as the blocking content then we capture + // its current place in the DOM (and current display style) so we can restore + // it when we unblock + if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) { + var node = msg.jquery ? msg[0] : msg; + var data = {}; + $(el).data('blockUI.history', data); + data.el = node; + data.parent = node.parentNode; + data.display = node.style.display; + data.position = node.style.position; + if (data.parent) + data.parent.removeChild(node); + } + + $(el).data('blockUI.onUnblock', opts.onUnblock); + var z = opts.baseZ; + + // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform; + // layer1 is the iframe layer which is used to supress bleed through of underlying content + // layer2 is the overlay layer which has opacity and a wait cursor (by default) + // layer3 is the message content that is displayed while blocking + var lyr1, lyr2, lyr3, s; + if (msie || opts.forceIframe) + lyr1 = $(''); + else + lyr1 = $(''); + + if (opts.theme) + lyr2 = $(''); + else + lyr2 = $(''); + + if (opts.theme && full) { + s = ''; + } + else if (opts.theme) { + s = ''; + } + else if (full) { + s = ''; + } + else { + s = ''; + } + lyr3 = $(s); + + // if we have a message, style it + if (msg) { + if (opts.theme) { + lyr3.css(themedCSS); + lyr3.addClass('ui-widget-content'); + } + else + lyr3.css(css); + } + + // style the overlay + if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/) + lyr2.css(opts.overlayCSS); + lyr2.css('position', full ? 'fixed' : 'absolute'); + + // make iframe layer transparent in IE + if (msie || opts.forceIframe) + lyr1.css('opacity',0.0); + + //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); + var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el); + $.each(layers, function() { + this.appendTo($par); + }); + + if (opts.theme && opts.draggable && $.fn.draggable) { + lyr3.draggable({ + handle: '.ui-dialog-titlebar', + cancel: 'li' + }); + } + + // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) + var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0); + if (ie6 || expr) { + // give body 100% height + if (full && opts.allowBodyStretch && $.support.boxModel) + $('html,body').css('height','100%'); + + // fix ie6 issue when blocked element has a border width + if ((ie6 || !$.support.boxModel) && !full) { + var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); + var fixT = t ? '(0 - '+t+')' : 0; + var fixL = l ? '(0 - '+l+')' : 0; + } + + // simulate fixed position + $.each(layers, function(i,o) { + var s = o[0].style; + s.position = 'absolute'; + if (i < 2) { + if (full) + s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"'); + else + s.setExpression('height','this.parentNode.offsetHeight + "px"'); + if (full) + s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'); + else + s.setExpression('width','this.parentNode.offsetWidth + "px"'); + if (fixL) s.setExpression('left', fixL); + if (fixT) s.setExpression('top', fixT); + } + else if (opts.centerY) { + if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); + s.marginTop = 0; + } + else if (!opts.centerY && full) { + var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0; + var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; + s.setExpression('top',expression); + } + }); + } + + // show the message + if (msg) { + if (opts.theme) + lyr3.find('.ui-widget-content').append(msg); + else + lyr3.append(msg); + if (msg.jquery || msg.nodeType) + $(msg).show(); + } + + if ((msie || opts.forceIframe) && opts.showOverlay) + lyr1.show(); // opacity is zero + if (opts.fadeIn) { + var cb = opts.onBlock ? opts.onBlock : noOp; + var cb1 = (opts.showOverlay && !msg) ? cb : noOp; + var cb2 = msg ? cb : noOp; + if (opts.showOverlay) + lyr2._fadeIn(opts.fadeIn, cb1); + if (msg) + lyr3._fadeIn(opts.fadeIn, cb2); + } + else { + if (opts.showOverlay) + lyr2.show(); + if (msg) + lyr3.show(); + if (opts.onBlock) + opts.onBlock.bind(lyr3)(); + } + + // bind key and mouse events + bind(1, el, opts); + + if (full) { + pageBlock = lyr3[0]; + pageBlockEls = $(opts.focusableElements,pageBlock); + if (opts.focusInput) + setTimeout(focus, 20); + } + else + center(lyr3[0], opts.centerX, opts.centerY); + + if (opts.timeout) { + // auto-unblock + var to = setTimeout(function() { + if (full) + $.unblockUI(opts); + else + $(el).unblock(opts); + }, opts.timeout); + $(el).data('blockUI.timeout', to); + } + } + + // remove the block + function remove(el, opts) { + var count; + var full = (el == window); + var $el = $(el); + var data = $el.data('blockUI.history'); + var to = $el.data('blockUI.timeout'); + if (to) { + clearTimeout(to); + $el.removeData('blockUI.timeout'); + } + opts = $.extend({}, $.blockUI.defaults, opts || {}); + bind(0, el, opts); // unbind events + + if (opts.onUnblock === null) { + opts.onUnblock = $el.data('blockUI.onUnblock'); + $el.removeData('blockUI.onUnblock'); + } + + var els; + if (full) // crazy selector to handle odd field errors in ie6/7 + els = $('body').children().filter('.blockUI').add('body > .blockUI'); + else + els = $el.find('>.blockUI'); + + // fix cursor issue + if ( opts.cursorReset ) { + if ( els.length > 1 ) + els[1].style.cursor = opts.cursorReset; + if ( els.length > 2 ) + els[2].style.cursor = opts.cursorReset; + } + + if (full) + pageBlock = pageBlockEls = null; + + if (opts.fadeOut) { + count = els.length; + els.stop().fadeOut(opts.fadeOut, function() { + if ( --count === 0) + reset(els,data,opts,el); + }); + } + else + reset(els, data, opts, el); + } + + // move blocking element back into the DOM where it started + function reset(els,data,opts,el) { + var $el = $(el); + if ( $el.data('blockUI.isBlocked') ) + return; + + els.each(function(i,o) { + // remove via DOM calls so we don't lose event handlers + if (this.parentNode) + this.parentNode.removeChild(this); + }); + + if (data && data.el) { + data.el.style.display = data.display; + data.el.style.position = data.position; + data.el.style.cursor = 'default'; // #59 + if (data.parent) + data.parent.appendChild(data.el); + $el.removeData('blockUI.history'); + } + + if ($el.data('blockUI.static')) { + $el.css('position', 'static'); // #22 + } + + if (typeof opts.onUnblock == 'function') + opts.onUnblock(el,opts); + + // fix issue in Safari 6 where block artifacts remain until reflow + var body = $(document.body), w = body.width(), cssW = body[0].style.width; + body.width(w-1).width(w); + body[0].style.width = cssW; + } + + // bind/unbind the handler + function bind(b, el, opts) { + var full = el == window, $el = $(el); + + // don't bother unbinding if there is nothing to unbind + if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) + return; + + $el.data('blockUI.isBlocked', b); + + // don't bind events when overlay is not in use or if bindEvents is false + if (!full || !opts.bindEvents || (b && !opts.showOverlay)) + return; + + // bind anchors and inputs for mouse and key events + var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove'; + if (b) + $(document).bind(events, opts, handler); + else + $(document).unbind(events, handler); + + // former impl... + // var $e = $('a,:input'); + // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); + } + + // event handler to suppress keyboard/mouse events when blocking + function handler(e) { + // allow tab navigation (conditionally) + if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) { + if (pageBlock && e.data.constrainTabKey) { + var els = pageBlockEls; + var fwd = !e.shiftKey && e.target === els[els.length-1]; + var back = e.shiftKey && e.target === els[0]; + if (fwd || back) { + setTimeout(function(){focus(back);},10); + return false; + } + } + } + var opts = e.data; + var target = $(e.target); + if (target.hasClass('blockOverlay') && opts.onOverlayClick) + opts.onOverlayClick(e); + + // allow events within the message content + if (target.parents('div.' + opts.blockMsgClass).length > 0) + return true; + + // allow events for content that is not being blocked + return target.parents().children().filter('div.blockUI').length === 0; + } + + function focus(back) { + if (!pageBlockEls) + return; + var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; + if (e) + e.focus(); + } + + function center(el, x, y) { + var p = el.parentNode, s = el.style; + var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); + var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); + if (x) s.left = l > 0 ? (l+'px') : '0'; + if (y) s.top = t > 0 ? (t+'px') : '0'; + } + + function sz(el, p) { + return parseInt($.css(el,p),10)||0; + } + + } + + + /*global define:true */ + if (typeof define === 'function' && define.amd && define.amd.jQuery) { + define(['jquery'], setup); + } else { + setup(jQuery); + } + +})(); \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.css b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.css new file mode 100644 index 0000000..6334b65 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.css @@ -0,0 +1,688 @@ +/*! + * bootstrap-fileinput v5.5.2 + * http://plugins.krajee.com/file-input + * + * Krajee default styling for bootstrap-fileinput. + * + * Author: Kartik Visweswaran + * Copyright: 2014 - 2022, Kartik Visweswaran, Krajee.com + * + * Licensed under the BSD-3-Clause + * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md + */ + +.file-loading input[type=file], +input[type=file].file-loading { + width: 0; + height: 0; +} + +.file-no-browse { + position: absolute; + left: 50%; + bottom: 20%; + width: 1px; + height: 1px; + font-size: 0; + opacity: 0; + border: none; + background: none; + outline: none; + box-shadow: none; +} + +.kv-hidden, +.file-caption-icon, +.file-zoom-dialog .modal-header:before, +.file-zoom-dialog .modal-header:after, +.file-input-new .file-preview, +.file-input-new .close, +.file-input-new .glyphicon-file, +.file-input-new .fileinput-remove-button, +.file-input-new .fileinput-upload-button, +.file-input-new .no-browse .input-group-btn, +.file-input-ajax-new .fileinput-remove-button, +.file-input-ajax-new .fileinput-upload-button, +.file-input-ajax-new .no-browse .input-group-btn, +.hide-content .kv-file-content, +.is-locked .fileinput-upload-button, +.is-locked .fileinput-remove-button { + display: none; +} + +.file-caption .input-group { + align-items: center; +} + +.btn-file input[type=file], +.file-caption-icon, +.file-preview .fileinput-remove, +.krajee-default .file-thumb-progress, +.file-zoom-dialog .btn-navigate, +.file-zoom-dialog .floating-buttons { + position: absolute; +} + +.file-caption-icon .kv-caption-icon { + line-height: inherit; +} + +.file-input, +.file-loading:before, +.btn-file, +.file-caption, +.file-preview, +.krajee-default.file-preview-frame, +.krajee-default .file-thumbnail-footer, +.file-zoom-dialog .modal-dialog { + position: relative; +} + +.file-error-message pre, +.file-error-message ul, +.krajee-default .file-actions, +.krajee-default .file-other-error { + text-align: left; +} + +.file-error-message pre, +.file-error-message ul { + margin: 0; +} + +.krajee-default .file-drag-handle, +.krajee-default .file-upload-indicator { + float: left; + margin-top: 10px; + width: 16px; + height: 16px; +} + +.file-thumb-progress .progress, +.file-thumb-progress .progress-bar { + font-family: Verdana, Helvetica, sans-serif; + font-size: 0.7rem; +} + +.krajee-default .file-thumb-progress .progress, +.kv-upload-progress .progress { + background-color: #ccc; +} + +.krajee-default .file-caption-info, +.krajee-default .file-size-info { + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 160px; + height: 15px; + margin: auto; +} + +.file-zoom-content > .file-object.type-video, +.file-zoom-content > .file-object.type-flash, +.file-zoom-content > .file-object.type-image { + max-width: 100%; + max-height: 100%; + width: auto; +} + +.file-zoom-content > .file-object.type-video, +.file-zoom-content > .file-object.type-flash { + height: 100%; +} + +.file-zoom-content > .file-object.type-pdf, +.file-zoom-content > .file-object.type-html, +.file-zoom-content > .file-object.type-text, +.file-zoom-content > .file-object.type-default { + width: 100%; +} + +.file-loading:before { + content: " Loading..."; + display: inline-block; + padding-left: 20px; + line-height: 16px; + font-size: 13px; + font-variant: small-caps; + color: #999; + background: transparent url(loading.gif) top left no-repeat; +} + +.file-object { + margin: 0 0 -5px 0; + padding: 0; +} + +.btn-file { + overflow: hidden; +} + +.btn-file input[type=file] { + top: 0; + left: 0; + min-width: 100%; + min-height: 100%; + text-align: right; + opacity: 0; + background: none repeat scroll 0 0 transparent; + cursor: inherit; + display: block; +} + +.btn-file ::-ms-browse { + font-size: 10000px; + width: 100%; + height: 100%; +} + +.file-caption.icon-visible .file-caption-icon { + display: inline-block; +} + +.file-caption.icon-visible .file-caption-name { + padding-left: 25px; +} + +.file-caption.icon-visible > .input-group-lg .file-caption-name { + padding-left: 30px; +} + +.file-caption.icon-visible > .input-group-sm .file-caption-name { + padding-left: 22px; +} + +.file-caption-name:not(.file-caption-disabled) { + background-color: transparent; +} + +.file-caption-name.file-processing { + font-style: italic; + border-color: #bbb; + opacity: 0.5; +} + +.file-caption-icon { + padding: 7px 5px; + left: 4px; +} + +.input-group-lg .file-caption-icon { + font-size: 1.25rem; +} + +.input-group-sm .file-caption-icon { + font-size: 0.875rem; + padding: 0.25rem; +} + +.file-error-message { + color: #a94442; + background-color: #f2dede; + margin: 5px; + border: 1px solid #ebccd1; + border-radius: 4px; + padding: 15px; +} + +.file-error-message pre { + margin: 5px 0; +} + +.file-caption-disabled { + background-color: #eee; + cursor: not-allowed; + opacity: 1; +} + +.file-preview { + border-radius: 5px; + border: 1px solid #ddd; + padding: 8px; + width: 100%; + margin-bottom: 5px; +} + +.file-preview .btn-xs { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.file-preview .fileinput-remove { + top: 1px; + right: 1px; + line-height: 10px; +} + +.file-preview .clickable { + cursor: pointer; +} + +.file-preview-image { + font: 40px Impact, Charcoal, sans-serif; + color: #008000; + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; +} + +.krajee-default.file-preview-frame { + margin: 8px; + border: 1px solid rgba(0, 0, 0, 0.2); + box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.2); + padding: 6px; + float: left; + text-align: center; + +} + +.krajee-default.file-preview-frame .kv-file-content { + width: 213px; + height: 160px; +} + +.krajee-default.file-preview-frame .kv-file-content.kv-pdf-rendered { + width: 400px; +} + +.krajee-default.file-preview-frame[data-template="audio"] .kv-file-content { + width: 240px; + height: 55px; +} + +.krajee-default.file-preview-frame .file-thumbnail-footer { + height: 70px; +} + +.krajee-default.file-preview-frame:not(.file-preview-error):hover { + border: 1px solid rgba(0, 0, 0, 0.3); + box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.4); +} + +.krajee-default .file-preview-text { + color: #428bca; + border: 1px solid #ddd; + outline: none; + resize: none; +} + +.krajee-default .file-preview-html { + border: 1px solid #ddd; +} + +.krajee-default .file-other-icon { + font-size: 6em; + line-height: 1; +} + +.krajee-default .file-footer-buttons { + float: right; +} + +.krajee-default .file-footer-caption { + display: block; + text-align: center; + padding-top: 4px; + font-size: 11px; + color: #999; + margin-bottom: 30px; +} + +.file-upload-stats { + font-size: 10px; + text-align: center; + width: 100%; +} + +.kv-upload-progress .file-upload-stats { + font-size: 12px; + margin: -10px 0 5px; +} + +.krajee-default .file-preview-error { + opacity: 0.65; + box-shadow: none; +} + +.krajee-default .file-thumb-progress { + top: 37px; + left: 0; + right: 0; +} + +.krajee-default.kvsortable-ghost { + background: #e1edf7; + border: 2px solid #a1abff; +} + +.krajee-default .file-preview-other:hover { + opacity: 0.8; +} + +.krajee-default .file-preview-frame:not(.file-preview-error) .file-footer-caption:hover { + color: #000; +} + +.kv-upload-progress .progress { + height: 20px; + margin: 10px 0; + overflow: hidden; +} + +.kv-upload-progress .progress-bar { + height: 20px; + font-family: Verdana, Helvetica, sans-serif; +} + + +/*noinspection CssOverwrittenProperties*/ + +.file-zoom-dialog .file-other-icon { + font-size: 22em; + font-size: 50vmin; +} + +.file-zoom-dialog .modal-dialog { + width: auto; +} + +.file-zoom-dialog .modal-header { + display: flex; + align-items: center; + justify-content: space-between; +} + +.file-zoom-dialog .btn-navigate { + margin: 0 0.1rem; + padding: 0; + font-size: 1.2rem; + width: 2.4rem; + height: 2.4rem; + top: 50%; + border-radius: 50%; + text-align: center; +} + +.btn-navigate * { + width: auto; +} + +.file-zoom-dialog .floating-buttons { + top: 5px; + right: 10px; +} + +.file-zoom-dialog .btn-kv-prev { + left: 0; +} + +.file-zoom-dialog .btn-kv-next { + right: 0; +} + +.file-zoom-dialog .kv-zoom-header { + padding: 0.5rem; +} + +.file-zoom-dialog .kv-zoom-body { + padding: 0.25rem; +} + +.file-zoom-dialog .kv-zoom-description { + position: absolute; + opacity: 0.8; + font-size: 0.8rem; + background-color: #1a1a1a; + padding: 1rem; + text-align: center; + border-radius: 0.5rem; + color: #fff; + left: 15%; + right: 15%; + bottom: 15%; +} + +.file-zoom-dialog .kv-desc-hide { + float: right; + color: #fff; + padding: 0 0.1rem; + background: none; + border: none; +} + +.file-zoom-dialog .kv-desc-hide:hover { + opacity: 0.7; +} + +.file-zoom-dialog .kv-desc-hide:focus { + opacity: 0.9; +} + +.file-input-new .no-browse .form-control { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.file-input-ajax-new .no-browse .form-control { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.file-caption { + width: 100%; + position: relative; +} + +.file-thumb-loading { + background: transparent url(loading.gif) no-repeat scroll center center content-box !important; +} + +.file-drop-zone { + border: 1px dashed #aaa; + min-height: 260px; + border-radius: 4px; + text-align: center; + vertical-align: middle; + margin: 12px 15px 12px 12px; + padding: 5px; +} + +.file-drop-zone.clickable:hover { + border: 2px dashed #999; +} + +.file-drop-zone.clickable:focus { + border: 2px solid #5acde2; +} + +.file-drop-zone .file-preview-thumbnails { + cursor: default; +} + +.file-drop-zone-title { + color: #aaa; + font-size: 1.6em; + text-align: center; + padding: 85px 10px; + cursor: default; +} + +.file-highlighted { + border: 2px dashed #999 !important; + background-color: #eee; +} + +.file-uploading { + background: url(loading-sm.gif) no-repeat center bottom 10px; + opacity: 0.65; +} + +.file-zoom-fullscreen .modal-dialog { + min-width: 100%; + margin: 0; +} + +.file-zoom-fullscreen .modal-content { + border-radius: 0; + box-shadow: none; + min-height: 100vh; +} + +.file-zoom-fullscreen .kv-zoom-body { + overflow-y: auto; +} + +.floating-buttons { + z-index: 3000; +} + +.floating-buttons .btn-kv { + margin-left: 3px; + z-index: 3000; +} + +.kv-zoom-actions { + min-width: 140px; +} + +.kv-zoom-actions .btn-kv { + margin-left: 3px; +} + +.file-zoom-content { + text-align: center; + white-space: nowrap; + min-height: 300px; +} + +.file-zoom-content:hover { + background: transparent; +} + +.file-zoom-content .file-preview-image { + max-height: 100%; +} + +.file-zoom-content .file-preview-video { + max-height: 100%; +} + +.file-zoom-content > .file-object.type-image { + height: auto; + min-height: inherit; +} + +.file-zoom-content > .file-object.type-audio { + width: auto; + height: 30px; +} + +@media (min-width: 576px) { + .file-zoom-dialog .modal-dialog { + max-width: 500px; + } +} + +@media (min-width: 992px) { + .file-zoom-dialog .modal-lg { + max-width: 800px; + } +} + +@media (max-width: 767px) { + .file-preview-thumbnails { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + } + + .file-zoom-dialog .modal-header { + flex-direction: column; + } +} + +@media (max-width: 350px) { + .krajee-default.file-preview-frame:not([data-template="audio"]) .kv-file-content { + width: 160px; + } +} + +@media (max-width: 420px) { + .krajee-default.file-preview-frame .kv-file-content.kv-pdf-rendered { + width: 100%; + } +} + +.file-loading[dir=rtl]:before { + background: transparent url(loading.gif) top right no-repeat; + padding-left: 0; + padding-right: 20px; +} + +.clickable .file-drop-zone-title { + cursor: pointer; +} + +.file-sortable .file-drag-handle:hover { + opacity: 0.7; +} + +.file-sortable .file-drag-handle { + cursor: grab; + opacity: 1; +} + +.file-grabbing, +.file-grabbing * { + cursor: not-allowed !important; +} + +.file-grabbing .file-preview-thumbnails * { + cursor: grabbing !important; +} + +.file-preview-frame.sortable-chosen { + background-color: #d9edf7; + border-color: #17a2b8; + box-shadow: none !important; +} + +.file-preview .kv-zoom-cache { + display: none; +} + +.file-preview-other-frame, .file-preview-object, .kv-file-content, .kv-zoom-body { + display: flex; + align-items: center; + justify-content: center; +} + +.btn-kv-rotate, +.kv-file-rotate { + display: none; +} + +.rotatable:not(.hide-rotate) .btn-kv-rotate, +.rotatable:not(.hide-rotate) .kv-file-rotate { + display: inline-block; +} + +.rotatable .file-zoom-detail, +.rotatable .kv-file-content, +.rotatable .kv-file-content > :first-child { + transform-origin: center center; +} + +.rotate-animate { + transition: transform 0.3s ease; +} + +.kv-overflow-hidden { + overflow: hidden; +} \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.js b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.js new file mode 100644 index 0000000..75466c0 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.js @@ -0,0 +1,6681 @@ +/*! + * bootstrap-fileinput v5.5.2 + * http://plugins.krajee.com/file-input + * + * Author: Kartik Visweswaran + * Copyright: 2014 - 2022, Kartik Visweswaran, Krajee.com + * + * Licensed under the BSD-3-Clause + * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md + */ +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } else if (typeof module === 'object' && typeof module.exports === 'object') { + factory(require('jquery')); + } else { + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + $.fn.fileinputLocales = {}; + $.fn.fileinputThemes = {}; + + if (!$.fn.fileinputBsVersion) { + $.fn.fileinputBsVersion = (window.bootstrap && window.bootstrap.Alert && window.bootstrap.Alert.VERSION) || + (window.Alert && window.Alert.VERSION) || '3.x.x'; + } + + String.prototype.setTokens = function (replacePairs) { + var str = this.toString(), key, re; + for (key in replacePairs) { + if (replacePairs.hasOwnProperty(key)) { + re = new RegExp('\{' + key + '\}', 'g'); + str = str.replace(re, replacePairs[key]); + } + } + return str; + }; + + if (!Array.prototype.flatMap) { // polyfill flatMap + Array.prototype.flatMap = function (lambda) { + return [].concat(this.map(lambda)); + }; + } + + var $h, FileInput; + + // fileinput helper object for all global variables and internal helper methods + $h = { + FRAMES: '.kv-preview-thumb', + SORT_CSS: 'file-sortable', + INIT_FLAG: 'init-', + SCRIPT_SRC: document && document.currentScript && document.currentScript.src || null, + OBJECT_PARAMS: '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n', + DEFAULT_PREVIEW: '
\n' + + '{previewFileIcon}\n' + + '
', + MODAL_ID: 'kvFileinputModal', + MODAL_EVENTS: ['show', 'shown', 'hide', 'hidden', 'loaded'], + logMessages: { + ajaxError: '{status}: {error}. Error Details: {text}.', + badDroppedFiles: 'Error scanning dropped files!', + badExifParser: 'Error loading the piexif.js library. {details}', + badInputType: 'The input "type" must be set to "file" for initializing the "bootstrap-fileinput" plugin.', + exifWarning: 'To avoid this warning, either set "autoOrientImage" to "false" OR ensure you have loaded ' + + 'the "piexif.js" library correctly on your page before the "fileinput.js" script.', + invalidChunkSize: 'Invalid upload chunk size: "{chunkSize}". Resumable uploads are disabled.', + invalidThumb: 'Invalid thumb frame with id: "{id}".', + noResumableSupport: 'The browser does not support resumable or chunk uploads.', + noUploadUrl: 'The "uploadUrl" is not set. Ajax uploads and resumable uploads have been disabled.', + retryStatus: 'Retrying upload for chunk # {chunk} for {filename}... retry # {retry}.', + chunkQueueError: 'Could not push task to ajax pool for chunk index # {index}.', + resumableMaxRetriesReached: 'Maximum resumable ajax retries ({n}) reached.', + resumableRetryError: 'Could not retry the resumable request (try # {n})... aborting.', + resumableAborting: 'Aborting / cancelling the resumable request.', + resumableRequestError: 'Error processing resumable request. {msg}' + + }, + objUrl: window.URL || window.webkitURL, + getZoomPlaceholder: function () { // used to prevent 404 errors in URL parsing + var src = $h.SCRIPT_SRC, srcPath, zoomVar = '?kvTemp__2873389129__='; + if (!src) { + return zoomVar; + } + srcPath = src.substring(0, src.lastIndexOf("/")); + return srcPath.substring(0, srcPath.lastIndexOf("/") + 1) + 'img/loading.gif' + zoomVar; + }, + isBs: function (ver) { + var chk = $.trim(($.fn.fileinputBsVersion || '') + ''); + ver = parseInt(ver, 10); + if (!chk) { + return ver === 4; + } + return ver === parseInt(chk.charAt(0), 10); + + }, + defaultButtonCss: function (fill) { + return 'btn-default btn-' + (fill ? '' : 'outline-') + 'secondary'; + }, + now: function () { + return new Date().getTime(); + }, + round: function (num) { + num = parseFloat(num); + return isNaN(num) ? 0 : Math.floor(Math.round(num)); + }, + getArray: function (obj) { + var i, arr = [], len = obj && obj.length || 0; + for (i = 0; i < len; i++) { + arr.push(obj[i]); + } + return arr; + }, + getFileRelativePath: function (file) { + /** @namespace file.relativePath */ + /** @namespace file.webkitRelativePath */ + return String(file.newPath || file.relativePath || file.webkitRelativePath || $h.getFileName(file) || null); + + }, + getFileId: function (file, generateFileId) { + var relativePath = $h.getFileRelativePath(file); + if (typeof generateFileId === 'function') { + return generateFileId(file); + } + if (!file) { + return null; + } + if (!relativePath) { + return null; + } + return (file.size + '_' + encodeURIComponent(relativePath).replace(/%/g, '_')); + }, + getFrameSelector: function (id, selector) { + selector = selector || ''; + return '[id="' + id + '"]' + selector; + }, + getZoomSelector: function (id, selector) { + return $h.getFrameSelector('zoom-' + id, selector); + }, + getFrameElement: function ($element, id, selector) { + return $element.find($h.getFrameSelector(id, selector)); + }, + getZoomElement: function ($element, id, selector) { + return $element.find($h.getZoomSelector(id, selector)); + }, + getElapsed: function (seconds) { + var delta = seconds, out = '', result = {}, structure = { + year: 31536000, + month: 2592000, + week: 604800, // uncomment row to ignore + day: 86400, // feel free to add your own row + hour: 3600, + minute: 60, + second: 1 + }; + $h.getObjectKeys(structure).forEach(function (key) { + result[key] = Math.floor(delta / structure[key]); + delta -= result[key] * structure[key]; + }); + $.each(result, function (key, value) { + if (value > 0) { + out += (out ? ' ' : '') + value + key.substring(0, 1); + } + }); + return out; + }, + debounce: function (func, delay) { + var inDebounce; + return function () { + var args = arguments, context = this; + clearTimeout(inDebounce); + inDebounce = setTimeout(function () { + func.apply(context, args); + }, delay); + }; + }, + stopEvent: function (e) { + e.stopPropagation(); + e.preventDefault(); + }, + getFileName: function (file) { + /** @namespace file.fileName */ + return file ? (file.fileName || file.name || '') : ''; // some confusion in different versions of Firefox + }, + createObjectURL: function (data) { + if ($h.objUrl && $h.objUrl.createObjectURL && data) { + return $h.objUrl.createObjectURL(data); + } + return ''; + }, + revokeObjectURL: function (data) { + if ($h.objUrl && $h.objUrl.revokeObjectURL && data) { + $h.objUrl.revokeObjectURL(data); + } + }, + compare: function (input, str, exact) { + return input !== undefined && (exact ? input === str : input.match(str)); + }, + isIE: function (ver) { + var div, status; + // check for IE versions < 11 + if (navigator.appName !== 'Microsoft Internet Explorer') { + return false; + } + if (ver === 10) { + return new RegExp('msie\\s' + ver, 'i').test(navigator.userAgent); + } + div = document.createElement('div'); + div.innerHTML = ''; + status = div.getElementsByTagName('i').length; + document.body.appendChild(div); + div.parentNode.removeChild(div); + return status; + }, + canOrientImage: function ($el) { + var $img = $(document.createElement('img')).css({width: '1px', height: '1px'}).insertAfter($el), + flag = $img.css('image-orientation'); + $img.remove(); + return !!flag; + }, + canAssignFilesToInput: function () { + var input = document.createElement('input'); + try { + input.type = 'file'; + input.files = null; + return true; + } catch (err) { + return false; + } + }, + getDragDropFolders: function (items) { + var i, item, len = items ? items.length : 0, folders = 0; + if (len > 0 && items[0].webkitGetAsEntry()) { + for (i = 0; i < len; i++) { + item = items[i].webkitGetAsEntry(); + if (item && item.isDirectory) { + folders++; + } + } + } + return folders; + }, + initModal: function ($modal) { + var $body = $('body'); + if ($body.length) { + $modal.appendTo($body); + } + }, + isFunction: function (v) { + return typeof v === 'function'; + }, + isEmpty: function (value, trim) { + if (value === undefined || value === null || value === '') { + return true; + } + if ($h.isString(value) && trim) { + return $.trim(value) === ''; + } + if ($h.isArray(value)) { + return value.length === 0; + } + if ($.isPlainObject(value) && $.isEmptyObject(value)) { + return true; + } + return false; + }, + isArray: function (a) { + return Array.isArray(a) || Object.prototype.toString.call(a) === '[object Array]'; + }, + isString: function (a) { + return Object.prototype.toString.call(a) === '[object String]'; + }, + ifSet: function (needle, haystack, def) { + def = def || ''; + return (haystack && typeof haystack === 'object' && needle in haystack) ? haystack[needle] : def; + }, + cleanArray: function (arr) { + if (!(arr instanceof Array)) { + arr = []; + } + return arr.filter(function (e) { + return (e !== undefined && e !== null); + }); + }, + spliceArray: function (arr, index, reverseOrder) { + var i, j = 0, out = [], newArr; + if (!(arr instanceof Array)) { + return []; + } + newArr = $.extend(true, [], arr); + if (reverseOrder) { + newArr.reverse(); + } + for (i = 0; i < newArr.length; i++) { + if (i !== index) { + out[j] = newArr[i]; + j++; + } + } + if (reverseOrder) { + out.reverse(); + } + return out; + }, + getNum: function (num, def) { + def = def || 0; + if (typeof num === 'number') { + return num; + } + if (typeof num === 'string') { + num = parseFloat(num); + } + return isNaN(num) ? def : num; + }, + hasFileAPISupport: function () { + return !!(window.File && window.FileReader); + }, + hasDragDropSupport: function () { + var div = document.createElement('div'); + /** @namespace div.draggable */ + /** @namespace div.ondragstart */ + /** @namespace div.ondrop */ + return !$h.isIE(9) && + (div.draggable !== undefined || (div.ondragstart !== undefined && div.ondrop !== undefined)); + }, + hasFileUploadSupport: function () { + return $h.hasFileAPISupport() && window.FormData; + }, + hasBlobSupport: function () { + try { + return !!window.Blob && Boolean(new Blob()); + } catch (e) { + return false; + } + }, + hasArrayBufferViewSupport: function () { + try { + return new Blob([new Uint8Array(100)]).size === 100; + } catch (e) { + return false; + } + }, + hasResumableUploadSupport: function () { + /** @namespace Blob.prototype.webkitSlice */ + /** @namespace Blob.prototype.mozSlice */ + return $h.hasFileUploadSupport() && $h.hasBlobSupport() && $h.hasArrayBufferViewSupport() && + (!!Blob.prototype.webkitSlice || !!Blob.prototype.mozSlice || !!Blob.prototype.slice || false); + }, + dataURI2Blob: function (dataURI) { + var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || + window.MSBlobBuilder, canBlob = $h.hasBlobSupport(), byteStr, arrayBuffer, intArray, i, mimeStr, bb, + canProceed = (canBlob || BlobBuilder) && window.atob && window.ArrayBuffer && window.Uint8Array; + if (!canProceed) { + return null; + } + if (dataURI.split(',')[0].indexOf('base64') >= 0) { + byteStr = atob(dataURI.split(',')[1]); + } else { + byteStr = decodeURIComponent(dataURI.split(',')[1]); + } + arrayBuffer = new ArrayBuffer(byteStr.length); + intArray = new Uint8Array(arrayBuffer); + for (i = 0; i < byteStr.length; i += 1) { + intArray[i] = byteStr.charCodeAt(i); + } + mimeStr = dataURI.split(',')[0].split(':')[1].split(';')[0]; + if (canBlob) { + return new Blob([$h.hasArrayBufferViewSupport() ? intArray : arrayBuffer], {type: mimeStr}); + } + bb = new BlobBuilder(); + bb.append(arrayBuffer); + return bb.getBlob(mimeStr); + }, + arrayBuffer2String: function (buffer) { + if (window.TextDecoder) { + return new TextDecoder('utf-8').decode(buffer); + } + var array = Array.prototype.slice.apply(new Uint8Array(buffer)), out = '', i = 0, len, c, char2, char3; + len = array.length; + while (i < len) { + c = array[i++]; + switch (c >> 4) { // jshint ignore:line + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + // 0xxxxxxx + out += String.fromCharCode(c); + break; + case 12: + case 13: + // 110x xxxx 10xx xxxx + char2 = array[i++]; + out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); // jshint ignore:line + break; + case 14: + // 1110 xxxx 10xx xxxx 10xx xxxx + char2 = array[i++]; + char3 = array[i++]; + out += String.fromCharCode(((c & 0x0F) << 12) | // jshint ignore:line + ((char2 & 0x3F) << 6) | // jshint ignore:line + ((char3 & 0x3F) << 0)); // jshint ignore:line + break; + } + } + return out; + }, + isHtml: function (str) { + var a = document.createElement('div'); + a.innerHTML = str; + for (var c = a.childNodes, i = c.length; i--;) { + if (c[i].nodeType === 1) { + return true; + } + } + return false; + }, + isPdf: function (str) { + if ($h.isEmpty(str)) { + return false; + } + str = str.toString().trim().replace(/\n/g, ' '); + if (str.length === 0) { + return false; + } + }, + isSvg: function (str) { + if ($h.isEmpty(str)) { + return false; + } + str = str.toString().trim().replace(/\n/g, ' '); + if (str.length === 0) { + return false; + } + return str.match(/^\s*<\?xml/i) && (str.match(/' + str + '')); + }, + uniqId: function () { + return (new Date().getTime() + Math.floor(Math.random() * Math.pow(10, 15))).toString(36); + }, + cspBuffer: { + CSP_ATTRIB: 'data-csp-01928735', // a randomly named temporary attribute to store the CSP elem id + domElementsStyles: {}, + stash: function (htmlString) { + var self = this, outerDom = $.parseHTML('
' + htmlString + '
'), $el = $(outerDom); + $el.find('[style]').each(function (key, elem) { + var $elem = $(elem), styleDeclaration = $elem[0].style, id = $h.uniqId(), styles = {}; + if (styleDeclaration && styleDeclaration.length) { + $(styleDeclaration).each(function () { + styles[this] = styleDeclaration[this]; + }); + self.domElementsStyles[id] = styles; + $elem.removeAttr('style').attr(self.CSP_ATTRIB, id); + } + }); + $el.filter('*').removeAttr('style'); // make sure all style attr are removed + var values = Object.values ? Object.values(outerDom) : Object.keys(outerDom).map(function (itm) { + return outerDom[itm]; + }); + return values.flatMap(function (elem) { + return elem.innerHTML; + }).join(''); + }, + apply: function (domElement) { + var self = this, $el = $(domElement); + $el.find('[' + self.CSP_ATTRIB + ']').each(function (key, elem) { + var $elem = $(elem), id = $elem.attr(self.CSP_ATTRIB), styles = self.domElementsStyles[id]; + if (styles) { + $elem.css(styles); + } + $elem.removeAttr(self.CSP_ATTRIB); + }); + self.domElementsStyles = {}; + } + }, + setHtml: function ($elem, htmlString) { + var buf = $h.cspBuffer; + $elem.html(buf.stash(htmlString)); + buf.apply($elem); + return $elem; + }, + htmlEncode: function (str, undefVal) { + if (str === undefined) { + return undefVal || null; + } + return str.replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + }, + replaceTags: function (str, tags) { + var out = str; + if (!tags) { + return out; + } + $.each(tags, function (key, value) { + if (typeof value === 'function') { + value = value(); + } + out = out.split(key).join(value); + }); + return out; + }, + cleanMemory: function ($thumb) { + var data = $thumb.is('img') ? $thumb.attr('src') : $thumb.find('source').attr('src'); + $h.revokeObjectURL(data); + }, + findFileName: function (filePath) { + var sepIndex = filePath.lastIndexOf('/'); + if (sepIndex === -1) { + sepIndex = filePath.lastIndexOf('\\'); + } + return filePath.split(filePath.substring(sepIndex, sepIndex + 1)).pop(); + }, + checkFullScreen: function () { + return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || + document.msFullscreenElement; + }, + toggleFullScreen: function (maximize) { + var doc = document, de = doc.documentElement, isFullScreen = $h.checkFullScreen(); + if (de && maximize && !isFullScreen) { + if (de.requestFullscreen) { + de.requestFullscreen(); + } else { + if (de.msRequestFullscreen) { + de.msRequestFullscreen(); + } else { + if (de.mozRequestFullScreen) { + de.mozRequestFullScreen(); + } else { + if (de.webkitRequestFullscreen) { + de.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); + } + } + } + } + } else { + if (isFullScreen) { + if (doc.exitFullscreen) { + doc.exitFullscreen(); + } else { + if (doc.msExitFullscreen) { + doc.msExitFullscreen(); + } else { + if (doc.mozCancelFullScreen) { + doc.mozCancelFullScreen(); + } else { + if (doc.webkitExitFullscreen) { + doc.webkitExitFullscreen(); + } + } + } + } + } + } + }, + moveArray: function (arr, oldIndex, newIndex, reverseOrder) { + var newArr = $.extend(true, [], arr); + if (reverseOrder) { + newArr.reverse(); + } + if (newIndex >= newArr.length) { + var k = newIndex - newArr.length; + while ((k--) + 1) { + newArr.push(undefined); + } + } + newArr.splice(newIndex, 0, newArr.splice(oldIndex, 1)[0]); + if (reverseOrder) { + newArr.reverse(); + } + return newArr; + }, + closeButton: function (css) { + css = ($h.isBs(5) ? 'btn-close' : 'close') + (css ? ' ' + css : ''); + return ''; + }, + getRotation: function (value) { + switch (value) { + case 2: + return 'rotateY(180deg)'; + case 3: + return 'rotate(180deg)'; + case 4: + return 'rotate(180deg) rotateY(180deg)'; + case 5: + return 'rotate(270deg) rotateY(180deg)'; + case 6: + return 'rotate(90deg)'; + case 7: + return 'rotate(90deg) rotateY(180deg)'; + case 8: + return 'rotate(270deg)'; + default: + return ''; + } + }, + setTransform: function (el, val) { + if (!el) { + return; + } + el.style.transform = val; + el.style.webkitTransform = val; + el.style['-moz-transform'] = val; + el.style['-ms-transform'] = val; + el.style['-o-transform'] = val; + }, + getObjectKeys: function (obj) { + var keys = []; + if (obj) { + $.each(obj, function (key) { + keys.push(key); + }); + } + return keys; + }, + getObjectSize: function (obj) { + return $h.getObjectKeys(obj).length; + }, + /** + * Small dependency injection for the task manager + * https://gist.github.com/fearphage/4341799 + */ + whenAll: function (array) { + var s = [].slice, resolveValues = arguments.length === 1 && $h.isArray(array) ? array : s.call(arguments), + deferred = $.Deferred(), i, failed = 0, value, length = resolveValues.length, + remaining = length, rejectContexts, rejectValues, resolveContexts, updateFunc; + rejectContexts = rejectValues = resolveContexts = Array(length); + updateFunc = function (index, contexts, values) { + return function () { + if (values !== resolveValues) { + failed++; + } + deferred.notifyWith(contexts[index] = this, values[index] = s.call(arguments)); + if (!(--remaining)) { + deferred[(!failed ? 'resolve' : 'reject') + 'With'](contexts, values); + } + }; + }; + for (i = 0; i < length; i++) { + if ((value = resolveValues[i]) && $.isFunction(value.promise)) { + value.promise() + .done(updateFunc(i, resolveContexts, resolveValues)) + .fail(updateFunc(i, rejectContexts, rejectValues)); + } else { + deferred.notifyWith(this, value); + --remaining; + } + } + if (!remaining) { + deferred.resolveWith(resolveContexts, resolveValues); + } + return deferred.promise(); + } + }; + FileInput = function (element, options) { + var self = this; + self.$element = $(element); + self.$parent = self.$element.parent(); + if (!self._validate()) { + return; + } + self.isPreviewable = $h.hasFileAPISupport(); + self.isIE9 = $h.isIE(9); + self.isIE10 = $h.isIE(10); + if (self.isPreviewable || self.isIE9) { + self._init(options); + self._listen(); + } + self.$element.removeClass('file-loading'); + }; + + FileInput.prototype = { + constructor: FileInput, + _cleanup: function () { + var self = this; + self.reader = null; + self.clearFileStack(); + self.fileBatchCompleted = true; + self.isError = false; + self.isDuplicateError = false; + self.isPersistentError = false; + self.cancelling = false; + self.paused = false; + self.lastProgress = 0; + self._initAjax(); + }, + _isAborted: function () { + var self = this; + return self.cancelling || self.paused; + }, + _initAjax: function () { + var self = this, tm = self.taskManager = { + pool: {}, + addPool: function (id) { + return (tm.pool[id] = new tm.TasksPool(id)); + }, + getPool: function (id) { + return tm.pool[id]; + }, + addTask: function (id, logic) { // add standalone task directly from task manager + return new tm.Task(id, logic); + }, + TasksPool: function (id) { + var tp = this; + tp.id = id; + tp.cancelled = false; + tp.cancelledDeferrer = $.Deferred(); + tp.tasks = {}; + tp.addTask = function (id, logic) { + return (tp.tasks[id] = new tm.Task(id, logic)); + }; + tp.size = function () { + return $h.getObjectSize(tp.tasks); + }; + tp.run = function (maxThreads) { + var i = 0, failed = false, task, tasksList = $h.getObjectKeys(tp.tasks).map(function (key) { + return tp.tasks[key]; + }), tasksDone = [], deferred = $.Deferred(), enqueue, callback; + + if (tp.cancelled) { + tp.cancelledDeferrer.resolve(); + return deferred.reject(); + } + // if run all at once + if (!maxThreads) { + var tasksDeferredList = $h.getObjectKeys(tp.tasks).map(function (key) { + return tp.tasks[key].deferred; + }); + // when all are done + $h.whenAll(tasksDeferredList).done(function () { + var argv = $h.getArray(arguments); + if (!tp.cancelled) { + deferred.resolve.apply(null, argv); + tp.cancelledDeferrer.reject(); + } else { + deferred.reject.apply(null, argv); + tp.cancelledDeferrer.resolve(); + } + }).fail(function () { + var argv = $h.getArray(arguments); + deferred.reject.apply(null, argv); + if (!tp.cancelled) { + tp.cancelledDeferrer.reject(); + } else { + tp.cancelledDeferrer.resolve(); + } + }); + // run all tasks + $.each(tp.tasks, function (id) { + task = tp.tasks[id]; + task.run(); + }); + return deferred; + } + enqueue = function (task) { + $.when(task.deferred) + .fail(function () { + failed = true; + callback.apply(null, arguments); + }) + .always(callback); + }; + callback = function () { + var argv = $h.getArray(arguments); + // notify a task just ended + deferred.notify(argv); + tasksDone.push(argv); + if (tp.cancelled) { + deferred.reject.apply(null, tasksDone); + tp.cancelledDeferrer.resolve(); + return; + } + if (tasksDone.length === tp.size()) { + if (failed) { + deferred.reject.apply(null, tasksDone); + } else { + deferred.resolve.apply(null, tasksDone); + } + } + // if there are any tasks remaining + if (tasksList.length) { + task = tasksList.shift(); + enqueue(task); + task.run(); + } + }; + // run the first "maxThreads" tasks + while (tasksList.length && i++ < maxThreads) { + task = tasksList.shift(); + enqueue(task); + task.run(); + } + return deferred; + }; + tp.cancel = function () { + tp.cancelled = true; + return tp.cancelledDeferrer; + }; + }, + Task: function (id, logic) { + var tk = this; + tk.id = id; + tk.deferred = $.Deferred(); + tk.logic = logic; + tk.context = null; + tk.run = function () { + var argv = $h.getArray(arguments); + argv.unshift(tk.deferred); // add deferrer as first argument + logic.apply(tk.context, argv); // run task + return tk.deferred; // return deferrer + }; + tk.runWithContext = function (context) { + tk.context = context; + return tk.run(); + }; + } + }; + self.ajaxQueue = []; + self.ajaxRequests = []; + self.ajaxPool = null; + self.ajaxAborted = false; + }, + _init: function (options, refreshMode) { + var self = this, f, $el = self.$element, $cont, t, tmp; + self.options = options; + self.zoomPlaceholder = $h.getZoomPlaceholder(); + self.canOrientImage = $h.canOrientImage($el); + $.each(options, function (key, value) { + switch (key) { + case 'minFileCount': + case 'maxFileCount': + case 'maxTotalFileCount': + case 'minFileSize': + case 'maxFileSize': + case 'maxFilePreviewSize': + case 'resizeQuality': + case 'resizeIfSizeMoreThan': + case 'progressUploadThreshold': + case 'initialPreviewCount': + case 'zoomModalHeight': + case 'minImageHeight': + case 'maxImageHeight': + case 'minImageWidth': + case 'maxImageWidth': + case 'bytesToKB': + self[key] = $h.getNum(value); + break; + default: + self[key] = value; + break; + } + }); + if (!self.bytesToKB || self.bytesToKB <= 0) { + self.bytesToKB = 1024; + } + if (self.errorCloseButton === undefined) { + self.errorCloseButton = $h.closeButton('kv-error-close' + ($h.isBs(5) ? ' float-end' : '')); + } + if (self.maxTotalFileCount > 0 && self.maxTotalFileCount < self.maxFileCount) { + self.maxTotalFileCount = self.maxFileCount; + } + if (self.rtl) { // swap buttons for rtl + tmp = self.previewZoomButtonIcons.prev; + self.previewZoomButtonIcons.prev = self.previewZoomButtonIcons.next; + self.previewZoomButtonIcons.next = tmp; + } + // validate chunk threads to not exceed maxAjaxThreads + if (!isNaN(self.maxAjaxThreads) && self.maxAjaxThreads < self.resumableUploadOptions.maxThreads) { + self.resumableUploadOptions.maxThreads = self.maxAjaxThreads; + } + self._initFileManager(); + if (typeof self.autoOrientImage === 'function') { + self.autoOrientImage = self.autoOrientImage(); + } + if (typeof self.autoOrientImageInitial === 'function') { + self.autoOrientImageInitial = self.autoOrientImageInitial(); + } + if (!refreshMode) { + self._cleanup(); + } + self.duplicateErrors = []; + self.$form = $el.closest('form'); + self._initTemplateDefaults(); + self.uploadFileAttr = !$h.isEmpty($el.attr('name')) ? $el.attr('name') : 'file_data'; + t = self._getLayoutTemplate('progress'); + self.progressTemplate = t.replace('{class}', self.progressClass); + self.progressInfoTemplate = t.replace('{class}', self.progressInfoClass); + self.progressPauseTemplate = t.replace('{class}', self.progressPauseClass); + self.progressCompleteTemplate = t.replace('{class}', self.progressCompleteClass); + self.progressErrorTemplate = t.replace('{class}', self.progressErrorClass); + self.isDisabled = $el.attr('disabled') || $el.attr('readonly'); + if (self.isDisabled) { + $el.attr('disabled', true); + } + self.isClickable = self.browseOnZoneClick && self.showPreview && + (self.dropZoneEnabled || !$h.isEmpty(self.defaultPreviewContent)); + self.isAjaxUpload = $h.hasFileUploadSupport() && !$h.isEmpty(self.uploadUrl); + self.dropZoneEnabled = $h.hasDragDropSupport() && self.dropZoneEnabled; + if (!self.isAjaxUpload) { + self.dropZoneEnabled = self.dropZoneEnabled && $h.canAssignFilesToInput(); + } + self.slug = typeof options.slugCallback === 'function' ? options.slugCallback : self._slugDefault; + self.mainTemplate = self.showCaption ? self._getLayoutTemplate('main1') : self._getLayoutTemplate('main2'); + self.captionTemplate = self._getLayoutTemplate('caption'); + self.previewGenericTemplate = self._getPreviewTemplate('generic'); + if (!self.imageCanvas && self.resizeImage && (self.maxImageWidth || self.maxImageHeight)) { + self.imageCanvas = document.createElement('canvas'); + self.imageCanvasContext = self.imageCanvas.getContext('2d'); + } + if ($h.isEmpty($el.attr('id'))) { + $el.attr('id', $h.uniqId()); + } + self.namespace = '.fileinput_' + $el.attr('id').replace(/-/g, '_'); + if (self.$container === undefined) { + self.$container = self._createContainer(); + } else { + self._refreshContainer(); + } + $cont = self.$container; + self.$dropZone = $cont.find('.file-drop-zone'); + self.$progress = $cont.find('.kv-upload-progress'); + self.$btnUpload = $cont.find('.fileinput-upload'); + self.$captionContainer = $h.getElement(options, 'elCaptionContainer', $cont.find('.file-caption')); + self.$caption = $h.getElement(options, 'elCaptionText', $cont.find('.file-caption-name')); + if (!$h.isEmpty(self.msgPlaceholder)) { + f = $el.attr('multiple') ? self.filePlural : self.fileSingle; + self.$caption.attr('placeholder', self.msgPlaceholder.replace('{files}', f)); + } + self.$captionIcon = self.$captionContainer.find('.file-caption-icon'); + self.$previewContainer = $h.getElement(options, 'elPreviewContainer', $cont.find('.file-preview')); + self.$preview = $h.getElement(options, 'elPreviewImage', $cont.find('.file-preview-thumbnails')); + self.$previewStatus = $h.getElement(options, 'elPreviewStatus', $cont.find('.file-preview-status')); + self.$errorContainer = $h.getElement(options, 'elErrorContainer', + self.$previewContainer.find('.kv-fileinput-error')); + self._validateDisabled(); + if (!$h.isEmpty(self.msgErrorClass)) { + $h.addCss(self.$errorContainer, self.msgErrorClass); + } + if (!refreshMode) { + self._resetErrors(); + self.$errorContainer.hide(); + self.previewInitId = 'thumb-' + $el.attr('id'); + self._initPreviewCache(); + self._initPreview(true); + self._initPreviewActions(); + if (self.$parent.hasClass('file-loading')) { + self.$container.insertBefore(self.$parent); + self.$parent.remove(); + } + } else { + if (!self._errorsExist()) { + self.$errorContainer.hide(); + } + } + self._setFileDropZoneTitle(); + if ($el.attr('disabled')) { + self.disable(); + } + self._initZoom(); + if (self.hideThumbnailContent) { + $h.addCss(self.$preview, 'hide-content'); + } + }, + _initFileManager: function () { + var self = this; + self.uploadStartTime = $h.now(); + self.fileManager = { + stack: {}, + filesProcessed: [], + errors: [], + loadedImages: {}, + totalImages: 0, + totalFiles: null, + totalSize: null, + uploadedSize: 0, + stats: {}, + bpsLog: [], + bps: 0, + initStats: function (id) { + var data = {started: $h.now()}; + if (id) { + self.fileManager.stats[id] = data; + } else { + self.fileManager.stats = data; + } + }, + getUploadStats: function (id, loaded, total) { + var fm = self.fileManager, + started = id ? fm.stats[id] && fm.stats[id].started || $h.now() : self.uploadStartTime, + elapsed = ($h.now() - started) / 1000, bps = Math.ceil(elapsed ? loaded / elapsed : 0), + pendingBytes = total - loaded, out, delay = fm.bpsLog.length ? self.bitrateUpdateDelay : 0; + setTimeout(function () { + var i, j = 0, n = 0, len, beg; + fm.bpsLog.push(bps); + fm.bpsLog.sort(function (a, b) { + return a - b; + }); + len = fm.bpsLog.length; + beg = len > 10 ? len - 10 : Math.ceil(len / 2); + for (i = len; i > beg; i--) { + n = parseFloat(fm.bpsLog[i]); + j++; + } + fm.bps = (j > 0 ? n / j : 0) * 64; + }, delay); + out = { + fileId: id, + started: started, + elapsed: elapsed, + loaded: loaded, + total: total, + bps: fm.bps, + bitrate: self._getSize(fm.bps, false, self.bitRateUnits), + pendingBytes: pendingBytes + }; + if (id) { + fm.stats[id] = out; + } else { + fm.stats = out; + } + return out; + }, + exists: function (id) { + return $.inArray(id, self.fileManager.getIdList()) !== -1; + }, + count: function () { + return self.fileManager.getIdList().length; + }, + total: function () { + var fm = self.fileManager; + if (!fm.totalFiles) { + fm.totalFiles = fm.count(); + } + return fm.totalFiles; + }, + getTotalSize: function () { + var fm = self.fileManager; + if (fm.totalSize) { + return fm.totalSize; + } + fm.totalSize = 0; + $.each(self.getFileStack(), function (id, f) { + var size = parseFloat(f.size); + fm.totalSize += isNaN(size) ? 0 : size; + }); + return fm.totalSize; + }, + add: function (file, id) { + if (!id) { + id = self.fileManager.getId(file); + } + if (!id) { + return; + } + self.fileManager.stack[id] = { + file: file, + name: $h.getFileName(file), + relativePath: $h.getFileRelativePath(file), + size: file.size, + nameFmt: self._getFileName(file, ''), + sizeFmt: self._getSize(file.size) + }; + }, + remove: function ($thumb) { + var id = self._getThumbFileId($thumb); + self.fileManager.removeFile(id); + }, + removeFile: function (id) { + var fm = self.fileManager; + if (!id) { + return; + } + delete fm.stack[id]; + delete fm.loadedImages[id]; + }, + move: function (idFrom, idTo) { + var result = {}, stack = self.fileManager.stack; + if (!idFrom && !idTo || idFrom === idTo) { + return; + } + $.each(stack, function (k, v) { + if (k !== idFrom) { + result[k] = v; + } + if (k === idTo) { + result[idFrom] = stack[idFrom]; + } + }); + self.fileManager.stack = result; + }, + list: function () { + var files = []; + $.each(self.getFileStack(), function (k, v) { + if (v && v.file) { + files.push(v.file); + } + }); + return files; + }, + isPending: function (id) { + return $.inArray(id, self.fileManager.filesProcessed) === -1 && self.fileManager.exists(id); + }, + isProcessed: function () { + var filesProcessed = true, fm = self.fileManager; + $.each(self.getFileStack(), function (id) { + if (fm.isPending(id)) { + filesProcessed = false; + } + }); + return filesProcessed; + }, + clear: function () { + var fm = self.fileManager; + self.isDuplicateError = false; + self.isPersistentError = false; + fm.totalFiles = null; + fm.totalSize = null; + fm.uploadedSize = 0; + fm.stack = {}; + fm.errors = []; + fm.filesProcessed = []; + fm.stats = {}; + fm.bpsLog = []; + fm.bps = 0; + fm.clearImages(); + }, + clearImages: function () { + self.fileManager.loadedImages = {}; + self.fileManager.totalImages = 0; + }, + addImage: function (id, config) { + self.fileManager.loadedImages[id] = config; + }, + removeImage: function (id) { + delete self.fileManager.loadedImages[id]; + }, + getImageIdList: function () { + return $h.getObjectKeys(self.fileManager.loadedImages); + }, + getImageCount: function () { + return self.fileManager.getImageIdList().length; + }, + getId: function (file) { + return self._getFileId(file); + }, + getIndex: function (id) { + return self.fileManager.getIdList().indexOf(id); + }, + getThumb: function (id) { + var $thumb = null; + self._getThumbs().each(function () { + var $t = $(this); + if (self._getThumbFileId($t) === id) { + $thumb = $t; + } + }); + return $thumb; + }, + getThumbIndex: function ($thumb) { + var id = self._getThumbFileId($thumb); + return self.fileManager.getIndex(id); + }, + getIdList: function () { + return $h.getObjectKeys(self.fileManager.stack); + }, + getFile: function (id) { + return self.fileManager.stack[id] || null; + }, + getFileName: function (id, fmt) { + var file = self.fileManager.getFile(id); + if (!file) { + return ''; + } + return fmt ? (file.nameFmt || '') : file.name || ''; + }, + getFirstFile: function () { + var ids = self.fileManager.getIdList(), id = ids && ids.length ? ids[0] : null; + return self.fileManager.getFile(id); + }, + setFile: function (id, file) { + if (self.fileManager.getFile(id)) { + self.fileManager.stack[id].file = file; + } else { + self.fileManager.add(file, id); + } + }, + setProcessed: function (id) { + self.fileManager.filesProcessed.push(id); + }, + getProgress: function () { + var total = self.fileManager.total(), filesProcessed = self.fileManager.filesProcessed.length; + if (!total) { + return 0; + } + return Math.ceil(filesProcessed / total * 100); + + }, + setProgress: function (id, pct) { + var f = self.fileManager.getFile(id); + if (!isNaN(pct) && f) { + f.progress = pct; + } + } + }; + }, + _setUploadData: function (fd, config) { + var self = this; + $.each(config, function (key, value) { + var param = self.uploadParamNames[key] || key; + if ($h.isArray(value)) { + fd.append(param, value[0], value[1]); + } else { + fd.append(param, value); + } + }); + }, + _initResumableUpload: function () { + var self = this, opts = self.resumableUploadOptions, logs = $h.logMessages, rm, fm = self.fileManager; + if (!self.enableResumableUpload) { + return; + } + if (opts.fallback !== false && typeof opts.fallback !== 'function') { + opts.fallback = function (s) { + s._log(logs.noResumableSupport); + s.enableResumableUpload = false; + }; + } + if (!$h.hasResumableUploadSupport() && opts.fallback !== false) { + opts.fallback(self); + return; + } + if (!self.uploadUrl && self.enableResumableUpload) { + self._log(logs.noUploadUrl); + self.enableResumableUpload = false; + return; + + } + opts.chunkSize = parseFloat(opts.chunkSize); + if (opts.chunkSize <= 0 || isNaN(opts.chunkSize)) { + self._log(logs.invalidChunkSize, {chunkSize: opts.chunkSize}); + self.enableResumableUpload = false; + return; + } + rm = self.resumableManager = { + init: function (id, f, index) { + rm.logs = []; + rm.stack = []; + rm.error = ''; + rm.id = id; + rm.file = f.file; + rm.fileName = f.name; + rm.fileIndex = index; + rm.completed = false; + rm.lastProgress = 0; + if (self.showPreview) { + rm.$thumb = fm.getThumb(id) || null; + rm.$progress = rm.$btnDelete = null; + if (rm.$thumb && rm.$thumb.length) { + rm.$progress = rm.$thumb.find('.file-thumb-progress'); + rm.$btnDelete = rm.$thumb.find('.kv-file-remove'); + } + } + rm.chunkSize = opts.chunkSize * self.bytesToKB; + rm.chunkCount = rm.getTotalChunks(); + }, + setAjaxError: function (jqXHR, textStatus, errorThrown, isTest) { + if (jqXHR.responseJSON && jqXHR.responseJSON.error) { + errorThrown = jqXHR.responseJSON.error.toString(); + } + if (!isTest) { + rm.error = errorThrown; + } + if (opts.showErrorLog) { + self._log(logs.ajaxError, { + status: jqXHR.status, + error: errorThrown, + text: jqXHR.responseText || '' + }); + } + }, + reset: function () { + rm.stack = []; + rm.chunksProcessed = {}; + }, + setProcessed: function (status) { + var id = rm.id, msg, $thumb = rm.$thumb, $prog = rm.$progress, hasThumb = $thumb && $thumb.length, + params = {id: hasThumb ? $thumb.attr('id') : '', index: fm.getIndex(id), fileId: id}, tokens, + skipErrorsAndProceed = self.resumableUploadOptions.skipErrorsAndProceed; + rm.completed = true; + rm.lastProgress = 0; + if (hasThumb) { + $thumb.removeClass('file-uploading'); + } + if (status === 'success') { + fm.uploadedSize += rm.file.size; + if (self.showPreview) { + self._setProgress(101, $prog); + self._setThumbStatus($thumb, 'Success'); + self._initUploadSuccess(rm.chunksProcessed[id].data, $thumb); + } + fm.removeFile(id); + delete rm.chunksProcessed[id]; + self._raise('fileuploaded', [params.id, params.index, params.fileId]); + if (fm.isProcessed()) { + self._setProgress(101); + } + } else { + if (status !== 'cancel') { + if (self.showPreview) { + self._setThumbStatus($thumb, 'Error'); + self._setPreviewError($thumb, true); + self._setProgress(101, $prog, self.msgProgressError); + self._setProgress(101, self.$progress, self.msgProgressError); + self.cancelling = !skipErrorsAndProceed; + } + if (!self.$errorContainer.find('li[data-file-id="' + params.fileId + '"]').length) { + tokens = {file: rm.fileName, max: opts.maxRetries, error: rm.error}; + msg = self.msgResumableUploadRetriesExceeded.setTokens(tokens); + $.extend(params, tokens); + self._showFileError(msg, params, 'filemaxretries'); + if (skipErrorsAndProceed) { + fm.removeFile(id); + delete rm.chunksProcessed[id]; + if (fm.isProcessed()) { + self._setProgress(101); + } + } + } + } + } + if (fm.isProcessed()) { + rm.reset(); + } + }, + check: function () { + var status = true; + $.each(rm.logs, function (index, value) { + if (!value) { + status = false; + return false; + } + }); + }, + processedResumables: function () { + var logs = rm.logs, i, count = 0; + if (!logs || !logs.length) { + return 0; + } + for (i = 0; i < logs.length; i++) { + if (logs[i] === true) { + count++; + } + } + return count; + }, + getUploadedSize: function () { + var size = rm.processedResumables() * rm.chunkSize; + return size > rm.file.size ? rm.file.size : size; + }, + getTotalChunks: function () { + var chunkSize = parseFloat(rm.chunkSize); + if (!isNaN(chunkSize) && chunkSize > 0) { + return Math.ceil(rm.file.size / chunkSize); + } + return 0; + }, + getProgress: function () { + var chunksProcessed = rm.processedResumables(), total = rm.chunkCount; + if (total === 0) { + return 0; + } + return Math.ceil(chunksProcessed / total * 100); + }, + checkAborted: function (intervalId) { + if (self._isAborted()) { + clearInterval(intervalId); + self.unlock(); + } + }, + upload: function () { + var ids = fm.getIdList(), flag = 'new', intervalId; + intervalId = setInterval(function () { + var id; + rm.checkAborted(intervalId); + if (flag === 'new') { + self.lock(); + flag = 'processing'; + id = ids.shift(); + fm.initStats(id); + if (fm.stack[id]) { + rm.init(id, fm.stack[id], fm.getIndex(id)); + rm.processUpload(); + } + } + if (!fm.isPending(id) && rm.completed) { + flag = 'new'; + } + if (fm.isProcessed()) { + var $initThumbs = self.$preview.find('.file-preview-initial'); + if ($initThumbs.length) { + $h.addCss($initThumbs, $h.SORT_CSS); + self._initSortable(); + } + clearInterval(intervalId); + self._clearFileInput(); + self.unlock(); + setTimeout(function () { + var data = self.previewCache.data; + if (data) { + self.initialPreview = data.content; + self.initialPreviewConfig = data.config; + self.initialPreviewThumbTags = data.tags; + } + self._raise('filebatchuploadcomplete', [ + self.initialPreview, + self.initialPreviewConfig, + self.initialPreviewThumbTags, + self._getExtraData() + ]); + }, self.processDelay); + } + }, self.processDelay); + }, + uploadResumable: function () { + var i, pool, tm = self.taskManager, total = rm.chunkCount; + pool = tm.addPool(rm.id); + for (i = 0; i < total; i++) { + rm.logs[i] = !!(rm.chunksProcessed[rm.id] && rm.chunksProcessed[rm.id][i]); + if (!rm.logs[i]) { + rm.pushAjax(i, 0); + } + } + pool.run(opts.maxThreads) + .done(function () { + rm.setProcessed('success'); + }) + .fail(function () { + rm.setProcessed(pool.cancelled ? 'cancel' : 'error'); + }); + }, + processUpload: function () { + var fd, f, id = rm.id, fnBefore, fnSuccess, fnError, fnComplete, outData; + if (!opts.testUrl) { + rm.uploadResumable(); + return; + } + fd = new FormData(); + f = fm.stack[id]; + self._setUploadData(fd, { + fileId: id, + fileName: f.fileName, + fileSize: f.size, + fileRelativePath: f.relativePath, + chunkSize: rm.chunkSize, + chunkCount: rm.chunkCount + }); + fnBefore = function (jqXHR) { + outData = self._getOutData(fd, jqXHR); + self._raise('filetestbeforesend', [id, fm, rm, outData]); + }; + fnSuccess = function (data, textStatus, jqXHR) { + outData = self._getOutData(fd, jqXHR, data); + var pNames = self.uploadParamNames, chunksUploaded = pNames.chunksUploaded || 'chunksUploaded', + params = [id, fm, rm, outData]; + if (!data[chunksUploaded] || !$h.isArray(data[chunksUploaded])) { + self._raise('filetesterror', params); + } else { + if (!rm.chunksProcessed[id]) { + rm.chunksProcessed[id] = {}; + } + $.each(data[chunksUploaded], function (key, index) { + rm.logs[index] = true; + rm.chunksProcessed[id][index] = true; + }); + rm.chunksProcessed[id].data = data; + self._raise('filetestsuccess', params); + } + rm.uploadResumable(); + }; + fnError = function (jqXHR, textStatus, errorThrown) { + outData = self._getOutData(fd, jqXHR); + self._raise('filetestajaxerror', [id, fm, rm, outData]); + rm.setAjaxError(jqXHR, textStatus, errorThrown, true); + rm.uploadResumable(); + }; + fnComplete = function () { + self._raise('filetestcomplete', [id, fm, rm, self._getOutData(fd)]); + }; + self._ajaxSubmit(fnBefore, fnSuccess, fnComplete, fnError, fd, id, rm.fileIndex, opts.testUrl); + }, + pushAjax: function (index, retry) { + var tm = self.taskManager, pool = tm.getPool(rm.id); + pool.addTask(pool.size() + 1, function (deferrer) { + // use fifo chunk stack + var arr = rm.stack.shift(), index; + index = arr[0]; + if (!rm.chunksProcessed[rm.id] || !rm.chunksProcessed[rm.id][index]) { + rm.sendAjax(index, arr[1], deferrer); + } else { + self._log(logs.chunkQueueError, {index: index}); + } + }); + rm.stack.push([index, retry]); + }, + sendAjax: function (index, retry, deferrer) { + var f, chunkSize = rm.chunkSize, id = rm.id, file = rm.file, $thumb = rm.$thumb, + msgs = $h.logMessages, $btnDelete = rm.$btnDelete, logError = function (msg, tokens) { + if (tokens) { + msg = msg.setTokens(tokens); + } + msg = msgs.resumableRequestError.setTokens({msg: msg}); + self._log(msg); + deferrer.reject(msg); + }; + if (rm.chunksProcessed[id] && rm.chunksProcessed[id][index]) { + return; + } + if (retry > opts.maxRetries) { + logError(msgs.resumableMaxRetriesReached, {n: opts.maxRetries}); + rm.setProcessed('error'); + return; + } + var fd, outData, fnBefore, fnSuccess, fnError, fnComplete, slice = file.slice ? 'slice' : + (file.mozSlice ? 'mozSlice' : (file.webkitSlice ? 'webkitSlice' : 'slice')), + blob = file[slice](chunkSize * index, chunkSize * (index + 1)); + fd = new FormData(); + f = fm.stack[id]; + self._setUploadData(fd, { + chunkCount: rm.chunkCount, + chunkIndex: index, + chunkSize: chunkSize, + chunkSizeStart: chunkSize * index, + fileBlob: [blob, rm.fileName], + fileId: id, + fileName: rm.fileName, + fileRelativePath: f.relativePath, + fileSize: file.size, + retryCount: retry + }); + if (rm.$progress && rm.$progress.length) { + rm.$progress.show(); + } + fnBefore = function (jqXHR) { + outData = self._getOutData(fd, jqXHR); + if (self.showPreview) { + if (!$thumb.hasClass('file-preview-success')) { + self._setThumbStatus($thumb, 'Loading'); + $h.addCss($thumb, 'file-uploading'); + } + $btnDelete.attr('disabled', true); + } + self._raise('filechunkbeforesend', [id, index, retry, fm, rm, outData]); + }; + fnSuccess = function (data, textStatus, jqXHR) { + if (self._isAborted()) { + logError(msgs.resumableAborting); + return; + } + outData = self._getOutData(fd, jqXHR, data); + var paramNames = self.uploadParamNames, chunkIndex = paramNames.chunkIndex || 'chunkIndex', + params = [id, index, retry, fm, rm, outData]; + if (data.error) { + if (opts.showErrorLog) { + self._log(logs.retryStatus, { + retry: retry + 1, + filename: rm.fileName, + chunk: index + }); + } + self._raise('filechunkerror', params); + rm.pushAjax(index, retry + 1); + rm.error = data.error; + logError(data.error); + } else { + rm.logs[data[chunkIndex]] = true; + if (!rm.chunksProcessed[id]) { + rm.chunksProcessed[id] = {}; + } + rm.chunksProcessed[id][data[chunkIndex]] = true; + rm.chunksProcessed[id].data = data; + deferrer.resolve.call(null, data); + self._raise('filechunksuccess', params); + rm.check(); + } + }; + fnError = function (jqXHR, textStatus, errorThrown) { + if (self._isAborted()) { + logError(msgs.resumableAborting); + return; + } + outData = self._getOutData(fd, jqXHR); + rm.setAjaxError(jqXHR, textStatus, errorThrown); + self._raise('filechunkajaxerror', [id, index, retry, fm, rm, outData]); + rm.pushAjax(index, retry + 1); // push another task + logError(msgs.resumableRetryError, {n: retry - 1}); // resolve the current task + }; + fnComplete = function () { + if (!self._isAborted()) { + self._raise('filechunkcomplete', [id, index, retry, fm, rm, self._getOutData(fd)]); + } + }; + self._ajaxSubmit(fnBefore, fnSuccess, fnComplete, fnError, fd, id, rm.fileIndex); + } + }; + rm.reset(); + }, + _initTemplateDefaults: function () { + var self = this, tMain1, tMain2, tPreview, tFileIcon, tClose, tCaption, tBtnDefault, tBtnLink, tBtnBrowse, + tModalMain, tModal, tProgress, tSize, tFooter, tActions, tActionDelete, tActionUpload, tActionDownload, + tActionZoom, tActionDrag, tIndicator, tTagBef, tTagBef1, tTagBef2, tTagAft, tGeneric, tHtml, tImage, + tText, tOffice, tGdocs, tVideo, tAudio, tFlash, tObject, tPdf, tOther, tStyle, tZoomCache, vDefaultDim, + tActionRotate, tStats, tModalLabel, tDescClose, renderObject = function (type, mime) { + return '\n' + $h.DEFAULT_PREVIEW + '\n\n'; + }, defBtnCss1 = 'btn btn-sm btn-kv ' + $h.defaultButtonCss(); + tMain1 = '{preview}\n' + + '
\n' + + '
\n' + + '
\n' + + ' {caption}\n\n' + + ($h.isBs(5) ? '' : '
\n') + + ' {remove}\n' + + ' {cancel}\n' + + ' {pause}\n' + + ' {upload}\n' + + ' {browse}\n' + + ($h.isBs(5) ? '' : '
\n') + + '
'; + '
'; + tMain2 = '{preview}\n
\n
\n' + + '{remove}\n{cancel}\n{upload}\n{browse}\n'; + tPreview = '
\n' + + ' {close}' + + '
\n' + + '
\n' + + '
\n' + + '
\n' + + '
\n' + + '
\n' + + '
'; + tClose = $h.closeButton('fileinput-remove'); + tFileIcon = ''; + // noinspection HtmlUnknownAttribute + tCaption = '\n'; + //noinspection HtmlUnknownAttribute + tBtnDefault = ''; + //noinspection HtmlUnknownTarget,HtmlUnknownAttribute + tBtnLink = '{icon} {label}'; + //noinspection HtmlUnknownAttribute + tBtnBrowse = '
{icon} {label}
'; + tModalLabel = $h.MODAL_ID + 'Label'; + tModalMain = ''; + tModal = '\n'; + tDescClose = ''; + tProgress = '
\n' + + '
\n' + + ' {status}\n' + + '
\n' + + '
{stats}'; + tStats = '
' + + '{pendingTime} ' + + '{uploadSpeed}' + + '
'; + tSize = ' ({sizeText})'; + tFooter = ''; + tActions = '
\n' + + ' \n' + + '
\n' + + '{drag}\n' + + '
'; + //noinspection HtmlUnknownAttribute + tActionDelete = '\n'; + tActionUpload = ''; + tActionRotate = ''; + tActionDownload = '{downloadIcon}'; + tActionZoom = ''; + tActionDrag = '{dragIcon}'; + tIndicator = '
{indicator}
'; + tTagBef = '
\n'; + tTagBef2 = tTagBef + ' title="{caption}">
\n'; + tTagAft = '
{footer}\n{zoomCache}
\n'; + tGeneric = '{content}\n'; + tStyle = ' {style}'; + tHtml = renderObject('html', 'text/html'); + tText = renderObject('text', 'text/plain;charset=UTF-8'); + tPdf = renderObject('pdf', 'application/pdf'); + tImage = '{alt}\n'; + tOffice = ''; + tGdocs = ''; + tVideo = '\n'; + tAudio = '\n'; + tFlash = '\n'; + tObject = '\n' + '\n' + + $h.OBJECT_PARAMS + ' ' + $h.DEFAULT_PREVIEW + '\n\n'; + tOther = '
\n' + $h.DEFAULT_PREVIEW + '\n
\n'; + tZoomCache = '
{zoomContent}
'; + vDefaultDim = {width: '100%', height: '100%', 'min-height': '480px'}; + if (self._isPdfRendered()) { + tPdf = self.pdfRendererTemplate.replace('{renderer}', self._encodeURI(self.pdfRendererUrl)); + } + self.defaults = { + layoutTemplates: { + main1: tMain1, + main2: tMain2, + preview: tPreview, + close: tClose, + fileIcon: tFileIcon, + caption: tCaption, + modalMain: tModalMain, + modal: tModal, + descriptionClose: tDescClose, + progress: tProgress, + stats: tStats, + size: tSize, + footer: tFooter, + indicator: tIndicator, + actions: tActions, + actionDelete: tActionDelete, + actionRotate: tActionRotate, + actionUpload: tActionUpload, + actionDownload: tActionDownload, + actionZoom: tActionZoom, + actionDrag: tActionDrag, + btnDefault: tBtnDefault, + btnLink: tBtnLink, + btnBrowse: tBtnBrowse, + zoomCache: tZoomCache + }, + previewMarkupTags: { + tagBefore1: tTagBef1, + tagBefore2: tTagBef2, + tagAfter: tTagAft + }, + previewContentTemplates: { + generic: tGeneric, + html: tHtml, + image: tImage, + text: tText, + office: tOffice, + gdocs: tGdocs, + video: tVideo, + audio: tAudio, + flash: tFlash, + object: tObject, + pdf: tPdf, + other: tOther + }, + allowedPreviewTypes: ['image', 'html', 'text', 'video', 'audio', 'flash', 'pdf', 'object'], + previewTemplates: {}, + previewSettings: { + image: {width: 'auto', height: 'auto', 'max-width': '100%', 'max-height': '100%'}, + html: {width: '213px', height: '160px'}, + text: {width: '213px', height: '160px'}, + office: {width: '213px', height: '160px'}, + gdocs: {width: '213px', height: '160px'}, + video: {width: '213px', height: '160px'}, + audio: {width: '100%', height: '30px'}, + flash: {width: '213px', height: '160px'}, + object: {width: '213px', height: '160px'}, + pdf: {width: '100%', height: '160px', 'position': 'relative'}, + other: {width: '213px', height: '160px'} + }, + previewSettingsSmall: { + image: {width: 'auto', height: 'auto', 'max-width': '100%', 'max-height': '100%'}, + html: {width: '100%', height: '160px'}, + text: {width: '100%', height: '160px'}, + office: {width: '100%', height: '160px'}, + gdocs: {width: '100%', height: '160px'}, + video: {width: '100%', height: 'auto'}, + audio: {width: '100%', height: '30px'}, + flash: {width: '100%', height: 'auto'}, + object: {width: '100%', height: 'auto'}, + pdf: {width: '100%', height: '160px'}, + other: {width: '100%', height: '160px'} + }, + previewZoomSettings: { + image: {width: 'auto', height: 'auto', 'max-width': '100%', 'max-height': '100%'}, + html: vDefaultDim, + text: vDefaultDim, + office: {width: '100%', height: '100%', 'max-width': '100%', 'min-height': '480px'}, + gdocs: {width: '100%', height: '100%', 'max-width': '100%', 'min-height': '480px'}, + video: {width: 'auto', height: '100%', 'max-width': '100%'}, + audio: {width: '100%', height: '30px'}, + flash: {width: 'auto', height: '480px'}, + object: {width: 'auto', height: '100%', 'max-width': '100%', 'min-height': '480px'}, + pdf: vDefaultDim, + other: {width: 'auto', height: '100%', 'min-height': '480px'} + }, + mimeTypeAliases: { + 'video/quicktime': 'video/mp4' + }, + fileTypeSettings: { + image: function (vType, vName) { + return ($h.compare(vType, 'image.*') && !$h.compare(vType, /(tiff?|wmf)$/i) || + $h.compare(vName, /\.(gif|png|jpe?g)$/i)); + }, + html: function (vType, vName) { + return $h.compare(vType, 'text/html') || $h.compare(vName, /\.(htm|html)$/i); + }, + office: function (vType, vName) { + return $h.compare(vType, /(word|excel|powerpoint|office)$/i) || + $h.compare(vName, /\.(docx?|xlsx?|pptx?|pps|potx?)$/i); + }, + gdocs: function (vType, vName) { + return $h.compare(vType, /(word|excel|powerpoint|office|iwork-pages|tiff?)$/i) || + $h.compare(vName, + /\.(docx?|xlsx?|pptx?|pps|potx?|rtf|ods|odt|pages|ai|dxf|ttf|tiff?|wmf|e?ps)$/i); + }, + text: function (vType, vName) { + return $h.compare(vType, 'text.*') || $h.compare(vName, /\.(xml|javascript)$/i) || + $h.compare(vName, /\.(txt|md|nfo|ini|json|php|js|css)$/i); + }, + video: function (vType, vName) { + return $h.compare(vType, 'video.*') && ($h.compare(vType, /(ogg|mp4|mp?g|mov|webm|3gp)$/i) || + $h.compare(vName, /\.(og?|mp4|webm|mp?g|mov|3gp)$/i)); + }, + audio: function (vType, vName) { + return $h.compare(vType, 'audio.*') && ($h.compare(vName, /(ogg|mp3|mp?g|wav)$/i) || + $h.compare(vName, /\.(og?|mp3|mp?g|wav)$/i)); + }, + flash: function (vType, vName) { + return $h.compare(vType, 'application/x-shockwave-flash', true) || $h.compare(vName, + /\.(swf)$/i); + }, + pdf: function (vType, vName) { + return $h.compare(vType, 'application/pdf', true) || $h.compare(vName, /\.(pdf)$/i); + }, + object: function () { + return true; + }, + other: function () { + return true; + } + }, + fileActionSettings: { + showRemove: true, + showUpload: true, + showDownload: true, + showZoom: true, + showDrag: true, + showRotate: false, + removeIcon: '', + removeClass: defBtnCss1, + removeErrorClass: 'btn btn-sm btn-kv btn-danger', + removeTitle: 'Remove file', + uploadIcon: '', + uploadClass: defBtnCss1, + uploadTitle: 'Upload file', + uploadRetryIcon: '', + uploadRetryTitle: 'Retry upload', + downloadIcon: '', + downloadClass: defBtnCss1, + downloadTitle: 'Download file', + rotateIcon: '', + rotateClass: defBtnCss1, + rotateTitle: 'Rotate 90 deg. clockwise', + zoomIcon: '', + zoomClass: defBtnCss1, + zoomTitle: 'View Details', + dragIcon: '', + dragClass: 'text-primary', + dragTitle: 'Move / Rearrange', + dragSettings: {}, + indicatorNew: '', + indicatorSuccess: '', + indicatorError: '', + indicatorLoading: '', + indicatorPaused: '', + indicatorNewTitle: 'Not uploaded yet', + indicatorSuccessTitle: 'Uploaded', + indicatorErrorTitle: 'Upload Error', + indicatorLoadingTitle: 'Uploading …', + indicatorPausedTitle: 'Upload Paused' + } + }; + $.each(self.defaults, function (key, setting) { + if (key === 'allowedPreviewTypes') { + if (self.allowedPreviewTypes === undefined) { + self.allowedPreviewTypes = setting; + } + return; + } + self[key] = $.extend(true, {}, setting, self[key]); + }); + self._initPreviewTemplates(); + }, + _initPreviewTemplates: function () { + var self = this, tags = self.previewMarkupTags, tagBef, tagAft = tags.tagAfter; + $.each(self.previewContentTemplates, function (key, value) { + if ($h.isEmpty(self.previewTemplates[key])) { + tagBef = tags.tagBefore2; + if (key === 'generic' || key === 'image') { + tagBef = tags.tagBefore1; + } + if (self._isPdfRendered() && key === 'pdf') { + tagBef = tagBef.replace('kv-file-content', 'kv-file-content kv-pdf-rendered'); + } + self.previewTemplates[key] = tagBef + value + tagAft; + } + }); + }, + _initPreviewCache: function () { + var self = this; + self.previewCache = { + data: {}, + init: function () { + var content = self.initialPreview; + if (content.length > 0 && !$h.isArray(content)) { + content = content.split(self.initialPreviewDelimiter); + } + self.previewCache.data = { + content: content, + config: self.initialPreviewConfig, + tags: self.initialPreviewThumbTags + }; + }, + count: function (skipNull) { + if (!self.previewCache.data || !self.previewCache.data.content) { + return 0; + } + if (skipNull) { + var chk = self.previewCache.data.content.filter(function (n) { + return n !== null; + }); + return chk.length; + } + return self.previewCache.data.content.length; + }, + get: function (i, isDisabled) { + var ind = $h.INIT_FLAG + i, data = self.previewCache.data, config = data.config[i], + content = data.content[i], out, $tmp, cat, ftr, + fname, ftype, frameClass, asData = $h.ifSet('previewAsData', config, self.initialPreviewAsData), + a = config ? {title: config.title || null, alt: config.alt || null} : {title: null, alt: null}, + parseTemplate = function (cat, dat, fname, ftype, ftr, ind, fclass, t) { + var fc = ' file-preview-initial ' + $h.SORT_CSS + (fclass ? ' ' + fclass : ''), + id = self.previewInitId + '-' + ind, + fileId = config && config.fileId || id; + /** @namespace config.zoomData */ + return self._generatePreviewTemplate(cat, dat, fname, ftype, id, fileId, false, null, null, fc, + ftr, ind, t, a, config && config.zoomData || dat); + }; + if (!content || !content.length) { + return ''; + } + isDisabled = isDisabled === undefined ? true : isDisabled; + cat = $h.ifSet('type', config, self.initialPreviewFileType || 'generic'); + fname = $h.ifSet('filename', config, $h.ifSet('caption', config)); + ftype = $h.ifSet('filetype', config, cat); + ftr = self.previewCache.footer(i, isDisabled, (config && config.size || null)); + frameClass = $h.ifSet('frameClass', config); + if (asData) { + out = parseTemplate(cat, content, fname, ftype, ftr, ind, frameClass); + } else { + out = parseTemplate('generic', content, fname, ftype, ftr, ind, frameClass, cat) + .setTokens({'content': data.content[i]}); + } + if (data.tags.length && data.tags[i]) { + out = $h.replaceTags(out, data.tags[i]); + } + /** @namespace config.frameAttr */ + if (!$h.isEmpty(config) && !$h.isEmpty(config.frameAttr)) { + $tmp = $h.createElement(out); + $tmp.find('.file-preview-initial').attr(config.frameAttr); + out = $tmp.html(); + $tmp.remove(); + } + return out; + }, + clean: function (data) { + data.content = $h.cleanArray(data.content); + data.config = $h.cleanArray(data.config); + data.tags = $h.cleanArray(data.tags); + self.previewCache.data = data; + }, + add: function (content, config, tags, append) { + var data = self.previewCache.data, index; + if (!content || !content.length) { + return 0; + } + index = content.length - 1; + if (!$h.isArray(content)) { + content = content.split(self.initialPreviewDelimiter); + } + if (append && data.content) { + index = data.content.push(content[0]) - 1; + data.config[index] = config; + data.tags[index] = tags; + } else { + data.content = content; + data.config = config; + data.tags = tags; + } + self.previewCache.clean(data); + return index; + }, + set: function (content, config, tags, append) { + var data = self.previewCache.data, i, chk; + if (!content || !content.length) { + return; + } + if (!$h.isArray(content)) { + content = content.split(self.initialPreviewDelimiter); + } + chk = content.filter(function (n) { + return n !== null; + }); + if (!chk.length) { + return; + } + if (data.content === undefined) { + data.content = []; + } + if (data.config === undefined) { + data.config = []; + } + if (data.tags === undefined) { + data.tags = []; + } + if (append) { + for (i = 0; i < content.length; i++) { + if (content[i]) { + data.content.push(content[i]); + } + } + for (i = 0; i < config.length; i++) { + if (config[i]) { + data.config.push(config[i]); + } + } + for (i = 0; i < tags.length; i++) { + if (tags[i]) { + data.tags.push(tags[i]); + } + } + } else { + data.content = content; + data.config = config; + data.tags = tags; + } + self.previewCache.clean(data); + }, + unset: function (index) { + var chk = self.previewCache.count(), rev = self.reversePreviewOrder; + if (!chk) { + return; + } + if (chk === 1) { + self.previewCache.data.content = []; + self.previewCache.data.config = []; + self.previewCache.data.tags = []; + self.initialPreview = []; + self.initialPreviewConfig = []; + self.initialPreviewThumbTags = []; + return; + } + self.previewCache.data.content = $h.spliceArray(self.previewCache.data.content, index, rev); + self.previewCache.data.config = $h.spliceArray(self.previewCache.data.config, index, rev); + self.previewCache.data.tags = $h.spliceArray(self.previewCache.data.tags, index, rev); + var data = $.extend(true, {}, self.previewCache.data); + self.previewCache.clean(data); + }, + out: function () { + var html = '', caption, len = self.previewCache.count(), i, content; + if (len === 0) { + return {content: '', caption: ''}; + } + for (i = 0; i < len; i++) { + content = self.previewCache.get(i); + html = self.reversePreviewOrder ? (content + html) : (html + content); + } + caption = self._getMsgSelected(len); + return {content: html, caption: caption}; + }, + footer: function (i, isDisabled, size) { + var data = self.previewCache.data || {}; + if ($h.isEmpty(data.content)) { + return ''; + } + if ($h.isEmpty(data.config) || $h.isEmpty(data.config[i])) { + data.config[i] = {}; + } + isDisabled = isDisabled === undefined ? true : isDisabled; + var config = data.config[i], caption = $h.ifSet('caption', config), a, + width = $h.ifSet('width', config, 'auto'), url = $h.ifSet('url', config, false), + key = $h.ifSet('key', config, null), fileId = $h.ifSet('fileId', config, null), + fs = self.fileActionSettings, initPreviewShowDel = self.initialPreviewShowDelete || false, + downloadInitialUrl = !self.initialPreviewDownloadUrl ? '' : + self.initialPreviewDownloadUrl + '?key=' + key + (fileId ? '&fileId=' + fileId : ''), + dUrl = config.downloadUrl || downloadInitialUrl, + dFil = config.filename || config.caption || '', + initPreviewShowDwl = !!(dUrl), + sDel = $h.ifSet('showRemove', config, initPreviewShowDel), + sRot = $h.ifSet('showRotate', config, $h.ifSet('showRotate', fs, true)), + sDwl = $h.ifSet('showDownload', config, $h.ifSet('showDownload', fs, initPreviewShowDwl)), + sZm = $h.ifSet('showZoom', config, $h.ifSet('showZoom', fs, true)), + sDrg = $h.ifSet('showDrag', config, $h.ifSet('showDrag', fs, true)), + dis = (url === false) && isDisabled; + sDwl = sDwl && config.downloadUrl !== false && !!dUrl; + a = self._renderFileActions(config, false, sDwl, sDel, sRot, sZm, sDrg, dis, url, key, true, dUrl, dFil); + return self._getLayoutTemplate('footer').setTokens({ + 'progress': self._renderThumbProgress(), + 'actions': a, + 'caption': caption, + 'size': self._getSize(size), + 'width': width, + 'indicator': '' + }); + } + }; + self.previewCache.init(); + }, + _isPdfRendered: function () { + var self = this, useLib = self.usePdfRenderer, + flag = typeof useLib === 'function' ? useLib() : !!useLib; + return flag && self.pdfRendererUrl; + }, + _handler: function ($el, event, callback) { + var self = this, ns = self.namespace, ev = event.split(' ').join(ns + ' ') + ns; + if (!$el || !$el.length) { + return; + } + $el.off(ev).on(ev, callback); + }, + _encodeURI: function (vUrl) { + var self = this; + return self.encodeUrl ? encodeURI(vUrl) : vUrl; + }, + _log: function (msg, tokens) { + var self = this, id = self.$element.attr('id'); + if (!self.showConsoleLogs) { + return; + } + if (id) { + msg = '"' + id + '": ' + msg; + } + msg = 'bootstrap-fileinput: ' + msg; + if (typeof tokens === 'object') { + msg = msg.setTokens(tokens); + } + if (window.console && typeof window.console.log !== 'undefined') { + window.console.log(msg); + } else { + window.alert(msg); + } + }, + _validate: function () { + var self = this, status = self.$element.attr('type') === 'file'; + if (!status) { + self._log($h.logMessages.badInputType); + } + return status; + }, + _errorsExist: function () { + var self = this, $err, $errList = self.$errorContainer.find('li'); + if ($errList.length) { + return true; + } + $err = $h.createElement(self.$errorContainer.html()); + $err.find('.kv-error-close').remove(); + $err.find('ul').remove(); + return !!$.trim($err.text()).length; + }, + _errorHandler: function (evt, caption) { + var self = this, err = evt.target.error, showError = function (msg) { + self._showError(msg.replace('{name}', caption)); + }; + /** @namespace err.NOT_FOUND_ERR */ + /** @namespace err.SECURITY_ERR */ + /** @namespace err.NOT_READABLE_ERR */ + if (err.code === err.NOT_FOUND_ERR) { + showError(self.msgFileNotFound); + } else { + if (err.code === err.SECURITY_ERR) { + showError(self.msgFileSecured); + } else { + if (err.code === err.NOT_READABLE_ERR) { + showError(self.msgFileNotReadable); + } else { + if (err.code === err.ABORT_ERR) { + showError(self.msgFilePreviewAborted); + } else { + showError(self.msgFilePreviewError); + } + } + } + } + }, + _addError: function (msg) { + var self = this, $error = self.$errorContainer; + if (msg && $error.length) { + $h.setHtml($error, self.errorCloseButton + msg); + self._handler($error.find('.kv-error-close'), 'click', function () { + setTimeout(function () { + if (self.showPreview && !self.getFrames().length) { + self.clear(); + } + $error.fadeOut('slow'); + }, self.processDelay); + }); + } + }, + _setValidationError: function (css) { + var self = this; + css = (css ? css + ' ' : '') + 'has-error'; + self.$container.removeClass(css).addClass('has-error'); + $h.addCss(self.$caption, 'is-invalid'); + }, + _resetErrors: function (fade) { + var self = this, $error = self.$errorContainer, history = self.resumableUploadOptions.retainErrorHistory; + if (self.isPersistentError || (self.enableResumableUpload && history && !self.clearInput)) { + return; + } + self.clearInput = false; + self.isError = false; + self.$container.removeClass('has-error'); + self.$caption.removeClass('is-invalid is-valid file-processing'); + $error.html(''); + if (fade) { + $error.fadeOut('slow'); + } else { + $error.hide(); + } + }, + _showFolderError: function (folders) { + var self = this, $error = self.$errorContainer, msg; + if (!folders) { + return; + } + if (!self.isAjaxUpload) { + self._clearFileInput(); + } + msg = self.msgFoldersNotAllowed.replace('{n}', folders); + self._addError(msg); + self._setValidationError(); + $error.fadeIn(self.fadeDelay); + self._raise('filefoldererror', [folders, msg]); + }, + showUserError: function (msg, params, retainErrorHistory) { + var self = this, fileName; + if (!self.uploadInitiated) { + return; + } + if (!params || !params.fileId) { + if (!retainErrorHistory) { + self.$errorContainer.html(''); + } + } else { + if (!retainErrorHistory) { + self.$errorContainer.find('[data-file-id="' + params.fileId + '"]').remove(); + } + fileName = self.fileManager.getFileName(params.fileId); + if (fileName) { + msg = '' + fileName + ': ' + msg; + } + } + self._showFileError(msg, params, 'fileusererror'); + }, + _showFileError: function (msg, params, event) { + var self = this, $error = self.$errorContainer, ev = event || 'fileuploaderror', + fId = params && params.fileId || '', e = params && params.id ? + '
  • ' + msg + '
  • ' : + '
  • ' + msg + '
  • '; + + if ($error.find('ul').length === 0) { + self._addError('
      ' + e + '
    '); + } else { + $error.find('ul').append(e); + } + $error.fadeIn(self.fadeDelay); + self._raise(ev, [params, msg]); + self._setValidationError('file-input-new'); + return true; + }, + _showError: function (msg, params, event) { + var self = this, $error = self.$errorContainer, ev = event || 'fileerror'; + params = params || {}; + params.reader = self.reader; + self._addError(msg); + $error.fadeIn(self.fadeDelay); + self._raise(ev, [params, msg]); + if (!self.isAjaxUpload) { + self._clearFileInput(); + } + self._setValidationError('file-input-new'); + self.$btnUpload.attr('disabled', true); + return true; + }, + _noFilesError: function (params) { + var self = this, label = self.minFileCount > 1 ? self.filePlural : self.fileSingle, + msg = self.msgFilesTooLess.replace('{n}', self.minFileCount).replace('{files}', label), + $error = self.$errorContainer; + msg = '
  • ' + msg + '
  • '; + if ($error.find('ul').length === 0) { + self._addError('
      ' + msg + '
    '); + } else { + $error.find('ul').append(msg); + } + self.isError = true; + self._updateFileDetails(0); + $error.fadeIn(self.fadeDelay); + self._raise('fileerror', [params, msg]); + self._clearFileInput(); + self._setValidationError(); + }, + _parseError: function (operation, jqXHR, errorThrown, fileName) { + /** @namespace jqXHR.responseJSON */ + var self = this, errMsg = $.trim(errorThrown + ''), textPre, errText, text; + errText = jqXHR.responseJSON && jqXHR.responseJSON.error ? jqXHR.responseJSON.error.toString() : ''; + text = errText ? errText : jqXHR.responseText; + if (self.cancelling && self.msgUploadAborted) { + errMsg = self.msgUploadAborted; + } + if (self.showAjaxErrorDetails && text) { + if (errText) { + errMsg = $.trim(errText + ''); + } else { + text = $.trim(text.replace(/\n\s*\n/g, '\n')); + textPre = text.length ? '
    ' + text + '
    ' : ''; + errMsg += errMsg ? textPre : text; + } + } + if (!errMsg) { + errMsg = self.msgAjaxError.replace('{operation}', operation); + } + self.cancelling = false; + return fileName ? '' + fileName + ': ' + errMsg : errMsg; + }, + _parseFileType: function (type, name) { + var self = this, isValid, vType, cat, i, types = self.allowedPreviewTypes || []; + if (type === 'application/text-plain') { + return 'text'; + } + for (i = 0; i < types.length; i++) { + cat = types[i]; + isValid = self.fileTypeSettings[cat]; + vType = isValid(type, name) ? cat : ''; + if (!$h.isEmpty(vType)) { + return vType; + } + } + return 'other'; + }, + _getPreviewIcon: function (fname) { + var self = this, ext, out = null; + if (fname && fname.indexOf('.') > -1) { + ext = fname.split('.').pop(); + if (self.previewFileIconSettings) { + out = self.previewFileIconSettings[ext] || self.previewFileIconSettings[ext.toLowerCase()] || null; + } + if (self.previewFileExtSettings) { + $.each(self.previewFileExtSettings, function (key, func) { + if (self.previewFileIconSettings[key] && func(ext)) { + out = self.previewFileIconSettings[key]; + //noinspection UnnecessaryReturnStatementJS + return; + } + }); + } + } + return out || self.previewFileIcon; + }, + _parseFilePreviewIcon: function (content, fname) { + var self = this, icn = self._getPreviewIcon(fname), out = content; + if (out.indexOf('{previewFileIcon}') > -1) { + out = out.setTokens({'previewFileIconClass': self.previewFileIconClass, 'previewFileIcon': icn}); + } + return out; + }, + _raise: function (event, params) { + var self = this, e = $.Event(event); + if (params !== undefined) { + self.$element.trigger(e, params); + } else { + self.$element.trigger(e); + } + var out = e.result, isAborted = out === false; + if (e.isDefaultPrevented() || isAborted) { + return false; + } + if (e.type === 'filebatchpreupload' && (out || isAborted)) { + self.ajaxAborted = out; + return false; + } + switch (event) { + // ignore these events + case 'filebatchuploadcomplete': + case 'filebatchuploadsuccess': + case 'fileuploaded': + case 'fileclear': + case 'filecleared': + case 'filereset': + case 'fileerror': + case 'filefoldererror': + case 'filecustomerror': + case 'filesuccessremove': + break; + // receive data response via `filecustomerror` event` + default: + if (!self.ajaxAborted) { + self.ajaxAborted = out; + } + break; + } + return true; + }, + _listenFullScreen: function (isFullScreen) { + var self = this, $modal = self.$modal, $btnFull, $btnBord; + if (!$modal || !$modal.length) { + return; + } + $btnFull = $modal && $modal.find('.btn-kv-fullscreen'); + $btnBord = $modal && $modal.find('.btn-kv-borderless'); + if (!$btnFull.length || !$btnBord.length) { + return; + } + $btnFull.removeClass('active').attr('aria-pressed', 'false'); + $btnBord.removeClass('active').attr('aria-pressed', 'false'); + if (isFullScreen) { + $btnFull.addClass('active').attr('aria-pressed', 'true'); + } else { + $btnBord.addClass('active').attr('aria-pressed', 'true'); + } + if ($modal.hasClass('file-zoom-fullscreen')) { + self._maximizeZoomDialog(); + } else { + if (isFullScreen) { + self._maximizeZoomDialog(); + } else { + $btnBord.removeClass('active').attr('aria-pressed', 'false'); + } + } + }, + _listen: function () { + var self = this, $el = self.$element, $form = self.$form, $cont = self.$container, fullScreenEv; + self._handler($el, 'click', function (e) { + self._initFileSelected(); + if ($el.hasClass('file-no-browse')) { + if ($el.data('zoneClicked')) { + $el.data('zoneClicked', false); + } else { + e.preventDefault(); + } + } + }); + self._handler($el, 'change', $.proxy(self._change, self)); + self._handler(self.$caption, 'paste', $.proxy(self.paste, self)); + if (self.showBrowse) { + self._handler(self.$btnFile, 'click', $.proxy(self._browse, self)); + self._handler(self.$btnFile, 'keypress', function (e) { + var keycode = e.keyCode || e.which; + if (keycode === 13) { + $el.trigger('click'); + self._browse(e); + } + }); + } + self._handler($cont.find('.fileinput-remove:not([disabled])'), 'click', $.proxy(self.clear, self)); + self._handler($cont.find('.fileinput-cancel'), 'click', $.proxy(self.cancel, self)); + self._handler($cont.find('.fileinput-pause'), 'click', $.proxy(self.pause, self)); + self._initDragDrop(); + self._handler($form, 'reset', $.proxy(self.clear, self)); + if (!self.isAjaxUpload) { + self._handler($form, 'submit', $.proxy(self._submitForm, self)); + } + self._handler(self.$container.find('.fileinput-upload'), 'click', $.proxy(self._uploadClick, self)); + self._handler($(window), 'resize', function () { + self._listenFullScreen(screen.width === window.innerWidth && screen.height === window.innerHeight); + }); + fullScreenEv = 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'; + self._handler($(document), fullScreenEv, function () { + self._listenFullScreen($h.checkFullScreen()); + }); + self.$caption.on('focus', function () { + self.$captionContainer.focus(); + }); + self._autoFitContent(); + self._initClickable(); + self._refreshPreview(); + }, + _autoFitContent: function () { + var width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, + self = this, config = width < 400 ? (self.previewSettingsSmall || self.defaults.previewSettingsSmall) : + (self.previewSettings || self.defaults.previewSettings), sel; + $.each(config, function (cat, settings) { + sel = '.file-preview-frame .file-preview-' + cat; + self.$preview.find(sel + '.kv-preview-data,' + sel + ' .kv-preview-data').css(settings); + }); + }, + _scanDroppedItems: function (item, files, path) { + path = path || ''; + var self = this, i, dirReader, readDir, errorHandler = function (e) { + self._log($h.logMessages.badDroppedFiles); + self._log(e); + }; + if (item.isFile) { + item.file(function (file) { + if (path) { + file.newPath = path + file.name; + } + files.push(file); + }, errorHandler); + } else { + if (item.isDirectory) { + dirReader = item.createReader(); + readDir = function () { + dirReader.readEntries(function (entries) { + if (entries && entries.length > 0) { + for (i = 0; i < entries.length; i++) { + self._scanDroppedItems(entries[i], files, path + item.name + '/'); + } + // recursively call readDir() again, since browser can only handle first 100 entries. + readDir(); + } + return null; + }, errorHandler); + }; + readDir(); + } + } + + }, + _initDragDrop: function () { + var self = this, $zone = self.$dropZone; + if (self.dropZoneEnabled && self.showPreview) { + self._handler($zone, 'dragenter dragover', $.proxy(self._zoneDragEnter, self)); + self._handler($zone, 'dragleave', $.proxy(self._zoneDragLeave, self)); + self._handler($zone, 'drop', $.proxy(self._zoneDrop, self)); + self._handler($(document), 'dragenter dragover drop', self._zoneDragDropInit); + } + }, + _zoneDragDropInit: function (e) { + e.stopPropagation(); + e.preventDefault(); + }, + _zoneDragEnter: function (e) { + var self = this, dt = e.originalEvent.dataTransfer, hasFiles = $.inArray('Files', dt.types) > -1; + self._zoneDragDropInit(e); + if (self.isDisabled || !hasFiles) { + dt.effectAllowed = 'none'; + dt.dropEffect = 'none'; + return; + } + dt.dropEffect = 'copy'; + if (self._raise('fileDragEnter', {'sourceEvent': e, 'files': dt.types.Files})) { + $h.addCss(self.$dropZone, 'file-highlighted'); + } + }, + _zoneDragLeave: function (e) { + var self = this; + self._zoneDragDropInit(e); + if (self.isDisabled) { + return; + } + if (self._raise('fileDragLeave', {'sourceEvent': e})) { + self.$dropZone.removeClass('file-highlighted'); + } + + }, + _dropFiles: function (e, files) { + var self = this, $el = self.$element; + if (!self.isAjaxUpload) { + self.changeTriggered = true; + $el.get(0).files = files; + setTimeout(function () { + self.changeTriggered = false; + $el.trigger('change' + self.namespace); + }, self.processDelay); + } else { + self._change(e, files); + } + self.$dropZone.removeClass('file-highlighted'); + }, + _zoneDrop: function (e) { + /** @namespace e.originalEvent.dataTransfer */ + var self = this, i, $el = self.$element, dt = e.originalEvent.dataTransfer, + files = dt.files, items = dt.items, folders = $h.getDragDropFolders(items); + e.preventDefault(); + if (self.isDisabled || $h.isEmpty(files)) { + return; + } + if (!self._raise('fileDragDrop', {'sourceEvent': e, 'files': files})) { + return; + } + if (folders > 0) { + if (!self.isAjaxUpload) { + self._showFolderError(folders); + return; + } + files = []; + for (i = 0; i < items.length; i++) { + var item = items[i].webkitGetAsEntry(); + if (item) { + self._scanDroppedItems(item, files); + } + } + setTimeout(function () { + self._dropFiles(e, files); + }, 500); + } else { + self._dropFiles(e, files); + } + }, + _uploadClick: function (e) { + var self = this, $btn = self.$container.find('.fileinput-upload'), $form, + isEnabled = !$btn.hasClass('disabled') && $h.isEmpty($btn.attr('disabled')); + if (e && e.isDefaultPrevented()) { + return; + } + if (!self.isAjaxUpload) { + if (isEnabled && $btn.attr('type') !== 'submit') { + e.preventDefault(); + $form = $btn.closest('form'); + // downgrade to normal form submit if possible + if ($form.length) { + $form.trigger('submit'); + } + } + return; + } + e.preventDefault(); + if (isEnabled) { + self.upload(); + } + }, + _submitForm: function () { + var self = this; + return self._isFileSelectionValid() && !self._abort({}); + }, + _clearPreview: function () { + var self = this, + $thumbs = self.showUploadedThumbs ? self.getFrames(':not(.file-preview-success)') : self.getFrames(); + $thumbs.each(function () { + var $thumb = $(this); + $thumb.remove(); + }); + if (!self.getFrames().length || !self.showPreview) { + self._resetUpload(); + } + self._validateDefaultPreview(); + }, + _initSortable: function () { + var self = this, $el = self.$preview, settings, selector = '.' + $h.SORT_CSS, $cont, $body = $('body'), + $html = $('html'), rev = self.reversePreviewOrder, Sortable = window.Sortable, beginGrab, endGrab; + if (!Sortable || $el.find(selector).length === 0) { + return; + } + $cont = $body.length ? $body : ($html.length ? $html : self.$container); + beginGrab = function () { + $cont.addClass('file-grabbing'); + }; + endGrab = function () { + $cont.removeClass('file-grabbing'); + }; + settings = { + handle: '.drag-handle-init', + dataIdAttr: 'data-fileid', + animation: 600, + draggable: selector, + scroll: false, + forceFallback: true, + onChoose: beginGrab, + onStart: beginGrab, + onUnchoose: endGrab, + onEnd: endGrab, + onSort: function (e) { + var oldIndex = e.oldIndex, newIndex = e.newIndex, i = 0, len = self.initialPreviewConfig.length, + exceedsLast = len > 0 && newIndex >= len, $item = $(e.item), $first; + if (exceedsLast) { + newIndex = len - 1; + } + self.initialPreview = $h.moveArray(self.initialPreview, oldIndex, newIndex, rev); + self.initialPreviewConfig = $h.moveArray(self.initialPreviewConfig, oldIndex, newIndex, rev); + self.previewCache.init(); + self.getFrames('.file-preview-initial').each(function () { + $(this).attr('data-fileindex', $h.INIT_FLAG + i); + i++; + }); + if (exceedsLast) { + $first = self.getFrames(':not(.file-preview-initial):first'); + if ($first.length) { + $item.slideUp(function () { + $item.insertBefore($first).slideDown(); + }); + } + } + self._raise('filesorted', { + previewId: $item.attr('id'), + 'oldIndex': oldIndex, + 'newIndex': newIndex, + stack: self.initialPreviewConfig + }); + }, + }; + $.extend(true, settings, self.fileActionSettings.dragSettings); + if (self.sortable) { + self.sortable.destroy(); + } + self.sortable = Sortable.create($el[0], settings); + }, + _setPreviewContent: function (content) { + var self = this; + $h.setHtml(self.$preview, content); + self._autoFitContent(); + }, + _initPreviewImageOrientations: function () { + var self = this, i = 0, canOrientImage = self.canOrientImage; + if (!self.autoOrientImageInitial && !canOrientImage) { + return; + } + self.getFrames('.file-preview-initial').each(function () { + var $thumb = $(this), $img, $zoomImg, id, config = self.initialPreviewConfig[i]; + /** @namespace config.exif */ + if (config && config.exif && config.exif.Orientation) { + id = $thumb.attr('id'); + $img = $thumb.find('>.kv-file-content img'); + $zoomImg = self._getZoom(id, ' >.kv-file-content img'); + if (canOrientImage) { + $img.css('image-orientation', (self.autoOrientImageInitial ? 'from-image' : 'none')); + } else { + self.setImageOrientation($img, $zoomImg, config.exif.Orientation, $thumb); + } + } + i++; + }); + }, + _initPreview: function (isInit) { + var self = this, cap = self.initialCaption || '', out; + if (!self.previewCache.count(true)) { + self._clearPreview(); + if (isInit) { + self._setCaption(cap); + } else { + self._initCaption(); + } + return; + } + out = self.previewCache.out(); + cap = isInit && self.initialCaption ? self.initialCaption : out.caption; + self._setPreviewContent(out.content); + self._setInitThumbAttr(); + self._setCaption(cap); + self._initSortable(); + if (!$h.isEmpty(out.content)) { + self.$container.removeClass('file-input-new'); + } + self._initPreviewImageOrientations(); + }, + _getZoomButton: function (type) { + var self = this, label = self.previewZoomButtonIcons[type], css = self.previewZoomButtonClasses[type], + title = ' title="' + (self.previewZoomButtonTitles[type] || '') + '" ', tag = $h.isBs(5) ? 'bs-' : '', + params = title + (type === 'close' ? ' data-' + tag + 'dismiss="modal" aria-hidden="true"' : ''); + if (type === 'fullscreen' || type === 'borderless' || type === 'toggleheader') { + params += ' data-toggle="button" aria-pressed="false" autocomplete="off"'; + } + return ''; + }, + _getModalContent: function () { + var self = this; + return self._getLayoutTemplate('modal').setTokens({ + 'rtl': self.rtl ? ' kv-rtl' : '', + 'zoomFrameClass': self.frameClass, + 'prev': self._getZoomButton('prev'), + 'next': self._getZoomButton('next'), + 'rotate': self._getZoomButton('rotate'), + 'toggleheader': self._getZoomButton('toggleheader'), + 'fullscreen': self._getZoomButton('fullscreen'), + 'borderless': self._getZoomButton('borderless'), + 'close': self._getZoomButton('close') + }); + }, + _listenModalEvent: function (event) { + var self = this, $modal = self.$modal, getParams = function (e) { + return { + sourceEvent: e, + previewId: $modal.data('previewId'), + modal: $modal + }; + }; + $modal.on(event + '.bs.modal', function (e) { + if (e.namespace !== 'bs.modal') { + return; + } + var $btnFull = $modal.find('.btn-fullscreen'), $btnBord = $modal.find('.btn-borderless'); + if ($modal.data('fileinputPluginId') === self.$element.attr('id')) { + self._raise('filezoom' + event, getParams(e)); + } + if (event === 'shown') { + self._handleRotation($modal, $modal.find('.file-zoom-detail'), $modal.data('angle')); + $btnBord.removeClass('active').attr('aria-pressed', 'false'); + $btnFull.removeClass('active').attr('aria-pressed', 'false'); + if ($modal.hasClass('file-zoom-fullscreen')) { + self._maximizeZoomDialog(); + if ($h.checkFullScreen()) { + $btnFull.addClass('active').attr('aria-pressed', 'true'); + } else { + $btnBord.addClass('active').attr('aria-pressed', 'true'); + } + } + } + }); + }, + _initZoom: function () { + var self = this, $dialog, modalMain = self._getLayoutTemplate('modalMain'), modalId = '#' + $h.MODAL_ID; + modalMain = self._setTabIndex('modal', modalMain); + if (!self.showPreview) { + return; + } + self.$modal = $(modalId); + if (!self.$modal || !self.$modal.length) { + $dialog = $h.createElement($h.cspBuffer.stash(modalMain)).insertAfter(self.$container); + self.$modal = $(modalId).insertBefore($dialog); + $h.cspBuffer.apply(self.$modal); + $dialog.remove(); + } + $h.initModal(self.$modal); + self.$modal.html($h.cspBuffer.stash(self._getModalContent())); + $h.cspBuffer.apply(self.$modal); + $.each($h.MODAL_EVENTS, function (key, event) { + self._listenModalEvent(event); + }); + }, + _initZoomButtons: function () { + var self = this, $modal = self.$modal, previewId = $modal.data('previewId') || '', $first, $last, + thumbs = self.getFrames().toArray(), len = thumbs.length, $prev = $modal.find('.btn-kv-prev'), + $next = $modal.find('.btn-kv-next'), $rotate = $modal.find('.btn-kv-rotate'); + if (thumbs.length < 2) { + $prev.hide(); + $next.hide(); + return; + } else { + $prev.show(); + $next.show(); + } + if (!len) { + return; + } + $first = $(thumbs[0]); + $last = $(thumbs[len - 1]); + $prev.removeAttr('disabled'); + $next.removeAttr('disabled'); + if (self.reversePreviewOrder) { + [$prev, $next] = [$next, $prev]; // swap + } + if ($first.length && $first.attr('id') === previewId) { + $prev.attr('disabled', true); + } + if ($last.length && $last.attr('id') === previewId) { + $next.attr('disabled', true); + } + }, + _maximizeZoomDialog: function () { + var self = this, $modal = self.$modal, $head = $modal.find('.modal-header:visible'), + $foot = $modal.find('.modal-footer:visible'), $body = $modal.find('.kv-zoom-body'), + h = $(window).height(), diff = 0; + $modal.addClass('file-zoom-fullscreen'); + if ($head && $head.length) { + h -= $head.outerHeight(true); + } + if ($foot && $foot.length) { + h -= $foot.outerHeight(true); + } + if ($body && $body.length) { + diff = $body.outerHeight(true) - $body.height(); + h -= diff; + } + $modal.find('.kv-zoom-body').height(h); + }, + _resizeZoomDialog: function (fullScreen) { + var self = this, $modal = self.$modal, $btnFull = $modal.find('.btn-kv-fullscreen'), + $btnBord = $modal.find('.btn-kv-borderless'); + if ($modal.hasClass('file-zoom-fullscreen')) { + $h.toggleFullScreen(false); + if (!fullScreen) { + if (!$btnFull.hasClass('active')) { + $modal.removeClass('file-zoom-fullscreen'); + self.$modal.find('.kv-zoom-body').css('height', self.zoomModalHeight); + } else { + $btnFull.removeClass('active').attr('aria-pressed', 'false'); + } + } else { + if (!$btnFull.hasClass('active')) { + $modal.removeClass('file-zoom-fullscreen'); + self._resizeZoomDialog(true); + if ($btnBord.hasClass('active')) { + $btnBord.removeClass('active').attr('aria-pressed', 'false'); + } + } + } + } else { + if (!fullScreen) { + self._maximizeZoomDialog(); + return; + } + $h.toggleFullScreen(true); + } + $modal.focus(); + }, + _setZoomContent: function ($frame, navigate) { + var self = this, $content, tmplt, body, title, $body, $dataEl, config, previewId = $frame.attr('id'), + $zoomPreview = self._getZoom(previewId), $modal = self.$modal, $tmp, desc, $desc, + $btnFull = $modal.find('.btn-kv-fullscreen'), $btnBord = $modal.find('.btn-kv-borderless'), cap, size, + $btnTogh = $modal.find('.btn-kv-toggleheader'), dir = navigate === 'prev' ? 'Left' : 'Right', + slideIn = 'slideIn' + dir, slideOut = 'slideOut' + dir, parsed, zoomData = $frame.data('zoom'); + if (zoomData) { + zoomData = decodeURIComponent(zoomData); + parsed = $zoomPreview.html().replace(self.zoomPlaceholder, '').setTokens({zoomData: zoomData}); + $zoomPreview.html(parsed); + $frame.data('zoom', ''); + $zoomPreview.attr('data-zoom', zoomData); + } + tmplt = $zoomPreview.attr('data-template') || 'generic'; + $content = $zoomPreview.find('.kv-file-content'); + body = $content.length ? $content.html() : ''; + cap = $frame.data('caption') || self.msgZoomModalHeading; + size = $frame.data('size') || ''; + desc = $frame.data('description') || ''; + $modal.find('.kv-zoom-caption').attr('title', cap).html(cap); + $modal.find('.kv-zoom-size').html(size); + $desc = $modal.find('.kv-zoom-description').hide(); + if (desc) { + if (self.showDescriptionClose) { + desc = self._getLayoutTemplate('descriptionClose').setTokens({ + closeIcon: self.previewZoomButtonIcons.close + }) + '' + desc; + } + $desc.show().html(desc); + if (self.showDescriptionClose) { + self._handler($modal.find('.kv-desc-hide'), 'click', function () { + $(this).parent().fadeOut('fast', function () { + $modal.focus(); + }); + }); + } + } + $body = $modal.find('.kv-zoom-body'); + $modal.removeClass('kv-single-content'); + if (navigate) { + $tmp = $body.addClass('file-thumb-loading').clone().insertAfter($body); + $h.setHtml($body, body).hide(); + $tmp.fadeOut('fast', function () { + $body.fadeIn('fast', function () { + $body.removeClass('file-thumb-loading'); + }); + $tmp.remove(); + }); + } else { + $h.setHtml($body, body); + } + config = self.previewZoomSettings[tmplt]; + if (config) { + $dataEl = $body.find('.kv-preview-data'); + $h.addCss($dataEl, 'file-zoom-detail'); + $.each(config, function (key, value) { + $dataEl.css(key, value); + if (($dataEl.attr('width') && key === 'width') || ($dataEl.attr('height') && key === 'height')) { + $dataEl.removeAttr(key); + } + }); + } + $modal.data('previewId', previewId); + self._handler($modal.find('.btn-kv-prev'), 'click', function () { + self._zoomSlideShow('prev', previewId); + }); + self._handler($modal.find('.btn-kv-next'), 'click', function () { + self._zoomSlideShow('next', previewId); + }); + self._handler($btnFull, 'click', function () { + self._resizeZoomDialog(true); + }); + self._handler($btnBord, 'click', function () { + self._resizeZoomDialog(false); + }); + self._handler($btnTogh, 'click', function () { + var $header = $modal.find('.modal-header'), $floatBar = $modal.find('.floating-buttons'), + ht, $actions = $header.find('.kv-zoom-actions'), resize = function (height) { + var $body = self.$modal.find('.kv-zoom-body'), h = self.zoomModalHeight; + if ($modal.hasClass('file-zoom-fullscreen')) { + h = $body.outerHeight(true); + if (!height) { + h = h - $header.outerHeight(true); + } + } + $body.css('height', height ? h + height : h); + }; + if ($header.is(':visible')) { + ht = $header.outerHeight(true); + $header.slideUp('slow', function () { + $actions.find('.btn').appendTo($floatBar); + resize(ht); + }); + } else { + $floatBar.find('.btn').appendTo($actions); + $header.slideDown('slow', function () { + resize(); + }); + } + $modal.focus(); + }); + self._handler($modal, 'keydown', function (e) { + var key = e.which || e.keyCode, delay = self.processDelay + 1, $prev = $(this).find('.btn-kv-prev'), + $next = $(this).find('.btn-kv-next'), vId = $(this).data('previewId'), vPrevKey, vNextKey; + [vPrevKey, vNextKey] = self.rtl ? [39, 37] : [37, 39]; + $.each({prev: [$prev, vPrevKey], next: [$next, vNextKey]}, function (direction, config) { + var $btn = config[0], vKey = config[1]; + if (key === vKey && $btn.length) { + $modal.focus(); + if (!$btn.attr('disabled')) { + $btn.blur(); + setTimeout(function () { + $btn.focus(); + self._zoomSlideShow(direction, vId); + setTimeout(function () { + if ($btn.attr('disabled')) { + $modal.focus(); + } + }, delay); + }, delay); + } + } + }); + }); + }, + _showModal: function ($frame) { + var self = this, $modal = self.$modal, $content, css, angle; + if (!$frame || !$frame.length) { + return; + } + $h.initModal($modal); + $h.setHtml($modal, self._getModalContent()); + self._setZoomContent($frame); + $modal.removeClass('rotatable'); + $modal.data({backdrop: false, fileinputPluginId: self.$element.attr('id')}); + $modal.find('.kv-zoom-body').css('height', self.zoomModalHeight); + $content = $frame.find('.kv-file-content > :first-child'); + if ($content.length) { + css = $content.css('transform'); + if (css) { + $modal.find('.file-zoom-detail').css('transform', css); + } + } + if ($frame.hasClass('rotatable')) { + $modal.addClass('rotatable'); + } + if ($frame.data('angle')) { + $modal.data('angle', $frame.data('angle')); + } + angle = ($frame.data('angle') || 0); + $modal.modal('show'); + self._initZoomButtons(); + self._initRotateZoom($frame, $content); + }, + _zoomPreview: function ($btn) { + var self = this, $frame; + if (!$btn.length) { + throw 'Cannot zoom to detailed preview!'; + } + $frame = $btn.closest($h.FRAMES); + self._showModal($frame); + }, + _zoomSlideShow: function (dir, previewId) { + var self = this, $modal = self.$modal, $btn = $modal.find('.kv-zoom-actions .btn-kv-' + dir), $targFrame, i, + $thumb, thumbsData = self.getFrames().toArray(), thumbs = [], len = thumbsData.length, out, angle, + $content; + if (self.reversePreviewOrder) { + dir = dir === 'prev' ? 'next' : 'prev'; + } + if ($btn.attr('disabled')) { + return; + } + for (i = 0; i < len; i++) { + $thumb = $(thumbsData[i]); + if ($thumb && $thumb.length && $thumb.find('.kv-file-zoom:visible').length) { + thumbs.push(thumbsData[i]); + } + } + len = thumbs.length; + for (i = 0; i < len; i++) { + if ($(thumbs[i]).attr('id') === previewId) { + out = dir === 'prev' ? i - 1 : i + 1; + break; + } + } + if (out < 0 || out >= len || !thumbs[out]) { + return; + } + $targFrame = $(thumbs[out]); + if ($targFrame.length) { + self._setZoomContent($targFrame, dir); + } + self._initZoomButtons(); + if ($targFrame.length && $targFrame.hasClass('rotatable')) { + angle = $targFrame.data('angle') || 0; + $modal.addClass('rotatable').data('angle', angle); + $content = $targFrame.find('.kv-file-content > :first-child'); + self._initRotateZoom($targFrame, $content); + } else { + $modal.removeClass('rotatable').removeData('angle'); + } + self._raise('filezoom' + dir, {'previewId': previewId, modal: self.$modal}); + }, + _initZoomButton: function () { + var self = this; + self.$preview.find('.kv-file-zoom').each(function () { + var $el = $(this); + self._handler($el, 'click', function () { + self._zoomPreview($el); + }); + }); + }, + _inputFileCount: function () { + return this.$element[0].files.length; + }, + _refreshPreview: function () { + var self = this, files; + if ((!self._inputFileCount() && !self.isAjaxUpload) || !self.showPreview || !self.isPreviewable) { + return; + } + if (self.isAjaxUpload) { + if (self.fileManager.count() > 0) { + files = $.extend(true, [], self.getFileList()); + self.fileManager.clear(); + self._clearFileInput(); + } else { + files = self.$element[0].files; + } + } else { + files = self.$element[0].files; + } + if (files && files.length) { + self.readFiles(files); + } + }, + _clearObjects: function ($el) { + $el.find('video audio').each(function () { + this.pause(); + $(this).remove(); + }); + $el.find('img object div').each(function () { + $(this).remove(); + }); + }, + _clearFileInput: function () { + var self = this, $el = self.$element, $srcFrm, $tmpFrm, $tmpEl; + if (!self._inputFileCount()) { + return; + } + $srcFrm = $el.closest('form'); + $tmpFrm = $(document.createElement('form')); + $tmpEl = $(document.createElement('div')); + $el.before($tmpEl); + if ($srcFrm.length) { + $srcFrm.after($tmpFrm); + } else { + $tmpEl.after($tmpFrm); + } + $tmpFrm.append($el).trigger('reset'); + $tmpEl.before($el).remove(); + $tmpFrm.remove(); + }, + _resetUpload: function () { + var self = this; + self.uploadInitiated = false; + self.uploadStartTime = $h.now(); + self.uploadCache = []; + self.$btnUpload.removeAttr('disabled'); + self._setProgress(0); + self._hideProgress(); + self._resetErrors(false); + self._initAjax(); + self.fileManager.clearImages(); + self._resetCanvas(); + if (self.overwriteInitial) { + self.initialPreview = []; + self.initialPreviewConfig = []; + self.initialPreviewThumbTags = []; + self.previewCache.data = { + content: [], + config: [], + tags: [] + }; + } + }, + _resetCanvas: function () { + var self = this; + if (self.imageCanvas && self.imageCanvasContext) { + self.imageCanvasContext.clearRect(0, 0, self.imageCanvas.width, self.imageCanvas.height); + } + }, + _hasInitialPreview: function () { + var self = this; + return !self.overwriteInitial && self.previewCache.count(true); + }, + _resetPreview: function () { + var self = this, out, cap, $div, hasSuc = self.showUploadedThumbs, hasErr = !self.removeFromPreviewOnError, + includeProcessed = (hasSuc || hasErr) && self.isDuplicateError; + if (self.previewCache.count(true)) { + out = self.previewCache.out(); + if (includeProcessed) { + $div = $h.createElement('').insertAfter(self.$container); + self.getFrames().each(function () { + var $thumb = $(this); + if ((hasSuc && $thumb.hasClass('file-preview-success')) || + (hasErr && $thumb.hasClass('file-preview-error'))) { + $div.append($thumb); + } + }); + } + self._setPreviewContent(out.content); + self._setInitThumbAttr(); + cap = self.initialCaption ? self.initialCaption : out.caption; + self._setCaption(cap); + if (includeProcessed) { + $div.contents().appendTo(self.$preview); + $div.remove(); + } + } else { + self._clearPreview(); + self._initCaption(); + } + if (self.showPreview) { + self._initZoom(); + self._initSortable(); + } + self.isDuplicateError = false; + }, + _clearDefaultPreview: function () { + var self = this; + self.$preview.find('.file-default-preview').remove(); + }, + _validateDefaultPreview: function () { + var self = this; + if (!self.showPreview || $h.isEmpty(self.defaultPreviewContent)) { + return; + } + self._setPreviewContent('
    ' + self.defaultPreviewContent + '
    '); + self.$container.removeClass('file-input-new'); + self._initClickable(); + }, + _resetPreviewThumbs: function (isAjax) { + var self = this, out; + if (isAjax) { + self._clearPreview(); + self.clearFileStack(); + return; + } + if (self._hasInitialPreview()) { + out = self.previewCache.out(); + self._setPreviewContent(out.content); + self._setInitThumbAttr(); + self._setCaption(out.caption); + self._initPreviewActions(); + } else { + self._clearPreview(); + } + }, + _getLayoutTemplate: function (t) { + var self = this, template = self.layoutTemplates[t]; + if ($h.isEmpty(self.customLayoutTags)) { + return template; + } + return $h.replaceTags(template, self.customLayoutTags); + }, + _getPreviewTemplate: function (t) { + var self = this, templates = self.previewTemplates, template = templates[t] || templates.other; + if ($h.isEmpty(self.customPreviewTags)) { + return template; + } + return $h.replaceTags(template, self.customPreviewTags); + }, + _getOutData: function (formdata, jqXHR, responseData, filesData) { + var self = this; + jqXHR = jqXHR || {}; + responseData = responseData || {}; + filesData = filesData || self.fileManager.list(); + return { + formdata: formdata, + files: filesData, + filenames: self.filenames, + filescount: self.getFilesCount(), + extra: self._getExtraData(), + response: responseData, + reader: self.reader, + jqXHR: jqXHR + }; + }, + _getMsgSelected: function (n, processing) { + var self = this, strFiles = n === 1 ? self.fileSingle : self.filePlural; + return n > 0 ? self.msgSelected.replace('{n}', n).replace('{files}', strFiles) : + (processing ? self.msgProcessing : self.msgNoFilesSelected); + }, + _getFrame: function (id, skipWarning) { + var self = this, $frame = $h.getFrameElement(self.$preview, id); + if (self.showPreview && !skipWarning && !$frame.length) { + self._log($h.logMessages.invalidThumb, {id: id}); + } + return $frame; + }, + _getZoom: function (id, selector) { + var self = this, $frame = $h.getZoomElement(self.$preview, id, selector); + if (self.showPreview && !$frame.length) { + self._log($h.logMessages.invalidThumb, {id: id}); + } + return $frame; + }, + _getThumbs: function (css) { + css = css || ''; + return this.getFrames(':not(.file-preview-initial)' + css); + }, + _getThumbId: function (fileId) { + var self = this; + return self.previewInitId + '-' + fileId; + }, + _getExtraData: function (fileId, index) { + var self = this, data = self.uploadExtraData; + if (typeof self.uploadExtraData === 'function') { + data = self.uploadExtraData(fileId, index); + } + return data; + }, + _initXhr: function (xhrobj, fileId) { + var self = this, fm = self.fileManager, func = function (event) { + var pct = 0, total = event.total, loaded = event.loaded || event.position, + stats = fm.getUploadStats(fileId, loaded, total); + /** @namespace event.lengthComputable */ + if (event.lengthComputable && !self.enableResumableUpload) { + pct = $h.round(loaded / total * 100); + } + if (fileId) { + self._setFileUploadStats(fileId, pct, stats); + } else { + self._setProgress(pct, null, null, self._getStats(stats)); + } + self._raise('fileajaxprogress', [stats]); + }; + if (xhrobj.upload) { + if (self.progressDelay) { + func = $h.debounce(func, self.progressDelay); + } + xhrobj.upload.addEventListener('progress', func, false); + } + return xhrobj; + }, + _initAjaxSettings: function () { + var self = this; + self._ajaxSettings = $.extend(true, {}, self.ajaxSettings); + self._ajaxDeleteSettings = $.extend(true, {}, self.ajaxDeleteSettings); + }, + _mergeAjaxCallback: function (funcName, srcFunc, type) { + var self = this, settings = self._ajaxSettings, flag = self.mergeAjaxCallbacks, targFunc; + if (type === 'delete') { + settings = self._ajaxDeleteSettings; + flag = self.mergeAjaxDeleteCallbacks; + } + targFunc = settings[funcName]; + if (flag && typeof targFunc === 'function') { + if (flag === 'before') { + settings[funcName] = function () { + targFunc.apply(this, arguments); + srcFunc.apply(this, arguments); + }; + } else { + settings[funcName] = function () { + srcFunc.apply(this, arguments); + targFunc.apply(this, arguments); + }; + } + } else { + settings[funcName] = srcFunc; + } + }, + _ajaxSubmit: function (fnBefore, fnSuccess, fnComplete, fnError, formdata, fileId, index, vUrl) { + var self = this, settings, defaults, data, tm = self.taskManager; + if (!self._raise('filepreajax', [formdata, fileId, index])) { + return; + } + formdata.append('initialPreview', JSON.stringify(self.initialPreview)); + formdata.append('initialPreviewConfig', JSON.stringify(self.initialPreviewConfig)); + formdata.append('initialPreviewThumbTags', JSON.stringify(self.initialPreviewThumbTags)); + self._initAjaxSettings(); + self._mergeAjaxCallback('beforeSend', fnBefore); + self._mergeAjaxCallback('success', fnSuccess); + self._mergeAjaxCallback('complete', fnComplete); + self._mergeAjaxCallback('error', fnError); + vUrl = vUrl || self.uploadUrlThumb || self.uploadUrl; + if (typeof vUrl === 'function') { + vUrl = vUrl(); + } + data = self._getExtraData(fileId, index) || {}; + if (typeof data === 'object') { + $.each(data, function (key, value) { + formdata.append(key, value); + }); + } + defaults = { + xhr: function () { + var xhrobj = $.ajaxSettings.xhr(); + return self._initXhr(xhrobj, fileId); + }, + url: self._encodeURI(vUrl), + type: 'POST', + dataType: 'json', + data: formdata, + cache: false, + processData: false, + contentType: false + }; + settings = $.extend(true, {}, defaults, self._ajaxSettings); + self.ajaxQueue.push(settings); + tm.addTask(fileId + '-' + index, function () { + var self = this.self, config, xhr; + config = self.ajaxQueue.shift(); + xhr = $.ajax(config); + self.ajaxRequests.push(xhr); + }).runWithContext({self: self}); + }, + _mergeArray: function (prop, content) { + var self = this, arr1 = $h.cleanArray(self[prop]), arr2 = $h.cleanArray(content); + self[prop] = arr1.concat(arr2); + }, + _initUploadSuccess: function (out, $thumb, allFiles) { + var self = this, append, data, index, $div, content, config, tags, id, i; + if (!self.showPreview || typeof out !== 'object' || $.isEmptyObject(out)) { + self._resetCaption(); + return; + } + if (out.initialPreview !== undefined && out.initialPreview.length > 0) { + self.hasInitData = true; + content = out.initialPreview || []; + config = out.initialPreviewConfig || []; + tags = out.initialPreviewThumbTags || []; + append = out.append === undefined || out.append; + if (content.length > 0 && !$h.isArray(content)) { + content = content.split(self.initialPreviewDelimiter); + } + if (content.length) { + self._mergeArray('initialPreview', content); + self._mergeArray('initialPreviewConfig', config); + self._mergeArray('initialPreviewThumbTags', tags); + } + if ($thumb !== undefined) { + if (!allFiles) { + index = self.previewCache.add(content[0], config[0], tags[0], append); + data = self.previewCache.get(index, false); + $div = $h.createElement(data).hide().appendTo($thumb); + $thumb.fadeOut('slow', function () { + var $newThumb = $div.find('> .file-preview-frame'); + if ($newThumb && $newThumb.length) { + $newThumb.insertBefore($thumb).fadeIn('slow').css('display:inline-block'); + } + self._initPreviewActions(); + self._clearFileInput(); + $thumb.remove(); + $div.remove(); + self._initSortable(); + }); + } else { + id = $thumb.attr('id'); + i = self._getUploadCacheIndex(id); + if (i !== null) { + self.uploadCache[i] = { + id: id, + content: content[0], + config: config[0] || [], + tags: tags[0] || [], + append: append + }; + } + } + } else { + self.previewCache.set(content, config, tags, append); + self._initPreview(); + self._initPreviewActions(); + } + } + self._resetCaption(); + }, + _getUploadCacheIndex: function (id) { + var self = this, i, len = self.uploadCache.length, config; + for (i = 0; i < len; i++) { + config = self.uploadCache[i]; + if (config.id === id) { + return i; + } + } + return null; + }, + _initSuccessThumbs: function () { + var self = this; + if (!self.showPreview) { + return; + } + setTimeout(function () { + self._getThumbs($h.FRAMES + '.file-preview-success').each(function () { + var $thumb = $(this), $remove = $thumb.find('.kv-file-remove'); + $remove.removeAttr('disabled'); + self._handler($remove, 'click', function () { + var id = $thumb.attr('id'), + out = self._raise('filesuccessremove', [id, $thumb.attr('data-fileindex')]); + $h.cleanMemory($thumb); + if (out === false) { + return; + } + self.$caption.attr('title', ''); + $thumb.fadeOut('slow', function () { + var fm = self.fileManager; + $thumb.remove(); + if (!self.getFrames().length) { + self.reset(); + } + }); + }); + }); + }, self.processDelay); + }, + _updateInitialPreview: function () { + var self = this, u = self.uploadCache; + if (self.showPreview) { + $.each(u, function (key, setting) { + self.previewCache.add(setting.content, setting.config, setting.tags, setting.append); + }); + if (self.hasInitData) { + self._initPreview(); + self._initPreviewActions(); + } + } + }, + _getThumbFileId: function ($thumb) { + var self = this; + if (self.showPreview && $thumb !== undefined) { + return $thumb.attr('data-fileid'); + } + return null; + }, + _getThumbFile: function ($thumb) { + var self = this, id = self._getThumbFileId($thumb); + return id ? self.fileManager.getFile(id) : null; + }, + _uploadSingle: function (i, id, isBatch, deferrer) { + var self = this, fm = self.fileManager, count = fm.count(), formdata = new FormData(), outData, + previewId = self._getThumbId(id), $thumb, chkComplete, $btnUpload, $btnDelete, + hasPostData = count > 0 || !$.isEmptyObject(self.uploadExtraData), uploadFailed, $prog, fnBefore, + errMsg, fnSuccess, fnComplete, fnError, updateUploadLog, op = self.ajaxOperations.uploadThumb, + fileObj = fm.getFile(id), params = {id: previewId, index: i, fileId: id}, + fileName = self.fileManager.getFileName(id, true), resolve = function () { + if (deferrer && deferrer.resolve) { + deferrer.resolve(); + } + }, reject = function () { + if (deferrer && deferrer.reject) { + deferrer.reject(); + } + }; + if (self.enableResumableUpload) { // not enabled for resumable uploads + return; + } + self.uploadInitiated = true; + if (self.showPreview) { + $thumb = fm.getThumb(id); + $prog = $thumb.find('.file-thumb-progress'); + $btnUpload = $thumb.find('.kv-file-upload'); + $btnDelete = $thumb.find('.kv-file-remove'); + $prog.show(); + } + if (count === 0 || !hasPostData || (self.showPreview && $btnUpload && $btnUpload.hasClass('disabled')) || + self._abort(params)) { + return; + } + updateUploadLog = function () { + if (!uploadFailed) { + fm.removeFile(id); + } else { + fm.errors.push(id); + } + fm.setProcessed(id); + if (fm.isProcessed()) { + self.fileBatchCompleted = true; + chkComplete(); + } + }; + chkComplete = function () { + var $initThumbs; + if (!self.fileBatchCompleted) { + return; + } + setTimeout(function () { + var triggerReset = fm.count() === 0, errCount = fm.errors.length; + self._updateInitialPreview(); + self.unlock(triggerReset); + if (triggerReset) { + self._clearFileInput(); + } + $initThumbs = self.$preview.find('.file-preview-initial'); + if (self.uploadAsync && $initThumbs.length) { + $h.addCss($initThumbs, $h.SORT_CSS); + self._initSortable(); + } + self._raise('filebatchuploadcomplete', [fm.stack, self._getExtraData()]); + if (!self.retryErrorUploads || errCount === 0) { + fm.clear(); + } + self._setProgress(101); + self.ajaxAborted = false; + self.uploadInitiated = false; + }, self.processDelay); + }; + fnBefore = function (jqXHR) { + outData = self._getOutData(formdata, jqXHR); + fm.initStats(id); + self.fileBatchCompleted = false; + if (!isBatch) { + self.ajaxAborted = false; + } + if (self.showPreview) { + if (!$thumb.hasClass('file-preview-success')) { + self._setThumbStatus($thumb, 'Loading'); + $h.addCss($thumb, 'file-uploading'); + } + $btnUpload.attr('disabled', true); + $btnDelete.attr('disabled', true); + } + if (!isBatch) { + self.lock(); + } + if (fm.errors.indexOf(id) !== -1) { + delete fm.errors[id]; + } + self._raise('filepreupload', [outData, previewId, i, self._getThumbFileId($thumb)]); + $.extend(true, params, outData); + if (self._abort(params)) { + jqXHR.abort(); + + if (!isBatch) { + self._setThumbStatus($thumb, 'New'); + $thumb.removeClass('file-uploading'); + $btnUpload.removeAttr('disabled'); + $btnDelete.removeAttr('disabled'); + } + self._setProgressCancelled(); + } + }; + fnSuccess = function (data, textStatus, jqXHR) { + var pid = self.showPreview && $thumb.attr('id') ? $thumb.attr('id') : previewId; + outData = self._getOutData(formdata, jqXHR, data); + $.extend(true, params, outData); + setTimeout(function () { + if ($h.isEmpty(data) || $h.isEmpty(data.error)) { + if (self.showPreview) { + self._setThumbStatus($thumb, 'Success'); + $btnUpload.hide(); + self._initUploadSuccess(data, $thumb, isBatch); + self._setProgress(101, $prog); + } + self._raise('fileuploaded', [outData, pid, i, self._getThumbFileId($thumb)]); + if (!isBatch) { + self.fileManager.remove($thumb); + } else { + updateUploadLog(); + resolve(); + } + } else { + uploadFailed = true; + errMsg = self._parseError(op, jqXHR, self.msgUploadError, self.fileManager.getFileName(id)); + self._showFileError(errMsg, params); + self._setPreviewError($thumb, true); + if (!self.retryErrorUploads) { + $btnUpload.hide(); + } + if (isBatch) { + updateUploadLog(); + resolve(); + } + self._setProgress(101, self._getFrame(pid).find('.file-thumb-progress'), + self.msgUploadError); + } + }, self.processDelay); + }; + fnComplete = function () { + if (self.showPreview) { + $btnUpload.removeAttr('disabled'); + $btnDelete.removeAttr('disabled'); + $thumb.removeClass('file-uploading'); + } + if (!isBatch) { + self.unlock(false); + self._clearFileInput(); + } else { + chkComplete(); + } + self._initSuccessThumbs(); + }; + fnError = function (jqXHR, textStatus, errorThrown) { + errMsg = self._parseError(op, jqXHR, errorThrown, self.fileManager.getFileName(id)); + uploadFailed = true; + setTimeout(function () { + var $prog; + if (isBatch) { + updateUploadLog(); + reject(); + } + self.fileManager.setProgress(id, 100); + self._setPreviewError($thumb, true); + if (!self.retryErrorUploads) { + $btnUpload.hide(); + } + $.extend(true, params, self._getOutData(formdata, jqXHR)); + self._setProgress(101, self.$progress, self.msgAjaxProgressError.replace('{operation}', op)); + $prog = self.showPreview && $thumb ? $thumb.find('.file-thumb-progress') : ''; + self._setProgress(101, $prog, self.msgUploadError); + self._showFileError(errMsg, params); + }, self.processDelay); + }; + self._setFileData(formdata, fileObj.file, fileName, id); + self._setUploadData(formdata, {fileId: id}); + self._ajaxSubmit(fnBefore, fnSuccess, fnComplete, fnError, formdata, id, i); + }, + _setFileData: function (formdata, file, fileName, fileId) { + var self = this, preProcess = self.preProcessUpload; + if (preProcess && typeof preProcess === 'function') { + formdata.append(self.uploadFileAttr, preProcess(fileId, file)); + } else { + formdata.append(self.uploadFileAttr, file, fileName); + } + }, + _checkBatchPreupload: function (outData, jqXHR) { + var self = this, out = self._raise('filebatchpreupload', [outData]); + if (out) { + return true; + } + self._abort(outData); + if (jqXHR) { + jqXHR.abort(); + } + self._getThumbs().each(function () { + var $thumb = $(this), $btnUpload = $thumb.find('.kv-file-upload'), + $btnDelete = $thumb.find('.kv-file-remove'); + if ($thumb.hasClass('file-preview-loading')) { + self._setThumbStatus($thumb, 'New'); + $thumb.removeClass('file-uploading'); + } + $btnUpload.removeAttr('disabled'); + $btnDelete.removeAttr('disabled'); + }); + self._setProgressCancelled(); + return false; + }, + _uploadBatch: function () { + var self = this, fm = self.fileManager, total = fm.total(), params = {}, fnBefore, fnSuccess, fnError, + fnComplete, hasPostData = total > 0 || !$.isEmptyObject(self.uploadExtraData), errMsg, + setAllUploaded, formdata = new FormData(), op = self.ajaxOperations.uploadBatch; + if (total === 0 || !hasPostData || self._abort(params)) { + return; + } + setAllUploaded = function () { + self.fileManager.clear(); + self._clearFileInput(); + }; + fnBefore = function (jqXHR) { + self.lock(); + fm.initStats(); + var outData = self._getOutData(formdata, jqXHR); + self.ajaxAborted = false; + if (self.showPreview) { + self._getThumbs().each(function () { + var $thumb = $(this), $btnUpload = $thumb.find('.kv-file-upload'), + $btnDelete = $thumb.find('.kv-file-remove'); + if (!$thumb.hasClass('file-preview-success')) { + self._setThumbStatus($thumb, 'Loading'); + $h.addCss($thumb, 'file-uploading'); + } + $btnUpload.attr('disabled', true); + $btnDelete.attr('disabled', true); + }); + } + self._checkBatchPreupload(outData, jqXHR); + }; + fnSuccess = function (data, textStatus, jqXHR) { + /** @namespace data.errorkeys */ + var outData = self._getOutData(formdata, jqXHR, data), key = 0, + $thumbs = self._getThumbs(':not(.file-preview-success)'), + keys = $h.isEmpty(data) || $h.isEmpty(data.errorkeys) ? [] : data.errorkeys; + + if ($h.isEmpty(data) || $h.isEmpty(data.error)) { + self._raise('filebatchuploadsuccess', [outData]); + setAllUploaded(); + if (self.showPreview) { + $thumbs.each(function () { + var $thumb = $(this); + self._setThumbStatus($thumb, 'Success'); + $thumb.removeClass('file-uploading'); + $thumb.find('.kv-file-upload').hide().removeAttr('disabled'); + }); + self._initUploadSuccess(data); + } else { + self.reset(); + } + self._setProgress(101); + } else { + if (self.showPreview) { + $thumbs.each(function () { + var $thumb = $(this); + $thumb.removeClass('file-uploading'); + $thumb.find('.kv-file-upload').removeAttr('disabled'); + $thumb.find('.kv-file-remove').removeAttr('disabled'); + if (keys.length === 0 || $.inArray(key, keys) !== -1) { + self._setPreviewError($thumb, true); + if (!self.retryErrorUploads) { + $thumb.find('.kv-file-upload').hide(); + self.fileManager.remove($thumb); + } + } else { + $thumb.find('.kv-file-upload').hide(); + self._setThumbStatus($thumb, 'Success'); + self.fileManager.remove($thumb); + } + if (!$thumb.hasClass('file-preview-error') || self.retryErrorUploads) { + key++; + } + }); + self._initUploadSuccess(data); + } + errMsg = self._parseError(op, jqXHR, self.msgUploadError); + self._showFileError(errMsg, outData, 'filebatchuploaderror'); + self._setProgress(101, self.$progress, self.msgUploadError); + } + }; + fnComplete = function () { + self.unlock(); + self._initSuccessThumbs(); + self._clearFileInput(); + self._raise('filebatchuploadcomplete', [self.fileManager.stack, self._getExtraData()]); + }; + fnError = function (jqXHR, textStatus, errorThrown) { + var outData = self._getOutData(formdata, jqXHR); + errMsg = self._parseError(op, jqXHR, errorThrown); + self._showFileError(errMsg, outData, 'filebatchuploaderror'); + self.uploadFileCount = total - 1; + if (!self.showPreview) { + return; + } + self._getThumbs().each(function () { + var $thumb = $(this); + $thumb.removeClass('file-uploading'); + if (self._getThumbFile($thumb)) { + self._setPreviewError($thumb); + } + }); + self._getThumbs().removeClass('file-uploading'); + self._getThumbs(' .kv-file-upload').removeAttr('disabled'); + self._getThumbs(' .kv-file-delete').removeAttr('disabled'); + self._setProgress(101, self.$progress, self.msgAjaxProgressError.replace('{operation}', op)); + }; + var ctr = 0; + $.each(self.fileManager.stack, function (key, data) { + if (!$h.isEmpty(data.file)) { + self._setFileData(formdata, data.file, (data.nameFmt || ('untitled_' + ctr)), key); + } + ctr++; + }); + self._ajaxSubmit(fnBefore, fnSuccess, fnComplete, fnError, formdata); + }, + _uploadExtraOnly: function () { + var self = this, params = {}, fnBefore, fnSuccess, fnComplete, fnError, formdata = new FormData(), errMsg, + op = self.ajaxOperations.uploadExtra; + fnBefore = function (jqXHR) { + self.lock(); + var outData = self._getOutData(formdata, jqXHR); + self._setProgress(50); + params.data = outData; + params.xhr = jqXHR; + self._checkBatchPreupload(outData, jqXHR); + }; + fnSuccess = function (data, textStatus, jqXHR) { + var outData = self._getOutData(formdata, jqXHR, data); + if ($h.isEmpty(data) || $h.isEmpty(data.error)) { + self._raise('filebatchuploadsuccess', [outData]); + self._clearFileInput(); + self._initUploadSuccess(data); + self._setProgress(101); + } else { + errMsg = self._parseError(op, jqXHR, self.msgUploadError); + self._showFileError(errMsg, outData, 'filebatchuploaderror'); + } + }; + fnComplete = function () { + self.unlock(); + self._clearFileInput(); + self._raise('filebatchuploadcomplete', [self.fileManager.stack, self._getExtraData()]); + }; + fnError = function (jqXHR, textStatus, errorThrown) { + var outData = self._getOutData(formdata, jqXHR); + errMsg = self._parseError(op, jqXHR, errorThrown); + params.data = outData; + self._showFileError(errMsg, outData, 'filebatchuploaderror'); + self._setProgress(101, self.$progress, self.msgAjaxProgressError.replace('{operation}', op)); + }; + self._ajaxSubmit(fnBefore, fnSuccess, fnComplete, fnError, formdata); + }, + _deleteFileIndex: function ($frame) { + var self = this, ind = $frame.attr('data-fileindex'), rev = self.reversePreviewOrder; + if (ind.substring(0, 5) === $h.INIT_FLAG) { + ind = parseInt(ind.replace($h.INIT_FLAG, '')); + self.initialPreview = $h.spliceArray(self.initialPreview, ind, rev); + self.initialPreviewConfig = $h.spliceArray(self.initialPreviewConfig, ind, rev); + self.initialPreviewThumbTags = $h.spliceArray(self.initialPreviewThumbTags, ind, rev); + self.getFrames().each(function () { + var $nFrame = $(this), nInd = $nFrame.attr('data-fileindex'); + if (nInd.substring(0, 5) === $h.INIT_FLAG) { + nInd = parseInt(nInd.replace($h.INIT_FLAG, '')); + if (nInd > ind) { + nInd--; + $nFrame.attr('data-fileindex', $h.INIT_FLAG + nInd); + } + } + }); + } + }, + _resetCaption: function () { + var self = this; + setTimeout(function () { + var cap = '', n, chk = self.previewCache.count(true), len = self.fileManager.count(), file, + incomplete = ':not(.file-preview-success):not(.file-preview-error)', cfg, + hasThumb = self.showPreview && self.getFrames(incomplete).length; + if (len === 0 && chk === 0 && !hasThumb) { + self.reset(); + } else { + n = chk + len; + if (n > 1) { + cap = self._getMsgSelected(n); + } else { + if (len === 0) { + cfg = self.initialPreviewConfig[0]; + cap = ''; + if (cfg) { + cap = cfg.caption || cfg.filename || ''; + } + if (!cap) { + cap = self._getMsgSelected(n); + } + } else { + file = self.fileManager.getFirstFile(); + cap = file ? file.nameFmt : '_'; + } + } + self._setCaption(cap); + } + }, self.processDelay); + }, + _handleRotation: function ($el, $content, angle) { + var self = this, css, newCss, addCss = '', scale = 1, elContent = $content[0], quadrant, transform, h, w, + wNew, $parent = $content.parent(), hParent, wParent, $body = $('body'), bodyExists = !!$body.length; + if (bodyExists) { + $body.addClass('kv-overflow-hidden'); + } + if (!$content.length || $el.hasClass('hide-rotate')) { + if (bodyExists) { + $body.removeClass('kv-overflow-hidden'); + } + return; + } + transform = $content.css('transform'); + if (transform) { + $content.css('transform', 'none'); + } + if (transform) { + $content.css('transform', transform); + } + angle = angle || 0; + quadrant = angle % 360; + css = 'rotate(' + angle + 'deg)'; + newCss = 'rotate(' + quadrant + 'deg)'; + addCss = ''; + if (quadrant === 90 || quadrant === 270) { + w = elContent.naturalWidth || $content.outerWidth() || 0; + h = elContent.naturalHeight || $content.outerHeight() || 0; + scale = w > h && w != 0 ? (h / w).toFixed(2) : 1; + if ($parent.length) { + hParent = $parent.height(); + wParent = $parent.width(); + wNew = Math.min(w, wParent); + if (hParent > scale * wNew) { + scale = wNew > hParent && wNew != 0 ? (hParent / wNew).toFixed(2) : 1; + } + } + if (scale !== 1) { + addCss = ' scale(' + scale + ')'; + } + } + $content.addClass('rotate-animate').css('transform', css + addCss); + setTimeout(function () { + $content.removeClass('rotate-animate').css('transform', newCss + addCss); + if (bodyExists) { + $body.removeClass('kv-overflow-hidden'); + } + $el.data('angle', quadrant); + }, self.fadeDelay); + }, + _initRotateButton: function () { + var self = this; + self.getFrames('.rotatable .kv-file-rotate').each(function () { + var $el = $(this), $frame = $el.closest($h.FRAMES), + $content = $frame.find('.kv-file-content > :first-child'); + self._handler($el, 'click', function () { + var angle = ($frame.data('angle') || 0) + 90; + self._handleRotation($frame, $content, angle); + }); + }); + }, + _initRotateZoom: function ($frame, $content) { + var self = this, $modal = self.$modal, $rotate = $modal.find('.btn-kv-rotate'), + angle = $frame.data('angle'); + $modal.data('angle', angle); + if ($rotate.length) { + $rotate.off('click'); + if ($modal.hasClass('rotatable')) { + $rotate.on('click', function () { + angle = ($modal.data('angle') || 0) + 90; + $modal.data('angle', angle); + self._handleRotation($modal, $modal.find('.file-zoom-detail'), angle); + self._handleRotation($frame, $content, angle); + if ($frame.hasClass('hide-rotate')) { + $frame.data('angle', angle); + } + }); + } + } + }, + _initFileActions: function () { + var self = this; + if (!self.showPreview) { + return; + } + self._initZoomButton(); + self._initRotateButton(); + self.getFrames(' .kv-file-remove').each(function () { + var $el = $(this), $frame = $el.closest($h.FRAMES), hasError, id = $frame.attr('id'), + ind = $frame.attr('data-fileindex'), status, fm = self.fileManager; + self._handler($el, 'click', function () { + status = self._raise('filepreremove', [id, ind]); + if (status === false || !self._validateMinCount()) { + return false; + } + hasError = $frame.hasClass('file-preview-error'); + $h.cleanMemory($frame); + $frame.fadeOut('slow', function () { + self.fileManager.remove($frame); + self._clearObjects($frame); + $frame.remove(); + if (id && hasError) { + self.$errorContainer.find('li[data-thumb-id="' + id + '"]').fadeOut('fast', function () { + $(this).remove(); + if (!self._errorsExist()) { + self._resetErrors(); + } + }); + } + self._clearFileInput(); + self._resetCaption(); + self._raise('fileremoved', [id, ind]); + }); + }); + }); + self.getFrames(' .kv-file-upload').each(function () { + var $el = $(this); + self._handler($el, 'click', function () { + var $frame = $el.closest($h.FRAMES), fileId = self._getThumbFileId($frame); + self._hideProgress(); + if ($frame.hasClass('file-preview-error') && !self.retryErrorUploads) { + return; + } + self._uploadSingle(self.fileManager.getIndex(fileId), fileId, false); + }); + }); + }, + _initPreviewActions: function () { + var self = this, $preview = self.$preview, deleteExtraData = self.deleteExtraData || {}, + btnRemove = $h.FRAMES + ' .kv-file-remove', settings = self.fileActionSettings, + origClass = settings.removeClass, errClass = settings.removeErrorClass, + resetProgress = function () { + var hasFiles = self.isAjaxUpload ? self.previewCache.count(true) : self._inputFileCount(); + if (!self.getFrames().length && !hasFiles) { + self._setCaption(''); + self.reset(); + self.initialCaption = ''; + } else { + self._resetCaption(); + } + }; + self._initZoomButton(); + self._initRotateButton(); + $preview.find(btnRemove).each(function () { + var $el = $(this), vUrl = $el.data('url') || self.deleteUrl, vKey = $el.data('key'), errMsg, fnBefore, + fnSuccess, fnError, op = self.ajaxOperations.deleteThumb; + if ($h.isEmpty(vUrl) || vKey === undefined) { + return; + } + if (typeof vUrl === 'function') { + vUrl = vUrl(); + } + var $frame = $el.closest($h.FRAMES), cache = self.previewCache.data, settings, params, config, + fileName, extraData, index = $frame.attr('data-fileindex'); + index = parseInt(index.replace($h.INIT_FLAG, '')); + config = $h.isEmpty(cache.config) && $h.isEmpty(cache.config[index]) ? null : cache.config[index]; + extraData = $h.isEmpty(config) || $h.isEmpty(config.extra) ? deleteExtraData : config.extra; + fileName = config && (config.filename || config.caption) || ''; + if (typeof extraData === 'function') { + extraData = extraData(); + } + params = {id: $el.attr('id'), key: vKey, extra: extraData}; + fnBefore = function (jqXHR) { + self.ajaxAborted = false; + self._raise('filepredelete', [vKey, jqXHR, extraData]); + if (self._abort()) { + jqXHR.abort(); + } else { + $el.removeClass(errClass); + $h.addCss($frame, 'file-uploading'); + $h.addCss($el, 'disabled ' + origClass); + } + }; + fnSuccess = function (data, textStatus, jqXHR) { + var n, cap; + if (!$h.isEmpty(data) && !$h.isEmpty(data.error)) { + params.jqXHR = jqXHR; + params.response = data; + errMsg = self._parseError(op, jqXHR, self.msgDeleteError, fileName); + self._showFileError(errMsg, params, 'filedeleteerror'); + $frame.removeClass('file-uploading'); + $el.removeClass('disabled ' + origClass).addClass(errClass); + resetProgress(); + return; + } + $frame.removeClass('file-uploading').addClass('file-deleted'); + $frame.fadeOut('slow', function () { + index = parseInt(($frame.attr('data-fileindex')).replace($h.INIT_FLAG, '')); + self.previewCache.unset(index); + self._deleteFileIndex($frame); + n = self.previewCache.count(true); + cap = n > 0 ? self._getMsgSelected(n) : ''; + self._setCaption(cap); + self._raise('filedeleted', [vKey, jqXHR, extraData]); + self._clearObjects($frame); + $frame.remove(); + resetProgress(); + }); + }; + fnError = function (jqXHR, textStatus, errorThrown) { + var errMsg = self._parseError(op, jqXHR, errorThrown, fileName); + params.jqXHR = jqXHR; + params.response = {}; + self._showFileError(errMsg, params, 'filedeleteerror'); + $frame.removeClass('file-uploading'); + $el.removeClass('disabled ' + origClass).addClass(errClass); + resetProgress(); + }; + self._initAjaxSettings(); + self._mergeAjaxCallback('beforeSend', fnBefore, 'delete'); + self._mergeAjaxCallback('success', fnSuccess, 'delete'); + self._mergeAjaxCallback('error', fnError, 'delete'); + settings = $.extend(true, {}, { + url: self._encodeURI(vUrl), + type: 'POST', + dataType: 'json', + data: $.extend(true, {}, {key: vKey}, extraData) + }, self._ajaxDeleteSettings); + self._handler($el, 'click', function () { + if (!self._validateMinCount()) { + return false; + } + self.ajaxAborted = false; + self._raise('filebeforedelete', [vKey, extraData]); + if (self.ajaxAborted instanceof Promise) { + self.ajaxAborted.then(function (result) { + if (!result) { + $.ajax(settings); + } + }); + } else { + if (!self.ajaxAborted) { + $.ajax(settings); + } + } + }); + }); + }, + _hideFileIcon: function () { + var self = this; + if (self.overwriteInitial) { + self.$captionContainer.removeClass('icon-visible'); + } + }, + _showFileIcon: function () { + var self = this; + $h.addCss(self.$captionContainer, 'icon-visible'); + }, + _getSize: function (bytes, skipTemplate, sizeUnits) { + var self = this, size = parseFloat(bytes), i = 0, factor = self.bytesToKB, func = self.fileSizeGetter, out, + sizeHuman = size, newSize; + if (!$.isNumeric(bytes) || !$.isNumeric(size)) { + return ''; + } + if (typeof func === 'function') { + out = func(size); + } else { + if (!sizeUnits) { + sizeUnits = self.sizeUnits; + } + if (size > 0) { + while (sizeHuman >= factor) { + sizeHuman /= factor; + ++i; + } + if (!sizeUnits[i]) { + sizeHuman = size; + i = 0; + } + } + newSize = sizeHuman.toFixed(2); + if (newSize == sizeHuman) { + newSize = sizeHuman; + } + out = newSize + ' ' + sizeUnits[i]; + } + return skipTemplate ? out : self._getLayoutTemplate('size').replace('{sizeText}', out); + }, + _getFileType: function (ftype) { + var self = this; + return self.mimeTypeAliases[ftype] || ftype; + }, + _generatePreviewTemplate: function ( + cat, + data, + fname, + ftype, + previewId, + fileId, + isError, + size, + fnameUpdated, + frameClass, + foot, + ind, + templ, + attrs, + zoomData + ) { + var self = this, caption = self.slug(fname), prevContent, zoomContent = '', styleAttribs = '', + filename = fnameUpdated || fname, isIconic, ext = filename.split('.').pop().toLowerCase(), + screenW = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, + config, title = caption, alt = caption, typeCss = 'type-default', getContent, addFrameCss, + footer = foot || self._renderFileFooter(cat, caption, size, 'auto', isError), isRotatable, + alwaysPreview = $.inArray(ext, self.alwaysPreviewFileExtensions) !== -1, + forcePrevIcon = self.preferIconicPreview && !alwaysPreview, + forceZoomIcon = self.preferIconicZoomPreview && !alwaysPreview, newCat = forcePrevIcon ? 'other' : cat; + config = screenW < 400 ? (self.previewSettingsSmall[newCat] || self.defaults.previewSettingsSmall[newCat]) : + (self.previewSettings[newCat] || self.defaults.previewSettings[newCat]); + if (config) { + $.each(config, function (key, val) { + styleAttribs += key + ':' + val + ';'; + }); + } + getContent = function (vCat, vData, zoom, frameCss, vZoomData) { + var id = zoom ? 'zoom-' + previewId : previewId, tmplt = self._getPreviewTemplate(vCat), + css = (frameClass || '') + ' ' + frameCss, tokens; + if (self.frameClass) { + css = self.frameClass + ' ' + css; + } + if (zoom) { + css = css.replace(' ' + $h.SORT_CSS, ''); + } + tmplt = self._parseFilePreviewIcon(tmplt, fname); + if (cat === 'object' && !ftype) { + $.each(self.defaults.fileTypeSettings, function (key, func) { + if (key === 'object' || key === 'other') { + return; + } + if (func(fname, ftype)) { + typeCss = 'type-' + key; + } + }); + } + if (!$h.isEmpty(attrs)) { + if (attrs.title !== undefined && attrs.title !== null) { + title = attrs.title; + } + if (attrs.alt !== undefined && attrs.alt !== null) { + alt = title = attrs.alt; + } + } + tokens = { + 'previewId': id, + 'caption': caption, + 'title': title, + 'alt': alt, + 'frameClass': css, + 'type': self._getFileType(ftype), + 'fileindex': ind, + 'fileid': fileId || '', + 'filename': filename, + 'typeCss': typeCss, + 'footer': footer, + 'data': vData, +// 'data': zoom && vZoomData ? self.zoomPlaceholder + '{zoomData}' : vData, + 'template': templ || cat, + 'style': styleAttribs ? 'style="' + styleAttribs + '"' : '', + 'zoomData': vZoomData ? encodeURIComponent(vZoomData) : '' + }; + if (zoom) { + tokens.zoomCache = ''; + tokens.zoomData = '{zoomData}'; + } + return tmplt.setTokens(tokens); + }; + ind = ind || previewId.slice(previewId.lastIndexOf('-') + 1); + isRotatable = self.fileActionSettings.showRotate && $.inArray(ext, self.rotatableFileExtensions) !== -1; + if (self.fileActionSettings.showZoom) { + addFrameCss = 'kv-zoom-thumb'; + if (isRotatable) { + addFrameCss += ' rotatable' + (forceZoomIcon ? ' hide-rotate' : ''); + } + zoomContent = getContent((forceZoomIcon ? 'other' : cat), data, true, addFrameCss, zoomData); + } + zoomContent = '\n' + self._getLayoutTemplate('zoomCache').replace('{zoomContent}', zoomContent); + if (typeof self.sanitizeZoomCache === 'function') { + zoomContent = self.sanitizeZoomCache(zoomContent); + } + addFrameCss = 'kv-preview-thumb'; + if (isRotatable) { + isIconic = forcePrevIcon || self.hideThumbnailContent || !!self.previewFileIconSettings[ext]; + addFrameCss += ' rotatable' + (isIconic ? ' hide-rotate' : ''); + } + prevContent = getContent((forcePrevIcon ? 'other' : cat), data, false, addFrameCss, zoomData); + return prevContent.setTokens({zoomCache: zoomContent}); + }, + _addToPreview: function ($preview, content) { + var self = this, $el; + content = $h.cspBuffer.stash(content); + $el = self.reversePreviewOrder ? $preview.prepend(content) : $preview.append(content); + $h.cspBuffer.apply($preview); + return $el; + }, + _previewDefault: function (file, isDisabled) { + var self = this, $preview = self.$preview; + if (!self.showPreview) { + return; + } + var fname = $h.getFileName(file), ftype = file ? file.type : '', content, size = file.size || 0, + caption = self._getFileName(file, ''), isError = isDisabled === true && !self.isAjaxUpload, + data = $h.createObjectURL(file), fileId = self.fileManager.getId(file), + previewId = self._getThumbId(fileId); + self._clearDefaultPreview(); + content = self._generatePreviewTemplate('other', data, fname, ftype, previewId, fileId, isError, size); + self._addToPreview($preview, content); + self._setThumbAttr(previewId, caption, size); + if (isDisabled === true && self.isAjaxUpload) { + self._setThumbStatus(self._getFrame(previewId), 'Error'); + } + }, + _previewFile: function (i, file, theFile, data, fileInfo) { + if (!this.showPreview) { + return; + } + var self = this, fname = $h.getFileName(file), ftype = fileInfo.type, content, + caption = fileInfo.name, cat = self._parseFileType(ftype, fname), $preview = self.$preview, + fsize = file.size || 0, iData = cat === 'image' ? theFile.target.result : data, fm = self.fileManager, + fileId = fm.getId(file), previewId = self._getThumbId(fileId); + /** @namespace window.DOMPurify */ + content = self._generatePreviewTemplate(cat, iData, fname, ftype, previewId, fileId, false, fsize, fileInfo.filename); + self._clearDefaultPreview(); + self._addToPreview($preview, content); + var $thumb = self._getFrame(previewId); + self._validateImageOrientation($thumb.find('img'), file, previewId, fileId, caption, ftype, fsize, iData); + self._setThumbAttr(previewId, caption, fsize); + self._initSortable(); + }, + _setThumbAttr: function (id, caption, size, description) { + var self = this, $frame = self._getFrame(id); + if ($frame.length) { + size = size && size > 0 ? self._getSize(size) : ''; + $frame.data({'caption': caption, 'size': size, 'description': description || ''}); + } + }, + _setInitThumbAttr: function () { + var self = this, data = self.previewCache.data, len = self.previewCache.count(true), config, + caption, size, description, previewId; + if (len === 0) { + return; + } + for (var i = 0; i < len; i++) { + config = data.config[i]; + previewId = self.previewInitId + '-' + $h.INIT_FLAG + i; + caption = $h.ifSet('caption', config, $h.ifSet('filename', config)); + size = $h.ifSet('size', config); + description = $h.ifSet('description', config); + self._setThumbAttr(previewId, caption, size, description); + } + }, + _slugDefault: function (text) { + // noinspection RegExpRedundantEscape + return $h.isEmpty(text, true) ? '' : String(text).replace(/[\[\]\/\{}:;#%=\(\)\*\+\?\\\^\$\|<>&"']/g, '_'); + }, + _updateFileDetails: function (numFiles) { + var self = this, $el = self.$element, label, n, log, nFiles, file, + name = ($h.isIE(9) && $h.findFileName($el.val())) || ($el[0].files[0] && $el[0].files[0].name); + if (!name && self.fileManager.count() > 0) { + file = self.fileManager.getFirstFile(); + label = file.nameFmt; + } else { + label = name ? self.slug(name) : '_'; + } + n = self.isAjaxUpload ? self.fileManager.count() : numFiles; + nFiles = self.previewCache.count(true) + n; + log = n === 1 ? label : self._getMsgSelected(nFiles, !self.isAjaxUpload && !self.isError); + if (self.isError) { + self.$previewContainer.removeClass('file-thumb-loading'); + self._initCapStatus(); + self.$previewStatus.html(''); + self.$captionContainer.removeClass('icon-visible'); + } else { + self._showFileIcon(); + } + self._setCaption(log, self.isError); + self.$container.removeClass('file-input-new file-input-ajax-new'); + self._raise('fileselect', [numFiles, label]); + if (self.previewCache.count(true)) { + self._initPreviewActions(); + } + }, + _setThumbStatus: function ($thumb, status) { + var self = this; + if (!self.showPreview) { + return; + } + var icon = 'indicator' + status, msg = icon + 'Title', + css = 'file-preview-' + status.toLowerCase(), + $indicator = $thumb.find('.file-upload-indicator'), + config = self.fileActionSettings; + $thumb.removeClass('file-preview-success file-preview-error file-preview-paused file-preview-loading'); + if (status === 'Success') { + $thumb.find('.file-drag-handle').remove(); + } + $h.setHtml($indicator, config[icon]); + $indicator.attr('title', config[msg]); + $thumb.addClass(css); + if (status === 'Error' && !self.retryErrorUploads) { + $thumb.find('.kv-file-upload').attr('disabled', true); + } + }, + _setProgressCancelled: function () { + var self = this; + self._setProgress(101, self.$progress, self.msgCancelled); + }, + _setProgress: function (p, $el, error, stats) { + var self = this; + $el = $el || self.$progress; + if (!$el.length) { + return; + } + var pct = Math.min(p, 100), out, pctLimit = self.progressUploadThreshold, + t = p <= 100 ? self.progressTemplate : self.progressCompleteTemplate, + template = pct < 100 ? self.progressTemplate : + (error ? (self.paused ? self.progressPauseTemplate : self.progressErrorTemplate) : t); + if (p >= 100) { + stats = ''; + } + if (!$h.isEmpty(template)) { + if (pctLimit && pct > pctLimit && p <= 100) { + out = template.setTokens({'percent': pctLimit, 'status': self.msgUploadThreshold}); + } else { + out = template.setTokens({'percent': pct, 'status': (p > 100 ? self.msgUploadEnd : pct + '%')}); + } + stats = stats || ''; + out = out.setTokens({stats: stats}); + $h.setHtml($el, out); + if (error) { + $h.setHtml($el.find('[role="progressbar"]'), error); + } + } + }, + _hasFiles: function () { + var el = this.$element[0]; + return !!(el && el.files && el.files.length); + }, + _setFileDropZoneTitle: function () { + var self = this, $zone = self.$container.find('.file-drop-zone'), title = self.dropZoneTitle, strFiles; + if (self.isClickable) { + strFiles = $h.isEmpty(self.$element.attr('multiple')) ? self.fileSingle : self.filePlural; + title += self.dropZoneClickTitle.replace('{files}', strFiles); + } + $zone.find('.' + self.dropZoneTitleClass).remove(); + if (!self.showPreview || $zone.length === 0 || self.fileManager.count() > 0 || !self.dropZoneEnabled || + self.previewCache.count() > 0 || (!self.isAjaxUpload && self._hasFiles())) { + return; + } + if ($zone.find($h.FRAMES).length === 0 && $h.isEmpty(self.defaultPreviewContent)) { + $zone.prepend('
    ' + title + '
    '); + } + self.$container.removeClass('file-input-new'); + $h.addCss(self.$container, 'file-input-ajax-new'); + }, + _getStats: function (stats) { + var self = this, pendingTime, t; + if (!self.showUploadStats || !stats || !stats.bitrate) { + return ''; + } + t = self._getLayoutTemplate('stats'); + pendingTime = (!stats.elapsed || !stats.bps) ? self.msgCalculatingTime : + self.msgPendingTime.setTokens({time: $h.getElapsed(Math.ceil(stats.pendingBytes / stats.bps))}); + + return t.setTokens({ + uploadSpeed: stats.bitrate, + pendingTime: pendingTime + }); + }, + _setResumableProgress: function (pct, stats, $thumb) { + var self = this, rm = self.resumableManager, obj = $thumb ? rm : self, + $prog = $thumb ? $thumb.find('.file-thumb-progress') : null; + if (obj.lastProgress === 0) { + obj.lastProgress = pct; + } + if (pct < obj.lastProgress) { + pct = obj.lastProgress; + } + self._setProgress(pct, $prog, null, self._getStats(stats)); + obj.lastProgress = pct; + }, + _toggleResumableProgress: function (template, message) { + var self = this, $progress = self.$progress; + if ($progress && $progress.length) { + $h.setHtml($progress, template.setTokens({ + percent: 101, + status: message, + stats: '' + })); + } + }, + _setFileUploadStats: function (id, pct, stats) { + var self = this, $prog = self.$progress; + if (!self.showPreview && (!$prog || !$prog.length)) { + return; + } + var fm = self.fileManager, rm = self.resumableManager, $thumb = fm.getThumb(id), pctTot, + totUpSize = 0, totSize = fm.getTotalSize(), totStats = $.extend(true, {}, stats); + if (self.enableResumableUpload) { + var loaded = stats.loaded, currUplSize = rm.getUploadedSize(), currTotSize = rm.file.size, totLoaded; + loaded += currUplSize; + totLoaded = fm.uploadedSize + loaded; + pct = $h.round(100 * loaded / currTotSize); + stats.pendingBytes = currTotSize - currUplSize; + self._setResumableProgress(pct, stats, $thumb); + pctTot = Math.floor(100 * totLoaded / totSize); + totStats.pendingBytes = totSize - totLoaded; + self._setResumableProgress(pctTot, totStats); + } else { + fm.setProgress(id, pct); + $prog = $thumb && $thumb.length ? $thumb.find('.file-thumb-progress') : null; + self._setProgress(pct, $prog, null, self._getStats(stats)); + $.each(fm.stats, function (id, cfg) { + totUpSize += cfg.loaded; + }); + totStats.pendingBytes = totSize - totUpSize; + pctTot = $h.round(totUpSize / totSize * 100); + self._setProgress(pctTot, null, null, self._getStats(totStats)); + } + }, + _validateMinCount: function () { + var self = this, len = self.isAjaxUpload ? self.fileManager.count() : self._inputFileCount(); + if (self.validateInitialCount && self.minFileCount > 0 && self._getFileCount(len - 1) < self.minFileCount) { + self._noFilesError({}); + return false; + } + return true; + }, + _getFileCount: function (fileCount, includeInitial) { + var self = this, addCount = 0; + if (includeInitial === undefined) { + includeInitial = self.validateInitialCount && !self.overwriteInitial; + } + if (includeInitial) { + addCount = self.previewCache.count(true); + fileCount += addCount; + } + return fileCount; + }, + _getFileId: function (file) { + return $h.getFileId(file, this.generateFileId); + }, + _getFileName: function (file, defaultValue) { + var self = this, fileName = $h.getFileName(file); + return fileName ? self.slug(fileName) : defaultValue; + }, + _getFileNames: function (skipNull) { + var self = this; + return self.filenames.filter(function (n) { + return (skipNull ? n !== undefined : n !== undefined && n !== null); + }); + }, + _setPreviewError: function ($thumb, keepFile) { + var self = this, removeFrame = self.removeFromPreviewOnError && !self.retryErrorUploads; + if (!keepFile || removeFrame) { + self.fileManager.remove($thumb); + } + if (!self.showPreview) { + return; + } + if (removeFrame) { + $thumb.remove(); + return; + } else { + self._setThumbStatus($thumb, 'Error'); + } + self._refreshUploadButton($thumb); + }, + _refreshUploadButton: function ($thumb) { + var self = this, $btn = $thumb.find('.kv-file-upload'), cfg = self.fileActionSettings, + icon = cfg.uploadIcon, title = cfg.uploadTitle; + if (!$btn.length) { + return; + } + if (self.retryErrorUploads) { + icon = cfg.uploadRetryIcon; + title = cfg.uploadRetryTitle; + } + $btn.attr('title', title); + $h.setHtml($btn, icon); + }, + _isValidSize: function (size, type, $image, $thumb, filename, params) { + var self = this, msg, dim, $img, tag = size === 'Small' ? 'min' : 'max', limit = self[tag + 'Image' + type]; + if ($h.isEmpty(limit) || !$image.length) { + return true; + } + $img = $image[0]; + dim = (type === 'Width') ? $img.naturalWidth || $img.width : $img.naturalHeight || $img.height; + if (size === 'Small' ? dim >= limit : dim <= limit) { + return true; + } + msg = self['msgImage' + type + size] || 'Image "{name}" has a size validation error (limit "{size}").'; + self._showFileError(msg.setTokens({'name': filename, 'size': limit, 'dimension': dim}), params); + self._setPreviewError($thumb); + self.fileManager.remove($thumb); + self._clearFileInput(); + return false; + }, + _getExifObj: function (data) { + var self = this, exifObj, error = $h.logMessages.exifWarning; + if (data.slice(0, 23) !== 'data:image/jpeg;base64,' && data.slice(0, 22) !== 'data:image/jpg;base64,') { + exifObj = null; + return; + } + try { + exifObj = window.piexif ? window.piexif.load(data) : null; + } catch (err) { + exifObj = null; + error = err && err.message || ''; + } + if (!exifObj && self.showExifErrorLog) { + self._log($h.logMessages.badExifParser, {details: error}); + } + return exifObj; + }, + setImageOrientation: function ($img, $zoomImg, value, $thumb) { + var self = this, invalidImg = !$img || !$img.length, invalidZoomImg = !$zoomImg || !$zoomImg.length, $mark, + isHidden = false, $div, zoomOnly = invalidImg && $thumb && $thumb.attr('data-template') === 'image', ev; + if (invalidImg && invalidZoomImg) { + return; + } + ev = 'load.fileinputimageorient'; + if (zoomOnly) { + $img = $zoomImg; + $zoomImg = null; + $img.css(self.previewSettings.image); + $div = $(document.createElement('div')).appendTo($thumb.find('.kv-file-content')); + $mark = $(document.createElement('span')).insertBefore($img); + $img.css('visibility', 'hidden').removeClass('file-zoom-detail').appendTo($div); + } else { + isHidden = !$img.is(':visible'); + } + $img.off(ev).on(ev, function () { + if (isHidden) { + self.$preview.removeClass('hide-content'); + $thumb.find('.kv-file-content').css('visibility', 'hidden'); + } + var img = $img[0], zoomImg = $zoomImg && $zoomImg.length ? $zoomImg[0] : null, + h = img.offsetHeight, w = img.offsetWidth, r = $h.getRotation(value); + if (isHidden) { + $thumb.find('.kv-file-content').css('visibility', 'visible'); + self.$preview.addClass('hide-content'); + } + $img.data('orientation', value); + if (zoomImg) { + $zoomImg.data('orientation', value); + } + if (value < 5) { + $h.setTransform(img, r); + $h.setTransform(zoomImg, r); + return; + } + var offsetAngle = Math.atan(w / h), origFactor = Math.sqrt(Math.pow(h, 2) + Math.pow(w, 2)), + scale = !origFactor ? 1 : (h / Math.cos(Math.PI / 2 + offsetAngle)) / origFactor, + s = ' scale(' + Math.abs(scale) + ')'; + $h.setTransform(img, r + s); + $h.setTransform(zoomImg, r + s); + if (zoomOnly) { + $img.css('visibility', 'visible').insertAfter($mark).addClass('file-zoom-detail'); + $mark.remove(); + $div.remove(); + } + }); + }, + _validateImageOrientation: function ($img, file, previewId, fileId, caption, ftype, fsize, iData) { + var self = this, exifObj = null, value, autoOrientImage = self.autoOrientImage, selector; + exifObj = self._getExifObj(iData); + if (self.canOrientImage) { + $img.css('image-orientation', (autoOrientImage ? 'from-image' : 'none')); + self._validateImage(previewId, fileId, caption, ftype, fsize, iData, exifObj); + return; + } + selector = $h.getZoomSelector(previewId, ' img'); + value = exifObj ? exifObj['0th'][piexif.ImageIFD.Orientation] : null; // jshint ignore:line + if (!value) { + self._validateImage(previewId, fileId, caption, ftype, fsize, iData, exifObj); + return; + } + self.setImageOrientation($img, $(selector), value, self._getFrame(previewId)); + self._raise('fileimageoriented', {'$img': $img, 'file': file}); + self._validateImage(previewId, fileId, caption, ftype, fsize, iData, exifObj); + }, + _validateImage: function (previewId, fileId, fname, ftype, fsize, iData, exifObj) { + var self = this, $preview = self.$preview, params, w1, w2, $thumb = self._getFrame(previewId), + i = $thumb.attr('data-fileindex'), $img = $thumb.find('img'); + fname = fname || 'Untitled'; + $img.one('load', function () { + if ($img.data('validated')) { + return; + } + $img.data('validated', true); + w1 = $thumb.width(); + w2 = $preview.width(); + if (w1 > w2) { + $img.css('width', '100%'); + } + params = {ind: i, id: previewId, fileId: fileId}; + setTimeout(function () { + var isValidWidth, isValidHeight; + isValidWidth = self._isValidSize('Small', 'Width', $img, $thumb, fname, params); + isValidHeight = self._isValidSize('Small', 'Height', $img, $thumb, fname, params); + if (!self.resizeImage) { + isValidWidth = isValidWidth && self._isValidSize('Large', 'Width', $img, $thumb, fname, params); + isValidHeight = isValidHeight && self._isValidSize('Large', 'Height', $img, $thumb, fname, params); + } + self._raise('fileimageloaded', [previewId]); + $thumb.data('exif', exifObj); + if (isValidWidth && isValidHeight) { + self.fileManager.addImage(fileId, { + ind: i, + img: $img, + thumb: $thumb, + pid: previewId, + typ: ftype, + siz: fsize, + validated: false, + imgData: iData, + exifObj: exifObj + }); + self._validateAllImages(); + } + }, self.processDelay); + }).one('error', function () { + self._raise('fileimageloaderror', [previewId]); + }); + }, + _validateAllImages: function () { + var self = this, counter = {val: 0}, numImgs = self.fileManager.getImageCount(), fsize, + minSize = self.resizeIfSizeMoreThan; + if (numImgs !== self.fileManager.totalImages) { + return; + } + self._raise('fileimagesloaded'); + if (!self.resizeImage) { + return; + } + $.each(self.fileManager.loadedImages, function (id, config) { + if (!config.validated) { + fsize = config.siz; + if (fsize && fsize > minSize * self.bytesToKB) { + self._getResizedImage(id, config, counter, numImgs); + } + config.validated = true; + } + }); + }, + _getResizedImage: function (id, config, counter, numImgs) { + var self = this, img = $(config.img)[0], width = img.naturalWidth, height = img.naturalHeight, blob, + ratio = 1, maxWidth = self.maxImageWidth || width, maxHeight = self.maxImageHeight || height, + isValidImage = !!(width && height), chkWidth, chkHeight, canvas = self.imageCanvas, dataURI, + context = self.imageCanvasContext, type = config.typ, pid = config.pid, ind = config.ind, + $thumb = config.thumb, throwError, msg, exifObj = config.exifObj, exifStr, file, params, evParams; + throwError = function (msg, params, ev) { + if (self.isAjaxUpload) { + self._showFileError(msg, params, ev); + } else { + self._showError(msg, params, ev); + } + self._setPreviewError($thumb); + }; + file = self.fileManager.getFile(id); + params = {id: pid, 'index': ind, fileId: id}; + evParams = [id, pid, ind]; + if (!file || !isValidImage || (width <= maxWidth && height <= maxHeight)) { + if (isValidImage && file) { + self._raise('fileimageresized', evParams); + } + counter.val++; + if (counter.val === numImgs) { + self._raise('fileimagesresized'); + } + if (!isValidImage) { + throwError(self.msgImageResizeError, params, 'fileimageresizeerror'); + return; + } + } + type = type || self.resizeDefaultImageType; + chkWidth = width > maxWidth; + chkHeight = height > maxHeight; + if (self.resizePreference === 'width') { + ratio = chkWidth ? maxWidth / width : (chkHeight ? maxHeight / height : 1); + } else { + ratio = chkHeight ? maxHeight / height : (chkWidth ? maxWidth / width : 1); + } + self._resetCanvas(); + width *= ratio; + height *= ratio; + canvas.width = width; + canvas.height = height; + try { + context.drawImage(img, 0, 0, width, height); + dataURI = canvas.toDataURL(type, self.resizeQuality); + if (exifObj) { + exifStr = window.piexif.dump(exifObj); + dataURI = window.piexif.insert(exifStr, dataURI); + } + blob = $h.dataURI2Blob(dataURI); + self.fileManager.setFile(id, blob); + self._raise('fileimageresized', evParams); + counter.val++; + if (counter.val === numImgs) { + self._raise('fileimagesresized', [undefined, undefined]); + } + if (!(blob instanceof Blob)) { + throwError(self.msgImageResizeError, params, 'fileimageresizeerror'); + } + } catch (err) { + counter.val++; + if (counter.val === numImgs) { + self._raise('fileimagesresized', [undefined, undefined]); + } + msg = self.msgImageResizeException.replace('{errors}', err.message); + throwError(msg, params, 'fileimageresizeexception'); + } + }, + _showProgress: function () { + var self = this; + if (self.$progress && self.$progress.length) { + self.$progress.show(); + } + }, + _hideProgress: function () { + var self = this; + if (self.$progress && self.$progress.length) { + self.$progress.hide(); + } + }, + _initBrowse: function ($container) { + var self = this, $el = self.$element; + if (self.showBrowse) { + self.$btnFile = $container.find('.btn-file').append($el); + } else { + $el.appendTo($container).attr('tabindex', -1); + $h.addCss($el, 'file-no-browse'); + } + }, + _initClickable: function () { + var self = this, $zone, $tmpZone; + if (!self.isClickable) { + return; + } + $zone = self.$dropZone; + if (!self.isAjaxUpload) { + $tmpZone = self.$preview.find('.file-default-preview'); + if ($tmpZone.length) { + $zone = $tmpZone; + } + } + + $h.addCss($zone, 'clickable'); + $zone.attr('tabindex', -1); + self._handler($zone, 'click', function (e) { + var $tar = $(e.target); + if (!self.$errorContainer.is(':visible') && (!$tar.parents( + '.file-preview-thumbnails').length || $tar.parents( + '.file-default-preview').length)) { + self.$element.data('zoneClicked', true).trigger('click'); + $zone.blur(); + } + }); + }, + _initCaption: function () { + var self = this, cap = self.initialCaption || ''; + if (self.overwriteInitial || $h.isEmpty(cap)) { + self.$caption.val(''); + return false; + } + self._setCaption(cap); + return true; + }, + _setCaption: function (content, isError) { + var self = this, title, out, icon, n, cap, file; + if (!self.$caption.length) { + return; + } + self.$captionContainer.removeClass('icon-visible'); + if (isError) { + title = $('
    ' + self.msgValidationError + '
    ').text(); + n = self.fileManager.count(); + if (n) { + file = self.fileManager.getFirstFile(); + cap = n === 1 && file ? file.nameFmt : self._getMsgSelected(n); + } else { + cap = self._getMsgSelected(self.msgNo); + } + out = $h.isEmpty(content) ? cap : content; + icon = '' + self.msgValidationErrorIcon + ''; + } else { + if ($h.isEmpty(content)) { + self.$caption.attr('title', ''); + return; + } + title = $('
    ' + content + '
    ').text(); + out = title; + icon = self._getLayoutTemplate('fileIcon'); + } + self.$captionContainer.addClass('icon-visible'); + self.$caption.attr('title', title).val(out); + $h.setHtml(self.$captionIcon, icon); + }, + _createContainer: function () { + var self = this, attribs = {'class': 'file-input file-input-new' + (self.rtl ? ' kv-rtl' : '')}, + $container = $h.createElement($h.cspBuffer.stash(self._renderMain())); + $h.cspBuffer.apply($container); + $container.insertBefore(self.$element).attr(attribs); + self._initBrowse($container); + if (self.theme) { + $container.addClass('theme-' + self.theme); + } + return $container; + }, + _refreshContainer: function () { + var self = this, $container = self.$container, $el = self.$element; + $el.insertAfter($container); + $h.setHtml($container, self._renderMain()); + self._initBrowse($container); + self._validateDisabled(); + }, + _validateDisabled: function () { + var self = this; + self.$caption.attr({readonly: self.isDisabled}); + }, + _setTabIndex: function (type, html) { + var self = this, index = self.tabIndexConfig[type]; + return html.setTokens({ + tabIndexConfig: index === undefined || index === null ? '' : 'tabindex="' + index + '"' + }); + }, + _renderMain: function () { + var self = this, + dropCss = self.dropZoneEnabled ? ' file-drop-zone' : 'file-drop-disabled', + close = !self.showClose ? '' : self._getLayoutTemplate('close'), + preview = !self.showPreview ? '' : self._getLayoutTemplate('preview') + .setTokens({'class': self.previewClass, 'dropClass': dropCss}), + css = self.isDisabled ? self.captionClass + ' file-caption-disabled' : self.captionClass, + caption = self.captionTemplate.setTokens({'class': css + ' kv-fileinput-caption'}); + caption = self._setTabIndex('caption', caption); + return self.mainTemplate.setTokens({ + 'class': self.mainClass + (!self.showBrowse && self.showCaption ? ' no-browse' : ''), + 'inputGroupClass': self.inputGroupClass, + 'preview': preview, + 'close': close, + 'caption': caption, + 'upload': self._renderButton('upload'), + 'remove': self._renderButton('remove'), + 'cancel': self._renderButton('cancel'), + 'pause': self._renderButton('pause'), + 'browse': self._renderButton('browse') + }); + + }, + _renderButton: function (type) { + var self = this, tmplt = self._getLayoutTemplate('btnDefault'), css = self[type + 'Class'], + title = self[type + 'Title'], icon = self[type + 'Icon'], label = self[type + 'Label'], + status = self.isDisabled ? ' disabled' : '', btnType = 'button'; + switch (type) { + case 'remove': + if (!self.showRemove) { + return ''; + } + break; + case 'cancel': + if (!self.showCancel) { + return ''; + } + css += ' kv-hidden'; + break; + case 'pause': + if (!self.showPause) { + return ''; + } + css += ' kv-hidden'; + break; + case 'upload': + if (!self.showUpload) { + return ''; + } + if (self.isAjaxUpload && !self.isDisabled) { + tmplt = self._getLayoutTemplate('btnLink').replace('{href}', self.uploadUrl); + } else { + btnType = 'submit'; + } + break; + case 'browse': + if (!self.showBrowse) { + return ''; + } + tmplt = self._getLayoutTemplate('btnBrowse'); + break; + default: + return ''; + } + tmplt = self._setTabIndex(type, tmplt); + + css += type === 'browse' ? ' btn-file' : ' fileinput-' + type + ' fileinput-' + type + '-button'; + if (!$h.isEmpty(label)) { + label = ' ' + label + ''; + } + return tmplt.setTokens({ + 'type': btnType, 'css': css, 'title': title, 'status': status, 'icon': icon, 'label': label + }); + }, + _renderThumbProgress: function () { + var self = this; + return '
    ' + + self.progressInfoTemplate.setTokens({percent: 101, status: self.msgUploadBegin, stats: ''}) + + '
    '; + }, + _renderFileFooter: function (cat, caption, size, width, isError) { + var self = this, config = self.fileActionSettings, rem = config.showRemove, drg = config.showDrag, + upl = config.showUpload, rot = config.showRotate, zoom = config.showZoom, out, params, + template = self._getLayoutTemplate('footer'), tInd = self._getLayoutTemplate('indicator'), + ind = isError ? config.indicatorError : config.indicatorNew, + title = isError ? config.indicatorErrorTitle : config.indicatorNewTitle, + indicator = tInd.setTokens({'indicator': ind, 'indicatorTitle': title}); + size = self._getSize(size); + params = {type: cat, caption: caption, size: size, width: width, progress: '', indicator: indicator}; + if (self.isAjaxUpload) { + params.progress = self._renderThumbProgress(); + params.actions = self._renderFileActions(params, upl, false, rem, rot, zoom, drg, false, false, false); + } else { + params.actions = self._renderFileActions(params, false, false, false, false, zoom, drg, false, false, false); + } + out = template.setTokens(params); + out = $h.replaceTags(out, self.previewThumbTags); + return out; + }, + _renderFileActions: function ( + cfg, + showUpl, + showDwn, + showDel, + showRot, + showZoom, + showDrag, + disabled, + url, + key, + isInit, + dUrl, + dFile + ) { + var self = this; + if (!cfg.type && isInit) { + cfg.type = 'image'; + } + if (self.enableResumableUpload) { + showUpl = false; + } else { + if (typeof showUpl === 'function') { + showUpl = showUpl(cfg); + } + } + if (typeof showDwn === 'function') { + showDwn = showDwn(cfg); + } + if (typeof showDel === 'function') { + showDel = showDel(cfg); + } + if (typeof showZoom === 'function') { + showZoom = showZoom(cfg); + } + if (typeof showDrag === 'function') { + showDrag = showDrag(cfg); + } + if (typeof showRot === 'function') { + showRot = showRot(cfg); + } + if (!showUpl && !showDwn && !showDel && !showRot && !showZoom && !showDrag) { + return ''; + } + var vUrl = url === false ? '' : ' data-url="' + url + '"', btnZoom = '', btnDrag = '', btnRotate = '', css, + vKey = key === false ? '' : ' data-key="' + key + '"', btnDelete = '', btnUpload = '', btnDownload = '', + template = self._getLayoutTemplate('actions'), config = self.fileActionSettings, + otherButtons = self.otherActionButtons.setTokens({'dataKey': vKey, 'key': key}), + removeClass = disabled ? config.removeClass + ' disabled' : config.removeClass; + if (showDel) { + btnDelete = self._getLayoutTemplate('actionDelete').setTokens({ + 'removeClass': removeClass, + 'removeIcon': config.removeIcon, + 'removeTitle': config.removeTitle, + 'dataUrl': vUrl, + 'dataKey': vKey, + 'key': key + }); + } + if (showRot) { + btnRotate = self._getLayoutTemplate('actionRotate').setTokens({ + 'rotateClass': config.rotateClass, + 'rotateIcon': config.rotateIcon, + 'rotateTitle': config.rotateTitle + }); + } + if (showUpl) { + btnUpload = self._getLayoutTemplate('actionUpload').setTokens({ + 'uploadClass': config.uploadClass, + 'uploadIcon': config.uploadIcon, + 'uploadTitle': config.uploadTitle + }); + } + if (showDwn) { + btnDownload = self._getLayoutTemplate('actionDownload').setTokens({ + 'downloadClass': config.downloadClass, + 'downloadIcon': config.downloadIcon, + 'downloadTitle': config.downloadTitle, + 'downloadUrl': dUrl || self.initialPreviewDownloadUrl + }); + btnDownload = btnDownload.setTokens({'filename': dFile, 'key': key}); + } + if (showZoom) { + btnZoom = self._getLayoutTemplate('actionZoom').setTokens({ + 'zoomClass': config.zoomClass, + 'zoomIcon': config.zoomIcon, + 'zoomTitle': config.zoomTitle + }); + } + if (showDrag && isInit) { + css = 'drag-handle-init ' + config.dragClass; + btnDrag = self._getLayoutTemplate('actionDrag').setTokens({ + 'dragClass': css, + 'dragTitle': config.dragTitle, + 'dragIcon': config.dragIcon + }); + } + return template.setTokens({ + 'delete': btnDelete, + 'upload': btnUpload, + 'download': btnDownload, + 'rotate': btnRotate, + 'zoom': btnZoom, + 'drag': btnDrag, + 'other': otherButtons + }); + }, + _browse: function (e) { + var self = this; + if (e && e.isDefaultPrevented() || !self._raise('filebrowse')) { + return; + } + if (self.isError && !self.isAjaxUpload) { + self.clear(); + } + if (self.focusCaptionOnBrowse) { + self.$captionContainer.focus(); + } + }, + _change: function (e) { + var self = this; + $(document.body).off('focusin.fileinput focusout.fileinput'); + if (self.changeTriggered) { + self._toggleLoading('hide'); + return; + } + self._toggleLoading('show'); + var $el = self.$element, isDragDrop = arguments.length > 1, isAjaxUpload = self.isAjaxUpload, + tfiles, files = isDragDrop ? arguments[1] : $el[0].files, ctr = self.fileManager.count(), + total, initCount, len, isSingleUpl = $h.isEmpty($el.attr('multiple')), + maxCount = !isAjaxUpload && isSingleUpl ? 1 : self.maxFileCount, maxTotCount = self.maxTotalFileCount, + inclAll = maxTotCount > 0 && maxTotCount > maxCount, flagSingle = (isSingleUpl && ctr > 0), + throwError = function (mesg, file, previewId, index) { + var p1 = $.extend(true, {}, self._getOutData(null, {}, {}, files), {id: previewId, index: index}), + p2 = {id: previewId, index: index, file: file, files: files}; + self.isPersistentError = true; + self._toggleLoading('hide'); + return isAjaxUpload ? self._showFileError(mesg, p1) : self._showError(mesg, p2); + }, + maxCountCheck = function (n, m, all) { + var msg = all ? self.msgTotalFilesTooMany : self.msgFilesTooMany; + msg = msg.replace('{m}', m).replace('{n}', n); + self.isError = throwError(msg, null, null, null); + self.$captionContainer.removeClass('icon-visible'); + self._setCaption('', true); + self.$container.removeClass('file-input-new file-input-ajax-new'); + }; + self.reader = null; + self._resetUpload(); + self._hideFileIcon(); + if (self.dropZoneEnabled) { + self.$container.find('.file-drop-zone .' + self.dropZoneTitleClass).remove(); + } + if (!isAjaxUpload) { + if (e.target && e.target.files === undefined) { + files = e.target.value ? [{name: e.target.value.replace(/^.+\\/, '')}] : []; + } else { + files = e.target.files || {}; + } + } + tfiles = files; + if ($h.isEmpty(tfiles) || tfiles.length === 0) { + if (!isAjaxUpload) { + self.clear(); + } + self._raise('fileselectnone'); + return; + } + self._resetErrors(); + len = tfiles.length; + initCount = isAjaxUpload ? (self.fileManager.count() + len) : len; + total = self._getFileCount(initCount, inclAll ? false : undefined); + if (maxCount > 0 && total > maxCount) { + if (!self.autoReplace || len > maxCount) { + maxCountCheck((self.autoReplace && len > maxCount ? len : total), maxCount); + return; + } + if (total > maxCount) { + self._resetPreviewThumbs(isAjaxUpload); + } + + } else { + if (inclAll) { + total = self._getFileCount(initCount, true); + if (maxTotCount > 0 && total > maxTotCount) { + if (!self.autoReplace || len > maxCount) { + maxCountCheck((self.autoReplace && len > maxTotCount ? len : total), maxTotCount, true); + return; + } + if (total > maxCount) { + self._resetPreviewThumbs(isAjaxUpload); + } + } + } + if (!isAjaxUpload || flagSingle) { + self._resetPreviewThumbs(false); + if (flagSingle) { + self.clearFileStack(); + } + } else { + if (isAjaxUpload && ctr === 0 && (!self.previewCache.count(true) || self.overwriteInitial)) { + self._resetPreviewThumbs(true); + } + } + } + if (self.autoReplace) { + self._getThumbs().each(function () { + var $thumb = $(this); + if ($thumb.hasClass('file-preview-success') || $thumb.hasClass('file-preview-error')) { + $thumb.remove(); + } + }); + } + self.readFiles(tfiles); + self._toggleLoading('hide'); + }, + _abort: function (params) { + var self = this, data; + if (self.ajaxAborted && typeof self.ajaxAborted === 'object' && self.ajaxAborted.message !== undefined) { + data = $.extend(true, {}, self._getOutData(null), params); + data.abortData = self.ajaxAborted.data || {}; + data.abortMessage = self.ajaxAborted.message; + self._setProgress(101, self.$progress, self.msgCancelled); + self._showFileError(self.ajaxAborted.message, data, 'filecustomerror'); + self.cancel(); + self.unlock(); + return true; + } + return !!self.ajaxAborted; + }, + _resetFileStack: function () { + var self = this, i = 0; + self._getThumbs().each(function () { + var $thumb = $(this), ind = $thumb.attr('data-fileindex'), pid = $thumb.attr('id'); + if (ind === '-1' || ind === -1) { + return; + } + if (!self._getThumbFile($thumb)) { + $thumb.attr({'data-fileindex': i}); + i++; + } else { + $thumb.attr({'data-fileindex': '-1'}); + } + self._getZoom(pid).attr({ + 'data-fileindex': $thumb.attr('data-fileindex') + }); + }); + }, + _isFileSelectionValid: function (cnt) { + var self = this; + cnt = cnt || 0; + if (self.required && !self.getFilesCount()) { + self.$errorContainer.html(''); + self._showFileError(self.msgFileRequired); + return false; + } + if (self.minFileCount > 0 && self._getFileCount(cnt) < self.minFileCount) { + self._noFilesError({}); + return false; + } + return true; + }, + _canPreview: function (file) { + var self = this; + if (!file || !self.showPreview || !self.$preview || !self.$preview.length) { + return false; + } + var name = file.name || '', type = file.type || '', size = (file.size || 0) / self.bytesToKB, + cat = self._parseFileType(type, name), allowedTypes, allowedMimes, allowedExts, skipPreview, + types = self.allowedPreviewTypes, mimes = self.allowedPreviewMimeTypes, + exts = self.allowedPreviewExtensions || [], dTypes = self.disabledPreviewTypes, + dMimes = self.disabledPreviewMimeTypes, dExts = self.disabledPreviewExtensions || [], + maxSize = self.maxFilePreviewSize && parseFloat(self.maxFilePreviewSize) || 0, + expAllExt = new RegExp('\\.(' + exts.join('|') + ')$', 'i'), + expDisExt = new RegExp('\\.(' + dExts.join('|') + ')$', 'i'); + allowedTypes = !types || types.indexOf(cat) !== -1; + allowedMimes = !mimes || mimes.indexOf(type) !== -1; + allowedExts = !exts.length || $h.compare(name, expAllExt); + skipPreview = (dTypes && dTypes.indexOf(cat) !== -1) || (dMimes && dMimes.indexOf(type) !== -1) || + (dExts.length && $h.compare(name, expDisExt)) || (maxSize && !isNaN(maxSize) && size > maxSize); + return !skipPreview && (allowedTypes || allowedMimes || allowedExts); + }, + addToStack: function (file, id) { + var self = this; + self.stackIsUpdating = true; + self.fileManager.add(file, id); + self._refreshPreview(); + self.stackIsUpdating = false; + }, + clearFileStack: function () { + var self = this; + self.fileManager.clear(); + self._initResumableUpload(); + if (self.enableResumableUpload) { + if (self.showPause === null) { + self.showPause = true; + } + if (self.showCancel === null) { + self.showCancel = false; + } + } else { + self.showPause = false; + if (self.showCancel === null) { + self.showCancel = true; + } + } + return self.$element; + }, + getFileStack: function () { + return this.fileManager.stack; + }, + getFileList: function () { + return this.fileManager.list(); + }, + getFilesSize: function () { + return this.fileManager.getTotalSize(); + }, + getFilesCount: function (includeInitial) { + var self = this, len = self.isAjaxUpload ? self.fileManager.count() : self._inputFileCount(); + if (includeInitial) { + len += self.previewCache.count(true); + } + return self._getFileCount(len); + }, + _initCapStatus: function (status) { + var self = this, $cap = self.$caption; + $cap.removeClass('is-valid file-processing'); + if (!status) { + return; + } + if (status === 'processing') { + $cap.addClass('file-processing'); + } else { + $cap.addClass('is-valid'); + } + }, + _toggleLoading: function (type) { + var self = this; + self.$previewStatus.html(type === 'hide' ? '' : self.msgProcessing); + self.$container.removeClass('file-thumb-loading'); + self._initCapStatus(type === 'hide' ? '' : 'processing'); + if (type !== 'hide') { + if (self.dropZoneEnabled) { + self.$container.find('.file-drop-zone .' + self.dropZoneTitleClass).remove(); + } + self.$container.addClass('file-thumb-loading'); + } + }, + _initFileSelected: function () { + var self = this, $el = self.$element, $body = $(document.body), ev = 'focusin.fileinput focusout.fileinput'; + if ($body.length) { + $body.off(ev).on('focusout.fileinput', function () { + self._toggleLoading('show'); + }).on('focusin.fileinput', function () { + setTimeout(function () { + if (!$el.val()) { + self._setFileDropZoneTitle(); + } + $body.off(ev); + self._toggleLoading('hide'); + }, 2500); + }); + } else { + self._toggleLoading('hide'); + } + }, + readFiles: function (files) { + this.reader = new FileReader(); + var self = this, reader = self.reader, $container = self.$previewContainer, + $status = self.$previewStatus, msgLoading = self.msgLoading, msgProgress = self.msgProgress, + previewInitId = self.previewInitId, numFiles = files.length, settings = self.fileTypeSettings, + readFile, fileTypes = self.allowedFileTypes, typLen = fileTypes ? fileTypes.length : 0, + fileExt = self.allowedFileExtensions, strExt = $h.isEmpty(fileExt) ? '' : fileExt.join(', '), + throwError = function (msg, file, previewId, index, fileId) { + var $thumb, p1 = $.extend(true, {}, self._getOutData(null, {}, {}, files), + {id: previewId, index: index, fileId: fileId}), + p2 = {id: previewId, index: index, fileId: fileId, file: file, files: files}; + self._previewDefault(file, true); + $thumb = self._getFrame(previewId, true); + self._toggleLoading('hide'); + if (self.isAjaxUpload) { + setTimeout(function () { + readFile(index + 1); + }, self.processDelay); + } else { + self.unlock(); + numFiles = 0; + } + if (self.removeFromPreviewOnError && $thumb.length) { + $thumb.remove(); + } else { + self._initFileActions(); + $thumb.find('.kv-file-upload').remove(); + } + self.isPersistentError = true; + self.isError = self.isAjaxUpload ? self._showFileError(msg, p1) : self._showError(msg, p2); + self._updateFileDetails(numFiles); + }; + self.fileManager.clearImages(); + $.each(files, function (key, file) { + var func = self.fileTypeSettings.image; + if (func && func(file.type)) { + self.fileManager.totalImages++; + } + }); + readFile = function (i) { + var $error = self.$errorContainer, errors, fm = self.fileManager; + if (i >= numFiles) { + self.unlock(); + if (self.duplicateErrors.length) { + errors = '
  • ' + self.duplicateErrors.join('
  • ') + '
  • '; + if ($error.find('ul').length === 0) { + $h.setHtml($error, self.errorCloseButton + '
      ' + errors + '
    '); + } else { + $error.find('ul').append(errors); + } + $error.fadeIn(self.fadeDelay); + self._handler($error.find('.kv-error-close'), 'click', function () { + $error.fadeOut(self.fadeDelay); + }); + self.duplicateErrors = []; + } + if (self.isAjaxUpload) { + self._raise('filebatchselected', [fm.stack]); + if (fm.count() === 0 && !self.isError) { + self.reset(); + } + } else { + self._raise('filebatchselected', [files]); + } + $container.removeClass('file-thumb-loading'); + self._initCapStatus('valid'); + $status.html(''); + return; + } + self.lock(true); + var file = files[i], id, previewId, fileProcessed, + fSize = (file && file.size || 0), sizeHuman = self._getSize(fSize, true), j, msg, + fnImage = settings.image, chk, typ, typ1, typ2, caption, fileSize = fSize / self.bytesToKB, + fileExtExpr = '', previewData, fileCount = 0, strTypes = '', fileId, canLoad, + fileReaderAborted = false, func, knownTypes = 0, isImage, processFileLoaded, initFileData; + initFileData = function (dataSource) { + dataSource = dataSource || file; + id = fileId = self._getFileId(file); + previewId = previewInitId + '-' + id; + previewData = $h.createObjectURL(dataSource); + caption = self._getFileName(file, ''); + }; + processFileLoaded = function () { + var isImageResized = !!fm.loadedImages[id], msg = msgProgress.setTokens({ + 'index': i + 1, + 'files': numFiles, + 'percent': 50, + 'name': caption + }); + setTimeout(function () { + $status.html(msg); + self._updateFileDetails(numFiles); + if (self.getFilesCount(true) > 0 && self.getFrames(':visible')) { + self.$dropZone.find('.' + self.dropZoneTitleClass).remove(); + } + readFile(i + 1); + }, self.processDelay); + if (self._raise('fileloaded', [file, previewId, id, i, reader]) && self.isAjaxUpload) { + if (!isImageResized) { + fm.add(file); + } + } else { + if (isImageResized) { + fm.removeFile(id); + } + } + }; + if (!file) { + return; + } + initFileData(); + + if (typLen > 0) { + for (j = 0; j < typLen; j++) { + typ1 = fileTypes[j]; + typ2 = self.msgFileTypes[typ1] || typ1; + strTypes += j === 0 ? typ2 : ', ' + typ2; + } + } + if (caption === false) { + readFile(i + 1); + return; + } + if (caption.length === 0) { + msg = self.msgInvalidFileName.replace('{name}', $h.htmlEncode($h.getFileName(file), '[unknown]')); + throwError(msg, file, previewId, i, fileId); + return; + } + if (!$h.isEmpty(fileExt)) { + fileExtExpr = new RegExp('\\.(' + fileExt.join('|') + ')$', 'i'); + } + if (self.isAjaxUpload && fm.exists(fileId) || self._getFrame(previewId, true).length) { + var p2 = {id: previewId, index: i, fileId: fileId, file: file, files: files}; + msg = self.msgDuplicateFile.setTokens({name: caption, size: sizeHuman}); + if (self.isAjaxUpload) { + if (!self.stackIsUpdating) { + self.duplicateErrors.push(msg); + self.isDuplicateError = true; + self._raise('fileduplicateerror', [file, fileId, caption, sizeHuman, previewId, i]); + } + readFile(i + 1); + self._updateFileDetails(numFiles); + } else { + self._showError(msg, p2); + self.unlock(); + numFiles = 0; + self._clearFileInput(); + self.reset(); + self._updateFileDetails(numFiles); + } + return; + } + if (self.maxFileSize > 0 && fileSize > self.maxFileSize) { + msg = self.msgSizeTooLarge.setTokens({ + 'name': caption, + 'size': sizeHuman, + 'maxSize': self._getSize(self.maxFileSize * self.bytesToKB, true) + }); + throwError(msg, file, previewId, i, fileId); + return; + } + if (self.minFileSize !== null && fileSize <= $h.getNum(self.minFileSize)) { + msg = self.msgSizeTooSmall.setTokens({ + 'name': caption, + 'size': sizeHuman, + 'minSize': self._getSize(self.minFileSize * self.bytesToKB, true) + }); + throwError(msg, file, previewId, i, fileId); + return; + } + if (!$h.isEmpty(fileTypes) && $h.isArray(fileTypes)) { + for (j = 0; j < fileTypes.length; j += 1) { + typ = fileTypes[j]; + func = settings[typ]; + fileCount += !func || (typeof func !== 'function') ? 0 : (func(file.type, + $h.getFileName(file)) ? 1 : 0); + } + if (fileCount === 0) { + msg = self.msgInvalidFileType.setTokens({name: caption, types: strTypes}); + throwError(msg, file, previewId, i, fileId); + return; + } + } + if (fileCount === 0 && !$h.isEmpty(fileExt) && $h.isArray(fileExt) && !$h.isEmpty(fileExtExpr)) { + chk = $h.compare(caption, fileExtExpr); + fileCount += $h.isEmpty(chk) ? 0 : chk.length; + if (fileCount === 0) { + msg = self.msgInvalidFileExtension.setTokens({name: caption, extensions: strExt}); + throwError(msg, file, previewId, i, fileId); + return; + } + } + if (!self._canPreview(file)) { + canLoad = self._raise('filebeforeload', [file, i, reader]); + if (self.isAjaxUpload && canLoad) { + fm.add(file); + } + if (self.showPreview && canLoad) { + $container.addClass('file-thumb-loading'); + self._initCapStatus('processing'); + self._previewDefault(file); + self._initFileActions(); + } + setTimeout(function () { + if (canLoad) { + self._updateFileDetails(numFiles); + } + readFile(i + 1); + self._raise('fileloaded', [file, previewId, id, i]); + }, 10); + return; + } + isImage = fnImage(file.type, caption); + $status.html(msgLoading.replace('{index}', i + 1).replace('{files}', numFiles)); + $container.addClass('file-thumb-loading'); + self._initCapStatus('processing'); + reader.onerror = function (evt) { + self._errorHandler(evt, caption); + }; + reader.onload = function (theFile) { + var hex, fileInfo, fileData, byte, bytes = [], contents, mime, + processPreview = function (fType, ext) { + if ($h.isEmpty(fType)) { // look for ascii text content + contents = $h.arrayBuffer2String(reader.result); + fType = $h.isSvg(contents) ? 'image/svg+xml' : $h.getMimeType(hex, contents, file.type); + } + fileInfo = {'name': caption, 'type': fType || ''}; + if (ext && typeof File !== "undefined") { + try { + var fName = fileInfo.filename = caption + '.' + ext; + fileProcessed = new File([file], fName, {type: fileInfo.type}); + initFileData(fileProcessed); + } catch (err) { + } + } + isImage = fnImage(fType, ''); + if (isImage) { + var newReader = new FileReader(); + newReader.onerror = function (theFileNew) { + self._errorHandler(theFileNew, caption); + }; + newReader.onload = function (theFileNew) { + if (self.isAjaxUpload && !self._raise('filebeforeload', [file, i, reader])) { + fileReaderAborted = true; + self._resetCaption(); + reader.abort(); + $status.html(''); + $container.removeClass('file-thumb-loading'); + self._initCapStatus('valid'); + self.enable(); + return; + } + self._previewFile(i, file, theFileNew, previewData, fileInfo); + self._initFileActions(); + processFileLoaded(); + }; + newReader.readAsDataURL(file); + return; + } + if (self.isAjaxUpload && !self._raise('filebeforeload', [file, i, reader])) { + fileReaderAborted = true; + self._resetCaption(); + reader.abort(); + $status.html(''); + $container.removeClass('file-thumb-loading'); + self._initCapStatus('valid'); + self.enable(); + return; + } + self._previewFile(i, file, theFile, previewData, fileInfo); + self._initFileActions(); + processFileLoaded(); + }; + mime = file.type; + fileInfo = {'name': caption, 'type': mime}; + $.each(settings, function (k, f) { + if (k !== 'object' && k !== 'other' && typeof f === 'function' && f(mime, caption)) { + knownTypes++; + } + }); + if (typeof FileTypeParser !== "undefined") { + fileData = new Uint8Array(theFile.target.result); + new FileTypeParser().parse(fileData).then(function (result) { + processPreview(result && result.mime || mime, result && result.ext || ''); + }); + } else { + if (knownTypes === 0) { // auto detect mime types from content if no known file types detected + fileData = new Uint8Array(theFile.target.result); + for (j = 0; j < fileData.length; j++) { + byte = fileData[j].toString(16); + bytes.push(byte); + } + hex = bytes.join('').toLowerCase().substring(0, 8); + mime = $h.getMimeType(hex, '', ''); + } + processPreview(mime); + } + }; + reader.onprogress = function (data) { + if (data.lengthComputable) { + var fact = (data.loaded / data.total) * 100, progress = Math.ceil(fact); + msg = msgProgress.setTokens({ + 'index': i + 1, + 'files': numFiles, + 'percent': progress, + 'name': caption + }); + setTimeout(function () { + if (!fileReaderAborted) { + $status.html(msg); + } + }, self.processDelay); + } + }; + reader.readAsArrayBuffer(file); + }; + + readFile(0); + self._updateFileDetails(numFiles); + }, + lock: function (selectMode) { + var self = this, $container = self.$container; + self._resetErrors(); + self.disable(); + if (!selectMode && self.showCancel) { + $container.find('.fileinput-cancel').show(); + } + if (!selectMode && self.showPause) { + $container.find('.fileinput-pause').show(); + } + self._initCapStatus('processing'); + self._raise('filelock', [self.fileManager.stack, self._getExtraData()]); + return self.$element; + }, + unlock: function (reset) { + var self = this, $container = self.$container; + if (reset === undefined) { + reset = true; + } + self.enable(); + $container.removeClass('is-locked'); + if (self.showCancel) { + $container.find('.fileinput-cancel').hide(); + } + if (self.showPause) { + $container.find('.fileinput-pause').hide(); + } + if (reset) { + self._resetFileStack(); + } + self._initCapStatus(); + self._raise('fileunlock', [self.fileManager.stack, self._getExtraData()]); + return self.$element; + }, + resume: function () { + var self = this, fm = self.fileManager, flag = false, rm = self.resumableManager; + fm.bpsLog = []; + fm.bps = 0; + if (!self.enableResumableUpload) { + return self.$element; + } + if (self.paused) { + self._toggleResumableProgress(self.progressPauseTemplate, self.msgUploadResume); + } else { + flag = true; + } + self.paused = false; + if (flag) { + self._toggleResumableProgress(self.progressInfoTemplate, self.msgUploadBegin); + } + setTimeout(function () { + rm.upload(); + }, self.processDelay); + return self.$element; + }, + paste: function (e) { + var self = this, ev = e.originalEvent, files = ev.clipboardData && ev.clipboardData.files || null; + if (files) { + self._dropFiles(e, files); + } + return self.$element; + }, + pause: function () { + var self = this, rm = self.resumableManager, xhr = self.ajaxRequests, len = xhr.length, i, + pct = rm.getProgress(), actions = self.fileActionSettings, tm = self.taskManager, + pool = tm.getPool(rm.id); + if (!self.enableResumableUpload) { + return self.$element; + } else { + if (pool) { + pool.cancel(); + } + } + self._raise('fileuploadpaused', [self.fileManager, rm]); + if (len > 0) { + for (i = 0; i < len; i += 1) { + self.paused = true; + xhr[i].abort(); + } + } + if (self.showPreview) { + self._getThumbs().each(function () { + var $thumb = $(this), t = self._getLayoutTemplate('stats'), stats, + $indicator = $thumb.find('.file-upload-indicator'); + $thumb.removeClass('file-uploading'); + if ($indicator.attr('title') === actions.indicatorLoadingTitle) { + self._setThumbStatus($thumb, 'Paused'); + stats = t.setTokens({pendingTime: self.msgPaused, uploadSpeed: ''}); + self.paused = true; + self._setProgress(pct, $thumb.find('.file-thumb-progress'), pct + '%', stats); + } + if (!self._getThumbFile($thumb)) { + $thumb.find('.kv-file-remove').removeClass('disabled').removeAttr('disabled'); + } + }); + } + self._setProgress(101, self.$progress, self.msgPaused); + return self.$element; + }, + cancel: function () { + var self = this, xhr = self.ajaxRequests, + rm = self.resumableManager, tm = self.taskManager, + pool = rm ? tm.getPool(rm.id) : undefined, len = xhr.length, i; + if (self.enableResumableUpload && pool) { + pool.cancel().done(function () { + self._setProgressCancelled(); + }); + rm.reset(); + self._raise('fileuploadcancelled', [self.fileManager, rm]); + } else { + if (self.ajaxPool) { + self.ajaxPool.cancel(); + } + self._raise('fileuploadcancelled', [self.fileManager]); + } + self._initAjax(); + if (len > 0) { + for (i = 0; i < len; i += 1) { + self.cancelling = true; + xhr[i].abort(); + } + } + self._getThumbs().each(function () { + var $thumb = $(this), $prog = $thumb.find('.file-thumb-progress'); + $thumb.removeClass('file-uploading'); + self._setProgress(0, $prog); + $prog.hide(); + if (!self._getThumbFile($thumb)) { + $thumb.find('.kv-file-upload').removeClass('disabled').removeAttr('disabled'); + $thumb.find('.kv-file-remove').removeClass('disabled').removeAttr('disabled'); + } + self.unlock(); + }); + setTimeout(function () { + self._setProgressCancelled(); + }, self.processDelay); + return self.$element; + }, + clear: function () { + var self = this, cap; + if (!self._raise('fileclear')) { + return; + } + self.clearInput = true; + self.$btnUpload.removeAttr('disabled'); + self._getThumbs().find('video,audio,img').each(function () { + $h.cleanMemory($(this)); + }); + self._clearFileInput(); + self._resetUpload(); + self.clearFileStack(); + self.isDuplicateError = false; + self.isPersistentError = false; + self._resetErrors(true); + if (self._hasInitialPreview()) { + self._showFileIcon(); + self._resetPreview(); + self._initPreviewActions(); + self.$container.removeClass('file-input-new'); + } else { + self._getThumbs().each(function () { + self._clearObjects($(this)); + }); + if (self.isAjaxUpload) { + self.previewCache.data = {}; + } + self.$preview.html(''); + cap = (!self.overwriteInitial && self.initialCaption.length > 0) ? self.initialCaption : ''; + self.$caption.attr('title', '').val(cap); + $h.addCss(self.$container, 'file-input-new'); + self._validateDefaultPreview(); + } + if (self.$container.find($h.FRAMES).length === 0) { + if (!self._initCaption()) { + self.$captionContainer.removeClass('icon-visible'); + } + } + self._hideFileIcon(); + if (self.focusCaptionOnClear) { + self.$captionContainer.focus(); + } + self._setFileDropZoneTitle(); + self._raise('filecleared'); + return self.$element; + }, + reset: function () { + var self = this; + if (!self._raise('filereset')) { + return; + } + self.lastProgress = 0; + self._resetPreview(); + self.$container.find('.fileinput-filename').text(''); + $h.addCss(self.$container, 'file-input-new'); + if (self.getFrames().length) { + self.$container.removeClass('file-input-new'); + } + self.clearFileStack(); + self._setFileDropZoneTitle(); + return self.$element; + }, + disable: function () { + var self = this, $container = self.$container; + self.isDisabled = true; + self._raise('filedisabled'); + self.$element.attr('disabled', 'disabled'); + $container.addClass('is-locked'); + $h.addCss($container.find('.btn-file'), 'disabled'); + $container.find('.kv-fileinput-caption').addClass('file-caption-disabled'); + $container.find('.fileinput-remove, .fileinput-upload, .file-preview-frame button') + .attr('disabled', true); + self._initDragDrop(); + return self.$element; + }, + enable: function () { + var self = this, $container = self.$container; + self.isDisabled = false; + self._raise('fileenabled'); + self.$element.removeAttr('disabled'); + $container.removeClass('is-locked'); + $container.find('.kv-fileinput-caption').removeClass('file-caption-disabled'); + $container.find('.fileinput-remove, .fileinput-upload, .file-preview-frame button') + .removeAttr('disabled'); + $container.find('.btn-file').removeClass('disabled'); + self._initDragDrop(); + return self.$element; + }, + upload: function () { + var self = this, fm = self.fileManager, totLen = fm.count(), i, outData, tm = self.taskManager, + hasExtraData = !$.isEmptyObject(self._getExtraData()); + fm.bpsLog = []; + fm.bps = 0; + if (!self.isAjaxUpload || self.isDisabled || !self._isFileSelectionValid(totLen)) { + return; + } + self.lastProgress = 0; + self._resetUpload(); + if (totLen === 0 && !hasExtraData) { + self._showFileError(self.msgUploadEmpty); + return; + } + self.cancelling = false; + self.uploadInitiated = true; + self._showProgress(); + self.lock(); + if (totLen === 0 && hasExtraData) { + self._setProgress(2); + self._uploadExtraOnly(); + return; + } + if (self.enableResumableUpload) { + return self.resume(); + } + if (self.uploadAsync || self.enableResumableUpload) { + outData = self._getOutData(null); + if (!self._checkBatchPreupload(outData)) { + return; + } + self.fileBatchCompleted = false; + self.uploadCache = []; + $.each(self.getFileStack(), function (id) { + var previewId = self._getThumbId(id); + self.uploadCache.push({id: previewId, content: null, config: null, tags: null, append: true}); + }); + self.$preview.find('.file-preview-initial').removeClass($h.SORT_CSS); + self._initSortable(); + } + self._setProgress(2); + self.hasInitData = false; + if (self.uploadAsync) { + i = 0; + var pool = self.ajaxPool = tm.addPool($h.uniqId()); + $.each(self.getFileStack(), function (id) { + pool.addTask(id + i, function (deferrer) { + self._uploadSingle(i, id, true, deferrer); + }); + i++; + }); + + pool.run(self.maxAjaxThreads).done(function () { + self._log('Async upload batch completed successfully.'); + self._raise('filebatchuploadsuccess', [fm.stack, self._getExtraData()]); + }).fail(function () { + self._log('Async upload batch completed with errors.'); + self._raise('filebatchuploaderror', [fm.stack, self._getExtraData()]); + }); + return; + } + self._uploadBatch(); + return self.$element; + }, + destroy: function () { + var self = this, $form = self.$form, $cont = self.$container, $el = self.$element, ns = self.namespace; + $(document).off(ns); + $(window).off(ns); + if ($form && $form.length) { + $form.off(ns); + } + if (self.isAjaxUpload) { + self._clearFileInput(); + } + self._cleanup(); + self._initPreviewCache(); + $el.insertBefore($cont).off(ns).removeData(); + $cont.off().remove(); + return $el; + }, + refresh: function (options) { + var self = this, $el = self.$element; + if (typeof options !== 'object' || $h.isEmpty(options)) { + options = self.options; + } else { + options = $.extend(true, {}, self.options, options); + } + self._init(options, true); + self._listen(); + return $el; + }, + zoom: function (frameId) { + var self = this, $frame = self._getFrame(frameId); + self._showModal($frame); + }, + getExif: function (frameId) { + var self = this, $frame = self._getFrame(frameId); + return $frame && $frame.data('exif') || null; + }, + getFrames: function (cssFilter) { + var self = this, $frames; + cssFilter = cssFilter || ''; + $frames = self.$preview.find($h.FRAMES + cssFilter); + if (self.reversePreviewOrder) { + $frames = $($frames.get().reverse()); + } + return $frames; + }, + getPreview: function () { + var self = this; + return { + content: self.initialPreview, + config: self.initialPreviewConfig, + tags: self.initialPreviewThumbTags + }; + } + }; + + $.fn.fileinput = function (option) { + if (!$h.hasFileAPISupport() && !$h.isIE(9)) { + return; + } + var args = Array.apply(null, arguments), retvals = []; + args.shift(); + this.each(function () { + var self = $(this), data = self.data('fileinput'), options = typeof option === 'object' && option, + theme = options.theme || self.data('theme'), l = {}, t = {}, + lang = options.language || self.data('language') || $.fn.fileinput.defaults.language || 'en', opt; + if (!data) { + if (theme) { + t = $.fn.fileinputThemes[theme] || {}; + } + if (lang !== 'en' && !$h.isEmpty($.fn.fileinputLocales[lang])) { + l = $.fn.fileinputLocales[lang] || {}; + } + opt = $.extend(true, {}, $.fn.fileinput.defaults, t, $.fn.fileinputLocales.en, l, options, self.data()); + data = new FileInput(this, opt); + self.data('fileinput', data); + } + + if (typeof option === 'string') { + retvals.push(data[option].apply(data, args)); + } + }); + switch (retvals.length) { + case 0: + return this; + case 1: + return retvals[0]; + default: + return retvals; + } + }; + + var IFRAME_ATTRIBS = 'class="kv-preview-data file-preview-pdf" src="{renderer}?file={data}" {style}', + defBtnCss1 = 'btn btn-sm btn-kv ' + $h.defaultButtonCss(), defBtnCss2 = 'btn ' + $h.defaultButtonCss(); + + $.fn.fileinput.defaults = { + language: 'zh', + bytesToKB: 1024, + showCaption: true, + showBrowse: true, + showPreview: true, + showRemove: true, + showUpload: true, + showUploadStats: true, + showCancel: null, + showPause: null, + showClose: true, + showUploadedThumbs: true, + showConsoleLogs: false, + browseOnZoneClick: false, + autoReplace: false, + showDescriptionClose: true, + autoOrientImage: function () { // applicable for JPEG images only and non ios safari + var ua = window.navigator.userAgent, webkit = !!ua.match(/WebKit/i), + iOS = !!ua.match(/iP(od|ad|hone)/i), iOSSafari = iOS && webkit && !ua.match(/CriOS/i); + return !iOSSafari; + }, + autoOrientImageInitial: true, + showExifErrorLog: false, + required: false, + rtl: false, + hideThumbnailContent: false, + encodeUrl: true, + focusCaptionOnBrowse: true, + focusCaptionOnClear: true, + generateFileId: null, + previewClass: '', + captionClass: '', + frameClass: 'krajee-default', + mainClass: '', + inputGroupClass: '', + mainTemplate: null, + fileSizeGetter: null, + initialCaption: '', + initialPreview: [], + initialPreviewDelimiter: '*$$*', + initialPreviewAsData: false, + initialPreviewFileType: 'image', + initialPreviewConfig: [], + initialPreviewThumbTags: [], + previewThumbTags: {}, + initialPreviewShowDelete: true, + initialPreviewDownloadUrl: '', + removeFromPreviewOnError: false, + deleteUrl: '', + deleteExtraData: {}, + overwriteInitial: true, + sanitizeZoomCache: function (content) { + var $container = $h.createElement(content); + $container.find('input,textarea,select,datalist,form,.file-thumbnail-footer').remove(); + return $container.html(); + }, + previewZoomButtonIcons: { + prev: '', + next: '', + toggleheader: '', + fullscreen: '', + borderless: '', + close: '' + }, + previewZoomButtonClasses: { + prev: 'btn btn-default btn-outline-secondary btn-navigate', + next: 'btn btn-default btn-outline-secondary btn-navigate', + rotate: defBtnCss1, + toggleheader: defBtnCss1, + fullscreen: defBtnCss1, + borderless: defBtnCss1, + close: defBtnCss1 + }, + previewTemplates: {}, + previewContentTemplates: {}, + preferIconicPreview: false, + preferIconicZoomPreview: false, + alwaysPreviewFileExtensions: [], + rotatableFileExtensions: ['jpg', 'jpeg', 'png', 'gif'], + allowedFileTypes: null, + allowedFileExtensions: null, + allowedPreviewTypes: undefined, + allowedPreviewMimeTypes: null, + allowedPreviewExtensions: null, + disabledPreviewTypes: undefined, + disabledPreviewExtensions: ['msi', 'exe', 'com', 'zip', 'rar', 'app', 'vb', 'scr'], + disabledPreviewMimeTypes: null, + defaultPreviewContent: null, + customLayoutTags: {}, + customPreviewTags: {}, + previewFileIcon: '', + previewFileIconClass: 'file-other-icon', + previewFileIconSettings: {}, + previewFileExtSettings: {}, + buttonLabelClass: 'hidden-xs', + browseIcon: ' ', + browseClass: 'btn btn-primary', + removeIcon: '', + removeClass: defBtnCss2, + cancelIcon: '', + cancelClass: defBtnCss2, + pauseIcon: '', + pauseClass: defBtnCss2, + uploadIcon: '', + uploadClass: defBtnCss2, + uploadUrl: null, + uploadUrlThumb: null, + uploadAsync: true, + uploadParamNames: { + chunkCount: 'chunkCount', + chunkIndex: 'chunkIndex', + chunkSize: 'chunkSize', + chunkSizeStart: 'chunkSizeStart', + chunksUploaded: 'chunksUploaded', + fileBlob: 'fileBlob', + fileId: 'fileId', + fileName: 'fileName', + fileRelativePath: 'fileRelativePath', + fileSize: 'fileSize', + retryCount: 'retryCount' + }, + maxAjaxThreads: 5, + fadeDelay: 800, + processDelay: 100, + bitrateUpdateDelay: 500, + queueDelay: 10, // must be lesser than process delay + progressDelay: 0, // must be lesser than process delay + enableResumableUpload: false, + resumableUploadOptions: { + fallback: null, + testUrl: null, // used for checking status of chunks/ files previously / partially uploaded + chunkSize: 2048, // in KB + maxThreads: 4, + maxRetries: 3, + showErrorLog: true, + retainErrorHistory: false, // when set to true, display complete error history always unless user explicitly resets upload + skipErrorsAndProceed: false // when set to true, files with errors will be skipped and upload will continue with other files + }, + uploadExtraData: {}, + zoomModalHeight: 485, // 5px more than the default preview content heights set for text, html, pdf etc. + minImageWidth: null, + minImageHeight: null, + maxImageWidth: null, + maxImageHeight: null, + resizeImage: false, + resizePreference: 'width', + resizeQuality: 0.92, + resizeDefaultImageType: 'image/jpeg', + resizeIfSizeMoreThan: 0, // in KB + minFileSize: -1, + maxFileSize: 0, + maxFilePreviewSize: 25600, // 25 MB + minFileCount: 0, + maxFileCount: 0, + maxTotalFileCount: 0, + validateInitialCount: false, + msgValidationErrorClass: 'text-danger', + msgValidationErrorIcon: ' ', + msgErrorClass: 'file-error-message', + progressThumbClass: 'progress-bar progress-bar-striped active progress-bar-animated', + progressClass: 'progress-bar bg-success progress-bar-success progress-bar-striped active progress-bar-animated', + progressInfoClass: 'progress-bar bg-info progress-bar-info progress-bar-striped active progress-bar-animated', + progressCompleteClass: 'progress-bar bg-success progress-bar-success', + progressPauseClass: 'progress-bar bg-primary progress-bar-primary progress-bar-striped active progress-bar-animated', + progressErrorClass: 'progress-bar bg-danger progress-bar-danger', + progressUploadThreshold: 99, + previewFileType: 'image', + elCaptionContainer: null, + elCaptionText: null, + elPreviewContainer: null, + elPreviewImage: null, + elPreviewStatus: null, + elErrorContainer: null, + errorCloseButton: undefined, + slugCallback: null, + dropZoneEnabled: true, + dropZoneTitleClass: 'file-drop-zone-title', + fileActionSettings: {}, + otherActionButtons: '', + textEncoding: 'UTF-8', + preProcessUpload: null, + ajaxSettings: {}, + ajaxDeleteSettings: {}, + showAjaxErrorDetails: true, + mergeAjaxCallbacks: false, + mergeAjaxDeleteCallbacks: false, + retryErrorUploads: true, + reversePreviewOrder: false, + usePdfRenderer: function () { + var isIE11 = !!window.MSInputMethodContext && !!document.documentMode; + return !!navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/i) || isIE11; + }, + pdfRendererUrl: '', + pdfRendererTemplate: '', + tabIndexConfig: { + browse: 500, + remove: 500, + upload: 500, + cancel: null, + pause: null, + modal: -1 + } + }; + + // noinspection HtmlUnknownAttribute + $.fn.fileinputLocales.en = { + sizeUnits: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], + bitRateUnits: ['B/s', 'KB/s', 'MB/s', 'GB/s', 'TB/s', 'PB/s', 'EB/s', 'ZB/s', 'YB/s'], + fileSingle: 'file', + filePlural: 'files', + browseLabel: 'Browse …', + removeLabel: 'Remove', + removeTitle: 'Clear all unprocessed files', + cancelLabel: 'Cancel', + cancelTitle: 'Abort ongoing upload', + pauseLabel: 'Pause', + pauseTitle: 'Pause ongoing upload', + uploadLabel: 'Upload', + uploadTitle: 'Upload selected files', + msgNo: 'No', + msgNoFilesSelected: 'No files selected', + msgCancelled: 'Cancelled', + msgPaused: 'Paused', + msgPlaceholder: 'Select {files} ...', + msgZoomModalHeading: 'Detailed Preview', + msgFileRequired: 'You must select a file to upload.', + msgSizeTooSmall: 'File "{name}" ({size}) is too small and must be larger than {minSize}.', + msgSizeTooLarge: 'File "{name}" ({size}) exceeds maximum allowed upload size of {maxSize}.', + msgFilesTooLess: 'You must select at least {n} {files} to upload.', + msgFilesTooMany: 'Number of files selected for upload ({n}) exceeds maximum allowed limit of {m}.', + msgTotalFilesTooMany: 'You can upload a maximum of {m} files ({n} files detected).', + msgFileNotFound: 'File "{name}" not found!', + msgFileSecured: 'Security restrictions prevent reading the file "{name}".', + msgFileNotReadable: 'File "{name}" is not readable.', + msgFilePreviewAborted: 'File preview aborted for "{name}".', + msgFilePreviewError: 'An error occurred while reading the file "{name}".', + msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".', + msgInvalidFileType: 'Invalid type for file "{name}". Only "{types}" files are supported.', + msgInvalidFileExtension: 'Invalid extension for file "{name}". Only "{extensions}" files are supported.', + msgFileTypes: { + 'image': 'image', + 'html': 'HTML', + 'text': 'text', + 'video': 'video', + 'audio': 'audio', + 'flash': 'flash', + 'pdf': 'PDF', + 'object': 'object' + }, + msgUploadAborted: 'The file upload was aborted', + msgUploadThreshold: 'Processing …', + msgUploadBegin: 'Initializing …', + msgUploadEnd: 'Done', + msgUploadResume: 'Resuming upload …', + msgUploadEmpty: 'No valid data available for upload.', + msgUploadError: 'Upload Error', + msgDeleteError: 'Delete Error', + msgProgressError: 'Error', + msgValidationError: 'Validation Error', + msgLoading: 'Loading file {index} of {files} …', + msgProgress: 'Loading file {index} of {files} - {name} - {percent}% completed.', + msgSelected: '{n} {files} selected', + msgProcessing: 'Processing ...', + msgFoldersNotAllowed: 'Drag & drop files only! {n} folder(s) dropped were skipped.', + msgImageWidthSmall: 'Width of image file "{name}" must be at least {size} px (detected {dimension} px).', + msgImageHeightSmall: 'Height of image file "{name}" must be at least {size} px (detected {dimension} px).', + msgImageWidthLarge: 'Width of image file "{name}" cannot exceed {size} px (detected {dimension} px).', + msgImageHeightLarge: 'Height of image file "{name}" cannot exceed {size} px (detected {dimension} px).', + msgImageResizeError: 'Could not get the image dimensions to resize.', + msgImageResizeException: 'Error while resizing the image.
    {errors}
    ', + msgAjaxError: 'Something went wrong with the {operation} operation. Please try again later!', + msgAjaxProgressError: '{operation} failed', + msgDuplicateFile: 'File "{name}" of same size "{size}" has already been selected earlier. Skipping duplicate selection.', + msgResumableUploadRetriesExceeded: 'Upload aborted beyond {max} retries for file {file}! Error Details:
    {error}
    ', + msgPendingTime: '{time} remaining', + msgCalculatingTime: 'calculating time remaining', + ajaxOperations: { + deleteThumb: 'file delete', + uploadThumb: 'file upload', + uploadBatch: 'batch file upload', + uploadExtra: 'form data upload' + }, + dropZoneTitle: 'Drag & drop files here …', + dropZoneClickTitle: '
    (or click to select {files})', + previewZoomButtonTitles: { + prev: 'View previous file', + next: 'View next file', + rotate: 'Rotate 90 deg. clockwise', + toggleheader: 'Toggle header', + fullscreen: 'Toggle full screen', + borderless: 'Toggle borderless mode', + close: 'Close detailed preview' + } + }; + + $.fn.fileinputLocales.zh = { + sizeUnits: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], + bitRateUnits: ['B/s', 'KB/s', 'MB/s', 'GB/s', 'TB/s', 'PB/s', 'EB/s', 'ZB/s', 'YB/s'], + fileSingle: '文件', + filePlural: '个文件', + browseLabel: '选择 …', + removeLabel: '移除', + removeTitle: '清除选中文件', + cancelLabel: '取消', + cancelTitle: '取消进行中的上传', + pauseLabel: '暂停', + pauseTitle: '暂停上传', + uploadLabel: '上传', + uploadTitle: '上传选中文件', + msgNo: '没有', + msgNoFilesSelected: '未选择文件', + msgPaused: '已暂停', + msgCancelled: '取消', + msgPlaceholder: '选择 {files} ...', + msgZoomModalHeading: '详细预览', + msgFileRequired: '必须选择一个文件上传.', + msgSizeTooSmall: '文件 "{name}" ({size}) 必须大于限定大小 {minSize}.', + msgSizeTooLarge: '文件 "{name}" ({size}) 超过了允许大小 {maxSize}.', + msgFilesTooLess: '你必须选择最少 {n} {files} 来上传. ', + msgFilesTooMany: '选择的上传文件个数 ({n}) 超出最大文件的限制个数 {m}.', + msgTotalFilesTooMany: '你最多可以上传 {m} 个文件 (当前有{n} 个文件).', + msgFileNotFound: '文件 "{name}" 未找到!', + msgFileSecured: '安全限制,为了防止读取文件 "{name}".', + msgFileNotReadable: '文件 "{name}" 不可读.', + msgFilePreviewAborted: '取消 "{name}" 的预览.', + msgFilePreviewError: '读取 "{name}" 时出现了一个错误.', + msgInvalidFileName: '文件名 "{name}" 包含非法字符.', + msgInvalidFileType: '不正确的类型 "{name}". 只支持 "{types}" 类型的文件.', + msgInvalidFileExtension: '不正确的文件扩展名 "{name}". 只支持 "{extensions}" 的文件扩展名.', + msgFileTypes: { + 'image': 'image', + 'html': 'HTML', + 'text': 'text', + 'video': 'video', + 'audio': 'audio', + 'flash': 'flash', + 'pdf': 'PDF', + 'object': 'object' + }, + msgUploadAborted: '该文件上传被中止', + msgUploadThreshold: '处理中 …', + msgUploadBegin: '正在初始化 …', + msgUploadEnd: '完成', + msgUploadResume: '继续上传 …', + msgUploadEmpty: '无效的文件上传.', + msgUploadError: '上传出错', + msgDeleteError: '删除出错', + msgProgressError: '上传出错', + msgValidationError: '验证错误', + msgLoading: '加载第 {index} 文件 共 {files} …', + msgProgress: '加载第 {index} 文件 共 {files} - {name} - {percent}% 完成.', + msgSelected: '{n} {files} 选中', + msgProcessing: '处理中 ...', + msgFoldersNotAllowed: '只支持拖拽文件! 跳过 {n} 拖拽的文件夹.', + msgImageWidthSmall: '图像文件的"{name}"的宽度必须是至少{size}像素.', + msgImageHeightSmall: '图像文件的"{name}"的高度必须至少为{size}像素.', + msgImageWidthLarge: '图像文件"{name}"的宽度不能超过{size}像素.', + msgImageHeightLarge: '图像文件"{name}"的高度不能超过{size}像素.', + msgImageResizeError: '无法获取的图像尺寸调整。', + msgImageResizeException: '调整图像大小时发生错误。
    {errors}
    ', + msgAjaxError: '{operation} 发生错误. 请重试!', + msgAjaxProgressError: '{operation} 失败', + msgDuplicateFile: '文件 "{name}",大小 "{size}" 已经被选中.忽略相同的文件.', + msgResumableUploadRetriesExceeded: '文件 {file} 上传失败超过 {max} 次重试 ! 错误详情:
    {error}
    ', + msgPendingTime: '{time} 剩余', + msgCalculatingTime: '计算剩余时间', + ajaxOperations: { + deleteThumb: '删除文件', + uploadThumb: '上传文件', + uploadBatch: '批量上传', + uploadExtra: '表单数据上传' + }, + dropZoneTitle: '拖拽文件到这里 …
    支持多文件同时上传', + dropZoneClickTitle: '
    (或点击{files}按钮选择文件)', + fileActionSettings: { + removeTitle: '删除文件', + uploadTitle: '上传文件', + downloadTitle: '下载文件', + uploadRetryTitle: '重试', + rotateTitle: '顺时针旋转90度', + zoomTitle: '查看详情', + dragTitle: '移动 / 重置', + indicatorNewTitle: '没有上传', + indicatorSuccessTitle: '上传', + indicatorErrorTitle: '上传错误', + indicatorPausedTitle: '上传已暂停', + indicatorLoadingTitle: '上传 …' + }, + previewZoomButtonTitles: { + prev: '预览上一个文件', + next: '预览下一个文件', + rotate: '顺时针旋转90度', + toggleheader: '缩放', + fullscreen: '全屏', + borderless: '无边界模式', + close: '关闭当前预览' + } + }; + + $.fn.fileinput.Constructor = FileInput; + + /** + * Convert automatically file inputs with class 'file' into a bootstrap fileinput control. + */ + $(document).ready(function () { + var $input = $('input.file[type=file]'); + if ($input.length) { + $input.fileinput(); + } + }); +})); \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.css b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.css new file mode 100644 index 0000000..f8a3cd5 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.css @@ -0,0 +1,13 @@ +/*! + * bootstrap-fileinput v5.5.2 + * http://plugins.krajee.com/file-input + * + * Krajee default styling for bootstrap-fileinput. + * + * Author: Kartik Visweswaran + * Copyright: 2014 - 2022, Kartik Visweswaran, Krajee.com + * + * Licensed under the BSD-3-Clause + * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md + */ + .file-loading input[type=file],input[type=file].file-loading{width:0;height:0;}.file-no-browse{position:absolute;left:50%;bottom:20%;width:1px;height:1px;font-size:0;opacity:0;border:none;background:none;outline:none;box-shadow:none;}.kv-hidden,.file-caption-icon,.file-zoom-dialog .modal-header:before,.file-zoom-dialog .modal-header:after,.file-input-new .file-preview,.file-input-new .close,.file-input-new .glyphicon-file,.file-input-new .fileinput-remove-button,.file-input-new .fileinput-upload-button,.file-input-new .no-browse .input-group-btn,.file-input-ajax-new .fileinput-remove-button,.file-input-ajax-new .fileinput-upload-button,.file-input-ajax-new .no-browse .input-group-btn,.hide-content .kv-file-content,.is-locked .fileinput-upload-button,.is-locked .fileinput-remove-button{display:none;}.file-caption .input-group{align-items:center;}.btn-file input[type=file],.file-caption-icon,.file-preview .fileinput-remove,.krajee-default .file-thumb-progress,.file-zoom-dialog .btn-navigate,.file-zoom-dialog .floating-buttons{position:absolute;}.file-caption-icon .kv-caption-icon{line-height:inherit;}.file-input,.file-loading:before,.btn-file,.file-caption,.file-preview,.krajee-default.file-preview-frame,.krajee-default .file-thumbnail-footer,.file-zoom-dialog .modal-dialog{position:relative;}.file-error-message pre,.file-error-message ul,.krajee-default .file-actions,.krajee-default .file-other-error{text-align:left;}.file-error-message pre,.file-error-message ul{margin:0;}.krajee-default .file-drag-handle,.krajee-default .file-upload-indicator{float:left;margin-top:10px;width:16px;height:16px;}.file-thumb-progress .progress,.file-thumb-progress .progress-bar{font-family:Verdana,Helvetica,sans-serif;font-size:0.7rem;}.krajee-default .file-thumb-progress .progress,.kv-upload-progress .progress{background-color:#ccc;}.krajee-default .file-caption-info,.krajee-default .file-size-info{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:160px;height:15px;margin:auto;}.file-zoom-content > .file-object.type-video,.file-zoom-content > .file-object.type-flash,.file-zoom-content > .file-object.type-image{max-width:100%;max-height:100%;width:auto;}.file-zoom-content > .file-object.type-video,.file-zoom-content > .file-object.type-flash{height:100%;}.file-zoom-content > .file-object.type-pdf,.file-zoom-content > .file-object.type-html,.file-zoom-content > .file-object.type-text,.file-zoom-content > .file-object.type-default{width:100%;}.file-loading:before{content:" Loading...";display:inline-block;padding-left:20px;line-height:16px;font-size:13px;font-variant:small-caps;color:#999;background:transparent url(loading.gif) top left no-repeat;}.file-object{margin:0 0 -5px 0;padding:0;}.btn-file{overflow:hidden;}.btn-file input[type=file]{top:0;left:0;min-width:100%;min-height:100%;text-align:right;opacity:0;background:none repeat scroll 0 0 transparent;cursor:inherit;display:block;}.btn-file::-ms-browse{font-size:10000px;width:100%;height:100%;}.file-caption.icon-visible .file-caption-icon{display:inline-block;}.file-caption.icon-visible .file-caption-name{padding-left:25px;}.file-caption.icon-visible > .input-group-lg .file-caption-name{padding-left:30px;}.file-caption.icon-visible > .input-group-sm .file-caption-name{padding-left:22px;}.file-caption-name:not(.file-caption-disabled){background-color:transparent;}.file-caption-name.file-processing{font-style:italic;border-color:#bbb;opacity:0.5;}.file-caption-icon{padding:7px 5px;left:4px;}.input-group-lg .file-caption-icon{font-size:1.25rem;}.input-group-sm .file-caption-icon{font-size:0.875rem;padding:0.25rem;}.file-error-message{color:#a94442;background-color:#f2dede;margin:5px;border:1px solid #ebccd1;border-radius:4px;padding:15px;}.file-error-message pre{margin:5px 0;}.file-caption-disabled{background-color:#eee;cursor:not-allowed;opacity:1;}.file-preview{border-radius:5px;border:1px solid #ddd;padding:8px;width:100%;margin-bottom:5px;}.file-preview .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px;}.file-preview .fileinput-remove{top:1px;right:1px;line-height:10px;}.file-preview .clickable{cursor:pointer;}.file-preview-image{font:40px Impact,Charcoal,sans-serif;color:#008000;width:auto;height:auto;max-width:100%;max-height:100%;}.krajee-default.file-preview-frame{margin:8px;border:1px solid rgba(0,0,0,0.2);box-shadow:0 0 10px 0 rgba(0,0,0,0.2);padding:6px;float:left;text-align:center;}.krajee-default.file-preview-frame .kv-file-content{width:213px;height:160px;}.krajee-default.file-preview-frame .kv-file-content.kv-pdf-rendered{width:400px;}.krajee-default.file-preview-frame[data-template="audio"] .kv-file-content{width:240px;height:55px;}.krajee-default.file-preview-frame .file-thumbnail-footer{height:70px;}.krajee-default.file-preview-frame:not(.file-preview-error):hover{border:1px solid rgba(0,0,0,0.3);box-shadow:0 0 10px 0 rgba(0,0,0,0.4);}.krajee-default .file-preview-text{color:#428bca;border:1px solid #ddd;outline:none;resize:none;}.krajee-default .file-preview-html{border:1px solid #ddd;}.krajee-default .file-other-icon{font-size:6em;line-height:1;}.krajee-default .file-footer-buttons{float:right;}.krajee-default .file-footer-caption{display:block;text-align:center;padding-top:4px;font-size:11px;color:#999;margin-bottom:30px;}.file-upload-stats{font-size:10px;text-align:center;width:100%;}.kv-upload-progress .file-upload-stats{font-size:12px;margin:-10px 0 5px;}.krajee-default .file-preview-error{opacity:0.65;box-shadow:none;}.krajee-default .file-thumb-progress{top:37px;left:0;right:0;}.krajee-default.kvsortable-ghost{background:#e1edf7;border:2px solid #a1abff;}.krajee-default .file-preview-other:hover{opacity:0.8;}.krajee-default .file-preview-frame:not(.file-preview-error) .file-footer-caption:hover{color:#000;}.kv-upload-progress .progress{height:20px;margin:10px 0;overflow:hidden;}.kv-upload-progress .progress-bar{height:20px;font-family:Verdana,Helvetica,sans-serif;}.file-zoom-dialog .file-other-icon{font-size:22em;font-size:50vmin;}.file-zoom-dialog .modal-dialog{width:auto;}.file-zoom-dialog .modal-header{display:flex;align-items:center;justify-content:space-between;}.file-zoom-dialog .btn-navigate{margin:0 0.1rem;padding:0;font-size:1.2rem;width:2.4rem;height:2.4rem;top:50%;border-radius:50%;text-align:center;}.btn-navigate *{width:auto;}.file-zoom-dialog .floating-buttons{top:5px;right:10px;}.file-zoom-dialog .btn-kv-prev{left:0;}.file-zoom-dialog .btn-kv-next{right:0;}.file-zoom-dialog .kv-zoom-header{padding:0.5rem;}.file-zoom-dialog .kv-zoom-body{padding:0.25rem;}.file-zoom-dialog .kv-zoom-description{position:absolute;opacity:0.8;font-size:0.8rem;background-color:#1a1a1a;padding:1rem;text-align:center;border-radius:0.5rem;color:#fff;left:15%;right:15%;bottom:15%;}.file-zoom-dialog .kv-desc-hide{float:right;color:#fff;padding:0 0.1rem;background:none;border:none;}.file-zoom-dialog .kv-desc-hide:hover{opacity:0.7;}.file-zoom-dialog .kv-desc-hide:focus{opacity:0.9;}.file-input-new .no-browse .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px;}.file-input-ajax-new .no-browse .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px;}.file-caption{width:100%;position:relative;}.file-thumb-loading{background:transparent url(loading.gif) no-repeat scroll center center content-box !important;}.file-drop-zone{border:1px dashed #aaa;min-height:260px;border-radius:4px;text-align:center;vertical-align:middle;margin:12px 15px 12px 12px;padding:5px;}.file-drop-zone.clickable:hover{border:2px dashed #999;}.file-drop-zone.clickable:focus{border:2px solid #5acde2;}.file-drop-zone .file-preview-thumbnails{cursor:default;}.file-drop-zone-title{color:#aaa;font-size:1.6em;text-align:center;padding:85px 10px;cursor:default;}.file-highlighted{border:2px dashed #999 !important;background-color:#eee;}.file-uploading{background:url(loading-sm.gif) no-repeat center bottom 10px;opacity:0.65;}.file-zoom-fullscreen .modal-dialog{min-width:100%;margin:0;}.file-zoom-fullscreen .modal-content{border-radius:0;box-shadow:none;min-height:100vh;}.file-zoom-fullscreen .kv-zoom-body{overflow-y:auto;}.floating-buttons{z-index:3000;}.floating-buttons .btn-kv{margin-left:3px;z-index:3000;}.kv-zoom-actions{min-width:140px;}.kv-zoom-actions .btn-kv{margin-left:3px;}.file-zoom-content{text-align:center;white-space:nowrap;min-height:300px;}.file-zoom-content:hover{background:transparent;}.file-zoom-content .file-preview-image{max-height:100%;}.file-zoom-content .file-preview-video{max-height:100%;}.file-zoom-content > .file-object.type-image{height:auto;min-height:inherit;}.file-zoom-content > .file-object.type-audio{width:auto;height:30px;}@media (min-width:576px){.file-zoom-dialog .modal-dialog{max-width:500px;}}@media (min-width:992px){.file-zoom-dialog .modal-lg{max-width:800px;}}@media (max-width:767px){.file-preview-thumbnails{display:flex;justify-content:center;align-items:center;flex-direction:column;}.file-zoom-dialog .modal-header{flex-direction:column;}}@media (max-width:350px){.krajee-default.file-preview-frame:not([data-template="audio"]) .kv-file-content{width:160px;}}@media (max-width:420px){.krajee-default.file-preview-frame .kv-file-content.kv-pdf-rendered{width:100%;}}.file-loading[dir=rtl]:before{background:transparent url(loading.gif) top right no-repeat;padding-left:0;padding-right:20px;}.clickable .file-drop-zone-title{cursor:pointer;}.file-sortable .file-drag-handle:hover{opacity:0.7;}.file-sortable .file-drag-handle{cursor:grab;opacity:1;}.file-grabbing,.file-grabbing *{cursor:not-allowed !important;}.file-grabbing .file-preview-thumbnails *{cursor:grabbing !important;}.file-preview-frame.sortable-chosen{background-color:#d9edf7;border-color:#17a2b8;box-shadow:none !important;}.file-preview .kv-zoom-cache{display:none;}.file-preview-other-frame,.file-preview-object,.kv-file-content,.kv-zoom-body{display:flex;align-items:center;justify-content:center;}.btn-kv-rotate,.kv-file-rotate{display:none;}.rotatable:not(.hide-rotate) .btn-kv-rotate,.rotatable:not(.hide-rotate) .kv-file-rotate{display:inline-block;}.rotatable .file-zoom-detail,.rotatable .kv-file-content,.rotatable .kv-file-content >:first-child{transform-origin:center center;}.rotate-animate{transition:transform 0.3s ease;}.kv-overflow-hidden{overflow:hidden;} \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.js b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.js new file mode 100644 index 0000000..72bf6bf --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.js @@ -0,0 +1,11 @@ +/*! + * bootstrap-fileinput v5.5.2 + * http://plugins.krajee.com/file-input + * + * Author: Kartik Visweswaran + * Copyright: 2014 - 2022, Kartik Visweswaran, Krajee.com + * + * Licensed under the BSD-3-Clause + * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md + */ +(function(factory){'use strict';if(typeof define==='function'&&define.amd){define(['jquery'],factory)}else if(typeof module==='object'&&typeof module.exports==='object'){factory(require('jquery'))}else{factory(window.jQuery)}}(function($){'use strict';$.fn.fileinputLocales={};$.fn.fileinputThemes={};if(!$.fn.fileinputBsVersion){$.fn.fileinputBsVersion=(window.bootstrap&&window.bootstrap.Alert&&window.bootstrap.Alert.VERSION)||(window.Alert&&window.Alert.VERSION)||'3.x.x'}String.prototype.setTokens=function(replacePairs){var str=this.toString(),key,re;for(key in replacePairs){if(replacePairs.hasOwnProperty(key)){re=new RegExp('\{'+key+'\}','g');str=str.replace(re,replacePairs[key])}}return str};if(!Array.prototype.flatMap){Array.prototype.flatMap=function(lambda){return[].concat(this.map(lambda))}}var $h,FileInput;$h={FRAMES:'.kv-preview-thumb',SORT_CSS:'file-sortable',INIT_FLAG:'init-',SCRIPT_SRC:document&&document.currentScript&&document.currentScript.src||null,OBJECT_PARAMS:'\n\n\n\n\n\n',DEFAULT_PREVIEW:'
    \n{previewFileIcon}\n
    ',MODAL_ID:'kvFileinputModal',MODAL_EVENTS:['show','shown','hide','hidden','loaded'],logMessages:{ajaxError:'{status}: {error}. Error Details: {text}.',badDroppedFiles:'Error scanning dropped files!',badExifParser:'Error loading the piexif.js library. {details}',badInputType:'The input "type" must be set to "file" for initializing the "bootstrap-fileinput" plugin.',exifWarning:'To avoid this warning, either set "autoOrientImage" to "false" OR ensure you have loaded the "piexif.js" library correctly on your page before the "fileinput.js" script.',invalidChunkSize:'Invalid upload chunk size: "{chunkSize}". Resumable uploads are disabled.',invalidThumb:'Invalid thumb frame with id: "{id}".',noResumableSupport:'The browser does not support resumable or chunk uploads.',noUploadUrl:'The "uploadUrl" is not set. Ajax uploads and resumable uploads have been disabled.',retryStatus:'Retrying upload for chunk # {chunk} for {filename}... retry # {retry}.',chunkQueueError:'Could not push task to ajax pool for chunk index # {index}.',resumableMaxRetriesReached:'Maximum resumable ajax retries ({n}) reached.',resumableRetryError:'Could not retry the resumable request (try # {n})... aborting.',resumableAborting:'Aborting / cancelling the resumable request.',resumableRequestError:'Error processing resumable request. {msg}'},objUrl:window.URL||window.webkitURL,getZoomPlaceholder:function(){var src=$h.SCRIPT_SRC,srcPath,zoomVar='?kvTemp__2873389129__=';if(!src){return zoomVar}srcPath=src.substring(0,src.lastIndexOf("/"));return srcPath.substring(0,srcPath.lastIndexOf("/")+1)+'img/loading.gif'+zoomVar},isBs:function(ver){var chk=$.trim(($.fn.fileinputBsVersion||'')+'');ver=parseInt(ver,10);if(!chk){return ver===4}return ver===parseInt(chk.charAt(0),10)},defaultButtonCss:function(fill){return'btn-default btn-'+(fill?'':'outline-')+'secondary'},now:function(){return new Date().getTime()},round:function(num){num=parseFloat(num);return isNaN(num)?0:Math.floor(Math.round(num))},getArray:function(obj){var i,arr=[],len=obj&&obj.length||0;for(i=0;i0){out+=(out?' ':'')+value+key.substring(0,1)}});return out},debounce:function(func,delay){var inDebounce;return function(){var args=arguments,context=this;clearTimeout(inDebounce);inDebounce=setTimeout(function(){func.apply(context,args)},delay)}},stopEvent:function(e){e.stopPropagation();e.preventDefault()},getFileName:function(file){return file?(file.fileName||file.name||''):''},createObjectURL:function(data){if($h.objUrl&&$h.objUrl.createObjectURL&&data){return $h.objUrl.createObjectURL(data)}return''},revokeObjectURL:function(data){if($h.objUrl&&$h.objUrl.revokeObjectURL&&data){$h.objUrl.revokeObjectURL(data)}},compare:function(input,str,exact){return input!==undefined&&(exact?input===str:input.match(str))},isIE:function(ver){var div,status;if(navigator.appName!=='Microsoft Internet Explorer'){return false}if(ver===10){return new RegExp('msie\\s'+ver,'i').test(navigator.userAgent)}div=document.createElement('div');div.innerHTML='';status=div.getElementsByTagName('i').length;document.body.appendChild(div);div.parentNode.removeChild(div);return status},canOrientImage:function($el){var $img=$(document.createElement('img')).css({width:'1px',height:'1px'}).insertAfter($el),flag=$img.css('image-orientation');$img.remove();return!!flag},canAssignFilesToInput:function(){var input=document.createElement('input');try{input.type='file';input.files=null;return true}catch(err){return false}},getDragDropFolders:function(items){var i,item,len=items?items.length:0,folders=0;if(len>0&&items[0].webkitGetAsEntry()){for(i=0;i=0){byteStr=atob(dataURI.split(',')[1])}else{byteStr=decodeURIComponent(dataURI.split(',')[1])}arrayBuffer=new ArrayBuffer(byteStr.length);intArray=new Uint8Array(arrayBuffer);for(i=0;i>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out+=String.fromCharCode(c);break;case 12:case 13:char2=array[i++];out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));break;case 14:char2=array[i++];char3=array[i++];out+=String.fromCharCode(((c&0x0F)<<12)|((char2&0x3F)<<6)|((char3&0x3F)<<0));break}}return out},isHtml:function(str){var a=document.createElement('div');a.innerHTML=str;for(var c=a.childNodes,i=c.length;i--;){if(c[i].nodeType===1){return true}}return false},isPdf:function(str){if($h.isEmpty(str)){return false}str=str.toString().trim().replace(/\n/g,' ');if(str.length===0){return false}},isSvg:function(str){if($h.isEmpty(str)){return false}str=str.toString().trim().replace(/\n/g,' ');if(str.length===0){return false}return str.match(/^\s*<\?xml/i)&&(str.match(/'+str+''))},uniqId:function(){return(new Date().getTime()+Math.floor(Math.random()*Math.pow(10,15))).toString(36)},cspBuffer:{CSP_ATTRIB:'data-csp-01928735',domElementsStyles:{},stash:function(htmlString){var self=this,outerDom=$.parseHTML('
    '+htmlString+'
    '),$el=$(outerDom);$el.find('[style]').each(function(key,elem){var $elem=$(elem),styleDeclaration=$elem[0].style,id=$h.uniqId(),styles={};if(styleDeclaration&&styleDeclaration.length){$(styleDeclaration).each(function(){styles[this]=styleDeclaration[this]});self.domElementsStyles[id]=styles;$elem.removeAttr('style').attr(self.CSP_ATTRIB,id)}});$el.filter('*').removeAttr('style');var values=Object.values?Object.values(outerDom):Object.keys(outerDom).map(function(itm){return outerDom[itm]});return values.flatMap(function(elem){return elem.innerHTML}).join('')},apply:function(domElement){var self=this,$el=$(domElement);$el.find('['+self.CSP_ATTRIB+']').each(function(key,elem){var $elem=$(elem),id=$elem.attr(self.CSP_ATTRIB),styles=self.domElementsStyles[id];if(styles){$elem.css(styles)}$elem.removeAttr(self.CSP_ATTRIB)});self.domElementsStyles={}}},setHtml:function($elem,htmlString){var buf=$h.cspBuffer;$elem.html(buf.stash(htmlString));buf.apply($elem);return $elem},htmlEncode:function(str,undefVal){if(str===undefined){return undefVal||null}return str.replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"').replace(/'/g,''')},replaceTags:function(str,tags){var out=str;if(!tags){return out}$.each(tags,function(key,value){if(typeof value==='function'){value=value()}out=out.split(key).join(value)});return out},cleanMemory:function($thumb){var data=$thumb.is('img')?$thumb.attr('src'):$thumb.find('source').attr('src');$h.revokeObjectURL(data)},findFileName:function(filePath){var sepIndex=filePath.lastIndexOf('/');if(sepIndex===-1){sepIndex=filePath.lastIndexOf('\\')}return filePath.split(filePath.substring(sepIndex,sepIndex+1)).pop()},checkFullScreen:function(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement},toggleFullScreen:function(maximize){var doc=document,de=doc.documentElement,isFullScreen=$h.checkFullScreen();if(de&&maximize&&!isFullScreen){if(de.requestFullscreen){de.requestFullscreen()}else{if(de.msRequestFullscreen){de.msRequestFullscreen()}else{if(de.mozRequestFullScreen){de.mozRequestFullScreen()}else{if(de.webkitRequestFullscreen){de.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}}}}}else{if(isFullScreen){if(doc.exitFullscreen){doc.exitFullscreen()}else{if(doc.msExitFullscreen){doc.msExitFullscreen()}else{if(doc.mozCancelFullScreen){doc.mozCancelFullScreen()}else{if(doc.webkitExitFullscreen){doc.webkitExitFullscreen()}}}}}}},moveArray:function(arr,oldIndex,newIndex,reverseOrder){var newArr=$.extend(true,[],arr);if(reverseOrder){newArr.reverse()}if(newIndex>=newArr.length){var k=newIndex-newArr.length;while((k--)+1){newArr.push(undefined)}}newArr.splice(newIndex,0,newArr.splice(oldIndex,1)[0]);if(reverseOrder){newArr.reverse()}return newArr},closeButton:function(css){css=($h.isBs(5)?'btn-close':'close')+(css?' '+css:'');return''},getRotation:function(value){switch(value){case 2:return'rotateY(180deg)';case 3:return'rotate(180deg)';case 4:return'rotate(180deg) rotateY(180deg)';case 5:return'rotate(270deg) rotateY(180deg)';case 6:return'rotate(90deg)';case 7:return'rotate(90deg) rotateY(180deg)';case 8:return'rotate(270deg)';default:return''}},setTransform:function(el,val){if(!el){return}el.style.transform=val;el.style.webkitTransform=val;el.style['-moz-transform']=val;el.style['-ms-transform']=val;el.style['-o-transform']=val},getObjectKeys:function(obj){var keys=[];if(obj){$.each(obj,function(key){keys.push(key)})}return keys},getObjectSize:function(obj){return $h.getObjectKeys(obj).length},whenAll:function(array){var s=[].slice,resolveValues=arguments.length===1&&$h.isArray(array)?array:s.call(arguments),deferred=$.Deferred(),i,failed=0,value,length=resolveValues.length,remaining=length,rejectContexts,rejectValues,resolveContexts,updateFunc;rejectContexts=rejectValues=resolveContexts=Array(length);updateFunc=function(index,contexts,values){return function(){if(values!==resolveValues){failed++}deferred.notifyWith(contexts[index]=this,values[index]=s.call(arguments));if(!(--remaining)){deferred[(!failed?'resolve':'reject')+'With'](contexts,values)}}};for(i=0;i0&&self.maxTotalFileCount10?len-10:Math.ceil(len/2);for(i=len;i>beg;i--){n=parseFloat(fm.bpsLog[i]);j++}fm.bps=(j>0?n/j:0)*64},delay);out={fileId:id,started:started,elapsed:elapsed,loaded:loaded,total:total,bps:fm.bps,bitrate:self._getSize(fm.bps,false,self.bitRateUnits),pendingBytes:pendingBytes};if(id){fm.stats[id]=out}else{fm.stats=out}return out},exists:function(id){return $.inArray(id,self.fileManager.getIdList())!==-1},count:function(){return self.fileManager.getIdList().length},total:function(){var fm=self.fileManager;if(!fm.totalFiles){fm.totalFiles=fm.count()}return fm.totalFiles},getTotalSize:function(){var fm=self.fileManager;if(fm.totalSize){return fm.totalSize}fm.totalSize=0;$.each(self.getFileStack(),function(id,f){var size=parseFloat(f.size);fm.totalSize+=isNaN(size)?0:size});return fm.totalSize},add:function(file,id){if(!id){id=self.fileManager.getId(file)}if(!id){return}self.fileManager.stack[id]={file:file,name:$h.getFileName(file),relativePath:$h.getFileRelativePath(file),size:file.size,nameFmt:self._getFileName(file,''),sizeFmt:self._getSize(file.size)}},remove:function($thumb){var id=self._getThumbFileId($thumb);self.fileManager.removeFile(id)},removeFile:function(id){var fm=self.fileManager;if(!id){return}delete fm.stack[id];delete fm.loadedImages[id]},move:function(idFrom,idTo){var result={},stack=self.fileManager.stack;if(!idFrom&&!idTo||idFrom===idTo){return}$.each(stack,function(k,v){if(k!==idFrom){result[k]=v}if(k===idTo){result[idFrom]=stack[idFrom]}});self.fileManager.stack=result},list:function(){var files=[];$.each(self.getFileStack(),function(k,v){if(v&&v.file){files.push(v.file)}});return files},isPending:function(id){return $.inArray(id,self.fileManager.filesProcessed)===-1&&self.fileManager.exists(id)},isProcessed:function(){var filesProcessed=true,fm=self.fileManager;$.each(self.getFileStack(),function(id){if(fm.isPending(id)){filesProcessed=false}});return filesProcessed},clear:function(){var fm=self.fileManager;self.isDuplicateError=false;self.isPersistentError=false;fm.totalFiles=null;fm.totalSize=null;fm.uploadedSize=0;fm.stack={};fm.errors=[];fm.filesProcessed=[];fm.stats={};fm.bpsLog=[];fm.bps=0;fm.clearImages()},clearImages:function(){self.fileManager.loadedImages={};self.fileManager.totalImages=0},addImage:function(id,config){self.fileManager.loadedImages[id]=config},removeImage:function(id){delete self.fileManager.loadedImages[id]},getImageIdList:function(){return $h.getObjectKeys(self.fileManager.loadedImages)},getImageCount:function(){return self.fileManager.getImageIdList().length},getId:function(file){return self._getFileId(file)},getIndex:function(id){return self.fileManager.getIdList().indexOf(id)},getThumb:function(id){var $thumb=null;self._getThumbs().each(function(){var $t=$(this);if(self._getThumbFileId($t)===id){$thumb=$t}});return $thumb},getThumbIndex:function($thumb){var id=self._getThumbFileId($thumb);return self.fileManager.getIndex(id)},getIdList:function(){return $h.getObjectKeys(self.fileManager.stack)},getFile:function(id){return self.fileManager.stack[id]||null},getFileName:function(id,fmt){var file=self.fileManager.getFile(id);if(!file){return''}return fmt?(file.nameFmt||''):file.name||''},getFirstFile:function(){var ids=self.fileManager.getIdList(),id=ids&&ids.length?ids[0]:null;return self.fileManager.getFile(id)},setFile:function(id,file){if(self.fileManager.getFile(id)){self.fileManager.stack[id].file=file}else{self.fileManager.add(file,id)}},setProcessed:function(id){self.fileManager.filesProcessed.push(id)},getProgress:function(){var total=self.fileManager.total(),filesProcessed=self.fileManager.filesProcessed.length;if(!total){return 0}return Math.ceil(filesProcessed/total*100)},setProgress:function(id,pct){var f=self.fileManager.getFile(id);if(!isNaN(pct)&&f){f.progress=pct}}}},_setUploadData:function(fd,config){var self=this;$.each(config,function(key,value){var param=self.uploadParamNames[key]||key;if($h.isArray(value)){fd.append(param,value[0],value[1])}else{fd.append(param,value)}})},_initResumableUpload:function(){var self=this,opts=self.resumableUploadOptions,logs=$h.logMessages,rm,fm=self.fileManager;if(!self.enableResumableUpload){return}if(opts.fallback!==false&&typeof opts.fallback!=='function'){opts.fallback=function(s){s._log(logs.noResumableSupport);s.enableResumableUpload=false}}if(!$h.hasResumableUploadSupport()&&opts.fallback!==false){opts.fallback(self);return}if(!self.uploadUrl&&self.enableResumableUpload){self._log(logs.noUploadUrl);self.enableResumableUpload=false;return}opts.chunkSize=parseFloat(opts.chunkSize);if(opts.chunkSize<=0||isNaN(opts.chunkSize)){self._log(logs.invalidChunkSize,{chunkSize:opts.chunkSize});self.enableResumableUpload=false;return}rm=self.resumableManager={init:function(id,f,index){rm.logs=[];rm.stack=[];rm.error='';rm.id=id;rm.file=f.file;rm.fileName=f.name;rm.fileIndex=index;rm.completed=false;rm.lastProgress=0;if(self.showPreview){rm.$thumb=fm.getThumb(id)||null;rm.$progress=rm.$btnDelete=null;if(rm.$thumb&&rm.$thumb.length){rm.$progress=rm.$thumb.find('.file-thumb-progress');rm.$btnDelete=rm.$thumb.find('.kv-file-remove')}}rm.chunkSize=opts.chunkSize*self.bytesToKB;rm.chunkCount=rm.getTotalChunks()},setAjaxError:function(jqXHR,textStatus,errorThrown,isTest){if(jqXHR.responseJSON&&jqXHR.responseJSON.error){errorThrown=jqXHR.responseJSON.error.toString()}if(!isTest){rm.error=errorThrown}if(opts.showErrorLog){self._log(logs.ajaxError,{status:jqXHR.status,error:errorThrown,text:jqXHR.responseText||''})}},reset:function(){rm.stack=[];rm.chunksProcessed={}},setProcessed:function(status){var id=rm.id,msg,$thumb=rm.$thumb,$prog=rm.$progress,hasThumb=$thumb&&$thumb.length,params={id:hasThumb?$thumb.attr('id'):'',index:fm.getIndex(id),fileId:id},tokens,skipErrorsAndProceed=self.resumableUploadOptions.skipErrorsAndProceed;rm.completed=true;rm.lastProgress=0;if(hasThumb){$thumb.removeClass('file-uploading')}if(status==='success'){fm.uploadedSize+=rm.file.size;if(self.showPreview){self._setProgress(101,$prog);self._setThumbStatus($thumb,'Success');self._initUploadSuccess(rm.chunksProcessed[id].data,$thumb)}fm.removeFile(id);delete rm.chunksProcessed[id];self._raise('fileuploaded',[params.id,params.index,params.fileId]);if(fm.isProcessed()){self._setProgress(101)}}else{if(status!=='cancel'){if(self.showPreview){self._setThumbStatus($thumb,'Error');self._setPreviewError($thumb,true);self._setProgress(101,$prog,self.msgProgressError);self._setProgress(101,self.$progress,self.msgProgressError);self.cancelling=!skipErrorsAndProceed}if(!self.$errorContainer.find('li[data-file-id="'+params.fileId+'"]').length){tokens={file:rm.fileName,max:opts.maxRetries,error:rm.error};msg=self.msgResumableUploadRetriesExceeded.setTokens(tokens);$.extend(params,tokens);self._showFileError(msg,params,'filemaxretries');if(skipErrorsAndProceed){fm.removeFile(id);delete rm.chunksProcessed[id];if(fm.isProcessed()){self._setProgress(101)}}}}}if(fm.isProcessed()){rm.reset()}},check:function(){var status=true;$.each(rm.logs,function(index,value){if(!value){status=false;return false}})},processedResumables:function(){var logs=rm.logs,i,count=0;if(!logs||!logs.length){return 0}for(i=0;irm.file.size?rm.file.size:size},getTotalChunks:function(){var chunkSize=parseFloat(rm.chunkSize);if(!isNaN(chunkSize)&&chunkSize>0){return Math.ceil(rm.file.size/chunkSize)}return 0},getProgress:function(){var chunksProcessed=rm.processedResumables(),total=rm.chunkCount;if(total===0){return 0}return Math.ceil(chunksProcessed/total*100)},checkAborted:function(intervalId){if(self._isAborted()){clearInterval(intervalId);self.unlock()}},upload:function(){var ids=fm.getIdList(),flag='new',intervalId;intervalId=setInterval(function(){var id;rm.checkAborted(intervalId);if(flag==='new'){self.lock();flag='processing';id=ids.shift();fm.initStats(id);if(fm.stack[id]){rm.init(id,fm.stack[id],fm.getIndex(id));rm.processUpload()}}if(!fm.isPending(id)&&rm.completed){flag='new'}if(fm.isProcessed()){var $initThumbs=self.$preview.find('.file-preview-initial');if($initThumbs.length){$h.addCss($initThumbs,$h.SORT_CSS);self._initSortable()}clearInterval(intervalId);self._clearFileInput();self.unlock();setTimeout(function(){var data=self.previewCache.data;if(data){self.initialPreview=data.content;self.initialPreviewConfig=data.config;self.initialPreviewThumbTags=data.tags}self._raise('filebatchuploadcomplete',[self.initialPreview,self.initialPreviewConfig,self.initialPreviewThumbTags,self._getExtraData()])},self.processDelay)}},self.processDelay)},uploadResumable:function(){var i,pool,tm=self.taskManager,total=rm.chunkCount;pool=tm.addPool(rm.id);for(i=0;iopts.maxRetries){logError(msgs.resumableMaxRetriesReached,{n:opts.maxRetries});rm.setProcessed('error');return}var fd,outData,fnBefore,fnSuccess,fnError,fnComplete,slice=file.slice?'slice':(file.mozSlice?'mozSlice':(file.webkitSlice?'webkitSlice':'slice')),blob=file[slice](chunkSize*index,chunkSize*(index+1));fd=new FormData();f=fm.stack[id];self._setUploadData(fd,{chunkCount:rm.chunkCount,chunkIndex:index,chunkSize:chunkSize,chunkSizeStart:chunkSize*index,fileBlob:[blob,rm.fileName],fileId:id,fileName:rm.fileName,fileRelativePath:f.relativePath,fileSize:file.size,retryCount:retry});if(rm.$progress&&rm.$progress.length){rm.$progress.show()}fnBefore=function(jqXHR){outData=self._getOutData(fd,jqXHR);if(self.showPreview){if(!$thumb.hasClass('file-preview-success')){self._setThumbStatus($thumb,'Loading');$h.addCss($thumb,'file-uploading')}$btnDelete.attr('disabled',true)}self._raise('filechunkbeforesend',[id,index,retry,fm,rm,outData])};fnSuccess=function(data,textStatus,jqXHR){if(self._isAborted()){logError(msgs.resumableAborting);return}outData=self._getOutData(fd,jqXHR,data);var paramNames=self.uploadParamNames,chunkIndex=paramNames.chunkIndex||'chunkIndex',params=[id,index,retry,fm,rm,outData];if(data.error){if(opts.showErrorLog){self._log(logs.retryStatus,{retry:retry+1,filename:rm.fileName,chunk:index})}self._raise('filechunkerror',params);rm.pushAjax(index,retry+1);rm.error=data.error;logError(data.error)}else{rm.logs[data[chunkIndex]]=true;if(!rm.chunksProcessed[id]){rm.chunksProcessed[id]={}}rm.chunksProcessed[id][data[chunkIndex]]=true;rm.chunksProcessed[id].data=data;deferrer.resolve.call(null,data);self._raise('filechunksuccess',params);rm.check()}};fnError=function(jqXHR,textStatus,errorThrown){if(self._isAborted()){logError(msgs.resumableAborting);return}outData=self._getOutData(fd,jqXHR);rm.setAjaxError(jqXHR,textStatus,errorThrown);self._raise('filechunkajaxerror',[id,index,retry,fm,rm,outData]);rm.pushAjax(index,retry+1);logError(msgs.resumableRetryError,{n:retry-1})};fnComplete=function(){if(!self._isAborted()){self._raise('filechunkcomplete',[id,index,retry,fm,rm,self._getOutData(fd)])}};self._ajaxSubmit(fnBefore,fnSuccess,fnComplete,fnError,fd,id,rm.fileIndex)}};rm.reset()},_initTemplateDefaults:function(){var self=this,tMain1,tMain2,tPreview,tFileIcon,tClose,tCaption,tBtnDefault,tBtnLink,tBtnBrowse,tModalMain,tModal,tProgress,tSize,tFooter,tActions,tActionDelete,tActionUpload,tActionDownload,tActionZoom,tActionDrag,tIndicator,tTagBef,tTagBef1,tTagBef2,tTagAft,tGeneric,tHtml,tImage,tText,tOffice,tGdocs,tVideo,tAudio,tFlash,tObject,tPdf,tOther,tStyle,tZoomCache,vDefaultDim,tActionRotate,tStats,tModalLabel,tDescClose,renderObject=function(type,mime){return'\n'+$h.DEFAULT_PREVIEW+'\n\n'},defBtnCss1='btn btn-sm btn-kv '+$h.defaultButtonCss();tMain1='{preview}\n
    \n
    \n
    \n {caption}\n\n'+($h.isBs(5)?'':'
    \n')+' {remove}\n {cancel}\n {pause}\n {upload}\n {browse}\n'+($h.isBs(5)?'':'
    \n')+'
    ';'
    ';tMain2='{preview}\n
    \n
    \n{remove}\n{cancel}\n{upload}\n{browse}\n';tPreview='
    \n {close}
    \n
    \n
    \n
    \n
    \n
    \n
    ';tClose=$h.closeButton('fileinput-remove');tFileIcon='';tCaption='\n';tBtnDefault='';tBtnLink='{icon} {label}';tBtnBrowse='
    {icon} {label}
    ';tModalLabel=$h.MODAL_ID+'Label';tModalMain='';tModal='\n';tDescClose='';tProgress='
    \n
    \n {status}\n
    \n
    {stats}';tStats='
    {pendingTime} {uploadSpeed}
    ';tSize=' ({sizeText})';tFooter='';tActions='
    \n \n
    \n{drag}\n
    ';tActionDelete='\n';tActionUpload='';tActionRotate='';tActionDownload='{downloadIcon}';tActionZoom='';tActionDrag='{dragIcon}';tIndicator='
    {indicator}
    ';tTagBef='
    \n';tTagBef2=tTagBef+' title="{caption}">
    \n';tTagAft='
    {footer}\n{zoomCache}
    \n';tGeneric='{content}\n';tStyle=' {style}';tHtml=renderObject('html','text/html');tText=renderObject('text','text/plain;charset=UTF-8');tPdf=renderObject('pdf','application/pdf');tImage='{alt}\n';tOffice='';tGdocs='';tVideo='\n';tAudio='\n';tFlash='\n';tObject='\n\n'+$h.OBJECT_PARAMS+' '+$h.DEFAULT_PREVIEW+'\n\n';tOther='
    \n'+$h.DEFAULT_PREVIEW+'\n
    \n';tZoomCache='
    {zoomContent}
    ';vDefaultDim={width:'100%',height:'100%','min-height':'480px'};if(self._isPdfRendered()){tPdf=self.pdfRendererTemplate.replace('{renderer}',self._encodeURI(self.pdfRendererUrl))}self.defaults={layoutTemplates:{main1:tMain1,main2:tMain2,preview:tPreview,close:tClose,fileIcon:tFileIcon,caption:tCaption,modalMain:tModalMain,modal:tModal,descriptionClose:tDescClose,progress:tProgress,stats:tStats,size:tSize,footer:tFooter,indicator:tIndicator,actions:tActions,actionDelete:tActionDelete,actionRotate:tActionRotate,actionUpload:tActionUpload,actionDownload:tActionDownload,actionZoom:tActionZoom,actionDrag:tActionDrag,btnDefault:tBtnDefault,btnLink:tBtnLink,btnBrowse:tBtnBrowse,zoomCache:tZoomCache},previewMarkupTags:{tagBefore1:tTagBef1,tagBefore2:tTagBef2,tagAfter:tTagAft},previewContentTemplates:{generic:tGeneric,html:tHtml,image:tImage,text:tText,office:tOffice,gdocs:tGdocs,video:tVideo,audio:tAudio,flash:tFlash,object:tObject,pdf:tPdf,other:tOther},allowedPreviewTypes:['image','html','text','video','audio','flash','pdf','object'],previewTemplates:{},previewSettings:{image:{width:'auto',height:'auto','max-width':'100%','max-height':'100%'},html:{width:'213px',height:'160px'},text:{width:'213px',height:'160px'},office:{width:'213px',height:'160px'},gdocs:{width:'213px',height:'160px'},video:{width:'213px',height:'160px'},audio:{width:'100%',height:'30px'},flash:{width:'213px',height:'160px'},object:{width:'213px',height:'160px'},pdf:{width:'100%',height:'160px','position':'relative'},other:{width:'213px',height:'160px'}},previewSettingsSmall:{image:{width:'auto',height:'auto','max-width':'100%','max-height':'100%'},html:{width:'100%',height:'160px'},text:{width:'100%',height:'160px'},office:{width:'100%',height:'160px'},gdocs:{width:'100%',height:'160px'},video:{width:'100%',height:'auto'},audio:{width:'100%',height:'30px'},flash:{width:'100%',height:'auto'},object:{width:'100%',height:'auto'},pdf:{width:'100%',height:'160px'},other:{width:'100%',height:'160px'}},previewZoomSettings:{image:{width:'auto',height:'auto','max-width':'100%','max-height':'100%'},html:vDefaultDim,text:vDefaultDim,office:{width:'100%',height:'100%','max-width':'100%','min-height':'480px'},gdocs:{width:'100%',height:'100%','max-width':'100%','min-height':'480px'},video:{width:'auto',height:'100%','max-width':'100%'},audio:{width:'100%',height:'30px'},flash:{width:'auto',height:'480px'},object:{width:'auto',height:'100%','max-width':'100%','min-height':'480px'},pdf:vDefaultDim,other:{width:'auto',height:'100%','min-height':'480px'}},mimeTypeAliases:{'video/quicktime':'video/mp4'},fileTypeSettings:{image:function(vType,vName){return($h.compare(vType,'image.*')&&!$h.compare(vType,/(tiff?|wmf)$/i)||$h.compare(vName,/\.(gif|png|jpe?g)$/i))},html:function(vType,vName){return $h.compare(vType,'text/html')||$h.compare(vName,/\.(htm|html)$/i)},office:function(vType,vName){return $h.compare(vType,/(word|excel|powerpoint|office)$/i)||$h.compare(vName,/\.(docx?|xlsx?|pptx?|pps|potx?)$/i)},gdocs:function(vType,vName){return $h.compare(vType,/(word|excel|powerpoint|office|iwork-pages|tiff?)$/i)||$h.compare(vName,/\.(docx?|xlsx?|pptx?|pps|potx?|rtf|ods|odt|pages|ai|dxf|ttf|tiff?|wmf|e?ps)$/i)},text:function(vType,vName){return $h.compare(vType,'text.*')||$h.compare(vName,/\.(xml|javascript)$/i)||$h.compare(vName,/\.(txt|md|nfo|ini|json|php|js|css)$/i)},video:function(vType,vName){return $h.compare(vType,'video.*')&&($h.compare(vType,/(ogg|mp4|mp?g|mov|webm|3gp)$/i)||$h.compare(vName,/\.(og?|mp4|webm|mp?g|mov|3gp)$/i))},audio:function(vType,vName){return $h.compare(vType,'audio.*')&&($h.compare(vName,/(ogg|mp3|mp?g|wav)$/i)||$h.compare(vName,/\.(og?|mp3|mp?g|wav)$/i))},flash:function(vType,vName){return $h.compare(vType,'application/x-shockwave-flash',true)||$h.compare(vName,/\.(swf)$/i)},pdf:function(vType,vName){return $h.compare(vType,'application/pdf',true)||$h.compare(vName,/\.(pdf)$/i)},object:function(){return true},other:function(){return true}},fileActionSettings:{showRemove:true,showUpload:true,showDownload:true,showZoom:true,showDrag:true,showRotate:false,removeIcon:'',removeClass:defBtnCss1,removeErrorClass:'btn btn-sm btn-kv btn-danger',removeTitle:'Remove file',uploadIcon:'',uploadClass:defBtnCss1,uploadTitle:'Upload file',uploadRetryIcon:'',uploadRetryTitle:'Retry upload',downloadIcon:'',downloadClass:defBtnCss1,downloadTitle:'Download file',rotateIcon:'',rotateClass:defBtnCss1,rotateTitle:'Rotate 90 deg. clockwise',zoomIcon:'',zoomClass:defBtnCss1,zoomTitle:'View Details',dragIcon:'',dragClass:'text-primary',dragTitle:'Move / Rearrange',dragSettings:{},indicatorNew:'',indicatorSuccess:'',indicatorError:'',indicatorLoading:'',indicatorPaused:'',indicatorNewTitle:'Not uploaded yet',indicatorSuccessTitle:'Uploaded',indicatorErrorTitle:'Upload Error',indicatorLoadingTitle:'Uploading …',indicatorPausedTitle:'Upload Paused'}};$.each(self.defaults,function(key,setting){if(key==='allowedPreviewTypes'){if(self.allowedPreviewTypes===undefined){self.allowedPreviewTypes=setting}return}self[key]=$.extend(true,{},setting,self[key])});self._initPreviewTemplates()},_initPreviewTemplates:function(){var self=this,tags=self.previewMarkupTags,tagBef,tagAft=tags.tagAfter;$.each(self.previewContentTemplates,function(key,value){if($h.isEmpty(self.previewTemplates[key])){tagBef=tags.tagBefore2;if(key==='generic'||key==='image'){tagBef=tags.tagBefore1}if(self._isPdfRendered()&&key==='pdf'){tagBef=tagBef.replace('kv-file-content','kv-file-content kv-pdf-rendered')}self.previewTemplates[key]=tagBef+value+tagAft}})},_initPreviewCache:function(){var self=this;self.previewCache={data:{},init:function(){var content=self.initialPreview;if(content.length>0&&!$h.isArray(content)){content=content.split(self.initialPreviewDelimiter)}self.previewCache.data={content:content,config:self.initialPreviewConfig,tags:self.initialPreviewThumbTags}},count:function(skipNull){if(!self.previewCache.data||!self.previewCache.data.content){return 0}if(skipNull){var chk=self.previewCache.data.content.filter(function(n){return n!==null});return chk.length}return self.previewCache.data.content.length},get:function(i,isDisabled){var ind=$h.INIT_FLAG+i,data=self.previewCache.data,config=data.config[i],content=data.content[i],out,$tmp,cat,ftr,fname,ftype,frameClass,asData=$h.ifSet('previewAsData',config,self.initialPreviewAsData),a=config?{title:config.title||null,alt:config.alt||null}:{title:null,alt:null},parseTemplate=function(cat,dat,fname,ftype,ftr,ind,fclass,t){var fc=' file-preview-initial '+$h.SORT_CSS+(fclass?' '+fclass:''),id=self.previewInitId+'-'+ind,fileId=config&&config.fileId||id;return self._generatePreviewTemplate(cat,dat,fname,ftype,id,fileId,false,null,null,fc,ftr,ind,t,a,config&&config.zoomData||dat)};if(!content||!content.length){return''}isDisabled=isDisabled===undefined?true:isDisabled;cat=$h.ifSet('type',config,self.initialPreviewFileType||'generic');fname=$h.ifSet('filename',config,$h.ifSet('caption',config));ftype=$h.ifSet('filetype',config,cat);ftr=self.previewCache.footer(i,isDisabled,(config&&config.size||null));frameClass=$h.ifSet('frameClass',config);if(asData){out=parseTemplate(cat,content,fname,ftype,ftr,ind,frameClass)}else{out=parseTemplate('generic',content,fname,ftype,ftr,ind,frameClass,cat).setTokens({'content':data.content[i]})}if(data.tags.length&&data.tags[i]){out=$h.replaceTags(out,data.tags[i])}if(!$h.isEmpty(config)&&!$h.isEmpty(config.frameAttr)){$tmp=$h.createElement(out);$tmp.find('.file-preview-initial').attr(config.frameAttr);out=$tmp.html();$tmp.remove()}return out},clean:function(data){data.content=$h.cleanArray(data.content);data.config=$h.cleanArray(data.config);data.tags=$h.cleanArray(data.tags);self.previewCache.data=data},add:function(content,config,tags,append){var data=self.previewCache.data,index;if(!content||!content.length){return 0}index=content.length-1;if(!$h.isArray(content)){content=content.split(self.initialPreviewDelimiter)}if(append&&data.content){index=data.content.push(content[0])-1;data.config[index]=config;data.tags[index]=tags}else{data.content=content;data.config=config;data.tags=tags}self.previewCache.clean(data);return index},set:function(content,config,tags,append){var data=self.previewCache.data,i,chk;if(!content||!content.length){return}if(!$h.isArray(content)){content=content.split(self.initialPreviewDelimiter)}chk=content.filter(function(n){return n!==null});if(!chk.length){return}if(data.content===undefined){data.content=[]}if(data.config===undefined){data.config=[]}if(data.tags===undefined){data.tags=[]}if(append){for(i=0;i'+fileName+': '+msg}}self._showFileError(msg,params,'fileusererror')},_showFileError:function(msg,params,event){var self=this,$error=self.$errorContainer,ev=event||'fileuploaderror',fId=params&¶ms.fileId||'',e=params&¶ms.id?'
  • '+msg+'
  • ':'
  • '+msg+'
  • ';if($error.find('ul').length===0){self._addError('
      '+e+'
    ')}else{$error.find('ul').append(e)}$error.fadeIn(self.fadeDelay);self._raise(ev,[params,msg]);self._setValidationError('file-input-new');return true},_showError:function(msg,params,event){var self=this,$error=self.$errorContainer,ev=event||'fileerror';params=params||{};params.reader=self.reader;self._addError(msg);$error.fadeIn(self.fadeDelay);self._raise(ev,[params,msg]);if(!self.isAjaxUpload){self._clearFileInput()}self._setValidationError('file-input-new');self.$btnUpload.attr('disabled',true);return true},_noFilesError:function(params){var self=this,label=self.minFileCount>1?self.filePlural:self.fileSingle,msg=self.msgFilesTooLess.replace('{n}',self.minFileCount).replace('{files}',label),$error=self.$errorContainer;msg='
  • '+msg+'
  • ';if($error.find('ul').length===0){self._addError('
      '+msg+'
    ')}else{$error.find('ul').append(msg)}self.isError=true;self._updateFileDetails(0);$error.fadeIn(self.fadeDelay);self._raise('fileerror',[params,msg]);self._clearFileInput();self._setValidationError()},_parseError:function(operation,jqXHR,errorThrown,fileName){var self=this,errMsg=$.trim(errorThrown+''),textPre,errText,text;errText=jqXHR.responseJSON&&jqXHR.responseJSON.error?jqXHR.responseJSON.error.toString():'';text=errText?errText:jqXHR.responseText;if(self.cancelling&&self.msgUploadAborted){errMsg=self.msgUploadAborted}if(self.showAjaxErrorDetails&&text){if(errText){errMsg=$.trim(errText+'')}else{text=$.trim(text.replace(/\n\s*\n/g,'\n'));textPre=text.length?'
    '+text+'
    ':'';errMsg+=errMsg?textPre:text}}if(!errMsg){errMsg=self.msgAjaxError.replace('{operation}',operation)}self.cancelling=false;return fileName?''+fileName+': '+errMsg:errMsg},_parseFileType:function(type,name){var self=this,isValid,vType,cat,i,types=self.allowedPreviewTypes||[];if(type==='application/text-plain'){return'text'}for(i=0;i-1){ext=fname.split('.').pop();if(self.previewFileIconSettings){out=self.previewFileIconSettings[ext]||self.previewFileIconSettings[ext.toLowerCase()]||null}if(self.previewFileExtSettings){$.each(self.previewFileExtSettings,function(key,func){if(self.previewFileIconSettings[key]&&func(ext)){out=self.previewFileIconSettings[key];return}})}}return out||self.previewFileIcon},_parseFilePreviewIcon:function(content,fname){var self=this,icn=self._getPreviewIcon(fname),out=content;if(out.indexOf('{previewFileIcon}')>-1){out=out.setTokens({'previewFileIconClass':self.previewFileIconClass,'previewFileIcon':icn})}return out},_raise:function(event,params){var self=this,e=$.Event(event);if(params!==undefined){self.$element.trigger(e,params)}else{self.$element.trigger(e)}var out=e.result,isAborted=out===false;if(e.isDefaultPrevented()||isAborted){return false}if(e.type==='filebatchpreupload'&&(out||isAborted)){self.ajaxAborted=out;return false}switch(event){case'filebatchuploadcomplete':case'filebatchuploadsuccess':case'fileuploaded':case'fileclear':case'filecleared':case'filereset':case'fileerror':case'filefoldererror':case'filecustomerror':case'filesuccessremove':break;default:if(!self.ajaxAborted){self.ajaxAborted=out}break}return true},_listenFullScreen:function(isFullScreen){var self=this,$modal=self.$modal,$btnFull,$btnBord;if(!$modal||!$modal.length){return}$btnFull=$modal&&$modal.find('.btn-kv-fullscreen');$btnBord=$modal&&$modal.find('.btn-kv-borderless');if(!$btnFull.length||!$btnBord.length){return}$btnFull.removeClass('active').attr('aria-pressed','false');$btnBord.removeClass('active').attr('aria-pressed','false');if(isFullScreen){$btnFull.addClass('active').attr('aria-pressed','true')}else{$btnBord.addClass('active').attr('aria-pressed','true')}if($modal.hasClass('file-zoom-fullscreen')){self._maximizeZoomDialog()}else{if(isFullScreen){self._maximizeZoomDialog()}else{$btnBord.removeClass('active').attr('aria-pressed','false')}}},_listen:function(){var self=this,$el=self.$element,$form=self.$form,$cont=self.$container,fullScreenEv;self._handler($el,'click',function(e){self._initFileSelected();if($el.hasClass('file-no-browse')){if($el.data('zoneClicked')){$el.data('zoneClicked',false)}else{e.preventDefault()}}});self._handler($el,'change',$.proxy(self._change,self));self._handler(self.$caption,'paste',$.proxy(self.paste,self));if(self.showBrowse){self._handler(self.$btnFile,'click',$.proxy(self._browse,self));self._handler(self.$btnFile,'keypress',function(e){var keycode=e.keyCode||e.which;if(keycode===13){$el.trigger('click');self._browse(e)}})}self._handler($cont.find('.fileinput-remove:not([disabled])'),'click',$.proxy(self.clear,self));self._handler($cont.find('.fileinput-cancel'),'click',$.proxy(self.cancel,self));self._handler($cont.find('.fileinput-pause'),'click',$.proxy(self.pause,self));self._initDragDrop();self._handler($form,'reset',$.proxy(self.clear,self));if(!self.isAjaxUpload){self._handler($form,'submit',$.proxy(self._submitForm,self))}self._handler(self.$container.find('.fileinput-upload'),'click',$.proxy(self._uploadClick,self));self._handler($(window),'resize',function(){self._listenFullScreen(screen.width===window.innerWidth&&screen.height===window.innerHeight)});fullScreenEv='webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange';self._handler($(document),fullScreenEv,function(){self._listenFullScreen($h.checkFullScreen())});self.$caption.on('focus',function(){self.$captionContainer.focus()});self._autoFitContent();self._initClickable();self._refreshPreview()},_autoFitContent:function(){var width=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,self=this,config=width<400?(self.previewSettingsSmall||self.defaults.previewSettingsSmall):(self.previewSettings||self.defaults.previewSettings),sel;$.each(config,function(cat,settings){sel='.file-preview-frame .file-preview-'+cat;self.$preview.find(sel+'.kv-preview-data,'+sel+' .kv-preview-data').css(settings)})},_scanDroppedItems:function(item,files,path){path=path||'';var self=this,i,dirReader,readDir,errorHandler=function(e){self._log($h.logMessages.badDroppedFiles);self._log(e)};if(item.isFile){item.file(function(file){if(path){file.newPath=path+file.name}files.push(file)},errorHandler)}else{if(item.isDirectory){dirReader=item.createReader();readDir=function(){dirReader.readEntries(function(entries){if(entries&&entries.length>0){for(i=0;i-1;self._zoneDragDropInit(e);if(self.isDisabled||!hasFiles){dt.effectAllowed='none';dt.dropEffect='none';return}dt.dropEffect='copy';if(self._raise('fileDragEnter',{'sourceEvent':e,'files':dt.types.Files})){$h.addCss(self.$dropZone,'file-highlighted')}},_zoneDragLeave:function(e){var self=this;self._zoneDragDropInit(e);if(self.isDisabled){return}if(self._raise('fileDragLeave',{'sourceEvent':e})){self.$dropZone.removeClass('file-highlighted')}},_dropFiles:function(e,files){var self=this,$el=self.$element;if(!self.isAjaxUpload){self.changeTriggered=true;$el.get(0).files=files;setTimeout(function(){self.changeTriggered=false;$el.trigger('change'+self.namespace)},self.processDelay)}else{self._change(e,files)}self.$dropZone.removeClass('file-highlighted')},_zoneDrop:function(e){var self=this,i,$el=self.$element,dt=e.originalEvent.dataTransfer,files=dt.files,items=dt.items,folders=$h.getDragDropFolders(items);e.preventDefault();if(self.isDisabled||$h.isEmpty(files)){return}if(!self._raise('fileDragDrop',{'sourceEvent':e,'files':files})){return}if(folders>0){if(!self.isAjaxUpload){self._showFolderError(folders);return}files=[];for(i=0;i0&&newIndex>=len,$item=$(e.item),$first;if(exceedsLast){newIndex=len-1}self.initialPreview=$h.moveArray(self.initialPreview,oldIndex,newIndex,rev);self.initialPreviewConfig=$h.moveArray(self.initialPreviewConfig,oldIndex,newIndex,rev);self.previewCache.init();self.getFrames('.file-preview-initial').each(function(){$(this).attr('data-fileindex',$h.INIT_FLAG+i);i++});if(exceedsLast){$first=self.getFrames(':not(.file-preview-initial):first');if($first.length){$item.slideUp(function(){$item.insertBefore($first).slideDown()})}}self._raise('filesorted',{previewId:$item.attr('id'),'oldIndex':oldIndex,'newIndex':newIndex,stack:self.initialPreviewConfig})},};$.extend(true,settings,self.fileActionSettings.dragSettings);if(self.sortable){self.sortable.destroy()}self.sortable=Sortable.create($el[0],settings)},_setPreviewContent:function(content){var self=this;$h.setHtml(self.$preview,content);self._autoFitContent()},_initPreviewImageOrientations:function(){var self=this,i=0,canOrientImage=self.canOrientImage;if(!self.autoOrientImageInitial&&!canOrientImage){return}self.getFrames('.file-preview-initial').each(function(){var $thumb=$(this),$img,$zoomImg,id,config=self.initialPreviewConfig[i];if(config&&config.exif&&config.exif.Orientation){id=$thumb.attr('id');$img=$thumb.find('>.kv-file-content img');$zoomImg=self._getZoom(id,' >.kv-file-content img');if(canOrientImage){$img.css('image-orientation',(self.autoOrientImageInitial?'from-image':'none'))}else{self.setImageOrientation($img,$zoomImg,config.exif.Orientation,$thumb)}}i++})},_initPreview:function(isInit){var self=this,cap=self.initialCaption||'',out;if(!self.previewCache.count(true)){self._clearPreview();if(isInit){self._setCaption(cap)}else{self._initCaption()}return}out=self.previewCache.out();cap=isInit&&self.initialCaption?self.initialCaption:out.caption;self._setPreviewContent(out.content);self._setInitThumbAttr();self._setCaption(cap);self._initSortable();if(!$h.isEmpty(out.content)){self.$container.removeClass('file-input-new')}self._initPreviewImageOrientations()},_getZoomButton:function(type){var self=this,label=self.previewZoomButtonIcons[type],css=self.previewZoomButtonClasses[type],title=' title="'+(self.previewZoomButtonTitles[type]||'')+'" ',tag=$h.isBs(5)?'bs-':'',params=title+(type==='close'?' data-'+tag+'dismiss="modal" aria-hidden="true"':'');if(type==='fullscreen'||type==='borderless'||type==='toggleheader'){params+=' data-toggle="button" aria-pressed="false" autocomplete="off"'}return''},_getModalContent:function(){var self=this;return self._getLayoutTemplate('modal').setTokens({'rtl':self.rtl?' kv-rtl':'','zoomFrameClass':self.frameClass,'prev':self._getZoomButton('prev'),'next':self._getZoomButton('next'),'rotate':self._getZoomButton('rotate'),'toggleheader':self._getZoomButton('toggleheader'),'fullscreen':self._getZoomButton('fullscreen'),'borderless':self._getZoomButton('borderless'),'close':self._getZoomButton('close')})},_listenModalEvent:function(event){var self=this,$modal=self.$modal,getParams=function(e){return{sourceEvent:e,previewId:$modal.data('previewId'),modal:$modal}};$modal.on(event+'.bs.modal',function(e){if(e.namespace!=='bs.modal'){return}var $btnFull=$modal.find('.btn-fullscreen'),$btnBord=$modal.find('.btn-borderless');if($modal.data('fileinputPluginId')===self.$element.attr('id')){self._raise('filezoom'+event,getParams(e))}if(event==='shown'){self._handleRotation($modal,$modal.find('.file-zoom-detail'),$modal.data('angle'));$btnBord.removeClass('active').attr('aria-pressed','false');$btnFull.removeClass('active').attr('aria-pressed','false');if($modal.hasClass('file-zoom-fullscreen')){self._maximizeZoomDialog();if($h.checkFullScreen()){$btnFull.addClass('active').attr('aria-pressed','true')}else{$btnBord.addClass('active').attr('aria-pressed','true')}}}})},_initZoom:function(){var self=this,$dialog,modalMain=self._getLayoutTemplate('modalMain'),modalId='#'+$h.MODAL_ID;modalMain=self._setTabIndex('modal',modalMain);if(!self.showPreview){return}self.$modal=$(modalId);if(!self.$modal||!self.$modal.length){$dialog=$h.createElement($h.cspBuffer.stash(modalMain)).insertAfter(self.$container);self.$modal=$(modalId).insertBefore($dialog);$h.cspBuffer.apply(self.$modal);$dialog.remove()}$h.initModal(self.$modal);self.$modal.html($h.cspBuffer.stash(self._getModalContent()));$h.cspBuffer.apply(self.$modal);$.each($h.MODAL_EVENTS,function(key,event){self._listenModalEvent(event)})},_initZoomButtons:function(){var self=this,$modal=self.$modal,previewId=$modal.data('previewId')||'',$first,$last,thumbs=self.getFrames().toArray(),len=thumbs.length,$prev=$modal.find('.btn-kv-prev'),$next=$modal.find('.btn-kv-next'),$rotate=$modal.find('.btn-kv-rotate');if(thumbs.length<2){$prev.hide();$next.hide();return}else{$prev.show();$next.show()}if(!len){return}$first=$(thumbs[0]);$last=$(thumbs[len-1]);$prev.removeAttr('disabled');$next.removeAttr('disabled');if(self.reversePreviewOrder){[$prev,$next]=[$next,$prev]}if($first.length&&$first.attr('id')===previewId){$prev.attr('disabled',true)}if($last.length&&$last.attr('id')===previewId){$next.attr('disabled',true)}},_maximizeZoomDialog:function(){var self=this,$modal=self.$modal,$head=$modal.find('.modal-header:visible'),$foot=$modal.find('.modal-footer:visible'),$body=$modal.find('.kv-zoom-body'),h=$(window).height(),diff=0;$modal.addClass('file-zoom-fullscreen');if($head&&$head.length){h-=$head.outerHeight(true)}if($foot&&$foot.length){h-=$foot.outerHeight(true)}if($body&&$body.length){diff=$body.outerHeight(true)-$body.height();h-=diff}$modal.find('.kv-zoom-body').height(h)},_resizeZoomDialog:function(fullScreen){var self=this,$modal=self.$modal,$btnFull=$modal.find('.btn-kv-fullscreen'),$btnBord=$modal.find('.btn-kv-borderless');if($modal.hasClass('file-zoom-fullscreen')){$h.toggleFullScreen(false);if(!fullScreen){if(!$btnFull.hasClass('active')){$modal.removeClass('file-zoom-fullscreen');self.$modal.find('.kv-zoom-body').css('height',self.zoomModalHeight)}else{$btnFull.removeClass('active').attr('aria-pressed','false')}}else{if(!$btnFull.hasClass('active')){$modal.removeClass('file-zoom-fullscreen');self._resizeZoomDialog(true);if($btnBord.hasClass('active')){$btnBord.removeClass('active').attr('aria-pressed','false')}}}}else{if(!fullScreen){self._maximizeZoomDialog();return}$h.toggleFullScreen(true)}$modal.focus()},_setZoomContent:function($frame,navigate){var self=this,$content,tmplt,body,title,$body,$dataEl,config,previewId=$frame.attr('id'),$zoomPreview=self._getZoom(previewId),$modal=self.$modal,$tmp,desc,$desc,$btnFull=$modal.find('.btn-kv-fullscreen'),$btnBord=$modal.find('.btn-kv-borderless'),cap,size,$btnTogh=$modal.find('.btn-kv-toggleheader'),dir=navigate==='prev'?'Left':'Right',slideIn='slideIn'+dir,slideOut='slideOut'+dir,parsed,zoomData=$frame.data('zoom');if(zoomData){zoomData=decodeURIComponent(zoomData);parsed=$zoomPreview.html().replace(self.zoomPlaceholder,'').setTokens({zoomData:zoomData});$zoomPreview.html(parsed);$frame.data('zoom','');$zoomPreview.attr('data-zoom',zoomData)}tmplt=$zoomPreview.attr('data-template')||'generic';$content=$zoomPreview.find('.kv-file-content');body=$content.length?$content.html():'';cap=$frame.data('caption')||self.msgZoomModalHeading;size=$frame.data('size')||'';desc=$frame.data('description')||'';$modal.find('.kv-zoom-caption').attr('title',cap).html(cap);$modal.find('.kv-zoom-size').html(size);$desc=$modal.find('.kv-zoom-description').hide();if(desc){if(self.showDescriptionClose){desc=self._getLayoutTemplate('descriptionClose').setTokens({closeIcon:self.previewZoomButtonIcons.close})+''+desc}$desc.show().html(desc);if(self.showDescriptionClose){self._handler($modal.find('.kv-desc-hide'),'click',function(){$(this).parent().fadeOut('fast',function(){$modal.focus()})})}}$body=$modal.find('.kv-zoom-body');$modal.removeClass('kv-single-content');if(navigate){$tmp=$body.addClass('file-thumb-loading').clone().insertAfter($body);$h.setHtml($body,body).hide();$tmp.fadeOut('fast',function(){$body.fadeIn('fast',function(){$body.removeClass('file-thumb-loading')});$tmp.remove()})}else{$h.setHtml($body,body)}config=self.previewZoomSettings[tmplt];if(config){$dataEl=$body.find('.kv-preview-data');$h.addCss($dataEl,'file-zoom-detail');$.each(config,function(key,value){$dataEl.css(key,value);if(($dataEl.attr('width')&&key==='width')||($dataEl.attr('height')&&key==='height')){$dataEl.removeAttr(key)}})}$modal.data('previewId',previewId);self._handler($modal.find('.btn-kv-prev'),'click',function(){self._zoomSlideShow('prev',previewId)});self._handler($modal.find('.btn-kv-next'),'click',function(){self._zoomSlideShow('next',previewId)});self._handler($btnFull,'click',function(){self._resizeZoomDialog(true)});self._handler($btnBord,'click',function(){self._resizeZoomDialog(false)});self._handler($btnTogh,'click',function(){var $header=$modal.find('.modal-header'),$floatBar=$modal.find('.floating-buttons'),ht,$actions=$header.find('.kv-zoom-actions'),resize=function(height){var $body=self.$modal.find('.kv-zoom-body'),h=self.zoomModalHeight;if($modal.hasClass('file-zoom-fullscreen')){h=$body.outerHeight(true);if(!height){h=h-$header.outerHeight(true)}}$body.css('height',height?h+height:h)};if($header.is(':visible')){ht=$header.outerHeight(true);$header.slideUp('slow',function(){$actions.find('.btn').appendTo($floatBar);resize(ht)})}else{$floatBar.find('.btn').appendTo($actions);$header.slideDown('slow',function(){resize()})}$modal.focus()});self._handler($modal,'keydown',function(e){var key=e.which||e.keyCode,delay=self.processDelay+1,$prev=$(this).find('.btn-kv-prev'),$next=$(this).find('.btn-kv-next'),vId=$(this).data('previewId'),vPrevKey,vNextKey;[vPrevKey,vNextKey]=self.rtl?[39,37]:[37,39];$.each({prev:[$prev,vPrevKey],next:[$next,vNextKey]},function(direction,config){var $btn=config[0],vKey=config[1];if(key===vKey&&$btn.length){$modal.focus();if(!$btn.attr('disabled')){$btn.blur();setTimeout(function(){$btn.focus();self._zoomSlideShow(direction,vId);setTimeout(function(){if($btn.attr('disabled')){$modal.focus()}},delay)},delay)}}})})},_showModal:function($frame){var self=this,$modal=self.$modal,$content,css,angle;if(!$frame||!$frame.length){return}$h.initModal($modal);$h.setHtml($modal,self._getModalContent());self._setZoomContent($frame);$modal.removeClass('rotatable');$modal.data({backdrop:false,fileinputPluginId:self.$element.attr('id')});$modal.find('.kv-zoom-body').css('height',self.zoomModalHeight);$content=$frame.find('.kv-file-content > :first-child');if($content.length){css=$content.css('transform');if(css){$modal.find('.file-zoom-detail').css('transform',css)}}if($frame.hasClass('rotatable')){$modal.addClass('rotatable')}if($frame.data('angle')){$modal.data('angle',$frame.data('angle'))}angle=($frame.data('angle')||0);$modal.modal('show');self._initZoomButtons();self._initRotateZoom($frame,$content)},_zoomPreview:function($btn){var self=this,$frame;if(!$btn.length){throw'Cannot zoom to detailed preview!';}$frame=$btn.closest($h.FRAMES);self._showModal($frame)},_zoomSlideShow:function(dir,previewId){var self=this,$modal=self.$modal,$btn=$modal.find('.kv-zoom-actions .btn-kv-'+dir),$targFrame,i,$thumb,thumbsData=self.getFrames().toArray(),thumbs=[],len=thumbsData.length,out,angle,$content;if(self.reversePreviewOrder){dir=dir==='prev'?'next':'prev'}if($btn.attr('disabled')){return}for(i=0;i=len||!thumbs[out]){return}$targFrame=$(thumbs[out]);if($targFrame.length){self._setZoomContent($targFrame,dir)}self._initZoomButtons();if($targFrame.length&&$targFrame.hasClass('rotatable')){angle=$targFrame.data('angle')||0;$modal.addClass('rotatable').data('angle',angle);$content=$targFrame.find('.kv-file-content > :first-child');self._initRotateZoom($targFrame,$content)}else{$modal.removeClass('rotatable').removeData('angle')}self._raise('filezoom'+dir,{'previewId':previewId,modal:self.$modal})},_initZoomButton:function(){var self=this;self.$preview.find('.kv-file-zoom').each(function(){var $el=$(this);self._handler($el,'click',function(){self._zoomPreview($el)})})},_inputFileCount:function(){return this.$element[0].files.length},_refreshPreview:function(){var self=this,files;if((!self._inputFileCount()&&!self.isAjaxUpload)||!self.showPreview||!self.isPreviewable){return}if(self.isAjaxUpload){if(self.fileManager.count()>0){files=$.extend(true,[],self.getFileList());self.fileManager.clear();self._clearFileInput()}else{files=self.$element[0].files}}else{files=self.$element[0].files}if(files&&files.length){self.readFiles(files)}},_clearObjects:function($el){$el.find('video audio').each(function(){this.pause();$(this).remove()});$el.find('img object div').each(function(){$(this).remove()})},_clearFileInput:function(){var self=this,$el=self.$element,$srcFrm,$tmpFrm,$tmpEl;if(!self._inputFileCount()){return}$srcFrm=$el.closest('form');$tmpFrm=$(document.createElement('form'));$tmpEl=$(document.createElement('div'));$el.before($tmpEl);if($srcFrm.length){$srcFrm.after($tmpFrm)}else{$tmpEl.after($tmpFrm)}$tmpFrm.append($el).trigger('reset');$tmpEl.before($el).remove();$tmpFrm.remove()},_resetUpload:function(){var self=this;self.uploadInitiated=false;self.uploadStartTime=$h.now();self.uploadCache=[];self.$btnUpload.removeAttr('disabled');self._setProgress(0);self._hideProgress();self._resetErrors(false);self._initAjax();self.fileManager.clearImages();self._resetCanvas();if(self.overwriteInitial){self.initialPreview=[];self.initialPreviewConfig=[];self.initialPreviewThumbTags=[];self.previewCache.data={content:[],config:[],tags:[]}}},_resetCanvas:function(){var self=this;if(self.imageCanvas&&self.imageCanvasContext){self.imageCanvasContext.clearRect(0,0,self.imageCanvas.width,self.imageCanvas.height)}},_hasInitialPreview:function(){var self=this;return!self.overwriteInitial&&self.previewCache.count(true)},_resetPreview:function(){var self=this,out,cap,$div,hasSuc=self.showUploadedThumbs,hasErr=!self.removeFromPreviewOnError,includeProcessed=(hasSuc||hasErr)&&self.isDuplicateError;if(self.previewCache.count(true)){out=self.previewCache.out();if(includeProcessed){$div=$h.createElement('').insertAfter(self.$container);self.getFrames().each(function(){var $thumb=$(this);if((hasSuc&&$thumb.hasClass('file-preview-success'))||(hasErr&&$thumb.hasClass('file-preview-error'))){$div.append($thumb)}})}self._setPreviewContent(out.content);self._setInitThumbAttr();cap=self.initialCaption?self.initialCaption:out.caption;self._setCaption(cap);if(includeProcessed){$div.contents().appendTo(self.$preview);$div.remove()}}else{self._clearPreview();self._initCaption()}if(self.showPreview){self._initZoom();self._initSortable()}self.isDuplicateError=false},_clearDefaultPreview:function(){var self=this;self.$preview.find('.file-default-preview').remove()},_validateDefaultPreview:function(){var self=this;if(!self.showPreview||$h.isEmpty(self.defaultPreviewContent)){return}self._setPreviewContent('
    '+self.defaultPreviewContent+'
    ');self.$container.removeClass('file-input-new');self._initClickable()},_resetPreviewThumbs:function(isAjax){var self=this,out;if(isAjax){self._clearPreview();self.clearFileStack();return}if(self._hasInitialPreview()){out=self.previewCache.out();self._setPreviewContent(out.content);self._setInitThumbAttr();self._setCaption(out.caption);self._initPreviewActions()}else{self._clearPreview()}},_getLayoutTemplate:function(t){var self=this,template=self.layoutTemplates[t];if($h.isEmpty(self.customLayoutTags)){return template}return $h.replaceTags(template,self.customLayoutTags)},_getPreviewTemplate:function(t){var self=this,templates=self.previewTemplates,template=templates[t]||templates.other;if($h.isEmpty(self.customPreviewTags)){return template}return $h.replaceTags(template,self.customPreviewTags)},_getOutData:function(formdata,jqXHR,responseData,filesData){var self=this;jqXHR=jqXHR||{};responseData=responseData||{};filesData=filesData||self.fileManager.list();return{formdata:formdata,files:filesData,filenames:self.filenames,filescount:self.getFilesCount(),extra:self._getExtraData(),response:responseData,reader:self.reader,jqXHR:jqXHR}},_getMsgSelected:function(n,processing){var self=this,strFiles=n===1?self.fileSingle:self.filePlural;return n>0?self.msgSelected.replace('{n}',n).replace('{files}',strFiles):(processing?self.msgProcessing:self.msgNoFilesSelected)},_getFrame:function(id,skipWarning){var self=this,$frame=$h.getFrameElement(self.$preview,id);if(self.showPreview&&!skipWarning&&!$frame.length){self._log($h.logMessages.invalidThumb,{id:id})}return $frame},_getZoom:function(id,selector){var self=this,$frame=$h.getZoomElement(self.$preview,id,selector);if(self.showPreview&&!$frame.length){self._log($h.logMessages.invalidThumb,{id:id})}return $frame},_getThumbs:function(css){css=css||'';return this.getFrames(':not(.file-preview-initial)'+css)},_getThumbId:function(fileId){var self=this;return self.previewInitId+'-'+fileId},_getExtraData:function(fileId,index){var self=this,data=self.uploadExtraData;if(typeof self.uploadExtraData==='function'){data=self.uploadExtraData(fileId,index)}return data},_initXhr:function(xhrobj,fileId){var self=this,fm=self.fileManager,func=function(event){var pct=0,total=event.total,loaded=event.loaded||event.position,stats=fm.getUploadStats(fileId,loaded,total);if(event.lengthComputable&&!self.enableResumableUpload){pct=$h.round(loaded/total*100)}if(fileId){self._setFileUploadStats(fileId,pct,stats)}else{self._setProgress(pct,null,null,self._getStats(stats))}self._raise('fileajaxprogress',[stats])};if(xhrobj.upload){if(self.progressDelay){func=$h.debounce(func,self.progressDelay)}xhrobj.upload.addEventListener('progress',func,false)}return xhrobj},_initAjaxSettings:function(){var self=this;self._ajaxSettings=$.extend(true,{},self.ajaxSettings);self._ajaxDeleteSettings=$.extend(true,{},self.ajaxDeleteSettings)},_mergeAjaxCallback:function(funcName,srcFunc,type){var self=this,settings=self._ajaxSettings,flag=self.mergeAjaxCallbacks,targFunc;if(type==='delete'){settings=self._ajaxDeleteSettings;flag=self.mergeAjaxDeleteCallbacks}targFunc=settings[funcName];if(flag&&typeof targFunc==='function'){if(flag==='before'){settings[funcName]=function(){targFunc.apply(this,arguments);srcFunc.apply(this,arguments)}}else{settings[funcName]=function(){srcFunc.apply(this,arguments);targFunc.apply(this,arguments)}}}else{settings[funcName]=srcFunc}},_ajaxSubmit:function(fnBefore,fnSuccess,fnComplete,fnError,formdata,fileId,index,vUrl){var self=this,settings,defaults,data,tm=self.taskManager;if(!self._raise('filepreajax',[formdata,fileId,index])){return}formdata.append('initialPreview',JSON.stringify(self.initialPreview));formdata.append('initialPreviewConfig',JSON.stringify(self.initialPreviewConfig));formdata.append('initialPreviewThumbTags',JSON.stringify(self.initialPreviewThumbTags));self._initAjaxSettings();self._mergeAjaxCallback('beforeSend',fnBefore);self._mergeAjaxCallback('success',fnSuccess);self._mergeAjaxCallback('complete',fnComplete);self._mergeAjaxCallback('error',fnError);vUrl=vUrl||self.uploadUrlThumb||self.uploadUrl;if(typeof vUrl==='function'){vUrl=vUrl()}data=self._getExtraData(fileId,index)||{};if(typeof data==='object'){$.each(data,function(key,value){formdata.append(key,value)})}defaults={xhr:function(){var xhrobj=$.ajaxSettings.xhr();return self._initXhr(xhrobj,fileId)},url:self._encodeURI(vUrl),type:'POST',dataType:'json',data:formdata,cache:false,processData:false,contentType:false};settings=$.extend(true,{},defaults,self._ajaxSettings);self.ajaxQueue.push(settings);tm.addTask(fileId+'-'+index,function(){var self=this.self,config,xhr;config=self.ajaxQueue.shift();xhr=$.ajax(config);self.ajaxRequests.push(xhr)}).runWithContext({self:self})},_mergeArray:function(prop,content){var self=this,arr1=$h.cleanArray(self[prop]),arr2=$h.cleanArray(content);self[prop]=arr1.concat(arr2)},_initUploadSuccess:function(out,$thumb,allFiles){var self=this,append,data,index,$div,content,config,tags,id,i;if(!self.showPreview||typeof out!=='object'||$.isEmptyObject(out)){self._resetCaption();return}if(out.initialPreview!==undefined&&out.initialPreview.length>0){self.hasInitData=true;content=out.initialPreview||[];config=out.initialPreviewConfig||[];tags=out.initialPreviewThumbTags||[];append=out.append===undefined||out.append;if(content.length>0&&!$h.isArray(content)){content=content.split(self.initialPreviewDelimiter)}if(content.length){self._mergeArray('initialPreview',content);self._mergeArray('initialPreviewConfig',config);self._mergeArray('initialPreviewThumbTags',tags)}if($thumb!==undefined){if(!allFiles){index=self.previewCache.add(content[0],config[0],tags[0],append);data=self.previewCache.get(index,false);$div=$h.createElement(data).hide().appendTo($thumb);$thumb.fadeOut('slow',function(){var $newThumb=$div.find('> .file-preview-frame');if($newThumb&&$newThumb.length){$newThumb.insertBefore($thumb).fadeIn('slow').css('display:inline-block')}self._initPreviewActions();self._clearFileInput();$thumb.remove();$div.remove();self._initSortable()})}else{id=$thumb.attr('id');i=self._getUploadCacheIndex(id);if(i!==null){self.uploadCache[i]={id:id,content:content[0],config:config[0]||[],tags:tags[0]||[],append:append}}}}else{self.previewCache.set(content,config,tags,append);self._initPreview();self._initPreviewActions()}}self._resetCaption()},_getUploadCacheIndex:function(id){var self=this,i,len=self.uploadCache.length,config;for(i=0;i0||!$.isEmptyObject(self.uploadExtraData),uploadFailed,$prog,fnBefore,errMsg,fnSuccess,fnComplete,fnError,updateUploadLog,op=self.ajaxOperations.uploadThumb,fileObj=fm.getFile(id),params={id:previewId,index:i,fileId:id},fileName=self.fileManager.getFileName(id,true),resolve=function(){if(deferrer&&deferrer.resolve){deferrer.resolve()}},reject=function(){if(deferrer&&deferrer.reject){deferrer.reject()}};if(self.enableResumableUpload){return}self.uploadInitiated=true;if(self.showPreview){$thumb=fm.getThumb(id);$prog=$thumb.find('.file-thumb-progress');$btnUpload=$thumb.find('.kv-file-upload');$btnDelete=$thumb.find('.kv-file-remove');$prog.show()}if(count===0||!hasPostData||(self.showPreview&&$btnUpload&&$btnUpload.hasClass('disabled'))||self._abort(params)){return}updateUploadLog=function(){if(!uploadFailed){fm.removeFile(id)}else{fm.errors.push(id)}fm.setProcessed(id);if(fm.isProcessed()){self.fileBatchCompleted=true;chkComplete()}};chkComplete=function(){var $initThumbs;if(!self.fileBatchCompleted){return}setTimeout(function(){var triggerReset=fm.count()===0,errCount=fm.errors.length;self._updateInitialPreview();self.unlock(triggerReset);if(triggerReset){self._clearFileInput()}$initThumbs=self.$preview.find('.file-preview-initial');if(self.uploadAsync&&$initThumbs.length){$h.addCss($initThumbs,$h.SORT_CSS);self._initSortable()}self._raise('filebatchuploadcomplete',[fm.stack,self._getExtraData()]);if(!self.retryErrorUploads||errCount===0){fm.clear()}self._setProgress(101);self.ajaxAborted=false;self.uploadInitiated=false},self.processDelay)};fnBefore=function(jqXHR){outData=self._getOutData(formdata,jqXHR);fm.initStats(id);self.fileBatchCompleted=false;if(!isBatch){self.ajaxAborted=false}if(self.showPreview){if(!$thumb.hasClass('file-preview-success')){self._setThumbStatus($thumb,'Loading');$h.addCss($thumb,'file-uploading')}$btnUpload.attr('disabled',true);$btnDelete.attr('disabled',true)}if(!isBatch){self.lock()}if(fm.errors.indexOf(id)!==-1){delete fm.errors[id]}self._raise('filepreupload',[outData,previewId,i,self._getThumbFileId($thumb)]);$.extend(true,params,outData);if(self._abort(params)){jqXHR.abort();if(!isBatch){self._setThumbStatus($thumb,'New');$thumb.removeClass('file-uploading');$btnUpload.removeAttr('disabled');$btnDelete.removeAttr('disabled')}self._setProgressCancelled()}};fnSuccess=function(data,textStatus,jqXHR){var pid=self.showPreview&&$thumb.attr('id')?$thumb.attr('id'):previewId;outData=self._getOutData(formdata,jqXHR,data);$.extend(true,params,outData);setTimeout(function(){if($h.isEmpty(data)||$h.isEmpty(data.error)){if(self.showPreview){self._setThumbStatus($thumb,'Success');$btnUpload.hide();self._initUploadSuccess(data,$thumb,isBatch);self._setProgress(101,$prog)}self._raise('fileuploaded',[outData,pid,i,self._getThumbFileId($thumb)]);if(!isBatch){self.fileManager.remove($thumb)}else{updateUploadLog();resolve()}}else{uploadFailed=true;errMsg=self._parseError(op,jqXHR,self.msgUploadError,self.fileManager.getFileName(id));self._showFileError(errMsg,params);self._setPreviewError($thumb,true);if(!self.retryErrorUploads){$btnUpload.hide()}if(isBatch){updateUploadLog();resolve()}self._setProgress(101,self._getFrame(pid).find('.file-thumb-progress'),self.msgUploadError)}},self.processDelay)};fnComplete=function(){if(self.showPreview){$btnUpload.removeAttr('disabled');$btnDelete.removeAttr('disabled');$thumb.removeClass('file-uploading')}if(!isBatch){self.unlock(false);self._clearFileInput()}else{chkComplete()}self._initSuccessThumbs()};fnError=function(jqXHR,textStatus,errorThrown){errMsg=self._parseError(op,jqXHR,errorThrown,self.fileManager.getFileName(id));uploadFailed=true;setTimeout(function(){var $prog;if(isBatch){updateUploadLog();reject()}self.fileManager.setProgress(id,100);self._setPreviewError($thumb,true);if(!self.retryErrorUploads){$btnUpload.hide()}$.extend(true,params,self._getOutData(formdata,jqXHR));self._setProgress(101,self.$progress,self.msgAjaxProgressError.replace('{operation}',op));$prog=self.showPreview&&$thumb?$thumb.find('.file-thumb-progress'):'';self._setProgress(101,$prog,self.msgUploadError);self._showFileError(errMsg,params)},self.processDelay)};self._setFileData(formdata,fileObj.file,fileName,id);self._setUploadData(formdata,{fileId:id});self._ajaxSubmit(fnBefore,fnSuccess,fnComplete,fnError,formdata,id,i)},_setFileData:function(formdata,file,fileName,fileId){var self=this,preProcess=self.preProcessUpload;if(preProcess&&typeof preProcess==='function'){formdata.append(self.uploadFileAttr,preProcess(fileId,file))}else{formdata.append(self.uploadFileAttr,file,fileName)}},_checkBatchPreupload:function(outData,jqXHR){var self=this,out=self._raise('filebatchpreupload',[outData]);if(out){return true}self._abort(outData);if(jqXHR){jqXHR.abort()}self._getThumbs().each(function(){var $thumb=$(this),$btnUpload=$thumb.find('.kv-file-upload'),$btnDelete=$thumb.find('.kv-file-remove');if($thumb.hasClass('file-preview-loading')){self._setThumbStatus($thumb,'New');$thumb.removeClass('file-uploading')}$btnUpload.removeAttr('disabled');$btnDelete.removeAttr('disabled')});self._setProgressCancelled();return false},_uploadBatch:function(){var self=this,fm=self.fileManager,total=fm.total(),params={},fnBefore,fnSuccess,fnError,fnComplete,hasPostData=total>0||!$.isEmptyObject(self.uploadExtraData),errMsg,setAllUploaded,formdata=new FormData(),op=self.ajaxOperations.uploadBatch;if(total===0||!hasPostData||self._abort(params)){return}setAllUploaded=function(){self.fileManager.clear();self._clearFileInput()};fnBefore=function(jqXHR){self.lock();fm.initStats();var outData=self._getOutData(formdata,jqXHR);self.ajaxAborted=false;if(self.showPreview){self._getThumbs().each(function(){var $thumb=$(this),$btnUpload=$thumb.find('.kv-file-upload'),$btnDelete=$thumb.find('.kv-file-remove');if(!$thumb.hasClass('file-preview-success')){self._setThumbStatus($thumb,'Loading');$h.addCss($thumb,'file-uploading')}$btnUpload.attr('disabled',true);$btnDelete.attr('disabled',true)})}self._checkBatchPreupload(outData,jqXHR)};fnSuccess=function(data,textStatus,jqXHR){var outData=self._getOutData(formdata,jqXHR,data),key=0,$thumbs=self._getThumbs(':not(.file-preview-success)'),keys=$h.isEmpty(data)||$h.isEmpty(data.errorkeys)?[]:data.errorkeys;if($h.isEmpty(data)||$h.isEmpty(data.error)){self._raise('filebatchuploadsuccess',[outData]);setAllUploaded();if(self.showPreview){$thumbs.each(function(){var $thumb=$(this);self._setThumbStatus($thumb,'Success');$thumb.removeClass('file-uploading');$thumb.find('.kv-file-upload').hide().removeAttr('disabled')});self._initUploadSuccess(data)}else{self.reset()}self._setProgress(101)}else{if(self.showPreview){$thumbs.each(function(){var $thumb=$(this);$thumb.removeClass('file-uploading');$thumb.find('.kv-file-upload').removeAttr('disabled');$thumb.find('.kv-file-remove').removeAttr('disabled');if(keys.length===0||$.inArray(key,keys)!==-1){self._setPreviewError($thumb,true);if(!self.retryErrorUploads){$thumb.find('.kv-file-upload').hide();self.fileManager.remove($thumb)}}else{$thumb.find('.kv-file-upload').hide();self._setThumbStatus($thumb,'Success');self.fileManager.remove($thumb)}if(!$thumb.hasClass('file-preview-error')||self.retryErrorUploads){key++}});self._initUploadSuccess(data)}errMsg=self._parseError(op,jqXHR,self.msgUploadError);self._showFileError(errMsg,outData,'filebatchuploaderror');self._setProgress(101,self.$progress,self.msgUploadError)}};fnComplete=function(){self.unlock();self._initSuccessThumbs();self._clearFileInput();self._raise('filebatchuploadcomplete',[self.fileManager.stack,self._getExtraData()])};fnError=function(jqXHR,textStatus,errorThrown){var outData=self._getOutData(formdata,jqXHR);errMsg=self._parseError(op,jqXHR,errorThrown);self._showFileError(errMsg,outData,'filebatchuploaderror');self.uploadFileCount=total-1;if(!self.showPreview){return}self._getThumbs().each(function(){var $thumb=$(this);$thumb.removeClass('file-uploading');if(self._getThumbFile($thumb)){self._setPreviewError($thumb)}});self._getThumbs().removeClass('file-uploading');self._getThumbs(' .kv-file-upload').removeAttr('disabled');self._getThumbs(' .kv-file-delete').removeAttr('disabled');self._setProgress(101,self.$progress,self.msgAjaxProgressError.replace('{operation}',op))};var ctr=0;$.each(self.fileManager.stack,function(key,data){if(!$h.isEmpty(data.file)){self._setFileData(formdata,data.file,(data.nameFmt||('untitled_'+ctr)),key)}ctr++});self._ajaxSubmit(fnBefore,fnSuccess,fnComplete,fnError,formdata)},_uploadExtraOnly:function(){var self=this,params={},fnBefore,fnSuccess,fnComplete,fnError,formdata=new FormData(),errMsg,op=self.ajaxOperations.uploadExtra;fnBefore=function(jqXHR){self.lock();var outData=self._getOutData(formdata,jqXHR);self._setProgress(50);params.data=outData;params.xhr=jqXHR;self._checkBatchPreupload(outData,jqXHR)};fnSuccess=function(data,textStatus,jqXHR){var outData=self._getOutData(formdata,jqXHR,data);if($h.isEmpty(data)||$h.isEmpty(data.error)){self._raise('filebatchuploadsuccess',[outData]);self._clearFileInput();self._initUploadSuccess(data);self._setProgress(101)}else{errMsg=self._parseError(op,jqXHR,self.msgUploadError);self._showFileError(errMsg,outData,'filebatchuploaderror')}};fnComplete=function(){self.unlock();self._clearFileInput();self._raise('filebatchuploadcomplete',[self.fileManager.stack,self._getExtraData()])};fnError=function(jqXHR,textStatus,errorThrown){var outData=self._getOutData(formdata,jqXHR);errMsg=self._parseError(op,jqXHR,errorThrown);params.data=outData;self._showFileError(errMsg,outData,'filebatchuploaderror');self._setProgress(101,self.$progress,self.msgAjaxProgressError.replace('{operation}',op))};self._ajaxSubmit(fnBefore,fnSuccess,fnComplete,fnError,formdata)},_deleteFileIndex:function($frame){var self=this,ind=$frame.attr('data-fileindex'),rev=self.reversePreviewOrder;if(ind.substring(0,5)===$h.INIT_FLAG){ind=parseInt(ind.replace($h.INIT_FLAG,''));self.initialPreview=$h.spliceArray(self.initialPreview,ind,rev);self.initialPreviewConfig=$h.spliceArray(self.initialPreviewConfig,ind,rev);self.initialPreviewThumbTags=$h.spliceArray(self.initialPreviewThumbTags,ind,rev);self.getFrames().each(function(){var $nFrame=$(this),nInd=$nFrame.attr('data-fileindex');if(nInd.substring(0,5)===$h.INIT_FLAG){nInd=parseInt(nInd.replace($h.INIT_FLAG,''));if(nInd>ind){nInd--;$nFrame.attr('data-fileindex',$h.INIT_FLAG+nInd)}}})}},_resetCaption:function(){var self=this;setTimeout(function(){var cap='',n,chk=self.previewCache.count(true),len=self.fileManager.count(),file,incomplete=':not(.file-preview-success):not(.file-preview-error)',cfg,hasThumb=self.showPreview&&self.getFrames(incomplete).length;if(len===0&&chk===0&&!hasThumb){self.reset()}else{n=chk+len;if(n>1){cap=self._getMsgSelected(n)}else{if(len===0){cfg=self.initialPreviewConfig[0];cap='';if(cfg){cap=cfg.caption||cfg.filename||''}if(!cap){cap=self._getMsgSelected(n)}}else{file=self.fileManager.getFirstFile();cap=file?file.nameFmt:'_'}}self._setCaption(cap)}},self.processDelay)},_handleRotation:function($el,$content,angle){var self=this,css,newCss,addCss='',scale=1,elContent=$content[0],quadrant,transform,h,w,wNew,$parent=$content.parent(),hParent,wParent,$body=$('body'),bodyExists=!!$body.length;if(bodyExists){$body.addClass('kv-overflow-hidden')}if(!$content.length||$el.hasClass('hide-rotate')){if(bodyExists){$body.removeClass('kv-overflow-hidden')}return}transform=$content.css('transform');if(transform){$content.css('transform','none')}if(transform){$content.css('transform',transform)}angle=angle||0;quadrant=angle%360;css='rotate('+angle+'deg)';newCss='rotate('+quadrant+'deg)';addCss='';if(quadrant===90||quadrant===270){w=elContent.naturalWidth||$content.outerWidth()||0;h=elContent.naturalHeight||$content.outerHeight()||0;scale=w>h&&w!=0?(h/w).toFixed(2):1;if($parent.length){hParent=$parent.height();wParent=$parent.width();wNew=Math.min(w,wParent);if(hParent>scale*wNew){scale=wNew>hParent&&wNew!=0?(hParent/wNew).toFixed(2):1}}if(scale!==1){addCss=' scale('+scale+')'}}$content.addClass('rotate-animate').css('transform',css+addCss);setTimeout(function(){$content.removeClass('rotate-animate').css('transform',newCss+addCss);if(bodyExists){$body.removeClass('kv-overflow-hidden')}$el.data('angle',quadrant)},self.fadeDelay)},_initRotateButton:function(){var self=this;self.getFrames('.rotatable .kv-file-rotate').each(function(){var $el=$(this),$frame=$el.closest($h.FRAMES),$content=$frame.find('.kv-file-content > :first-child');self._handler($el,'click',function(){var angle=($frame.data('angle')||0)+90;self._handleRotation($frame,$content,angle)})})},_initRotateZoom:function($frame,$content){var self=this,$modal=self.$modal,$rotate=$modal.find('.btn-kv-rotate'),angle=$frame.data('angle');$modal.data('angle',angle);if($rotate.length){$rotate.off('click');if($modal.hasClass('rotatable')){$rotate.on('click',function(){angle=($modal.data('angle')||0)+90;$modal.data('angle',angle);self._handleRotation($modal,$modal.find('.file-zoom-detail'),angle);self._handleRotation($frame,$content,angle);if($frame.hasClass('hide-rotate')){$frame.data('angle',angle)}})}}},_initFileActions:function(){var self=this;if(!self.showPreview){return}self._initZoomButton();self._initRotateButton();self.getFrames(' .kv-file-remove').each(function(){var $el=$(this),$frame=$el.closest($h.FRAMES),hasError,id=$frame.attr('id'),ind=$frame.attr('data-fileindex'),status,fm=self.fileManager;self._handler($el,'click',function(){status=self._raise('filepreremove',[id,ind]);if(status===false||!self._validateMinCount()){return false}hasError=$frame.hasClass('file-preview-error');$h.cleanMemory($frame);$frame.fadeOut('slow',function(){self.fileManager.remove($frame);self._clearObjects($frame);$frame.remove();if(id&&hasError){self.$errorContainer.find('li[data-thumb-id="'+id+'"]').fadeOut('fast',function(){$(this).remove();if(!self._errorsExist()){self._resetErrors()}})}self._clearFileInput();self._resetCaption();self._raise('fileremoved',[id,ind])})})});self.getFrames(' .kv-file-upload').each(function(){var $el=$(this);self._handler($el,'click',function(){var $frame=$el.closest($h.FRAMES),fileId=self._getThumbFileId($frame);self._hideProgress();if($frame.hasClass('file-preview-error')&&!self.retryErrorUploads){return}self._uploadSingle(self.fileManager.getIndex(fileId),fileId,false)})})},_initPreviewActions:function(){var self=this,$preview=self.$preview,deleteExtraData=self.deleteExtraData||{},btnRemove=$h.FRAMES+' .kv-file-remove',settings=self.fileActionSettings,origClass=settings.removeClass,errClass=settings.removeErrorClass,resetProgress=function(){var hasFiles=self.isAjaxUpload?self.previewCache.count(true):self._inputFileCount();if(!self.getFrames().length&&!hasFiles){self._setCaption('');self.reset();self.initialCaption=''}else{self._resetCaption()}};self._initZoomButton();self._initRotateButton();$preview.find(btnRemove).each(function(){var $el=$(this),vUrl=$el.data('url')||self.deleteUrl,vKey=$el.data('key'),errMsg,fnBefore,fnSuccess,fnError,op=self.ajaxOperations.deleteThumb;if($h.isEmpty(vUrl)||vKey===undefined){return}if(typeof vUrl==='function'){vUrl=vUrl()}var $frame=$el.closest($h.FRAMES),cache=self.previewCache.data,settings,params,config,fileName,extraData,index=$frame.attr('data-fileindex');index=parseInt(index.replace($h.INIT_FLAG,''));config=$h.isEmpty(cache.config)&&$h.isEmpty(cache.config[index])?null:cache.config[index];extraData=$h.isEmpty(config)||$h.isEmpty(config.extra)?deleteExtraData:config.extra;fileName=config&&(config.filename||config.caption)||'';if(typeof extraData==='function'){extraData=extraData()}params={id:$el.attr('id'),key:vKey,extra:extraData};fnBefore=function(jqXHR){self.ajaxAborted=false;self._raise('filepredelete',[vKey,jqXHR,extraData]);if(self._abort()){jqXHR.abort()}else{$el.removeClass(errClass);$h.addCss($frame,'file-uploading');$h.addCss($el,'disabled '+origClass)}};fnSuccess=function(data,textStatus,jqXHR){var n,cap;if(!$h.isEmpty(data)&&!$h.isEmpty(data.error)){params.jqXHR=jqXHR;params.response=data;errMsg=self._parseError(op,jqXHR,self.msgDeleteError,fileName);self._showFileError(errMsg,params,'filedeleteerror');$frame.removeClass('file-uploading');$el.removeClass('disabled '+origClass).addClass(errClass);resetProgress();return}$frame.removeClass('file-uploading').addClass('file-deleted');$frame.fadeOut('slow',function(){index=parseInt(($frame.attr('data-fileindex')).replace($h.INIT_FLAG,''));self.previewCache.unset(index);self._deleteFileIndex($frame);n=self.previewCache.count(true);cap=n>0?self._getMsgSelected(n):'';self._setCaption(cap);self._raise('filedeleted',[vKey,jqXHR,extraData]);self._clearObjects($frame);$frame.remove();resetProgress()})};fnError=function(jqXHR,textStatus,errorThrown){var errMsg=self._parseError(op,jqXHR,errorThrown,fileName);params.jqXHR=jqXHR;params.response={};self._showFileError(errMsg,params,'filedeleteerror');$frame.removeClass('file-uploading');$el.removeClass('disabled '+origClass).addClass(errClass);resetProgress()};self._initAjaxSettings();self._mergeAjaxCallback('beforeSend',fnBefore,'delete');self._mergeAjaxCallback('success',fnSuccess,'delete');self._mergeAjaxCallback('error',fnError,'delete');settings=$.extend(true,{},{url:self._encodeURI(vUrl),type:'POST',dataType:'json',data:$.extend(true,{},{key:vKey},extraData)},self._ajaxDeleteSettings);self._handler($el,'click',function(){if(!self._validateMinCount()){return false}self.ajaxAborted=false;self._raise('filebeforedelete',[vKey,extraData]);if(self.ajaxAborted instanceof Promise){self.ajaxAborted.then(function(result){if(!result){$.ajax(settings)}})}else{if(!self.ajaxAborted){$.ajax(settings)}}})})},_hideFileIcon:function(){var self=this;if(self.overwriteInitial){self.$captionContainer.removeClass('icon-visible')}},_showFileIcon:function(){var self=this;$h.addCss(self.$captionContainer,'icon-visible')},_getSize:function(bytes,skipTemplate,sizeUnits){var self=this,size=parseFloat(bytes),i=0,factor=self.bytesToKB,func=self.fileSizeGetter,out,sizeHuman=size,newSize;if(!$.isNumeric(bytes)||!$.isNumeric(size)){return''}if(typeof func==='function'){out=func(size)}else{if(!sizeUnits){sizeUnits=self.sizeUnits}if(size>0){while(sizeHuman>=factor){sizeHuman/=factor;++i}if(!sizeUnits[i]){sizeHuman=size;i=0}}newSize=sizeHuman.toFixed(2);if(newSize==sizeHuman){newSize=sizeHuman}out=newSize+' '+sizeUnits[i]}return skipTemplate?out:self._getLayoutTemplate('size').replace('{sizeText}',out)},_getFileType:function(ftype){var self=this;return self.mimeTypeAliases[ftype]||ftype},_generatePreviewTemplate:function(cat,data,fname,ftype,previewId,fileId,isError,size,fnameUpdated,frameClass,foot,ind,templ,attrs,zoomData){var self=this,caption=self.slug(fname),prevContent,zoomContent='',styleAttribs='',filename=fnameUpdated||fname,isIconic,ext=filename.split('.').pop().toLowerCase(),screenW=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,config,title=caption,alt=caption,typeCss='type-default',getContent,addFrameCss,footer=foot||self._renderFileFooter(cat,caption,size,'auto',isError),isRotatable,alwaysPreview=$.inArray(ext,self.alwaysPreviewFileExtensions)!==-1,forcePrevIcon=self.preferIconicPreview&&!alwaysPreview,forceZoomIcon=self.preferIconicZoomPreview&&!alwaysPreview,newCat=forcePrevIcon?'other':cat;config=screenW<400?(self.previewSettingsSmall[newCat]||self.defaults.previewSettingsSmall[newCat]):(self.previewSettings[newCat]||self.defaults.previewSettings[newCat]);if(config){$.each(config,function(key,val){styleAttribs+=key+':'+val+';'})}getContent=function(vCat,vData,zoom,frameCss,vZoomData){var id=zoom?'zoom-'+previewId:previewId,tmplt=self._getPreviewTemplate(vCat),css=(frameClass||'')+' '+frameCss,tokens;if(self.frameClass){css=self.frameClass+' '+css}if(zoom){css=css.replace(' '+$h.SORT_CSS,'')}tmplt=self._parseFilePreviewIcon(tmplt,fname);if(cat==='object'&&!ftype){$.each(self.defaults.fileTypeSettings,function(key,func){if(key==='object'||key==='other'){return}if(func(fname,ftype)){typeCss='type-'+key}})}if(!$h.isEmpty(attrs)){if(attrs.title!==undefined&&attrs.title!==null){title=attrs.title}if(attrs.alt!==undefined&&attrs.alt!==null){alt=title=attrs.alt}}tokens={'previewId':id,'caption':caption,'title':title,'alt':alt,'frameClass':css,'type':self._getFileType(ftype),'fileindex':ind,'fileid':fileId||'','filename':filename,'typeCss':typeCss,'footer':footer,'data':vData,'template':templ||cat,'style':styleAttribs?'style="'+styleAttribs+'"':'','zoomData':vZoomData?encodeURIComponent(vZoomData):''};if(zoom){tokens.zoomCache='';tokens.zoomData='{zoomData}'}return tmplt.setTokens(tokens)};ind=ind||previewId.slice(previewId.lastIndexOf('-')+1);isRotatable=self.fileActionSettings.showRotate&&$.inArray(ext,self.rotatableFileExtensions)!==-1;if(self.fileActionSettings.showZoom){addFrameCss='kv-zoom-thumb';if(isRotatable){addFrameCss+=' rotatable'+(forceZoomIcon?' hide-rotate':'')}zoomContent=getContent((forceZoomIcon?'other':cat),data,true,addFrameCss,zoomData)}zoomContent='\n'+self._getLayoutTemplate('zoomCache').replace('{zoomContent}',zoomContent);if(typeof self.sanitizeZoomCache==='function'){zoomContent=self.sanitizeZoomCache(zoomContent)}addFrameCss='kv-preview-thumb';if(isRotatable){isIconic=forcePrevIcon||self.hideThumbnailContent||!!self.previewFileIconSettings[ext];addFrameCss+=' rotatable'+(isIconic?' hide-rotate':'')}prevContent=getContent((forcePrevIcon?'other':cat),data,false,addFrameCss,zoomData);return prevContent.setTokens({zoomCache:zoomContent})},_addToPreview:function($preview,content){var self=this,$el;content=$h.cspBuffer.stash(content);$el=self.reversePreviewOrder?$preview.prepend(content):$preview.append(content);$h.cspBuffer.apply($preview);return $el},_previewDefault:function(file,isDisabled){var self=this,$preview=self.$preview;if(!self.showPreview){return}var fname=$h.getFileName(file),ftype=file?file.type:'',content,size=file.size||0,caption=self._getFileName(file,''),isError=isDisabled===true&&!self.isAjaxUpload,data=$h.createObjectURL(file),fileId=self.fileManager.getId(file),previewId=self._getThumbId(fileId);self._clearDefaultPreview();content=self._generatePreviewTemplate('other',data,fname,ftype,previewId,fileId,isError,size);self._addToPreview($preview,content);self._setThumbAttr(previewId,caption,size);if(isDisabled===true&&self.isAjaxUpload){self._setThumbStatus(self._getFrame(previewId),'Error')}},_previewFile:function(i,file,theFile,data,fileInfo){if(!this.showPreview){return}var self=this,fname=$h.getFileName(file),ftype=fileInfo.type,content,caption=fileInfo.name,cat=self._parseFileType(ftype,fname),$preview=self.$preview,fsize=file.size||0,iData=cat==='image'?theFile.target.result:data,fm=self.fileManager,fileId=fm.getId(file),previewId=self._getThumbId(fileId);content=self._generatePreviewTemplate(cat,iData,fname,ftype,previewId,fileId,false,fsize,fileInfo.filename);self._clearDefaultPreview();self._addToPreview($preview,content);var $thumb=self._getFrame(previewId);self._validateImageOrientation($thumb.find('img'),file,previewId,fileId,caption,ftype,fsize,iData);self._setThumbAttr(previewId,caption,fsize);self._initSortable()},_setThumbAttr:function(id,caption,size,description){var self=this,$frame=self._getFrame(id);if($frame.length){size=size&&size>0?self._getSize(size):'';$frame.data({'caption':caption,'size':size,'description':description||''})}},_setInitThumbAttr:function(){var self=this,data=self.previewCache.data,len=self.previewCache.count(true),config,caption,size,description,previewId;if(len===0){return}for(var i=0;i&"']/g,'_')},_updateFileDetails:function(numFiles){var self=this,$el=self.$element,label,n,log,nFiles,file,name=($h.isIE(9)&&$h.findFileName($el.val()))||($el[0].files[0]&&$el[0].files[0].name);if(!name&&self.fileManager.count()>0){file=self.fileManager.getFirstFile();label=file.nameFmt}else{label=name?self.slug(name):'_'}n=self.isAjaxUpload?self.fileManager.count():numFiles;nFiles=self.previewCache.count(true)+n;log=n===1?label:self._getMsgSelected(nFiles,!self.isAjaxUpload&&!self.isError);if(self.isError){self.$previewContainer.removeClass('file-thumb-loading');self._initCapStatus();self.$previewStatus.html('');self.$captionContainer.removeClass('icon-visible')}else{self._showFileIcon()}self._setCaption(log,self.isError);self.$container.removeClass('file-input-new file-input-ajax-new');self._raise('fileselect',[numFiles,label]);if(self.previewCache.count(true)){self._initPreviewActions()}},_setThumbStatus:function($thumb,status){var self=this;if(!self.showPreview){return}var icon='indicator'+status,msg=icon+'Title',css='file-preview-'+status.toLowerCase(),$indicator=$thumb.find('.file-upload-indicator'),config=self.fileActionSettings;$thumb.removeClass('file-preview-success file-preview-error file-preview-paused file-preview-loading');if(status==='Success'){$thumb.find('.file-drag-handle').remove()}$h.setHtml($indicator,config[icon]);$indicator.attr('title',config[msg]);$thumb.addClass(css);if(status==='Error'&&!self.retryErrorUploads){$thumb.find('.kv-file-upload').attr('disabled',true)}},_setProgressCancelled:function(){var self=this;self._setProgress(101,self.$progress,self.msgCancelled)},_setProgress:function(p,$el,error,stats){var self=this;$el=$el||self.$progress;if(!$el.length){return}var pct=Math.min(p,100),out,pctLimit=self.progressUploadThreshold,t=p<=100?self.progressTemplate:self.progressCompleteTemplate,template=pct<100?self.progressTemplate:(error?(self.paused?self.progressPauseTemplate:self.progressErrorTemplate):t);if(p>=100){stats=''}if(!$h.isEmpty(template)){if(pctLimit&&pct>pctLimit&&p<=100){out=template.setTokens({'percent':pctLimit,'status':self.msgUploadThreshold})}else{out=template.setTokens({'percent':pct,'status':(p>100?self.msgUploadEnd:pct+'%')})}stats=stats||'';out=out.setTokens({stats:stats});$h.setHtml($el,out);if(error){$h.setHtml($el.find('[role="progressbar"]'),error)}}},_hasFiles:function(){var el=this.$element[0];return!!(el&&el.files&&el.files.length)},_setFileDropZoneTitle:function(){var self=this,$zone=self.$container.find('.file-drop-zone'),title=self.dropZoneTitle,strFiles;if(self.isClickable){strFiles=$h.isEmpty(self.$element.attr('multiple'))?self.fileSingle:self.filePlural;title+=self.dropZoneClickTitle.replace('{files}',strFiles)}$zone.find('.'+self.dropZoneTitleClass).remove();if(!self.showPreview||$zone.length===0||self.fileManager.count()>0||!self.dropZoneEnabled||self.previewCache.count()>0||(!self.isAjaxUpload&&self._hasFiles())){return}if($zone.find($h.FRAMES).length===0&&$h.isEmpty(self.defaultPreviewContent)){$zone.prepend('
    '+title+'
    ')}self.$container.removeClass('file-input-new');$h.addCss(self.$container,'file-input-ajax-new')},_getStats:function(stats){var self=this,pendingTime,t;if(!self.showUploadStats||!stats||!stats.bitrate){return''}t=self._getLayoutTemplate('stats');pendingTime=(!stats.elapsed||!stats.bps)?self.msgCalculatingTime:self.msgPendingTime.setTokens({time:$h.getElapsed(Math.ceil(stats.pendingBytes/stats.bps))});return t.setTokens({uploadSpeed:stats.bitrate,pendingTime:pendingTime})},_setResumableProgress:function(pct,stats,$thumb){var self=this,rm=self.resumableManager,obj=$thumb?rm:self,$prog=$thumb?$thumb.find('.file-thumb-progress'):null;if(obj.lastProgress===0){obj.lastProgress=pct}if(pct0&&self._getFileCount(len-1)=limit:dim<=limit){return true}msg=self['msgImage'+type+size]||'Image "{name}" has a size validation error (limit "{size}").';self._showFileError(msg.setTokens({'name':filename,'size':limit,'dimension':dim}),params);self._setPreviewError($thumb);self.fileManager.remove($thumb);self._clearFileInput();return false},_getExifObj:function(data){var self=this,exifObj,error=$h.logMessages.exifWarning;if(data.slice(0,23)!=='data:image/jpeg;base64,'&&data.slice(0,22)!=='data:image/jpg;base64,'){exifObj=null;return}try{exifObj=window.piexif?window.piexif.load(data):null}catch(err){exifObj=null;error=err&&err.message||''}if(!exifObj&&self.showExifErrorLog){self._log($h.logMessages.badExifParser,{details:error})}return exifObj},setImageOrientation:function($img,$zoomImg,value,$thumb){var self=this,invalidImg=!$img||!$img.length,invalidZoomImg=!$zoomImg||!$zoomImg.length,$mark,isHidden=false,$div,zoomOnly=invalidImg&&$thumb&&$thumb.attr('data-template')==='image',ev;if(invalidImg&&invalidZoomImg){return}ev='load.fileinputimageorient';if(zoomOnly){$img=$zoomImg;$zoomImg=null;$img.css(self.previewSettings.image);$div=$(document.createElement('div')).appendTo($thumb.find('.kv-file-content'));$mark=$(document.createElement('span')).insertBefore($img);$img.css('visibility','hidden').removeClass('file-zoom-detail').appendTo($div)}else{isHidden=!$img.is(':visible')}$img.off(ev).on(ev,function(){if(isHidden){self.$preview.removeClass('hide-content');$thumb.find('.kv-file-content').css('visibility','hidden')}var img=$img[0],zoomImg=$zoomImg&&$zoomImg.length?$zoomImg[0]:null,h=img.offsetHeight,w=img.offsetWidth,r=$h.getRotation(value);if(isHidden){$thumb.find('.kv-file-content').css('visibility','visible');self.$preview.addClass('hide-content')}$img.data('orientation',value);if(zoomImg){$zoomImg.data('orientation',value)}if(value<5){$h.setTransform(img,r);$h.setTransform(zoomImg,r);return}var offsetAngle=Math.atan(w/h),origFactor=Math.sqrt(Math.pow(h,2)+Math.pow(w,2)),scale=!origFactor?1:(h/Math.cos(Math.PI/2+offsetAngle))/origFactor,s=' scale('+Math.abs(scale)+')';$h.setTransform(img,r+s);$h.setTransform(zoomImg,r+s);if(zoomOnly){$img.css('visibility','visible').insertAfter($mark).addClass('file-zoom-detail');$mark.remove();$div.remove()}})},_validateImageOrientation:function($img,file,previewId,fileId,caption,ftype,fsize,iData){var self=this,exifObj=null,value,autoOrientImage=self.autoOrientImage,selector;exifObj=self._getExifObj(iData);if(self.canOrientImage){$img.css('image-orientation',(autoOrientImage?'from-image':'none'));self._validateImage(previewId,fileId,caption,ftype,fsize,iData,exifObj);return}selector=$h.getZoomSelector(previewId,' img');value=exifObj?exifObj['0th'][piexif.ImageIFD.Orientation]:null;if(!value){self._validateImage(previewId,fileId,caption,ftype,fsize,iData,exifObj);return}self.setImageOrientation($img,$(selector),value,self._getFrame(previewId));self._raise('fileimageoriented',{'$img':$img,'file':file});self._validateImage(previewId,fileId,caption,ftype,fsize,iData,exifObj)},_validateImage:function(previewId,fileId,fname,ftype,fsize,iData,exifObj){var self=this,$preview=self.$preview,params,w1,w2,$thumb=self._getFrame(previewId),i=$thumb.attr('data-fileindex'),$img=$thumb.find('img');fname=fname||'Untitled';$img.one('load',function(){if($img.data('validated')){return}$img.data('validated',true);w1=$thumb.width();w2=$preview.width();if(w1>w2){$img.css('width','100%')}params={ind:i,id:previewId,fileId:fileId};setTimeout(function(){var isValidWidth,isValidHeight;isValidWidth=self._isValidSize('Small','Width',$img,$thumb,fname,params);isValidHeight=self._isValidSize('Small','Height',$img,$thumb,fname,params);if(!self.resizeImage){isValidWidth=isValidWidth&&self._isValidSize('Large','Width',$img,$thumb,fname,params);isValidHeight=isValidHeight&&self._isValidSize('Large','Height',$img,$thumb,fname,params)}self._raise('fileimageloaded',[previewId]);$thumb.data('exif',exifObj);if(isValidWidth&&isValidHeight){self.fileManager.addImage(fileId,{ind:i,img:$img,thumb:$thumb,pid:previewId,typ:ftype,siz:fsize,validated:false,imgData:iData,exifObj:exifObj});self._validateAllImages()}},self.processDelay)}).one('error',function(){self._raise('fileimageloaderror',[previewId])})},_validateAllImages:function(){var self=this,counter={val:0},numImgs=self.fileManager.getImageCount(),fsize,minSize=self.resizeIfSizeMoreThan;if(numImgs!==self.fileManager.totalImages){return}self._raise('fileimagesloaded');if(!self.resizeImage){return}$.each(self.fileManager.loadedImages,function(id,config){if(!config.validated){fsize=config.siz;if(fsize&&fsize>minSize*self.bytesToKB){self._getResizedImage(id,config,counter,numImgs)}config.validated=true}})},_getResizedImage:function(id,config,counter,numImgs){var self=this,img=$(config.img)[0],width=img.naturalWidth,height=img.naturalHeight,blob,ratio=1,maxWidth=self.maxImageWidth||width,maxHeight=self.maxImageHeight||height,isValidImage=!!(width&&height),chkWidth,chkHeight,canvas=self.imageCanvas,dataURI,context=self.imageCanvasContext,type=config.typ,pid=config.pid,ind=config.ind,$thumb=config.thumb,throwError,msg,exifObj=config.exifObj,exifStr,file,params,evParams;throwError=function(msg,params,ev){if(self.isAjaxUpload){self._showFileError(msg,params,ev);}else{self._showError(msg,params,ev)}self._setPreviewError($thumb)};file=self.fileManager.getFile(id);params={id:pid,'index':ind,fileId:id};evParams=[id,pid,ind];if(!file||!isValidImage||(width<=maxWidth&&height<=maxHeight)){if(isValidImage&&file){self._raise('fileimageresized',evParams)}counter.val++;if(counter.val===numImgs){self._raise('fileimagesresized')}if(!isValidImage){throwError(self.msgImageResizeError,params,'fileimageresizeerror');return}}type=type||self.resizeDefaultImageType;chkWidth=width>maxWidth;chkHeight=height>maxHeight;if(self.resizePreference==='width'){ratio=chkWidth?maxWidth/width:(chkHeight?maxHeight/height:1)}else{ratio=chkHeight?maxHeight/height:(chkWidth?maxWidth/width:1)}self._resetCanvas();width*=ratio;height*=ratio;canvas.width=width;canvas.height=height;try{context.drawImage(img,0,0,width,height);dataURI=canvas.toDataURL(type,self.resizeQuality);if(exifObj){exifStr=window.piexif.dump(exifObj);dataURI=window.piexif.insert(exifStr,dataURI)}blob=$h.dataURI2Blob(dataURI);self.fileManager.setFile(id,blob);self._raise('fileimageresized',evParams);counter.val++;if(counter.val===numImgs){self._raise('fileimagesresized',[undefined,undefined])}if(!(blob instanceof Blob)){throwError(self.msgImageResizeError,params,'fileimageresizeerror');}}catch(err){counter.val++;if(counter.val===numImgs){self._raise('fileimagesresized',[undefined,undefined])}msg=self.msgImageResizeException.replace('{errors}',err.message);throwError(msg,params,'fileimageresizeexception');}},_showProgress:function(){var self=this;if(self.$progress&&self.$progress.length){self.$progress.show()}},_hideProgress:function(){var self=this;if(self.$progress&&self.$progress.length){self.$progress.hide()}},_initBrowse:function($container){var self=this,$el=self.$element;if(self.showBrowse){self.$btnFile=$container.find('.btn-file').append($el)}else{$el.appendTo($container).attr('tabindex',-1);$h.addCss($el,'file-no-browse')}},_initClickable:function(){var self=this,$zone,$tmpZone;if(!self.isClickable){return}$zone=self.$dropZone;if(!self.isAjaxUpload){$tmpZone=self.$preview.find('.file-default-preview');if($tmpZone.length){$zone=$tmpZone}}$h.addCss($zone,'clickable');$zone.attr('tabindex',-1);self._handler($zone,'click',function(e){var $tar=$(e.target);if(!self.$errorContainer.is(':visible')&&(!$tar.parents('.file-preview-thumbnails').length||$tar.parents('.file-default-preview').length)){self.$element.data('zoneClicked',true).trigger('click');$zone.blur()}})},_initCaption:function(){var self=this,cap=self.initialCaption||'';if(self.overwriteInitial||$h.isEmpty(cap)){self.$caption.val('');return false}self._setCaption(cap);return true},_setCaption:function(content,isError){var self=this,title,out,icon,n,cap,file;if(!self.$caption.length){return}self.$captionContainer.removeClass('icon-visible');if(isError){title=$('
    '+self.msgValidationError+'
    ').text();n=self.fileManager.count();if(n){file=self.fileManager.getFirstFile();cap=n===1&&file?file.nameFmt:self._getMsgSelected(n)}else{cap=self._getMsgSelected(self.msgNo)}out=$h.isEmpty(content)?cap:content;icon=''+self.msgValidationErrorIcon+''}else{if($h.isEmpty(content)){self.$caption.attr('title','');return}title=$('
    '+content+'
    ').text();out=title;icon=self._getLayoutTemplate('fileIcon')}self.$captionContainer.addClass('icon-visible');self.$caption.attr('title',title).val(out);$h.setHtml(self.$captionIcon,icon)},_createContainer:function(){var self=this,attribs={'class':'file-input file-input-new'+(self.rtl?' kv-rtl':'')},$container=$h.createElement($h.cspBuffer.stash(self._renderMain()));$h.cspBuffer.apply($container);$container.insertBefore(self.$element).attr(attribs);self._initBrowse($container);if(self.theme){$container.addClass('theme-'+self.theme)}return $container},_refreshContainer:function(){var self=this,$container=self.$container,$el=self.$element;$el.insertAfter($container);$h.setHtml($container,self._renderMain());self._initBrowse($container);self._validateDisabled()},_validateDisabled:function(){var self=this;self.$caption.attr({readonly:self.isDisabled})},_setTabIndex:function(type,html){var self=this,index=self.tabIndexConfig[type];return html.setTokens({tabIndexConfig:index===undefined||index===null?'':'tabindex="'+index+'"'})},_renderMain:function(){var self=this,dropCss=self.dropZoneEnabled?' file-drop-zone':'file-drop-disabled',close=!self.showClose?'':self._getLayoutTemplate('close'),preview=!self.showPreview?'':self._getLayoutTemplate('preview').setTokens({'class':self.previewClass,'dropClass':dropCss}),css=self.isDisabled?self.captionClass+' file-caption-disabled':self.captionClass,caption=self.captionTemplate.setTokens({'class':css+' kv-fileinput-caption'});caption=self._setTabIndex('caption',caption);return self.mainTemplate.setTokens({'class':self.mainClass+(!self.showBrowse&&self.showCaption?' no-browse':''),'inputGroupClass':self.inputGroupClass,'preview':preview,'close':close,'caption':caption,'upload':self._renderButton('upload'),'remove':self._renderButton('remove'),'cancel':self._renderButton('cancel'),'pause':self._renderButton('pause'),'browse':self._renderButton('browse')})},_renderButton:function(type){var self=this,tmplt=self._getLayoutTemplate('btnDefault'),css=self[type+'Class'],title=self[type+'Title'],icon=self[type+'Icon'],label=self[type+'Label'],status=self.isDisabled?' disabled':'',btnType='button';switch(type){case'remove':if(!self.showRemove){return''}break;case'cancel':if(!self.showCancel){return''}css+=' kv-hidden';break;case'pause':if(!self.showPause){return''}css+=' kv-hidden';break;case'upload':if(!self.showUpload){return''}if(self.isAjaxUpload&&!self.isDisabled){tmplt=self._getLayoutTemplate('btnLink').replace('{href}',self.uploadUrl)}else{btnType='submit'}break;case'browse':if(!self.showBrowse){return''}tmplt=self._getLayoutTemplate('btnBrowse');break;default:return''}tmplt=self._setTabIndex(type,tmplt);css+=type==='browse'?' btn-file':' fileinput-'+type+' fileinput-'+type+'-button';if(!$h.isEmpty(label)){label=' '+label+''}return tmplt.setTokens({'type':btnType,'css':css,'title':title,'status':status,'icon':icon,'label':label})},_renderThumbProgress:function(){var self=this;return'
    '+self.progressInfoTemplate.setTokens({percent:101,status:self.msgUploadBegin,stats:''})+'
    '},_renderFileFooter:function(cat,caption,size,width,isError){var self=this,config=self.fileActionSettings,rem=config.showRemove,drg=config.showDrag,upl=config.showUpload,rot=config.showRotate,zoom=config.showZoom,out,params,template=self._getLayoutTemplate('footer'),tInd=self._getLayoutTemplate('indicator'),ind=isError?config.indicatorError:config.indicatorNew,title=isError?config.indicatorErrorTitle:config.indicatorNewTitle,indicator=tInd.setTokens({'indicator':ind,'indicatorTitle':title});size=self._getSize(size);params={type:cat,caption:caption,size:size,width:width,progress:'',indicator:indicator};if(self.isAjaxUpload){params.progress=self._renderThumbProgress();params.actions=self._renderFileActions(params,upl,false,rem,rot,zoom,drg,false,false,false)}else{params.actions=self._renderFileActions(params,false,false,false,false,zoom,drg,false,false,false)}out=template.setTokens(params);out=$h.replaceTags(out,self.previewThumbTags);return out},_renderFileActions:function(cfg,showUpl,showDwn,showDel,showRot,showZoom,showDrag,disabled,url,key,isInit,dUrl,dFile){var self=this;if(!cfg.type&&isInit){cfg.type='image'}if(self.enableResumableUpload){showUpl=false}else{if(typeof showUpl==='function'){showUpl=showUpl(cfg)}}if(typeof showDwn==='function'){showDwn=showDwn(cfg)}if(typeof showDel==='function'){showDel=showDel(cfg)}if(typeof showZoom==='function'){showZoom=showZoom(cfg)}if(typeof showDrag==='function'){showDrag=showDrag(cfg)}if(typeof showRot==='function'){showRot=showRot(cfg)}if(!showUpl&&!showDwn&&!showDel&&!showRot&&!showZoom&&!showDrag){return''}var vUrl=url===false?'':' data-url="'+url+'"',btnZoom='',btnDrag='',btnRotate='',css,vKey=key===false?'':' data-key="'+key+'"',btnDelete='',btnUpload='',btnDownload='',template=self._getLayoutTemplate('actions'),config=self.fileActionSettings,otherButtons=self.otherActionButtons.setTokens({'dataKey':vKey,'key':key}),removeClass=disabled?config.removeClass+' disabled':config.removeClass;if(showDel){btnDelete=self._getLayoutTemplate('actionDelete').setTokens({'removeClass':removeClass,'removeIcon':config.removeIcon,'removeTitle':config.removeTitle,'dataUrl':vUrl,'dataKey':vKey,'key':key})}if(showRot){btnRotate=self._getLayoutTemplate('actionRotate').setTokens({'rotateClass':config.rotateClass,'rotateIcon':config.rotateIcon,'rotateTitle':config.rotateTitle})}if(showUpl){btnUpload=self._getLayoutTemplate('actionUpload').setTokens({'uploadClass':config.uploadClass,'uploadIcon':config.uploadIcon,'uploadTitle':config.uploadTitle})}if(showDwn){btnDownload=self._getLayoutTemplate('actionDownload').setTokens({'downloadClass':config.downloadClass,'downloadIcon':config.downloadIcon,'downloadTitle':config.downloadTitle,'downloadUrl':dUrl||self.initialPreviewDownloadUrl});btnDownload=btnDownload.setTokens({'filename':dFile,'key':key})}if(showZoom){btnZoom=self._getLayoutTemplate('actionZoom').setTokens({'zoomClass':config.zoomClass,'zoomIcon':config.zoomIcon,'zoomTitle':config.zoomTitle})}if(showDrag&&isInit){css='drag-handle-init '+config.dragClass;btnDrag=self._getLayoutTemplate('actionDrag').setTokens({'dragClass':css,'dragTitle':config.dragTitle,'dragIcon':config.dragIcon})}return template.setTokens({'delete':btnDelete,'upload':btnUpload,'download':btnDownload,'rotate':btnRotate,'zoom':btnZoom,'drag':btnDrag,'other':otherButtons})},_browse:function(e){var self=this;if(e&&e.isDefaultPrevented()||!self._raise('filebrowse')){return}if(self.isError&&!self.isAjaxUpload){self.clear()}if(self.focusCaptionOnBrowse){self.$captionContainer.focus()}},_change:function(e){var self=this;$(document.body).off('focusin.fileinput focusout.fileinput');if(self.changeTriggered){self._toggleLoading('hide');return}self._toggleLoading('show');var $el=self.$element,isDragDrop=arguments.length>1,isAjaxUpload=self.isAjaxUpload,tfiles,files=isDragDrop?arguments[1]:$el[0].files,ctr=self.fileManager.count(),total,initCount,len,isSingleUpl=$h.isEmpty($el.attr('multiple')),maxCount=!isAjaxUpload&&isSingleUpl?1:self.maxFileCount,maxTotCount=self.maxTotalFileCount,inclAll=maxTotCount>0&&maxTotCount>maxCount,flagSingle=(isSingleUpl&&ctr>0),throwError=function(mesg,file,previewId,index){var p1=$.extend(true,{},self._getOutData(null,{},{},files),{id:previewId,index:index}),p2={id:previewId,index:index,file:file,files:files};self.isPersistentError=true;self._toggleLoading('hide');return isAjaxUpload?self._showFileError(mesg,p1):self._showError(mesg,p2)},maxCountCheck=function(n,m,all){var msg=all?self.msgTotalFilesTooMany:self.msgFilesTooMany;msg=msg.replace('{m}',m).replace('{n}',n);self.isError=throwError(msg,null,null,null);self.$captionContainer.removeClass('icon-visible');self._setCaption('',true);self.$container.removeClass('file-input-new file-input-ajax-new')};self.reader=null;self._resetUpload();self._hideFileIcon();if(self.dropZoneEnabled){self.$container.find('.file-drop-zone .'+self.dropZoneTitleClass).remove()}if(!isAjaxUpload){if(e.target&&e.target.files===undefined){files=e.target.value?[{name:e.target.value.replace(/^.+\\/,'')}]:[]}else{files=e.target.files||{}}}tfiles=files;if($h.isEmpty(tfiles)||tfiles.length===0){if(!isAjaxUpload){self.clear()}self._raise('fileselectnone');return}self._resetErrors();len=tfiles.length;initCount=isAjaxUpload?(self.fileManager.count()+len):len;total=self._getFileCount(initCount,inclAll?false:undefined);if(maxCount>0&&total>maxCount){if(!self.autoReplace||len>maxCount){maxCountCheck((self.autoReplace&&len>maxCount?len:total),maxCount);return}if(total>maxCount){self._resetPreviewThumbs(isAjaxUpload)}}else{if(inclAll){total=self._getFileCount(initCount,true);if(maxTotCount>0&&total>maxTotCount){if(!self.autoReplace||len>maxCount){maxCountCheck((self.autoReplace&&len>maxTotCount?len:total),maxTotCount,true);return}if(total>maxCount){self._resetPreviewThumbs(isAjaxUpload)}}}if(!isAjaxUpload||flagSingle){self._resetPreviewThumbs(false);if(flagSingle){self.clearFileStack()}}else{if(isAjaxUpload&&ctr===0&&(!self.previewCache.count(true)||self.overwriteInitial)){self._resetPreviewThumbs(true)}}}if(self.autoReplace){self._getThumbs().each(function(){var $thumb=$(this);if($thumb.hasClass('file-preview-success')||$thumb.hasClass('file-preview-error')){$thumb.remove()}})}self.readFiles(tfiles);self._toggleLoading('hide')},_abort:function(params){var self=this,data;if(self.ajaxAborted&&typeof self.ajaxAborted==='object'&&self.ajaxAborted.message!==undefined){data=$.extend(true,{},self._getOutData(null),params);data.abortData=self.ajaxAborted.data||{};data.abortMessage=self.ajaxAborted.message;self._setProgress(101,self.$progress,self.msgCancelled);self._showFileError(self.ajaxAborted.message,data,'filecustomerror');self.cancel();self.unlock();return true}return!!self.ajaxAborted},_resetFileStack:function(){var self=this,i=0;self._getThumbs().each(function(){var $thumb=$(this),ind=$thumb.attr('data-fileindex'),pid=$thumb.attr('id');if(ind==='-1'||ind===-1){return}if(!self._getThumbFile($thumb)){$thumb.attr({'data-fileindex':i});i++}else{$thumb.attr({'data-fileindex':'-1'})}self._getZoom(pid).attr({'data-fileindex':$thumb.attr('data-fileindex')})})},_isFileSelectionValid:function(cnt){var self=this;cnt=cnt||0;if(self.required&&!self.getFilesCount()){self.$errorContainer.html('');self._showFileError(self.msgFileRequired);return false}if(self.minFileCount>0&&self._getFileCount(cnt)maxSize);return!skipPreview&&(allowedTypes||allowedMimes||allowedExts)},addToStack:function(file,id){var self=this;self.stackIsUpdating=true;self.fileManager.add(file,id);self._refreshPreview();self.stackIsUpdating=false},clearFileStack:function(){var self=this;self.fileManager.clear();self._initResumableUpload();if(self.enableResumableUpload){if(self.showPause===null){self.showPause=true}if(self.showCancel===null){self.showCancel=false}}else{self.showPause=false;if(self.showCancel===null){self.showCancel=true}}return self.$element},getFileStack:function(){return this.fileManager.stack},getFileList:function(){return this.fileManager.list()},getFilesSize:function(){return this.fileManager.getTotalSize()},getFilesCount:function(includeInitial){var self=this,len=self.isAjaxUpload?self.fileManager.count():self._inputFileCount();if(includeInitial){len+=self.previewCache.count(true)}return self._getFileCount(len)},_initCapStatus:function(status){var self=this,$cap=self.$caption;$cap.removeClass('is-valid file-processing');if(!status){return}if(status==='processing'){$cap.addClass('file-processing')}else{$cap.addClass('is-valid')}},_toggleLoading:function(type){var self=this;self.$previewStatus.html(type==='hide'?'':self.msgProcessing);self.$container.removeClass('file-thumb-loading');self._initCapStatus(type==='hide'?'':'processing');if(type!=='hide'){if(self.dropZoneEnabled){self.$container.find('.file-drop-zone .'+self.dropZoneTitleClass).remove()}self.$container.addClass('file-thumb-loading')}},_initFileSelected:function(){var self=this,$el=self.$element,$body=$(document.body),ev='focusin.fileinput focusout.fileinput';if($body.length){$body.off(ev).on('focusout.fileinput',function(){self._toggleLoading('show')}).on('focusin.fileinput',function(){setTimeout(function(){if(!$el.val()){self._setFileDropZoneTitle()}$body.off(ev);self._toggleLoading('hide')},2500)})}else{self._toggleLoading('hide')}},readFiles:function(files){this.reader=new FileReader();var self=this,reader=self.reader,$container=self.$previewContainer,$status=self.$previewStatus,msgLoading=self.msgLoading,msgProgress=self.msgProgress,previewInitId=self.previewInitId,numFiles=files.length,settings=self.fileTypeSettings,readFile,fileTypes=self.allowedFileTypes,typLen=fileTypes?fileTypes.length:0,fileExt=self.allowedFileExtensions,strExt=$h.isEmpty(fileExt)?'':fileExt.join(', '),throwError=function(msg,file,previewId,index,fileId){var $thumb,p1=$.extend(true,{},self._getOutData(null,{},{},files),{id:previewId,index:index,fileId:fileId}),p2={id:previewId,index:index,fileId:fileId,file:file,files:files};self._previewDefault(file,true);$thumb=self._getFrame(previewId,true);self._toggleLoading('hide');if(self.isAjaxUpload){setTimeout(function(){readFile(index+1)},self.processDelay)}else{self.unlock();numFiles=0}if(self.removeFromPreviewOnError&&$thumb.length){$thumb.remove()}else{self._initFileActions();$thumb.find('.kv-file-upload').remove()}self.isPersistentError=true;self.isError=self.isAjaxUpload?self._showFileError(msg,p1):self._showError(msg,p2);self._updateFileDetails(numFiles)};self.fileManager.clearImages();$.each(files,function(key,file){var func=self.fileTypeSettings.image;if(func&&func(file.type)){self.fileManager.totalImages++}});readFile=function(i){var $error=self.$errorContainer,errors,fm=self.fileManager;if(i>=numFiles){self.unlock();if(self.duplicateErrors.length){errors='
  • '+self.duplicateErrors.join('
  • ')+'
  • ';if($error.find('ul').length===0){$h.setHtml($error,self.errorCloseButton+'
      '+errors+'
    ')}else{$error.find('ul').append(errors)}$error.fadeIn(self.fadeDelay);self._handler($error.find('.kv-error-close'),'click',function(){$error.fadeOut(self.fadeDelay)});self.duplicateErrors=[]}if(self.isAjaxUpload){self._raise('filebatchselected',[fm.stack]);if(fm.count()===0&&!self.isError){self.reset()}}else{self._raise('filebatchselected',[files])}$container.removeClass('file-thumb-loading');self._initCapStatus('valid');$status.html('');return}self.lock(true);var file=files[i],id,previewId,fileProcessed,fSize=(file&&file.size||0),sizeHuman=self._getSize(fSize,true),j,msg,fnImage=settings.image,chk,typ,typ1,typ2,caption,fileSize=fSize/self.bytesToKB,fileExtExpr='',previewData,fileCount=0,strTypes='',fileId,canLoad,fileReaderAborted=false,func,knownTypes=0,isImage,processFileLoaded,initFileData;initFileData=function(dataSource){dataSource=dataSource||file;id=fileId=self._getFileId(file);previewId=previewInitId+'-'+id;previewData=$h.createObjectURL(dataSource);caption=self._getFileName(file,'')};processFileLoaded=function(){var isImageResized=!!fm.loadedImages[id],msg=msgProgress.setTokens({'index':i+1,'files':numFiles,'percent':50,'name':caption});setTimeout(function(){$status.html(msg);self._updateFileDetails(numFiles);if(self.getFilesCount(true)>0&&self.getFrames(':visible')){self.$dropZone.find('.'+self.dropZoneTitleClass).remove()}readFile(i+1)},self.processDelay);if(self._raise('fileloaded',[file,previewId,id,i,reader])&&self.isAjaxUpload){if(!isImageResized){fm.add(file)}}else{if(isImageResized){fm.removeFile(id)}}};if(!file){return}initFileData();if(typLen>0){for(j=0;j0&&fileSize>self.maxFileSize){msg=self.msgSizeTooLarge.setTokens({'name':caption,'size':sizeHuman,'maxSize':self._getSize(self.maxFileSize*self.bytesToKB,true)});throwError(msg,file,previewId,i,fileId);return}if(self.minFileSize!==null&&fileSize<=$h.getNum(self.minFileSize)){msg=self.msgSizeTooSmall.setTokens({'name':caption,'size':sizeHuman,'minSize':self._getSize(self.minFileSize*self.bytesToKB,true)});throwError(msg,file,previewId,i,fileId);return}if(!$h.isEmpty(fileTypes)&&$h.isArray(fileTypes)){for(j=0;j0){for(i=0;i0){for(i=0;i0)?self.initialCaption:'';self.$caption.attr('title','').val(cap);$h.addCss(self.$container,'file-input-new');self._validateDefaultPreview()}if(self.$container.find($h.FRAMES).length===0){if(!self._initCaption()){self.$captionContainer.removeClass('icon-visible')}}self._hideFileIcon();if(self.focusCaptionOnClear){self.$captionContainer.focus()}self._setFileDropZoneTitle();self._raise('filecleared');return self.$element},reset:function(){var self=this;if(!self._raise('filereset')){return}self.lastProgress=0;self._resetPreview();self.$container.find('.fileinput-filename').text('');$h.addCss(self.$container,'file-input-new');if(self.getFrames().length){self.$container.removeClass('file-input-new')}self.clearFileStack();self._setFileDropZoneTitle();return self.$element},disable:function(){var self=this,$container=self.$container;self.isDisabled=true;self._raise('filedisabled');self.$element.attr('disabled','disabled');$container.addClass('is-locked');$h.addCss($container.find('.btn-file'),'disabled');$container.find('.kv-fileinput-caption').addClass('file-caption-disabled');$container.find('.fileinput-remove, .fileinput-upload, .file-preview-frame button').attr('disabled',true);self._initDragDrop();return self.$element},enable:function(){var self=this,$container=self.$container;self.isDisabled=false;self._raise('fileenabled');self.$element.removeAttr('disabled');$container.removeClass('is-locked');$container.find('.kv-fileinput-caption').removeClass('file-caption-disabled');$container.find('.fileinput-remove, .fileinput-upload, .file-preview-frame button').removeAttr('disabled');$container.find('.btn-file').removeClass('disabled');self._initDragDrop();return self.$element},upload:function(){var self=this,fm=self.fileManager,totLen=fm.count(),i,outData,tm=self.taskManager,hasExtraData=!$.isEmptyObject(self._getExtraData());fm.bpsLog=[];fm.bps=0;if(!self.isAjaxUpload||self.isDisabled||!self._isFileSelectionValid(totLen)){return}self.lastProgress=0;self._resetUpload();if(totLen===0&&!hasExtraData){self._showFileError(self.msgUploadEmpty);return}self.cancelling=false;self.uploadInitiated=true;self._showProgress();self.lock();if(totLen===0&&hasExtraData){self._setProgress(2);self._uploadExtraOnly();return}if(self.enableResumableUpload){return self.resume()}if(self.uploadAsync||self.enableResumableUpload){outData=self._getOutData(null);if(!self._checkBatchPreupload(outData)){return}self.fileBatchCompleted=false;self.uploadCache=[];$.each(self.getFileStack(),function(id){var previewId=self._getThumbId(id);self.uploadCache.push({id:previewId,content:null,config:null,tags:null,append:true})});self.$preview.find('.file-preview-initial').removeClass($h.SORT_CSS);self._initSortable()}self._setProgress(2);self.hasInitData=false;if(self.uploadAsync){i=0;var pool=self.ajaxPool=tm.addPool($h.uniqId());$.each(self.getFileStack(),function(id){pool.addTask(id+i,function(deferrer){self._uploadSingle(i,id,true,deferrer)});i++});pool.run(self.maxAjaxThreads).done(function(){self._log('Async upload batch completed successfully.');self._raise('filebatchuploadsuccess',[fm.stack,self._getExtraData()])}).fail(function(){self._log('Async upload batch completed with errors.');self._raise('filebatchuploaderror',[fm.stack,self._getExtraData()])});return}self._uploadBatch();return self.$element},destroy:function(){var self=this,$form=self.$form,$cont=self.$container,$el=self.$element,ns=self.namespace;$(document).off(ns);$(window).off(ns);if($form&&$form.length){$form.off(ns)}if(self.isAjaxUpload){self._clearFileInput()}self._cleanup();self._initPreviewCache();$el.insertBefore($cont).off(ns).removeData();$cont.off().remove();return $el},refresh:function(options){var self=this,$el=self.$element;if(typeof options!=='object'||$h.isEmpty(options)){options=self.options}else{options=$.extend(true,{},self.options,options)}self._init(options,true);self._listen();return $el},zoom:function(frameId){var self=this,$frame=self._getFrame(frameId);self._showModal($frame)},getExif:function(frameId){var self=this,$frame=self._getFrame(frameId);return $frame&&$frame.data('exif')||null},getFrames:function(cssFilter){var self=this,$frames;cssFilter=cssFilter||'';$frames=self.$preview.find($h.FRAMES+cssFilter);if(self.reversePreviewOrder){$frames=$($frames.get().reverse())}return $frames},getPreview:function(){var self=this;return{content:self.initialPreview,config:self.initialPreviewConfig,tags:self.initialPreviewThumbTags}}};$.fn.fileinput=function(option){if(!$h.hasFileAPISupport()&&!$h.isIE(9)){return}var args=Array.apply(null,arguments),retvals=[];args.shift();this.each(function(){var self=$(this),data=self.data('fileinput'),options=typeof option==='object'&&option,theme=options.theme||self.data('theme'),l={},t={},lang=options.language||self.data('language')||$.fn.fileinput.defaults.language||'en',opt;if(!data){if(theme){t=$.fn.fileinputThemes[theme]||{}}if(lang!=='en'&&!$h.isEmpty($.fn.fileinputLocales[lang])){l=$.fn.fileinputLocales[lang]||{}}opt=$.extend(true,{},$.fn.fileinput.defaults,t,$.fn.fileinputLocales.en,l,options,self.data());data=new FileInput(this,opt);self.data('fileinput',data)}if(typeof option==='string'){retvals.push(data[option].apply(data,args))}});switch(retvals.length){case 0:return this;case 1:return retvals[0];default:return retvals}};var IFRAME_ATTRIBS='class="kv-preview-data file-preview-pdf" src="{renderer}?file={data}" {style}',defBtnCss1='btn btn-sm btn-kv '+$h.defaultButtonCss(),defBtnCss2='btn '+$h.defaultButtonCss();$.fn.fileinput.defaults={language:'zh',bytesToKB:1024,showCaption:true,showBrowse:true,showPreview:true,showRemove:true,showUpload:true,showUploadStats:true,showCancel:null,showPause:null,showClose:true,showUploadedThumbs:true,showConsoleLogs:false,browseOnZoneClick:false,autoReplace:false,showDescriptionClose:true,autoOrientImage:function(){var ua=window.navigator.userAgent,webkit=!!ua.match(/WebKit/i),iOS=!!ua.match(/iP(od|ad|hone)/i),iOSSafari=iOS&&webkit&&!ua.match(/CriOS/i);return!iOSSafari},autoOrientImageInitial:true,showExifErrorLog:false,required:false,rtl:false,hideThumbnailContent:false,encodeUrl:true,focusCaptionOnBrowse:true,focusCaptionOnClear:true,generateFileId:null,previewClass:'',captionClass:'',frameClass:'krajee-default',mainClass:'',inputGroupClass:'',mainTemplate:null,fileSizeGetter:null,initialCaption:'',initialPreview:[],initialPreviewDelimiter:'*$$*',initialPreviewAsData:false,initialPreviewFileType:'image',initialPreviewConfig:[],initialPreviewThumbTags:[],previewThumbTags:{},initialPreviewShowDelete:true,initialPreviewDownloadUrl:'',removeFromPreviewOnError:false,deleteUrl:'',deleteExtraData:{},overwriteInitial:true,sanitizeZoomCache:function(content){var $container=$h.createElement(content);$container.find('input,textarea,select,datalist,form,.file-thumbnail-footer').remove();return $container.html()},previewZoomButtonIcons:{prev:'',next:'',toggleheader:'',fullscreen:'',borderless:'',close:''},previewZoomButtonClasses:{prev:'btn btn-default btn-outline-secondary btn-navigate',next:'btn btn-default btn-outline-secondary btn-navigate',rotate:defBtnCss1,toggleheader:defBtnCss1,fullscreen:defBtnCss1,borderless:defBtnCss1,close:defBtnCss1},previewTemplates:{},previewContentTemplates:{},preferIconicPreview:false,preferIconicZoomPreview:false,alwaysPreviewFileExtensions:[],rotatableFileExtensions:['jpg','jpeg','png','gif'],allowedFileTypes:null,allowedFileExtensions:null,allowedPreviewTypes:undefined,allowedPreviewMimeTypes:null,allowedPreviewExtensions:null,disabledPreviewTypes:undefined,disabledPreviewExtensions:['msi','exe','com','zip','rar','app','vb','scr'],disabledPreviewMimeTypes:null,defaultPreviewContent:null,customLayoutTags:{},customPreviewTags:{},previewFileIcon:'',previewFileIconClass:'file-other-icon',previewFileIconSettings:{},previewFileExtSettings:{},buttonLabelClass:'hidden-xs',browseIcon:' ',browseClass:'btn btn-primary',removeIcon:'',removeClass:defBtnCss2,cancelIcon:'',cancelClass:defBtnCss2,pauseIcon:'',pauseClass:defBtnCss2,uploadIcon:'',uploadClass:defBtnCss2,uploadUrl:null,uploadUrlThumb:null,uploadAsync:true,uploadParamNames:{chunkCount:'chunkCount',chunkIndex:'chunkIndex',chunkSize:'chunkSize',chunkSizeStart:'chunkSizeStart',chunksUploaded:'chunksUploaded',fileBlob:'fileBlob',fileId:'fileId',fileName:'fileName',fileRelativePath:'fileRelativePath',fileSize:'fileSize',retryCount:'retryCount'},maxAjaxThreads:5,fadeDelay:800,processDelay:100,bitrateUpdateDelay:500,queueDelay:10,progressDelay:0,enableResumableUpload:false,resumableUploadOptions:{fallback:null,testUrl:null,chunkSize:2048,maxThreads:4,maxRetries:3,showErrorLog:true,retainErrorHistory:false,skipErrorsAndProceed:false},uploadExtraData:{},zoomModalHeight:485,minImageWidth:null,minImageHeight:null,maxImageWidth:null,maxImageHeight:null,resizeImage:false,resizePreference:'width',resizeQuality:0.92,resizeDefaultImageType:'image/jpeg',resizeIfSizeMoreThan:0,minFileSize:-1,maxFileSize:0,maxFilePreviewSize:25600,minFileCount:0,maxFileCount:0,maxTotalFileCount:0,validateInitialCount:false,msgValidationErrorClass:'text-danger',msgValidationErrorIcon:' ',msgErrorClass:'file-error-message',progressThumbClass:'progress-bar progress-bar-striped active progress-bar-animated',progressClass:'progress-bar bg-success progress-bar-success progress-bar-striped active progress-bar-animated',progressInfoClass:'progress-bar bg-info progress-bar-info progress-bar-striped active progress-bar-animated',progressCompleteClass:'progress-bar bg-success progress-bar-success',progressPauseClass:'progress-bar bg-primary progress-bar-primary progress-bar-striped active progress-bar-animated',progressErrorClass:'progress-bar bg-danger progress-bar-danger',progressUploadThreshold:99,previewFileType:'image',elCaptionContainer:null,elCaptionText:null,elPreviewContainer:null,elPreviewImage:null,elPreviewStatus:null,elErrorContainer:null,errorCloseButton:undefined,slugCallback:null,dropZoneEnabled:true,dropZoneTitleClass:'file-drop-zone-title',fileActionSettings:{},otherActionButtons:'',textEncoding:'UTF-8',preProcessUpload:null,ajaxSettings:{},ajaxDeleteSettings:{},showAjaxErrorDetails:true,mergeAjaxCallbacks:false,mergeAjaxDeleteCallbacks:false,retryErrorUploads:true,reversePreviewOrder:false,usePdfRenderer:function(){var isIE11=!!window.MSInputMethodContext&&!!document.documentMode;return!!navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/i)||isIE11},pdfRendererUrl:'',pdfRendererTemplate:'',tabIndexConfig:{browse:500,remove:500,upload:500,cancel:null,pause:null,modal:-1}};$.fn.fileinputLocales.en={sizeUnits:['B','KB','MB','GB','TB','PB','EB','ZB','YB'],bitRateUnits:['B/s','KB/s','MB/s','GB/s','TB/s','PB/s','EB/s','ZB/s','YB/s'],fileSingle:'file',filePlural:'files',browseLabel:'Browse …',removeLabel:'Remove',removeTitle:'Clear all unprocessed files',cancelLabel:'Cancel',cancelTitle:'Abort ongoing upload',pauseLabel:'Pause',pauseTitle:'Pause ongoing upload',uploadLabel:'Upload',uploadTitle:'Upload selected files',msgNo:'No',msgNoFilesSelected:'No files selected',msgCancelled:'Cancelled',msgPaused:'Paused',msgPlaceholder:'Select {files} ...',msgZoomModalHeading:'Detailed Preview',msgFileRequired:'You must select a file to upload.',msgSizeTooSmall:'File "{name}" ({size}) is too small and must be larger than {minSize}.',msgSizeTooLarge:'File "{name}" ({size}) exceeds maximum allowed upload size of {maxSize}.',msgFilesTooLess:'You must select at least {n} {files} to upload.',msgFilesTooMany:'Number of files selected for upload ({n}) exceeds maximum allowed limit of {m}.',msgTotalFilesTooMany:'You can upload a maximum of {m} files ({n} files detected).',msgFileNotFound:'File "{name}" not found!',msgFileSecured:'Security restrictions prevent reading the file "{name}".',msgFileNotReadable:'File "{name}" is not readable.',msgFilePreviewAborted:'File preview aborted for "{name}".',msgFilePreviewError:'An error occurred while reading the file "{name}".',msgInvalidFileName:'Invalid or unsupported characters in file name "{name}".',msgInvalidFileType:'Invalid type for file "{name}". Only "{types}" files are supported.',msgInvalidFileExtension:'Invalid extension for file "{name}". Only "{extensions}" files are supported.',msgFileTypes:{'image':'image','html':'HTML','text':'text','video':'video','audio':'audio','flash':'flash','pdf':'PDF','object':'object'},msgUploadAborted:'The file upload was aborted',msgUploadThreshold:'Processing …',msgUploadBegin:'Initializing …',msgUploadEnd:'Done',msgUploadResume:'Resuming upload …',msgUploadEmpty:'No valid data available for upload.',msgUploadError:'Upload Error',msgDeleteError:'Delete Error',msgProgressError:'Error',msgValidationError:'Validation Error',msgLoading:'Loading file {index} of {files} …',msgProgress:'Loading file {index} of {files} - {name} - {percent}% completed.',msgSelected:'{n} {files} selected',msgProcessing:'Processing ...',msgFoldersNotAllowed:'Drag & drop files only! {n} folder(s) dropped were skipped.',msgImageWidthSmall:'Width of image file "{name}" must be at least {size} px (detected {dimension} px).',msgImageHeightSmall:'Height of image file "{name}" must be at least {size} px (detected {dimension} px).',msgImageWidthLarge:'Width of image file "{name}" cannot exceed {size} px (detected {dimension} px).',msgImageHeightLarge:'Height of image file "{name}" cannot exceed {size} px (detected {dimension} px).',msgImageResizeError:'Could not get the image dimensions to resize.',msgImageResizeException:'Error while resizing the image.
    {errors}
    ',msgAjaxError:'Something went wrong with the {operation} operation. Please try again later!',msgAjaxProgressError:'{operation} failed',msgDuplicateFile:'File "{name}" of same size "{size}" has already been selected earlier. Skipping duplicate selection.',msgResumableUploadRetriesExceeded:'Upload aborted beyond {max} retries for file {file}! Error Details:
    {error}
    ',msgPendingTime:'{time} remaining',msgCalculatingTime:'calculating time remaining',ajaxOperations:{deleteThumb:'file delete',uploadThumb:'file upload',uploadBatch:'batch file upload',uploadExtra:'form data upload'},dropZoneTitle:'Drag & drop files here …',dropZoneClickTitle:'
    (or click to select {files})',previewZoomButtonTitles:{prev:'View previous file',next:'View next file',rotate:'Rotate 90 deg. clockwise',toggleheader:'Toggle header',fullscreen:'Toggle full screen',borderless:'Toggle borderless mode',close:'Close detailed preview'}};$.fn.fileinputLocales.zh={sizeUnits:['B','KB','MB','GB','TB','PB','EB','ZB','YB'],bitRateUnits:['B/s','KB/s','MB/s','GB/s','TB/s','PB/s','EB/s','ZB/s','YB/s'],fileSingle:'文件',filePlural:'个文件',browseLabel:'选择 …',removeLabel:'移除',removeTitle:'清除选中文件',cancelLabel:'取消',cancelTitle:'取消进行中的上传',pauseLabel:'暂停',pauseTitle:'暂停上传',uploadLabel:'上传',uploadTitle:'上传选中文件',msgNo:'没有',msgNoFilesSelected:'未选择文件',msgPaused:'已暂停',msgCancelled:'取消',msgPlaceholder:'选择 {files} ...',msgZoomModalHeading:'详细预览',msgFileRequired:'必须选择一个文件上传.',msgSizeTooSmall:'文件 "{name}" ({size}) 必须大于限定大小 {minSize}.',msgSizeTooLarge:'文件 "{name}" ({size}) 超过了允许大小 {maxSize}.',msgFilesTooLess:'你必须选择最少 {n} {files} 来上传. ',msgFilesTooMany:'选择的上传文件个数 ({n}) 超出最大文件的限制个数 {m}.',msgTotalFilesTooMany:'你最多可以上传 {m} 个文件 (当前有{n} 个文件).',msgFileNotFound:'文件 "{name}" 未找到!',msgFileSecured:'安全限制,为了防止读取文件 "{name}".',msgFileNotReadable:'文件 "{name}" 不可读.',msgFilePreviewAborted:'取消 "{name}" 的预览.',msgFilePreviewError:'读取 "{name}" 时出现了一个错误.',msgInvalidFileName:'文件名 "{name}" 包含非法字符.',msgInvalidFileType:'不正确的类型 "{name}". 只支持 "{types}" 类型的文件.',msgInvalidFileExtension:'不正确的文件扩展名 "{name}". 只支持 "{extensions}" 的文件扩展名.',msgFileTypes:{'image':'image','html':'HTML','text':'text','video':'video','audio':'audio','flash':'flash','pdf':'PDF','object':'object'},msgUploadAborted:'该文件上传被中止',msgUploadThreshold:'处理中 …',msgUploadBegin:'正在初始化 …',msgUploadEnd:'完成',msgUploadResume:'继续上传 …',msgUploadEmpty:'无效的文件上传.',msgUploadError:'上传出错',msgDeleteError:'删除出错',msgProgressError:'上传出错',msgValidationError:'验证错误',msgLoading:'加载第 {index} 文件 共 {files} …',msgProgress:'加载第 {index} 文件 共 {files} - {name} - {percent}% 完成.',msgSelected:'{n} {files} 选中',msgProcessing:'处理中 ...',msgFoldersNotAllowed:'只支持拖拽文件! 跳过 {n} 拖拽的文件夹.',msgImageWidthSmall:'图像文件的"{name}"的宽度必须是至少{size}像素.',msgImageHeightSmall:'图像文件的"{name}"的高度必须至少为{size}像素.',msgImageWidthLarge:'图像文件"{name}"的宽度不能超过{size}像素.',msgImageHeightLarge:'图像文件"{name}"的高度不能超过{size}像素.',msgImageResizeError:'无法获取的图像尺寸调整。',msgImageResizeException:'调整图像大小时发生错误。
    {errors}
    ',msgAjaxError:'{operation} 发生错误. 请重试!',msgAjaxProgressError:'{operation} 失败',msgDuplicateFile:'文件 "{name}",大小 "{size}" 已经被选中.忽略相同的文件.',msgResumableUploadRetriesExceeded:'文件 {file} 上传失败超过 {max} 次重试 ! 错误详情:
    {error}
    ',msgPendingTime:'{time} 剩余',msgCalculatingTime:'计算剩余时间',ajaxOperations:{deleteThumb:'删除文件',uploadThumb:'上传文件',uploadBatch:'批量上传',uploadExtra:'表单数据上传'},dropZoneTitle:'拖拽文件到这里 …
    支持多文件同时上传',dropZoneClickTitle:'
    (或点击{files}按钮选择文件)',fileActionSettings:{removeTitle:'删除文件',uploadTitle:'上传文件',downloadTitle:'下载文件',uploadRetryTitle:'重试',rotateTitle:'顺时针旋转90度',zoomTitle:'查看详情',dragTitle:'移动 / 重置',indicatorNewTitle:'没有上传',indicatorSuccessTitle:'上传',indicatorErrorTitle:'上传错误',indicatorPausedTitle:'上传已暂停',indicatorLoadingTitle:'上传 …'},previewZoomButtonTitles:{prev:'预览上一个文件',next:'预览下一个文件',rotate:'顺时针旋转90度',toggleheader:'缩放',fullscreen:'全屏',borderless:'无边界模式',close:'关闭当前预览'}};$.fn.fileinput.Constructor=FileInput;$(document).ready(function(){var $input=$('input.file[type=file]');if($input.length){$input.fileinput()}})})); \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/loading-sm.gif b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/loading-sm.gif new file mode 100644 index 0000000..44e3b7a Binary files /dev/null and b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/loading-sm.gif differ diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/loading.gif b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/loading.gif new file mode 100644 index 0000000..0ea146c Binary files /dev/null and b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/loading.gif differ diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-select/bootstrap-select.css b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-select/bootstrap-select.css new file mode 100644 index 0000000..34edabf --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-select/bootstrap-select.css @@ -0,0 +1,459 @@ +/*! + * Bootstrap-select v1.13.18 (https://developer.snapappointments.com/bootstrap-select) + * + * Copyright 2012-2020 SnapAppointments, LLC + * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE) + */ + +@-webkit-keyframes bs-notify-fadeOut { + 0% { + opacity: 0.9; + } + 100% { + opacity: 0; + } +} +@-o-keyframes bs-notify-fadeOut { + 0% { + opacity: 0.9; + } + 100% { + opacity: 0; + } +} +@keyframes bs-notify-fadeOut { + 0% { + opacity: 0.9; + } + 100% { + opacity: 0; + } +} +select.bs-select-hidden, +.bootstrap-select > select.bs-select-hidden, +select.selectpicker { + display: none !important; +} +.bootstrap-select { + width: 220px \0; + /*IE9 and below*/ + vertical-align: middle; +} +.bootstrap-select > .dropdown-toggle { + position: relative; + width: 100%; + text-align: right; + white-space: nowrap; + display: -webkit-inline-box; + display: -webkit-inline-flex; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; +} +.bootstrap-select > .dropdown-toggle:after { + margin-top: -1px; +} +.bootstrap-select > .dropdown-toggle.bs-placeholder, +.bootstrap-select > .dropdown-toggle.bs-placeholder:hover, +.bootstrap-select > .dropdown-toggle.bs-placeholder:focus, +.bootstrap-select > .dropdown-toggle.bs-placeholder:active { + color: #999; +} +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:hover, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:hover, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:hover, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:hover, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:hover, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:hover, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:focus, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:focus, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:focus, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:focus, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:focus, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:focus, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:active, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:active, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:active, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:active, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:active, +.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:active { + color: rgba(255, 255, 255, 0.5); +} +.bootstrap-select > select { + position: absolute !important; + bottom: 0; + left: 50%; + display: block !important; + width: 0.5px !important; + height: 100% !important; + padding: 0 !important; + opacity: 0 !important; + border: none; + z-index: 0 !important; +} +.bootstrap-select > select.mobile-device { + top: 0; + left: 0; + display: block !important; + width: 100% !important; + z-index: 2 !important; +} +.has-error .bootstrap-select .dropdown-toggle, +.error .bootstrap-select .dropdown-toggle, +.bootstrap-select.is-invalid .dropdown-toggle, +.was-validated .bootstrap-select select:invalid + .dropdown-toggle { + border-color: #b94a48; +} +.bootstrap-select.is-valid .dropdown-toggle, +.was-validated .bootstrap-select select:valid + .dropdown-toggle { + border-color: #28a745; +} +.bootstrap-select.fit-width { + width: auto !important; +} +.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) { + width: 220px; +} +.bootstrap-select > select.mobile-device:focus + .dropdown-toggle, +.bootstrap-select .dropdown-toggle:focus { + outline: thin dotted #333333 !important; + outline: 5px auto -webkit-focus-ring-color !important; + outline-offset: -2px; +} +.bootstrap-select.form-control { + margin-bottom: 0; + padding: 0; + border: none; + height: auto; +} +:not(.input-group) > .bootstrap-select.form-control:not([class*="col-"]) { + width: 100%; +} +.bootstrap-select.form-control.input-group-btn { + float: none; + z-index: auto; +} +.form-inline .bootstrap-select, +.form-inline .bootstrap-select.form-control:not([class*="col-"]) { + width: auto; +} +.bootstrap-select:not(.input-group-btn), +.bootstrap-select[class*="col-"] { + float: none; + display: inline-block; + margin-left: 0; +} +.bootstrap-select.dropdown-menu-right, +.bootstrap-select[class*="col-"].dropdown-menu-right, +.row .bootstrap-select[class*="col-"].dropdown-menu-right { + float: right; +} +.form-inline .bootstrap-select, +.form-horizontal .bootstrap-select, +.form-group .bootstrap-select { + margin-bottom: 0; +} +.form-group-lg .bootstrap-select.form-control, +.form-group-sm .bootstrap-select.form-control { + padding: 0; +} +.form-group-lg .bootstrap-select.form-control .dropdown-toggle, +.form-group-sm .bootstrap-select.form-control .dropdown-toggle { + height: 100%; + font-size: inherit; + line-height: inherit; + border-radius: inherit; +} +.bootstrap-select.form-control-sm .dropdown-toggle, +.bootstrap-select.form-control-lg .dropdown-toggle { + font-size: inherit; + line-height: inherit; + border-radius: inherit; +} +.bootstrap-select.form-control-sm .dropdown-toggle { + padding: 0.25rem 0.5rem; +} +.bootstrap-select.form-control-lg .dropdown-toggle { + padding: 0.5rem 1rem; +} +.form-inline .bootstrap-select .form-control { + width: 100%; +} +.bootstrap-select.disabled, +.bootstrap-select > .disabled { + cursor: not-allowed; +} +.bootstrap-select.disabled:focus, +.bootstrap-select > .disabled:focus { + outline: none !important; +} +.bootstrap-select.bs-container { + position: absolute; + top: 0; + left: 0; + height: 0 !important; + padding: 0 !important; +} +.bootstrap-select.bs-container .dropdown-menu { + z-index: 1060; +} +.bootstrap-select .dropdown-toggle .filter-option { + position: static; + top: 0; + left: 0; + float: left; + height: 100%; + width: 100%; + text-align: left; + overflow: hidden; + -webkit-box-flex: 0; + -webkit-flex: 0 1 auto; + -ms-flex: 0 1 auto; + flex: 0 1 auto; +} +.bs3.bootstrap-select .dropdown-toggle .filter-option { + padding-right: inherit; +} +.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option { + position: absolute; + padding-top: inherit; + padding-bottom: inherit; + padding-left: inherit; + float: none; +} +.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option .filter-option-inner { + padding-right: inherit; +} +.bootstrap-select .dropdown-toggle .filter-option-inner-inner { + overflow: hidden; +} +.bootstrap-select .dropdown-toggle .filter-expand { + width: 0 !important; + float: left; + opacity: 0 !important; + overflow: hidden; +} +.bootstrap-select .dropdown-toggle .caret { + position: absolute; + top: 50%; + right: 12px; + margin-top: -2px; + vertical-align: middle; +} +.input-group .bootstrap-select.form-control .dropdown-toggle { + border-radius: inherit; +} +.bootstrap-select[class*="col-"] .dropdown-toggle { + width: 100%; +} +.bootstrap-select .dropdown-menu { + min-width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.bootstrap-select .dropdown-menu > .inner:focus { + outline: none !important; +} +.bootstrap-select .dropdown-menu.inner { + position: static; + float: none; + border: 0; + padding: 0; + margin: 0; + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none; +} +.bootstrap-select .dropdown-menu li { + position: relative; +} +.bootstrap-select .dropdown-menu li.active small { + color: rgba(255, 255, 255, 0.5) !important; +} +.bootstrap-select .dropdown-menu li.disabled a { + cursor: not-allowed; +} +.bootstrap-select .dropdown-menu li a { + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.bootstrap-select .dropdown-menu li a.opt { + position: relative; + padding-left: 2.25em; +} +.bootstrap-select .dropdown-menu li a span.check-mark { + display: none; +} +.bootstrap-select .dropdown-menu li a span.text { + display: inline-block; +} +.bootstrap-select .dropdown-menu li small { + padding-left: 0.5em; +} +.bootstrap-select .dropdown-menu .notify { + position: absolute; + bottom: 5px; + width: 96%; + margin: 0 2%; + min-height: 26px; + padding: 3px 5px; + background: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + pointer-events: none; + opacity: 0.9; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.bootstrap-select .dropdown-menu .notify.fadeOut { + -webkit-animation: 300ms linear 750ms forwards bs-notify-fadeOut; + -o-animation: 300ms linear 750ms forwards bs-notify-fadeOut; + animation: 300ms linear 750ms forwards bs-notify-fadeOut; +} +.bootstrap-select .no-results { + padding: 3px; + background: #f5f5f5; + margin: 0 5px; + white-space: nowrap; +} +.bootstrap-select.fit-width .dropdown-toggle .filter-option { + position: static; + display: inline; + padding: 0; +} +.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner, +.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner { + display: inline; +} +.bootstrap-select.fit-width .dropdown-toggle .bs-caret:before { + content: '\00a0'; +} +.bootstrap-select.fit-width .dropdown-toggle .caret { + position: static; + top: auto; + margin-top: -1px; +} +.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark { + position: absolute; + display: inline-block; + right: 15px; + top: 5px; +} +.bootstrap-select.show-tick .dropdown-menu li a span.text { + margin-right: 34px; +} +.bootstrap-select .bs-ok-default:after { + content: ''; + display: block; + width: 0.5em; + height: 1em; + border-style: solid; + border-width: 0 0.26em 0.26em 0; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.bootstrap-select.show-menu-arrow.open > .dropdown-toggle, +.bootstrap-select.show-menu-arrow.show > .dropdown-toggle { + z-index: 1061; +} +.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before { + content: ''; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid rgba(204, 204, 204, 0.2); + position: absolute; + bottom: -4px; + left: 9px; + display: none; +} +.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after { + content: ''; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid white; + position: absolute; + bottom: -4px; + left: 10px; + display: none; +} +.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before { + bottom: auto; + top: -4px; + border-top: 7px solid rgba(204, 204, 204, 0.2); + border-bottom: 0; +} +.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after { + bottom: auto; + top: -4px; + border-top: 6px solid white; + border-bottom: 0; +} +.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before { + right: 12px; + left: auto; +} +.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after { + right: 13px; + left: auto; +} +.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:before, +.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:before, +.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:after, +.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:after { + display: block; +} +.bs-searchbox, +.bs-actionsbox, +.bs-donebutton { + padding: 4px 8px; +} +.bs-actionsbox { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.bs-actionsbox .btn-group button { + width: 50%; +} +.bs-donebutton { + float: left; + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.bs-donebutton .btn-group button { + width: 100%; +} +.bs-searchbox + .bs-actionsbox { + padding: 0 8px 4px; +} +.bs-searchbox .form-control { + margin-bottom: 0; + width: 100%; + float: none; +} diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-select/bootstrap-select.js b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-select/bootstrap-select.js new file mode 100644 index 0000000..d25d751 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-select/bootstrap-select.js @@ -0,0 +1,3247 @@ +/*! + * Bootstrap-select v1.13.18 (https://developer.snapappointments.com/bootstrap-select) + * + * Copyright 2012-2020 SnapAppointments, LLC + * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE) + */ + +(function (root, factory) { + if (root === undefined && window !== undefined) root = window; + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module unless amdModuleId is set + define(["jquery"], function (a0) { + return (factory(a0)); + }); + } else if (typeof module === 'object' && module.exports) { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +}(this, function (jQuery) { + +(function ($) { + 'use strict'; + + var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']; + + var uriAttrs = [ + 'background', + 'cite', + 'href', + 'itemtype', + 'longdesc', + 'poster', + 'src', + 'xlink:href' + ]; + + var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; + + var DefaultWhitelist = { + // Global attributes allowed on any supplied element below. + '*': ['class', 'dir', 'id', 'lang', 'role', 'tabindex', 'style', ARIA_ATTRIBUTE_PATTERN], + a: ['target', 'href', 'title', 'rel'], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ['src', 'alt', 'title', 'width', 'height'], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + } + + /** + * A pattern that recognizes a commonly useful subset of URLs that are safe. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi; + + /** + * A pattern that matches safe data URLs. Only matches image, video and audio types. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i; + + function allowedAttribute (attr, allowedAttributeList) { + var attrName = attr.nodeName.toLowerCase() + + if ($.inArray(attrName, allowedAttributeList) !== -1) { + if ($.inArray(attrName, uriAttrs) !== -1) { + return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN)) + } + + return true + } + + var regExp = $(allowedAttributeList).filter(function (index, value) { + return value instanceof RegExp + }) + + // Check if a regular expression validates the attribute. + for (var i = 0, l = regExp.length; i < l; i++) { + if (attrName.match(regExp[i])) { + return true + } + } + + return false + } + + function sanitizeHtml (unsafeElements, whiteList, sanitizeFn) { + if (sanitizeFn && typeof sanitizeFn === 'function') { + return sanitizeFn(unsafeElements); + } + + var whitelistKeys = Object.keys(whiteList); + + for (var i = 0, len = unsafeElements.length; i < len; i++) { + var elements = unsafeElements[i].querySelectorAll('*'); + + for (var j = 0, len2 = elements.length; j < len2; j++) { + var el = elements[j]; + var elName = el.nodeName.toLowerCase(); + + if (whitelistKeys.indexOf(elName) === -1) { + el.parentNode.removeChild(el); + + continue; + } + + var attributeList = [].slice.call(el.attributes); + var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []); + + for (var k = 0, len3 = attributeList.length; k < len3; k++) { + var attr = attributeList[k]; + + if (!allowedAttribute(attr, whitelistedAttributes)) { + el.removeAttribute(attr.nodeName); + } + } + } + } + } + + // Polyfill for browsers with no classList support + // Remove in v2 + if (!('classList' in document.createElement('_'))) { + (function (view) { + if (!('Element' in view)) return; + + var classListProp = 'classList', + protoProp = 'prototype', + elemCtrProto = view.Element[protoProp], + objCtr = Object, + classListGetter = function () { + var $elem = $(this); + + return { + add: function (classes) { + classes = Array.prototype.slice.call(arguments).join(' '); + return $elem.addClass(classes); + }, + remove: function (classes) { + classes = Array.prototype.slice.call(arguments).join(' '); + return $elem.removeClass(classes); + }, + toggle: function (classes, force) { + return $elem.toggleClass(classes, force); + }, + contains: function (classes) { + return $elem.hasClass(classes); + } + } + }; + + if (objCtr.defineProperty) { + var classListPropDesc = { + get: classListGetter, + enumerable: true, + configurable: true + }; + try { + objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); + } catch (ex) { // IE 8 doesn't support enumerable:true + // adding undefined to fight this issue https://github.com/eligrey/classList.js/issues/36 + // modernie IE8-MSW7 machine has IE8 8.0.6001.18702 and is affected + if (ex.number === undefined || ex.number === -0x7FF5EC54) { + classListPropDesc.enumerable = false; + objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); + } + } + } else if (objCtr[protoProp].__defineGetter__) { + elemCtrProto.__defineGetter__(classListProp, classListGetter); + } + }(window)); + } + + var testElement = document.createElement('_'); + + testElement.classList.add('c1', 'c2'); + + if (!testElement.classList.contains('c2')) { + var _add = DOMTokenList.prototype.add, + _remove = DOMTokenList.prototype.remove; + + DOMTokenList.prototype.add = function () { + Array.prototype.forEach.call(arguments, _add.bind(this)); + } + + DOMTokenList.prototype.remove = function () { + Array.prototype.forEach.call(arguments, _remove.bind(this)); + } + } + + testElement.classList.toggle('c3', false); + + // Polyfill for IE 10 and Firefox <24, where classList.toggle does not + // support the second argument. + if (testElement.classList.contains('c3')) { + var _toggle = DOMTokenList.prototype.toggle; + + DOMTokenList.prototype.toggle = function (token, force) { + if (1 in arguments && !this.contains(token) === !force) { + return force; + } else { + return _toggle.call(this, token); + } + }; + } + + testElement = null; + + // shallow array comparison + function isEqual (array1, array2) { + return array1.length === array2.length && array1.every(function (element, index) { + return element === array2[index]; + }); + }; + + // + if (!String.prototype.startsWith) { + (function () { + 'use strict'; // needed to support `apply`/`call` with `undefined`/`null` + var defineProperty = (function () { + // IE 8 only supports `Object.defineProperty` on DOM elements + try { + var object = {}; + var $defineProperty = Object.defineProperty; + var result = $defineProperty(object, object, object) && $defineProperty; + } catch (error) { + } + return result; + }()); + var toString = {}.toString; + var startsWith = function (search) { + if (this == null) { + throw new TypeError(); + } + var string = String(this); + if (search && toString.call(search) == '[object RegExp]') { + throw new TypeError(); + } + var stringLength = string.length; + var searchString = String(search); + var searchLength = searchString.length; + var position = arguments.length > 1 ? arguments[1] : undefined; + // `ToInteger` + var pos = position ? Number(position) : 0; + if (pos != pos) { // better `isNaN` + pos = 0; + } + var start = Math.min(Math.max(pos, 0), stringLength); + // Avoid the `indexOf` call if no match is possible + if (searchLength + start > stringLength) { + return false; + } + var index = -1; + while (++index < searchLength) { + if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) { + return false; + } + } + return true; + }; + if (defineProperty) { + defineProperty(String.prototype, 'startsWith', { + 'value': startsWith, + 'configurable': true, + 'writable': true + }); + } else { + String.prototype.startsWith = startsWith; + } + }()); + } + + if (!Object.keys) { + Object.keys = function ( + o, // object + k, // key + r // result array + ) { + // initialize object and result + r = []; + // iterate over object keys + for (k in o) { + // fill result array with non-prototypical keys + r.hasOwnProperty.call(o, k) && r.push(k); + } + // return result + return r; + }; + } + + if (HTMLSelectElement && !HTMLSelectElement.prototype.hasOwnProperty('selectedOptions')) { + Object.defineProperty(HTMLSelectElement.prototype, 'selectedOptions', { + get: function () { + return this.querySelectorAll(':checked'); + } + }); + } + + function getSelectedOptions (select, ignoreDisabled) { + var selectedOptions = select.selectedOptions, + options = [], + opt; + + if (ignoreDisabled) { + for (var i = 0, len = selectedOptions.length; i < len; i++) { + opt = selectedOptions[i]; + + if (!(opt.disabled || opt.parentNode.tagName === 'OPTGROUP' && opt.parentNode.disabled)) { + options.push(opt); + } + } + + return options; + } + + return selectedOptions; + } + + // much faster than $.val() + function getSelectValues (select, selectedOptions) { + var value = [], + options = selectedOptions || select.selectedOptions, + opt; + + for (var i = 0, len = options.length; i < len; i++) { + opt = options[i]; + + if (!(opt.disabled || opt.parentNode.tagName === 'OPTGROUP' && opt.parentNode.disabled)) { + value.push(opt.value); + } + } + + if (!select.multiple) { + return !value.length ? null : value[0]; + } + + return value; + } + + // set data-selected on select element if the value has been programmatically selected + // prior to initialization of bootstrap-select + // * consider removing or replacing an alternative method * + var valHooks = { + useDefault: false, + _set: $.valHooks.select.set + }; + + $.valHooks.select.set = function (elem, value) { + if (value && !valHooks.useDefault) $(elem).data('selected', true); + + return valHooks._set.apply(this, arguments); + }; + + var changedArguments = null; + + var EventIsSupported = (function () { + try { + new Event('change'); + return true; + } catch (e) { + return false; + } + })(); + + $.fn.triggerNative = function (eventName) { + var el = this[0], + event; + + if (el.dispatchEvent) { // for modern browsers & IE9+ + if (EventIsSupported) { + // For modern browsers + event = new Event(eventName, { + bubbles: true + }); + } else { + // For IE since it doesn't support Event constructor + event = document.createEvent('Event'); + event.initEvent(eventName, true, false); + } + + el.dispatchEvent(event); + } else if (el.fireEvent) { // for IE8 + event = document.createEventObject(); + event.eventType = eventName; + el.fireEvent('on' + eventName, event); + } else { + // fall back to jQuery.trigger + this.trigger(eventName); + } + }; + // + + function stringSearch (li, searchString, method, normalize) { + var stringTypes = [ + 'display', + 'subtext', + 'tokens' + ], + searchSuccess = false; + + for (var i = 0; i < stringTypes.length; i++) { + var stringType = stringTypes[i], + string = li[stringType]; + + if (string) { + string = string.toString(); + + // Strip HTML tags. This isn't perfect, but it's much faster than any other method + if (stringType === 'display') { + string = string.replace(/<[^>]+>/g, ''); + } + + if (normalize) string = normalizeToBase(string); + string = string.toUpperCase(); + + if (method === 'contains') { + searchSuccess = string.indexOf(searchString) >= 0; + } else { + searchSuccess = string.startsWith(searchString); + } + + if (searchSuccess) break; + } + } + + return searchSuccess; + } + + function toInteger (value) { + return parseInt(value, 10) || 0; + } + + // Borrowed from Lodash (_.deburr) + /** Used to map Latin Unicode letters to basic Latin letters. */ + var deburredLetters = { + // Latin-1 Supplement block. + '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', + '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', + '\xc7': 'C', '\xe7': 'c', + '\xd0': 'D', '\xf0': 'd', + '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', + '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', + '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', + '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', + '\xd1': 'N', '\xf1': 'n', + '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', + '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', + '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', + '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', + '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', + '\xc6': 'Ae', '\xe6': 'ae', + '\xde': 'Th', '\xfe': 'th', + '\xdf': 'ss', + // Latin Extended-A block. + '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', + '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', + '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', + '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', + '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', + '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', + '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', + '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', + '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', + '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', + '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', + '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', + '\u0134': 'J', '\u0135': 'j', + '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', + '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', + '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', + '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', + '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', + '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', + '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', + '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', + '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', + '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', + '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', + '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', + '\u0163': 't', '\u0165': 't', '\u0167': 't', + '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', + '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', + '\u0174': 'W', '\u0175': 'w', + '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', + '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', + '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', + '\u0132': 'IJ', '\u0133': 'ij', + '\u0152': 'Oe', '\u0153': 'oe', + '\u0149': "'n", '\u017f': 's' + }; + + /** Used to match Latin Unicode letters (excluding mathematical operators). */ + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + + /** Used to compose unicode character classes. */ + var rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboMarksExtendedRange = '\\u1ab0-\\u1aff', + rsComboMarksSupplementRange = '\\u1dc0-\\u1dff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange + rsComboMarksExtendedRange + rsComboMarksSupplementRange; + + /** Used to compose unicode capture groups. */ + var rsCombo = '[' + rsComboRange + ']'; + + /** + * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and + * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). + */ + var reComboMark = RegExp(rsCombo, 'g'); + + function deburrLetter (key) { + return deburredLetters[key]; + }; + + function normalizeToBase (string) { + string = string.toString(); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); + } + + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + + // Functions for escaping and unescaping strings to/from HTML interpolation. + var createEscaper = function (map) { + var escaper = function (match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + Object.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function (string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + }; + + var htmlEscape = createEscaper(escapeMap); + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var keyCodeMap = { + 32: ' ', + 48: '0', + 49: '1', + 50: '2', + 51: '3', + 52: '4', + 53: '5', + 54: '6', + 55: '7', + 56: '8', + 57: '9', + 59: ';', + 65: 'A', + 66: 'B', + 67: 'C', + 68: 'D', + 69: 'E', + 70: 'F', + 71: 'G', + 72: 'H', + 73: 'I', + 74: 'J', + 75: 'K', + 76: 'L', + 77: 'M', + 78: 'N', + 79: 'O', + 80: 'P', + 81: 'Q', + 82: 'R', + 83: 'S', + 84: 'T', + 85: 'U', + 86: 'V', + 87: 'W', + 88: 'X', + 89: 'Y', + 90: 'Z', + 96: '0', + 97: '1', + 98: '2', + 99: '3', + 100: '4', + 101: '5', + 102: '6', + 103: '7', + 104: '8', + 105: '9' + }; + + var keyCodes = { + ESCAPE: 27, // KeyboardEvent.which value for Escape (Esc) key + ENTER: 13, // KeyboardEvent.which value for Enter key + SPACE: 32, // KeyboardEvent.which value for space key + TAB: 9, // KeyboardEvent.which value for tab key + ARROW_UP: 38, // KeyboardEvent.which value for up arrow key + ARROW_DOWN: 40 // KeyboardEvent.which value for down arrow key + } + + var version = { + success: false, + major: '3' + }; + + try { + version.full = ($.fn.dropdown.Constructor.VERSION || '').split(' ')[0].split('.'); + version.major = version.full[0]; + version.success = true; + } catch (err) { + // do nothing + } + + var selectId = 0; + + var EVENT_KEY = '.bs.select'; + + var classNames = { + DISABLED: 'disabled', + DIVIDER: 'divider', + SHOW: 'open', + DROPUP: 'dropup', + MENU: 'dropdown-menu', + MENURIGHT: 'dropdown-menu-right', + MENULEFT: 'dropdown-menu-left', + // to-do: replace with more advanced template/customization options + BUTTONCLASS: 'btn-default', + POPOVERHEADER: 'popover-title', + ICONBASE: 'glyphicon', + TICKICON: 'glyphicon-ok' + } + + var Selector = { + MENU: '.' + classNames.MENU + } + + var elementTemplates = { + div: document.createElement('div'), + span: document.createElement('span'), + i: document.createElement('i'), + subtext: document.createElement('small'), + a: document.createElement('a'), + li: document.createElement('li'), + whitespace: document.createTextNode('\u00A0'), + fragment: document.createDocumentFragment() + } + + elementTemplates.noResults = elementTemplates.li.cloneNode(false); + elementTemplates.noResults.className = 'no-results'; + + elementTemplates.a.setAttribute('role', 'option'); + elementTemplates.a.className = 'dropdown-item'; + + elementTemplates.subtext.className = 'text-muted'; + + elementTemplates.text = elementTemplates.span.cloneNode(false); + elementTemplates.text.className = 'text'; + + elementTemplates.checkMark = elementTemplates.span.cloneNode(false); + + var REGEXP_ARROW = new RegExp(keyCodes.ARROW_UP + '|' + keyCodes.ARROW_DOWN); + var REGEXP_TAB_OR_ESCAPE = new RegExp('^' + keyCodes.TAB + '$|' + keyCodes.ESCAPE); + + var generateOption = { + li: function (content, classes, optgroup) { + var li = elementTemplates.li.cloneNode(false); + + if (content) { + if (content.nodeType === 1 || content.nodeType === 11) { + li.appendChild(content); + } else { + li.innerHTML = content; + } + } + + if (typeof classes !== 'undefined' && classes !== '') li.className = classes; + if (typeof optgroup !== 'undefined' && optgroup !== null) li.classList.add('optgroup-' + optgroup); + + return li; + }, + + a: function (text, classes, inline) { + var a = elementTemplates.a.cloneNode(true); + + if (text) { + if (text.nodeType === 11) { + a.appendChild(text); + } else { + a.insertAdjacentHTML('beforeend', text); + } + } + + if (typeof classes !== 'undefined' && classes !== '') a.classList.add.apply(a.classList, classes.split(/\s+/)); + if (inline) a.setAttribute('style', inline); + + return a; + }, + + text: function (options, useFragment) { + var textElement = elementTemplates.text.cloneNode(false), + subtextElement, + iconElement; + + if (options.content) { + textElement.innerHTML = options.content; + } else { + textElement.textContent = options.text; + + if (options.icon) { + var whitespace = elementTemplates.whitespace.cloneNode(false); + + // need to use for icons in the button to prevent a breaking change + // note: switch to span in next major release + iconElement = (useFragment === true ? elementTemplates.i : elementTemplates.span).cloneNode(false); + iconElement.className = this.options.iconBase + ' ' + options.icon; + + elementTemplates.fragment.appendChild(iconElement); + elementTemplates.fragment.appendChild(whitespace); + } + + if (options.subtext) { + subtextElement = elementTemplates.subtext.cloneNode(false); + subtextElement.textContent = options.subtext; + textElement.appendChild(subtextElement); + } + } + + if (useFragment === true) { + while (textElement.childNodes.length > 0) { + elementTemplates.fragment.appendChild(textElement.childNodes[0]); + } + } else { + elementTemplates.fragment.appendChild(textElement); + } + + return elementTemplates.fragment; + }, + + label: function (options) { + var textElement = elementTemplates.text.cloneNode(false), + subtextElement, + iconElement; + + textElement.innerHTML = options.display; + + if (options.icon) { + var whitespace = elementTemplates.whitespace.cloneNode(false); + + iconElement = elementTemplates.span.cloneNode(false); + iconElement.className = this.options.iconBase + ' ' + options.icon; + + elementTemplates.fragment.appendChild(iconElement); + elementTemplates.fragment.appendChild(whitespace); + } + + if (options.subtext) { + subtextElement = elementTemplates.subtext.cloneNode(false); + subtextElement.textContent = options.subtext; + textElement.appendChild(subtextElement); + } + + elementTemplates.fragment.appendChild(textElement); + + return elementTemplates.fragment; + } + } + + function showNoResults (searchMatch, searchValue) { + if (!searchMatch.length) { + elementTemplates.noResults.innerHTML = this.options.noneResultsText.replace('{0}', '"' + htmlEscape(searchValue) + '"'); + this.$menuInner[0].firstChild.appendChild(elementTemplates.noResults); + } + } + + var Selectpicker = function (element, options) { + var that = this; + + // bootstrap-select has been initialized - revert valHooks.select.set back to its original function + if (!valHooks.useDefault) { + $.valHooks.select.set = valHooks._set; + valHooks.useDefault = true; + } + + this.$element = $(element); + this.$newElement = null; + this.$button = null; + this.$menu = null; + this.options = options; + this.selectpicker = { + main: {}, + search: {}, + current: {}, // current changes if a search is in progress + view: {}, + isSearching: false, + keydown: { + keyHistory: '', + resetKeyHistory: { + start: function () { + return setTimeout(function () { + that.selectpicker.keydown.keyHistory = ''; + }, 800); + } + } + } + }; + + this.sizeInfo = {}; + + // If we have no title yet, try to pull it from the html title attribute (jQuery doesnt' pick it up as it's not a + // data-attribute) + if (this.options.title === null) { + this.options.title = this.$element.attr('title'); + } + + // Format window padding + var winPad = this.options.windowPadding; + if (typeof winPad === 'number') { + this.options.windowPadding = [winPad, winPad, winPad, winPad]; + } + + // Expose public methods + this.val = Selectpicker.prototype.val; + this.render = Selectpicker.prototype.render; + this.refresh = Selectpicker.prototype.refresh; + this.setStyle = Selectpicker.prototype.setStyle; + this.selectAll = Selectpicker.prototype.selectAll; + this.deselectAll = Selectpicker.prototype.deselectAll; + this.destroy = Selectpicker.prototype.destroy; + this.remove = Selectpicker.prototype.remove; + this.show = Selectpicker.prototype.show; + this.hide = Selectpicker.prototype.hide; + + this.init(); + }; + + Selectpicker.VERSION = '1.13.18'; + + // part of this is duplicated in i18n/defaults-en_US.js. Make sure to update both. + Selectpicker.DEFAULTS = { + noneSelectedText: 'Nothing selected', + noneResultsText: 'No results matched {0}', + countSelectedText: function (numSelected, numTotal) { + return (numSelected == 1) ? '{0} item selected' : '{0} items selected'; + }, + maxOptionsText: function (numAll, numGroup) { + return [ + (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)', + (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)' + ]; + }, + selectAllText: 'Select All', + deselectAllText: 'Deselect All', + doneButton: false, + doneButtonText: 'Close', + multipleSeparator: ', ', + styleBase: 'btn', + style: classNames.BUTTONCLASS, + size: 'auto', + title: null, + selectedTextFormat: 'values', + width: false, + container: false, + hideDisabled: false, + showSubtext: false, + showIcon: true, + showContent: true, + dropupAuto: true, + header: false, + liveSearch: false, + liveSearchPlaceholder: null, + liveSearchNormalize: false, + liveSearchStyle: 'contains', + actionsBox: false, + iconBase: classNames.ICONBASE, + tickIcon: classNames.TICKICON, + showTick: false, + template: { + caret: '' + }, + maxOptions: false, + mobile: false, + selectOnTab: false, + dropdownAlignRight: false, + windowPadding: 0, + virtualScroll: 600, + display: false, + sanitize: true, + sanitizeFn: null, + whiteList: DefaultWhitelist + }; + + Selectpicker.prototype = { + + constructor: Selectpicker, + + init: function () { + var that = this, + id = this.$element.attr('id'), + element = this.$element[0], + form = element.form; + + selectId++; + this.selectId = 'bs-select-' + selectId; + + element.classList.add('bs-select-hidden'); + + this.multiple = this.$element.prop('multiple'); + this.autofocus = this.$element.prop('autofocus'); + + if (element.classList.contains('show-tick')) { + this.options.showTick = true; + } + + this.$newElement = this.createDropdown(); + this.buildData(); + this.$element + .after(this.$newElement) + .prependTo(this.$newElement); + + // ensure select is associated with form element if it got unlinked after moving it inside newElement + if (form && element.form === null) { + if (!form.id) form.id = 'form-' + this.selectId; + element.setAttribute('form', form.id); + } + + this.$button = this.$newElement.children('button'); + this.$menu = this.$newElement.children(Selector.MENU); + this.$menuInner = this.$menu.children('.inner'); + this.$searchbox = this.$menu.find('input'); + + element.classList.remove('bs-select-hidden'); + + if (this.options.dropdownAlignRight === true) this.$menu[0].classList.add(classNames.MENURIGHT); + + if (typeof id !== 'undefined') { + this.$button.attr('data-id', id); + } + + this.checkDisabled(); + this.clickListener(); + + if (this.options.liveSearch) { + this.liveSearchListener(); + this.focusedParent = this.$searchbox[0]; + } else { + this.focusedParent = this.$menuInner[0]; + } + + this.setStyle(); + this.render(); + this.setWidth(); + if (this.options.container) { + this.selectPosition(); + } else { + this.$element.on('hide' + EVENT_KEY, function () { + if (that.isVirtual()) { + // empty menu on close + var menuInner = that.$menuInner[0], + emptyMenu = menuInner.firstChild.cloneNode(false); + + // replace the existing UL with an empty one - this is faster than $.empty() or innerHTML = '' + menuInner.replaceChild(emptyMenu, menuInner.firstChild); + menuInner.scrollTop = 0; + } + }); + } + this.$menu.data('this', this); + this.$newElement.data('this', this); + if (this.options.mobile) this.mobile(); + + this.$newElement.on({ + 'hide.bs.dropdown': function (e) { + that.$element.trigger('hide' + EVENT_KEY, e); + }, + 'hidden.bs.dropdown': function (e) { + that.$element.trigger('hidden' + EVENT_KEY, e); + }, + 'show.bs.dropdown': function (e) { + that.$element.trigger('show' + EVENT_KEY, e); + }, + 'shown.bs.dropdown': function (e) { + that.$element.trigger('shown' + EVENT_KEY, e); + } + }); + + if (element.hasAttribute('required')) { + this.$element.on('invalid' + EVENT_KEY, function () { + that.$button[0].classList.add('bs-invalid'); + + that.$element + .on('shown' + EVENT_KEY + '.invalid', function () { + that.$element + .val(that.$element.val()) // set the value to hide the validation message in Chrome when menu is opened + .off('shown' + EVENT_KEY + '.invalid'); + }) + .on('rendered' + EVENT_KEY, function () { + // if select is no longer invalid, remove the bs-invalid class + if (this.validity.valid) that.$button[0].classList.remove('bs-invalid'); + that.$element.off('rendered' + EVENT_KEY); + }); + + that.$button.on('blur' + EVENT_KEY, function () { + that.$element.trigger('focus').trigger('blur'); + that.$button.off('blur' + EVENT_KEY); + }); + }); + } + + setTimeout(function () { + that.buildList(); + that.$element.trigger('loaded' + EVENT_KEY); + }); + }, + + createDropdown: function () { + // Options + // If we are multiple or showTick option is set, then add the show-tick class + var showTick = (this.multiple || this.options.showTick) ? ' show-tick' : '', + multiselectable = this.multiple ? ' aria-multiselectable="true"' : '', + inputGroup = '', + autofocus = this.autofocus ? ' autofocus' : ''; + + if (version.major < 4 && this.$element.parent().hasClass('input-group')) { + inputGroup = ' input-group-btn'; + } + + // Elements + var drop, + header = '', + searchbox = '', + actionsbox = '', + donebutton = ''; + + if (this.options.header) { + header = + '
    ' + + '' + + this.options.header + + '
    '; + } + + if (this.options.liveSearch) { + searchbox = + ''; + } + + if (this.multiple && this.options.actionsBox) { + actionsbox = + '
    ' + + '
    ' + + '' + + '' + + '
    ' + + '
    '; + } + + if (this.multiple && this.options.doneButton) { + donebutton = + '
    ' + + '
    ' + + '' + + '
    ' + + '
    '; + } + + drop = + ''; + + return $(drop); + }, + + setPositionData: function () { + this.selectpicker.view.canHighlight = []; + this.selectpicker.view.size = 0; + this.selectpicker.view.firstHighlightIndex = false; + + for (var i = 0; i < this.selectpicker.current.data.length; i++) { + var li = this.selectpicker.current.data[i], + canHighlight = true; + + if (li.type === 'divider') { + canHighlight = false; + li.height = this.sizeInfo.dividerHeight; + } else if (li.type === 'optgroup-label') { + canHighlight = false; + li.height = this.sizeInfo.dropdownHeaderHeight; + } else { + li.height = this.sizeInfo.liHeight; + } + + if (li.disabled) canHighlight = false; + + this.selectpicker.view.canHighlight.push(canHighlight); + + if (canHighlight) { + this.selectpicker.view.size++; + li.posinset = this.selectpicker.view.size; + if (this.selectpicker.view.firstHighlightIndex === false) this.selectpicker.view.firstHighlightIndex = i; + } + + li.position = (i === 0 ? 0 : this.selectpicker.current.data[i - 1].position) + li.height; + } + }, + + isVirtual: function () { + return (this.options.virtualScroll !== false) && (this.selectpicker.main.elements.length >= this.options.virtualScroll) || this.options.virtualScroll === true; + }, + + createView: function (isSearching, setSize, refresh) { + var that = this, + scrollTop = 0, + active = [], + selected, + prevActive; + + this.selectpicker.isSearching = isSearching; + this.selectpicker.current = isSearching ? this.selectpicker.search : this.selectpicker.main; + + this.setPositionData(); + + if (setSize) { + if (refresh) { + scrollTop = this.$menuInner[0].scrollTop; + } else if (!that.multiple) { + var element = that.$element[0], + selectedIndex = (element.options[element.selectedIndex] || {}).liIndex; + + if (typeof selectedIndex === 'number' && that.options.size !== false) { + var selectedData = that.selectpicker.main.data[selectedIndex], + position = selectedData && selectedData.position; + + if (position) { + scrollTop = position - ((that.sizeInfo.menuInnerHeight + that.sizeInfo.liHeight) / 2); + } + } + } + } + + scroll(scrollTop, true); + + this.$menuInner.off('scroll.createView').on('scroll.createView', function (e, updateValue) { + if (!that.noScroll) scroll(this.scrollTop, updateValue); + that.noScroll = false; + }); + + function scroll (scrollTop, init) { + var size = that.selectpicker.current.elements.length, + chunks = [], + chunkSize, + chunkCount, + firstChunk, + lastChunk, + currentChunk, + prevPositions, + positionIsDifferent, + previousElements, + menuIsDifferent = true, + isVirtual = that.isVirtual(); + + that.selectpicker.view.scrollTop = scrollTop; + + chunkSize = Math.ceil(that.sizeInfo.menuInnerHeight / that.sizeInfo.liHeight * 1.5); // number of options in a chunk + chunkCount = Math.round(size / chunkSize) || 1; // number of chunks + + for (var i = 0; i < chunkCount; i++) { + var endOfChunk = (i + 1) * chunkSize; + + if (i === chunkCount - 1) { + endOfChunk = size; + } + + chunks[i] = [ + (i) * chunkSize + (!i ? 0 : 1), + endOfChunk + ]; + + if (!size) break; + + if (currentChunk === undefined && scrollTop - 1 <= that.selectpicker.current.data[endOfChunk - 1].position - that.sizeInfo.menuInnerHeight) { + currentChunk = i; + } + } + + if (currentChunk === undefined) currentChunk = 0; + + prevPositions = [that.selectpicker.view.position0, that.selectpicker.view.position1]; + + // always display previous, current, and next chunks + firstChunk = Math.max(0, currentChunk - 1); + lastChunk = Math.min(chunkCount - 1, currentChunk + 1); + + that.selectpicker.view.position0 = isVirtual === false ? 0 : (Math.max(0, chunks[firstChunk][0]) || 0); + that.selectpicker.view.position1 = isVirtual === false ? size : (Math.min(size, chunks[lastChunk][1]) || 0); + + positionIsDifferent = prevPositions[0] !== that.selectpicker.view.position0 || prevPositions[1] !== that.selectpicker.view.position1; + + if (that.activeIndex !== undefined) { + prevActive = that.selectpicker.main.elements[that.prevActiveIndex]; + active = that.selectpicker.main.elements[that.activeIndex]; + selected = that.selectpicker.main.elements[that.selectedIndex]; + + if (init) { + if (that.activeIndex !== that.selectedIndex) { + that.defocusItem(active); + } + that.activeIndex = undefined; + } + + if (that.activeIndex && that.activeIndex !== that.selectedIndex) { + that.defocusItem(selected); + } + } + + if (that.prevActiveIndex !== undefined && that.prevActiveIndex !== that.activeIndex && that.prevActiveIndex !== that.selectedIndex) { + that.defocusItem(prevActive); + } + + if (init || positionIsDifferent) { + previousElements = that.selectpicker.view.visibleElements ? that.selectpicker.view.visibleElements.slice() : []; + + if (isVirtual === false) { + that.selectpicker.view.visibleElements = that.selectpicker.current.elements; + } else { + that.selectpicker.view.visibleElements = that.selectpicker.current.elements.slice(that.selectpicker.view.position0, that.selectpicker.view.position1); + } + + that.setOptionStatus(); + + // if searching, check to make sure the list has actually been updated before updating DOM + // this prevents unnecessary repaints + if (isSearching || (isVirtual === false && init)) menuIsDifferent = !isEqual(previousElements, that.selectpicker.view.visibleElements); + + // if virtual scroll is disabled and not searching, + // menu should never need to be updated more than once + if ((init || isVirtual === true) && menuIsDifferent) { + var menuInner = that.$menuInner[0], + menuFragment = document.createDocumentFragment(), + emptyMenu = menuInner.firstChild.cloneNode(false), + marginTop, + marginBottom, + elements = that.selectpicker.view.visibleElements, + toSanitize = []; + + // replace the existing UL with an empty one - this is faster than $.empty() + menuInner.replaceChild(emptyMenu, menuInner.firstChild); + + for (var i = 0, visibleElementsLen = elements.length; i < visibleElementsLen; i++) { + var element = elements[i], + elText, + elementData; + + if (that.options.sanitize) { + elText = element.lastChild; + + if (elText) { + elementData = that.selectpicker.current.data[i + that.selectpicker.view.position0]; + + if (elementData && elementData.content && !elementData.sanitized) { + toSanitize.push(elText); + elementData.sanitized = true; + } + } + } + + menuFragment.appendChild(element); + } + + if (that.options.sanitize && toSanitize.length) { + sanitizeHtml(toSanitize, that.options.whiteList, that.options.sanitizeFn); + } + + if (isVirtual === true) { + marginTop = (that.selectpicker.view.position0 === 0 ? 0 : that.selectpicker.current.data[that.selectpicker.view.position0 - 1].position); + marginBottom = (that.selectpicker.view.position1 > size - 1 ? 0 : that.selectpicker.current.data[size - 1].position - that.selectpicker.current.data[that.selectpicker.view.position1 - 1].position); + + menuInner.firstChild.style.marginTop = marginTop + 'px'; + menuInner.firstChild.style.marginBottom = marginBottom + 'px'; + } else { + menuInner.firstChild.style.marginTop = 0; + menuInner.firstChild.style.marginBottom = 0; + } + + menuInner.firstChild.appendChild(menuFragment); + + // if an option is encountered that is wider than the current menu width, update the menu width accordingly + // switch to ResizeObserver with increased browser support + if (isVirtual === true && that.sizeInfo.hasScrollBar) { + var menuInnerInnerWidth = menuInner.firstChild.offsetWidth; + + if (init && menuInnerInnerWidth < that.sizeInfo.menuInnerInnerWidth && that.sizeInfo.totalMenuWidth > that.sizeInfo.selectWidth) { + menuInner.firstChild.style.minWidth = that.sizeInfo.menuInnerInnerWidth + 'px'; + } else if (menuInnerInnerWidth > that.sizeInfo.menuInnerInnerWidth) { + // set to 0 to get actual width of menu + that.$menu[0].style.minWidth = 0; + + var actualMenuWidth = menuInner.firstChild.offsetWidth; + + if (actualMenuWidth > that.sizeInfo.menuInnerInnerWidth) { + that.sizeInfo.menuInnerInnerWidth = actualMenuWidth; + menuInner.firstChild.style.minWidth = that.sizeInfo.menuInnerInnerWidth + 'px'; + } + + // reset to default CSS styling + that.$menu[0].style.minWidth = ''; + } + } + } + } + + that.prevActiveIndex = that.activeIndex; + + if (!that.options.liveSearch) { + that.$menuInner.trigger('focus'); + } else if (isSearching && init) { + var index = 0, + newActive; + + if (!that.selectpicker.view.canHighlight[index]) { + index = 1 + that.selectpicker.view.canHighlight.slice(1).indexOf(true); + } + + newActive = that.selectpicker.view.visibleElements[index]; + + that.defocusItem(that.selectpicker.view.currentActive); + + that.activeIndex = (that.selectpicker.current.data[index] || {}).index; + + that.focusItem(newActive); + } + } + + $(window) + .off('resize' + EVENT_KEY + '.' + this.selectId + '.createView') + .on('resize' + EVENT_KEY + '.' + this.selectId + '.createView', function () { + var isActive = that.$newElement.hasClass(classNames.SHOW); + + if (isActive) scroll(that.$menuInner[0].scrollTop); + }); + }, + + focusItem: function (li, liData, noStyle) { + if (li) { + liData = liData || this.selectpicker.main.data[this.activeIndex]; + var a = li.firstChild; + + if (a) { + a.setAttribute('aria-setsize', this.selectpicker.view.size); + a.setAttribute('aria-posinset', liData.posinset); + + if (noStyle !== true) { + this.focusedParent.setAttribute('aria-activedescendant', a.id); + li.classList.add('active'); + a.classList.add('active'); + } + } + } + }, + + defocusItem: function (li) { + if (li) { + li.classList.remove('active'); + if (li.firstChild) li.firstChild.classList.remove('active'); + } + }, + + setPlaceholder: function () { + var that = this, + updateIndex = false; + + if (this.options.title && !this.multiple) { + if (!this.selectpicker.view.titleOption) this.selectpicker.view.titleOption = document.createElement('option'); + + // this option doesn't create a new
  • element, but does add a new option at the start, + // so startIndex should increase to prevent having to check every option for the bs-title-option class + updateIndex = true; + + var element = this.$element[0], + selectTitleOption = false, + titleNotAppended = !this.selectpicker.view.titleOption.parentNode, + selectedIndex = element.selectedIndex, + selectedOption = element.options[selectedIndex], + navigation = window.performance && window.performance.getEntriesByType('navigation'), + // Safari doesn't support getEntriesByType('navigation') - fall back to performance.navigation + isNotBackForward = (navigation && navigation.length) ? navigation[0].type !== 'back_forward' : window.performance.navigation.type !== 2; + + if (titleNotAppended) { + // Use native JS to prepend option (faster) + this.selectpicker.view.titleOption.className = 'bs-title-option'; + this.selectpicker.view.titleOption.value = ''; + + // Check if selected or data-selected attribute is already set on an option. If not, select the titleOption option. + // the selected item may have been changed by user or programmatically before the bootstrap select plugin runs, + // if so, the select will have the data-selected attribute + selectTitleOption = !selectedOption || (selectedIndex === 0 && selectedOption.defaultSelected === false && this.$element.data('selected') === undefined); + } + + if (titleNotAppended || this.selectpicker.view.titleOption.index !== 0) { + element.insertBefore(this.selectpicker.view.titleOption, element.firstChild); + } + + // Set selected *after* appending to select, + // otherwise the option doesn't get selected in IE + // set using selectedIndex, as setting the selected attr to true here doesn't work in IE11 + if (selectTitleOption && isNotBackForward) { + element.selectedIndex = 0; + } else if (document.readyState !== 'complete') { + // if navigation type is back_forward, there's a chance the select will have its value set by BFCache + // wait for that value to be set, then run render again + window.addEventListener('pageshow', function () { + if (that.selectpicker.view.displayedValue !== element.value) that.render(); + }); + } + } + + return updateIndex; + }, + + buildData: function () { + var optionSelector = ':not([hidden]):not([data-hidden="true"])', + mainData = [], + optID = 0, + startIndex = this.setPlaceholder() ? 1 : 0; // append the titleOption if necessary and skip the first option in the loop + + if (this.options.hideDisabled) optionSelector += ':not(:disabled)'; + + var selectOptions = this.$element[0].querySelectorAll('select > *' + optionSelector); + + function addDivider (config) { + var previousData = mainData[mainData.length - 1]; + + // ensure optgroup doesn't create back-to-back dividers + if ( + previousData && + previousData.type === 'divider' && + (previousData.optID || config.optID) + ) { + return; + } + + config = config || {}; + config.type = 'divider'; + + mainData.push(config); + } + + function addOption (option, config) { + config = config || {}; + + config.divider = option.getAttribute('data-divider') === 'true'; + + if (config.divider) { + addDivider({ + optID: config.optID + }); + } else { + var liIndex = mainData.length, + cssText = option.style.cssText, + inlineStyle = cssText ? htmlEscape(cssText) : '', + optionClass = (option.className || '') + (config.optgroupClass || ''); + + if (config.optID) optionClass = 'opt ' + optionClass; + + config.optionClass = optionClass.trim(); + config.inlineStyle = inlineStyle; + config.text = option.textContent; + + config.content = option.getAttribute('data-content'); + config.tokens = option.getAttribute('data-tokens'); + config.subtext = option.getAttribute('data-subtext'); + config.icon = option.getAttribute('data-icon'); + + option.liIndex = liIndex; + + config.display = config.content || config.text; + config.type = 'option'; + config.index = liIndex; + config.option = option; + config.selected = !!option.selected; + config.disabled = config.disabled || !!option.disabled; + + mainData.push(config); + } + } + + function addOptgroup (index, selectOptions) { + var optgroup = selectOptions[index], + // skip placeholder option + previous = index - 1 < startIndex ? false : selectOptions[index - 1], + next = selectOptions[index + 1], + options = optgroup.querySelectorAll('option' + optionSelector); + + if (!options.length) return; + + var config = { + display: htmlEscape(optgroup.label), + subtext: optgroup.getAttribute('data-subtext'), + icon: optgroup.getAttribute('data-icon'), + type: 'optgroup-label', + optgroupClass: ' ' + (optgroup.className || '') + }, + headerIndex, + lastIndex; + + optID++; + + if (previous) { + addDivider({ optID: optID }); + } + + config.optID = optID; + + mainData.push(config); + + for (var j = 0, len = options.length; j < len; j++) { + var option = options[j]; + + if (j === 0) { + headerIndex = mainData.length - 1; + lastIndex = headerIndex + len; + } + + addOption(option, { + headerIndex: headerIndex, + lastIndex: lastIndex, + optID: config.optID, + optgroupClass: config.optgroupClass, + disabled: optgroup.disabled + }); + } + + if (next) { + addDivider({ optID: optID }); + } + } + + for (var len = selectOptions.length, i = startIndex; i < len; i++) { + var item = selectOptions[i]; + + if (item.tagName !== 'OPTGROUP') { + addOption(item, {}); + } else { + addOptgroup(i, selectOptions); + } + } + + this.selectpicker.main.data = this.selectpicker.current.data = mainData; + }, + + buildList: function () { + var that = this, + selectData = this.selectpicker.main.data, + mainElements = [], + widestOptionLength = 0; + + if ((that.options.showTick || that.multiple) && !elementTemplates.checkMark.parentNode) { + elementTemplates.checkMark.className = this.options.iconBase + ' ' + that.options.tickIcon + ' check-mark'; + elementTemplates.a.appendChild(elementTemplates.checkMark); + } + + function buildElement (item) { + var liElement, + combinedLength = 0; + + switch (item.type) { + case 'divider': + liElement = generateOption.li( + false, + classNames.DIVIDER, + (item.optID ? item.optID + 'div' : undefined) + ); + + break; + + case 'option': + liElement = generateOption.li( + generateOption.a( + generateOption.text.call(that, item), + item.optionClass, + item.inlineStyle + ), + '', + item.optID + ); + + if (liElement.firstChild) { + liElement.firstChild.id = that.selectId + '-' + item.index; + } + + break; + + case 'optgroup-label': + liElement = generateOption.li( + generateOption.label.call(that, item), + 'dropdown-header' + item.optgroupClass, + item.optID + ); + + break; + } + + item.element = liElement; + mainElements.push(liElement); + + // count the number of characters in the option - not perfect, but should work in most cases + if (item.display) combinedLength += item.display.length; + if (item.subtext) combinedLength += item.subtext.length; + // if there is an icon, ensure this option's width is checked + if (item.icon) combinedLength += 1; + + if (combinedLength > widestOptionLength) { + widestOptionLength = combinedLength; + + // guess which option is the widest + // use this when calculating menu width + // not perfect, but it's fast, and the width will be updating accordingly when scrolling + that.selectpicker.view.widestOption = mainElements[mainElements.length - 1]; + } + } + + for (var len = selectData.length, i = 0; i < len; i++) { + var item = selectData[i]; + + buildElement(item); + } + + this.selectpicker.main.elements = this.selectpicker.current.elements = mainElements; + }, + + findLis: function () { + return this.$menuInner.find('.inner > li'); + }, + + render: function () { + var that = this, + element = this.$element[0], + // ensure titleOption is appended and selected (if necessary) before getting selectedOptions + placeholderSelected = this.setPlaceholder() && element.selectedIndex === 0, + selectedOptions = getSelectedOptions(element, this.options.hideDisabled), + selectedCount = selectedOptions.length, + button = this.$button[0], + buttonInner = button.querySelector('.filter-option-inner-inner'), + multipleSeparator = document.createTextNode(this.options.multipleSeparator), + titleFragment = elementTemplates.fragment.cloneNode(false), + showCount, + countMax, + hasContent = false; + + button.classList.toggle('bs-placeholder', that.multiple ? !selectedCount : !getSelectValues(element, selectedOptions)); + + if (!that.multiple && selectedOptions.length === 1) { + that.selectpicker.view.displayedValue = getSelectValues(element, selectedOptions); + } + + if (this.options.selectedTextFormat === 'static') { + titleFragment = generateOption.text.call(this, { text: this.options.title }, true); + } else { + showCount = this.multiple && this.options.selectedTextFormat.indexOf('count') !== -1 && selectedCount > 1; + + // determine if the number of selected options will be shown (showCount === true) + if (showCount) { + countMax = this.options.selectedTextFormat.split('>'); + showCount = (countMax.length > 1 && selectedCount > countMax[1]) || (countMax.length === 1 && selectedCount >= 2); + } + + // only loop through all selected options if the count won't be shown + if (showCount === false) { + if (!placeholderSelected) { + for (var selectedIndex = 0; selectedIndex < selectedCount; selectedIndex++) { + if (selectedIndex < 50) { + var option = selectedOptions[selectedIndex], + thisData = this.selectpicker.main.data[option.liIndex], + titleOptions = {}; + + if (this.multiple && selectedIndex > 0) { + titleFragment.appendChild(multipleSeparator.cloneNode(false)); + } + + if (option.title) { + titleOptions.text = option.title; + } else if (thisData) { + if (thisData.content && that.options.showContent) { + titleOptions.content = thisData.content.toString(); + hasContent = true; + } else { + if (that.options.showIcon) { + titleOptions.icon = thisData.icon; + } + if (that.options.showSubtext && !that.multiple && thisData.subtext) titleOptions.subtext = ' ' + thisData.subtext; + titleOptions.text = option.textContent.trim(); + } + } + + titleFragment.appendChild(generateOption.text.call(this, titleOptions, true)); + } else { + break; + } + } + + // add ellipsis + if (selectedCount > 49) { + titleFragment.appendChild(document.createTextNode('...')); + } + } + } else { + var optionSelector = ':not([hidden]):not([data-hidden="true"]):not([data-divider="true"])'; + if (this.options.hideDisabled) optionSelector += ':not(:disabled)'; + + // If this is a multiselect, and selectedTextFormat is count, then show 1 of 2 selected, etc. + var totalCount = this.$element[0].querySelectorAll('select > option' + optionSelector + ', optgroup' + optionSelector + ' option' + optionSelector).length, + tr8nText = (typeof this.options.countSelectedText === 'function') ? this.options.countSelectedText(selectedCount, totalCount) : this.options.countSelectedText; + + titleFragment = generateOption.text.call(this, { + text: tr8nText.replace('{0}', selectedCount.toString()).replace('{1}', totalCount.toString()) + }, true); + } + } + + if (this.options.title == undefined) { + // use .attr to ensure undefined is returned if title attribute is not set + this.options.title = this.$element.attr('title'); + } + + // If the select doesn't have a title, then use the default, or if nothing is set at all, use noneSelectedText + if (!titleFragment.childNodes.length) { + titleFragment = generateOption.text.call(this, { + text: typeof this.options.title !== 'undefined' ? this.options.title : this.options.noneSelectedText + }, true); + } + + // strip all HTML tags and trim the result, then unescape any escaped tags + button.title = titleFragment.textContent.replace(/<[^>]*>?/g, '').trim(); + + if (this.options.sanitize && hasContent) { + sanitizeHtml([titleFragment], that.options.whiteList, that.options.sanitizeFn); + } + + buttonInner.innerHTML = ''; + buttonInner.appendChild(titleFragment); + + if (version.major < 4 && this.$newElement[0].classList.contains('bs3-has-addon')) { + var filterExpand = button.querySelector('.filter-expand'), + clone = buttonInner.cloneNode(true); + + clone.className = 'filter-expand'; + + if (filterExpand) { + button.replaceChild(clone, filterExpand); + } else { + button.appendChild(clone); + } + } + + this.$element.trigger('rendered' + EVENT_KEY); + }, + + /** + * @param [style] + * @param [status] + */ + setStyle: function (newStyle, status) { + var button = this.$button[0], + newElement = this.$newElement[0], + style = this.options.style.trim(), + buttonClass; + + if (this.$element.attr('class')) { + this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device|bs-select-hidden|validate\[.*\]/gi, '')); + } + + if (version.major < 4) { + newElement.classList.add('bs3'); + + if (newElement.parentNode.classList && newElement.parentNode.classList.contains('input-group') && + (newElement.previousElementSibling || newElement.nextElementSibling) && + (newElement.previousElementSibling || newElement.nextElementSibling).classList.contains('input-group-addon') + ) { + newElement.classList.add('bs3-has-addon'); + } + } + + if (newStyle) { + buttonClass = newStyle.trim(); + } else { + buttonClass = style; + } + + if (status == 'add') { + if (buttonClass) button.classList.add.apply(button.classList, buttonClass.split(' ')); + } else if (status == 'remove') { + if (buttonClass) button.classList.remove.apply(button.classList, buttonClass.split(' ')); + } else { + if (style) button.classList.remove.apply(button.classList, style.split(' ')); + if (buttonClass) button.classList.add.apply(button.classList, buttonClass.split(' ')); + } + }, + + liHeight: function (refresh) { + if (!refresh && (this.options.size === false || Object.keys(this.sizeInfo).length)) return; + + var newElement = elementTemplates.div.cloneNode(false), + menu = elementTemplates.div.cloneNode(false), + menuInner = elementTemplates.div.cloneNode(false), + menuInnerInner = document.createElement('ul'), + divider = elementTemplates.li.cloneNode(false), + dropdownHeader = elementTemplates.li.cloneNode(false), + li, + a = elementTemplates.a.cloneNode(false), + text = elementTemplates.span.cloneNode(false), + header = this.options.header && this.$menu.find('.' + classNames.POPOVERHEADER).length > 0 ? this.$menu.find('.' + classNames.POPOVERHEADER)[0].cloneNode(true) : null, + search = this.options.liveSearch ? elementTemplates.div.cloneNode(false) : null, + actions = this.options.actionsBox && this.multiple && this.$menu.find('.bs-actionsbox').length > 0 ? this.$menu.find('.bs-actionsbox')[0].cloneNode(true) : null, + doneButton = this.options.doneButton && this.multiple && this.$menu.find('.bs-donebutton').length > 0 ? this.$menu.find('.bs-donebutton')[0].cloneNode(true) : null, + firstOption = this.$element.find('option')[0]; + + this.sizeInfo.selectWidth = this.$newElement[0].offsetWidth; + + text.className = 'text'; + a.className = 'dropdown-item ' + (firstOption ? firstOption.className : ''); + newElement.className = this.$menu[0].parentNode.className + ' ' + classNames.SHOW; + newElement.style.width = 0; // ensure button width doesn't affect natural width of menu when calculating + if (this.options.width === 'auto') menu.style.minWidth = 0; + menu.className = classNames.MENU + ' ' + classNames.SHOW; + menuInner.className = 'inner ' + classNames.SHOW; + menuInnerInner.className = classNames.MENU + ' inner ' + (version.major === '4' ? classNames.SHOW : ''); + divider.className = classNames.DIVIDER; + dropdownHeader.className = 'dropdown-header'; + + text.appendChild(document.createTextNode('\u200b')); + + if (this.selectpicker.current.data.length) { + for (var i = 0; i < this.selectpicker.current.data.length; i++) { + var data = this.selectpicker.current.data[i]; + if (data.type === 'option') { + li = data.element; + break; + } + } + } else { + li = elementTemplates.li.cloneNode(false); + a.appendChild(text); + li.appendChild(a); + } + + dropdownHeader.appendChild(text.cloneNode(true)); + + if (this.selectpicker.view.widestOption) { + menuInnerInner.appendChild(this.selectpicker.view.widestOption.cloneNode(true)); + } + + menuInnerInner.appendChild(li); + menuInnerInner.appendChild(divider); + menuInnerInner.appendChild(dropdownHeader); + if (header) menu.appendChild(header); + if (search) { + var input = document.createElement('input'); + search.className = 'bs-searchbox'; + input.className = 'form-control'; + search.appendChild(input); + menu.appendChild(search); + } + if (actions) menu.appendChild(actions); + menuInner.appendChild(menuInnerInner); + menu.appendChild(menuInner); + if (doneButton) menu.appendChild(doneButton); + newElement.appendChild(menu); + + document.body.appendChild(newElement); + + var liHeight = li.offsetHeight, + dropdownHeaderHeight = dropdownHeader ? dropdownHeader.offsetHeight : 0, + headerHeight = header ? header.offsetHeight : 0, + searchHeight = search ? search.offsetHeight : 0, + actionsHeight = actions ? actions.offsetHeight : 0, + doneButtonHeight = doneButton ? doneButton.offsetHeight : 0, + dividerHeight = $(divider).outerHeight(true), + // fall back to jQuery if getComputedStyle is not supported + menuStyle = window.getComputedStyle ? window.getComputedStyle(menu) : false, + menuWidth = menu.offsetWidth, + $menu = menuStyle ? null : $(menu), + menuPadding = { + vert: toInteger(menuStyle ? menuStyle.paddingTop : $menu.css('paddingTop')) + + toInteger(menuStyle ? menuStyle.paddingBottom : $menu.css('paddingBottom')) + + toInteger(menuStyle ? menuStyle.borderTopWidth : $menu.css('borderTopWidth')) + + toInteger(menuStyle ? menuStyle.borderBottomWidth : $menu.css('borderBottomWidth')), + horiz: toInteger(menuStyle ? menuStyle.paddingLeft : $menu.css('paddingLeft')) + + toInteger(menuStyle ? menuStyle.paddingRight : $menu.css('paddingRight')) + + toInteger(menuStyle ? menuStyle.borderLeftWidth : $menu.css('borderLeftWidth')) + + toInteger(menuStyle ? menuStyle.borderRightWidth : $menu.css('borderRightWidth')) + }, + menuExtras = { + vert: menuPadding.vert + + toInteger(menuStyle ? menuStyle.marginTop : $menu.css('marginTop')) + + toInteger(menuStyle ? menuStyle.marginBottom : $menu.css('marginBottom')) + 2, + horiz: menuPadding.horiz + + toInteger(menuStyle ? menuStyle.marginLeft : $menu.css('marginLeft')) + + toInteger(menuStyle ? menuStyle.marginRight : $menu.css('marginRight')) + 2 + }, + scrollBarWidth; + + menuInner.style.overflowY = 'scroll'; + + scrollBarWidth = menu.offsetWidth - menuWidth; + + document.body.removeChild(newElement); + + this.sizeInfo.liHeight = liHeight; + this.sizeInfo.dropdownHeaderHeight = dropdownHeaderHeight; + this.sizeInfo.headerHeight = headerHeight; + this.sizeInfo.searchHeight = searchHeight; + this.sizeInfo.actionsHeight = actionsHeight; + this.sizeInfo.doneButtonHeight = doneButtonHeight; + this.sizeInfo.dividerHeight = dividerHeight; + this.sizeInfo.menuPadding = menuPadding; + this.sizeInfo.menuExtras = menuExtras; + this.sizeInfo.menuWidth = menuWidth; + this.sizeInfo.menuInnerInnerWidth = menuWidth - menuPadding.horiz; + this.sizeInfo.totalMenuWidth = this.sizeInfo.menuWidth; + this.sizeInfo.scrollBarWidth = scrollBarWidth; + this.sizeInfo.selectHeight = this.$newElement[0].offsetHeight; + + this.setPositionData(); + }, + + getSelectPosition: function () { + var that = this, + $window = $(window), + pos = that.$newElement.offset(), + $container = $(that.options.container), + containerPos; + + if (that.options.container && $container.length && !$container.is('body')) { + containerPos = $container.offset(); + containerPos.top += parseInt($container.css('borderTopWidth')); + containerPos.left += parseInt($container.css('borderLeftWidth')); + } else { + containerPos = { top: 0, left: 0 }; + } + + var winPad = that.options.windowPadding; + + this.sizeInfo.selectOffsetTop = pos.top - containerPos.top - $window.scrollTop(); + this.sizeInfo.selectOffsetBot = $window.height() - this.sizeInfo.selectOffsetTop - this.sizeInfo.selectHeight - containerPos.top - winPad[2]; + this.sizeInfo.selectOffsetLeft = pos.left - containerPos.left - $window.scrollLeft(); + this.sizeInfo.selectOffsetRight = $window.width() - this.sizeInfo.selectOffsetLeft - this.sizeInfo.selectWidth - containerPos.left - winPad[1]; + this.sizeInfo.selectOffsetTop -= winPad[0]; + this.sizeInfo.selectOffsetLeft -= winPad[3]; + }, + + setMenuSize: function (isAuto) { + this.getSelectPosition(); + + var selectWidth = this.sizeInfo.selectWidth, + liHeight = this.sizeInfo.liHeight, + headerHeight = this.sizeInfo.headerHeight, + searchHeight = this.sizeInfo.searchHeight, + actionsHeight = this.sizeInfo.actionsHeight, + doneButtonHeight = this.sizeInfo.doneButtonHeight, + divHeight = this.sizeInfo.dividerHeight, + menuPadding = this.sizeInfo.menuPadding, + menuInnerHeight, + menuHeight, + divLength = 0, + minHeight, + _minHeight, + maxHeight, + menuInnerMinHeight, + estimate, + isDropup; + + if (this.options.dropupAuto) { + // Get the estimated height of the menu without scrollbars. + // This is useful for smaller menus, where there might be plenty of room + // below the button without setting dropup, but we can't know + // the exact height of the menu until createView is called later + estimate = liHeight * this.selectpicker.current.elements.length + menuPadding.vert; + + isDropup = this.sizeInfo.selectOffsetTop - this.sizeInfo.selectOffsetBot > this.sizeInfo.menuExtras.vert && estimate + this.sizeInfo.menuExtras.vert + 50 > this.sizeInfo.selectOffsetBot; + + // ensure dropup doesn't change while searching (so menu doesn't bounce back and forth) + if (this.selectpicker.isSearching === true) { + isDropup = this.selectpicker.dropup; + } + + this.$newElement.toggleClass(classNames.DROPUP, isDropup); + this.selectpicker.dropup = isDropup; + } + + if (this.options.size === 'auto') { + _minHeight = this.selectpicker.current.elements.length > 3 ? this.sizeInfo.liHeight * 3 + this.sizeInfo.menuExtras.vert - 2 : 0; + menuHeight = this.sizeInfo.selectOffsetBot - this.sizeInfo.menuExtras.vert; + minHeight = _minHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight; + menuInnerMinHeight = Math.max(_minHeight - menuPadding.vert, 0); + + if (this.$newElement.hasClass(classNames.DROPUP)) { + menuHeight = this.sizeInfo.selectOffsetTop - this.sizeInfo.menuExtras.vert; + } + + maxHeight = menuHeight; + menuInnerHeight = menuHeight - headerHeight - searchHeight - actionsHeight - doneButtonHeight - menuPadding.vert; + } else if (this.options.size && this.options.size != 'auto' && this.selectpicker.current.elements.length > this.options.size) { + for (var i = 0; i < this.options.size; i++) { + if (this.selectpicker.current.data[i].type === 'divider') divLength++; + } + + menuHeight = liHeight * this.options.size + divLength * divHeight + menuPadding.vert; + menuInnerHeight = menuHeight - menuPadding.vert; + maxHeight = menuHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight; + minHeight = menuInnerMinHeight = ''; + } + + this.$menu.css({ + 'max-height': maxHeight + 'px', + 'overflow': 'hidden', + 'min-height': minHeight + 'px' + }); + + this.$menuInner.css({ + 'max-height': menuInnerHeight + 'px', + 'overflow-y': 'auto', + 'min-height': menuInnerMinHeight + 'px' + }); + + // ensure menuInnerHeight is always a positive number to prevent issues calculating chunkSize in createView + this.sizeInfo.menuInnerHeight = Math.max(menuInnerHeight, 1); + + if (this.selectpicker.current.data.length && this.selectpicker.current.data[this.selectpicker.current.data.length - 1].position > this.sizeInfo.menuInnerHeight) { + this.sizeInfo.hasScrollBar = true; + this.sizeInfo.totalMenuWidth = this.sizeInfo.menuWidth + this.sizeInfo.scrollBarWidth; + } + + if (this.options.dropdownAlignRight === 'auto') { + this.$menu.toggleClass(classNames.MENURIGHT, this.sizeInfo.selectOffsetLeft > this.sizeInfo.selectOffsetRight && this.sizeInfo.selectOffsetRight < (this.sizeInfo.totalMenuWidth - selectWidth)); + } + + if (this.dropdown && this.dropdown._popper) this.dropdown._popper.update(); + }, + + setSize: function (refresh) { + this.liHeight(refresh); + + if (this.options.header) this.$menu.css('padding-top', 0); + + if (this.options.size !== false) { + var that = this, + $window = $(window); + + this.setMenuSize(); + + if (this.options.liveSearch) { + this.$searchbox + .off('input.setMenuSize propertychange.setMenuSize') + .on('input.setMenuSize propertychange.setMenuSize', function () { + return that.setMenuSize(); + }); + } + + if (this.options.size === 'auto') { + $window + .off('resize' + EVENT_KEY + '.' + this.selectId + '.setMenuSize' + ' scroll' + EVENT_KEY + '.' + this.selectId + '.setMenuSize') + .on('resize' + EVENT_KEY + '.' + this.selectId + '.setMenuSize' + ' scroll' + EVENT_KEY + '.' + this.selectId + '.setMenuSize', function () { + return that.setMenuSize(); + }); + } else if (this.options.size && this.options.size != 'auto' && this.selectpicker.current.elements.length > this.options.size) { + $window.off('resize' + EVENT_KEY + '.' + this.selectId + '.setMenuSize' + ' scroll' + EVENT_KEY + '.' + this.selectId + '.setMenuSize'); + } + } + + this.createView(false, true, refresh); + }, + + setWidth: function () { + var that = this; + + if (this.options.width === 'auto') { + requestAnimationFrame(function () { + that.$menu.css('min-width', '0'); + + that.$element.on('loaded' + EVENT_KEY, function () { + that.liHeight(); + that.setMenuSize(); + + // Get correct width if element is hidden + var $selectClone = that.$newElement.clone().appendTo('body'), + btnWidth = $selectClone.css('width', 'auto').children('button').outerWidth(); + + $selectClone.remove(); + + // Set width to whatever's larger, button title or longest option + that.sizeInfo.selectWidth = Math.max(that.sizeInfo.totalMenuWidth, btnWidth); + that.$newElement.css('width', that.sizeInfo.selectWidth + 'px'); + }); + }); + } else if (this.options.width === 'fit') { + // Remove inline min-width so width can be changed from 'auto' + this.$menu.css('min-width', ''); + this.$newElement.css('width', '').addClass('fit-width'); + } else if (this.options.width) { + // Remove inline min-width so width can be changed from 'auto' + this.$menu.css('min-width', ''); + this.$newElement.css('width', this.options.width); + } else { + // Remove inline min-width/width so width can be changed + this.$menu.css('min-width', ''); + this.$newElement.css('width', ''); + } + // Remove fit-width class if width is changed programmatically + if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') { + this.$newElement[0].classList.remove('fit-width'); + } + }, + + selectPosition: function () { + this.$bsContainer = $('
    '); + + var that = this, + $container = $(this.options.container), + pos, + containerPos, + actualHeight, + getPlacement = function ($element) { + var containerPosition = {}, + // fall back to dropdown's default display setting if display is not manually set + display = that.options.display || ( + // Bootstrap 3 doesn't have $.fn.dropdown.Constructor.Default + $.fn.dropdown.Constructor.Default ? $.fn.dropdown.Constructor.Default.display + : false + ); + + that.$bsContainer.addClass($element.attr('class').replace(/form-control|fit-width/gi, '')).toggleClass(classNames.DROPUP, $element.hasClass(classNames.DROPUP)); + pos = $element.offset(); + + if (!$container.is('body')) { + containerPos = $container.offset(); + containerPos.top += parseInt($container.css('borderTopWidth')) - $container.scrollTop(); + containerPos.left += parseInt($container.css('borderLeftWidth')) - $container.scrollLeft(); + } else { + containerPos = { top: 0, left: 0 }; + } + + actualHeight = $element.hasClass(classNames.DROPUP) ? 0 : $element[0].offsetHeight; + + // Bootstrap 4+ uses Popper for menu positioning + if (version.major < 4 || display === 'static') { + containerPosition.top = pos.top - containerPos.top + actualHeight; + containerPosition.left = pos.left - containerPos.left; + } + + containerPosition.width = $element[0].offsetWidth; + + that.$bsContainer.css(containerPosition); + }; + + this.$button.on('click.bs.dropdown.data-api', function () { + if (that.isDisabled()) { + return; + } + + getPlacement(that.$newElement); + + that.$bsContainer + .appendTo(that.options.container) + .toggleClass(classNames.SHOW, !that.$button.hasClass(classNames.SHOW)) + .append(that.$menu); + }); + + $(window) + .off('resize' + EVENT_KEY + '.' + this.selectId + ' scroll' + EVENT_KEY + '.' + this.selectId) + .on('resize' + EVENT_KEY + '.' + this.selectId + ' scroll' + EVENT_KEY + '.' + this.selectId, function () { + var isActive = that.$newElement.hasClass(classNames.SHOW); + + if (isActive) getPlacement(that.$newElement); + }); + + this.$element.on('hide' + EVENT_KEY, function () { + that.$menu.data('height', that.$menu.height()); + that.$bsContainer.detach(); + }); + }, + + setOptionStatus: function (selectedOnly) { + var that = this; + + that.noScroll = false; + + if (that.selectpicker.view.visibleElements && that.selectpicker.view.visibleElements.length) { + for (var i = 0; i < that.selectpicker.view.visibleElements.length; i++) { + var liData = that.selectpicker.current.data[i + that.selectpicker.view.position0], + option = liData.option; + + if (option) { + if (selectedOnly !== true) { + that.setDisabled( + liData.index, + liData.disabled + ); + } + + that.setSelected( + liData.index, + option.selected + ); + } + } + } + }, + + /** + * @param {number} index - the index of the option that is being changed + * @param {boolean} selected - true if the option is being selected, false if being deselected + */ + setSelected: function (index, selected) { + var li = this.selectpicker.main.elements[index], + liData = this.selectpicker.main.data[index], + activeIndexIsSet = this.activeIndex !== undefined, + thisIsActive = this.activeIndex === index, + prevActive, + a, + // if current option is already active + // OR + // if the current option is being selected, it's NOT multiple, and + // activeIndex is undefined: + // - when the menu is first being opened, OR + // - after a search has been performed, OR + // - when retainActive is false when selecting a new option (i.e. index of the newly selected option is not the same as the current activeIndex) + keepActive = thisIsActive || (selected && !this.multiple && !activeIndexIsSet); + + liData.selected = selected; + + a = li.firstChild; + + if (selected) { + this.selectedIndex = index; + } + + li.classList.toggle('selected', selected); + + if (keepActive) { + this.focusItem(li, liData); + this.selectpicker.view.currentActive = li; + this.activeIndex = index; + } else { + this.defocusItem(li); + } + + if (a) { + a.classList.toggle('selected', selected); + + if (selected) { + a.setAttribute('aria-selected', true); + } else { + if (this.multiple) { + a.setAttribute('aria-selected', false); + } else { + a.removeAttribute('aria-selected'); + } + } + } + + if (!keepActive && !activeIndexIsSet && selected && this.prevActiveIndex !== undefined) { + prevActive = this.selectpicker.main.elements[this.prevActiveIndex]; + + this.defocusItem(prevActive); + } + }, + + /** + * @param {number} index - the index of the option that is being disabled + * @param {boolean} disabled - true if the option is being disabled, false if being enabled + */ + setDisabled: function (index, disabled) { + var li = this.selectpicker.main.elements[index], + a; + + this.selectpicker.main.data[index].disabled = disabled; + + a = li.firstChild; + + li.classList.toggle(classNames.DISABLED, disabled); + + if (a) { + if (version.major === '4') a.classList.toggle(classNames.DISABLED, disabled); + + if (disabled) { + a.setAttribute('aria-disabled', disabled); + a.setAttribute('tabindex', -1); + } else { + a.removeAttribute('aria-disabled'); + a.setAttribute('tabindex', 0); + } + } + }, + + isDisabled: function () { + return this.$element[0].disabled; + }, + + checkDisabled: function () { + if (this.isDisabled()) { + this.$newElement[0].classList.add(classNames.DISABLED); + this.$button.addClass(classNames.DISABLED).attr('aria-disabled', true); + } else { + if (this.$button[0].classList.contains(classNames.DISABLED)) { + this.$newElement[0].classList.remove(classNames.DISABLED); + this.$button.removeClass(classNames.DISABLED).attr('aria-disabled', false); + } + } + }, + + clickListener: function () { + var that = this, + $document = $(document); + + $document.data('spaceSelect', false); + + this.$button.on('keyup', function (e) { + if (/(32)/.test(e.keyCode.toString(10)) && $document.data('spaceSelect')) { + e.preventDefault(); + $document.data('spaceSelect', false); + } + }); + + this.$newElement.on('show.bs.dropdown', function () { + if (version.major > 3 && !that.dropdown) { + that.dropdown = that.$button.data('bs.dropdown'); + that.dropdown._menu = that.$menu[0]; + } + }); + + this.$button.on('click.bs.dropdown.data-api', function () { + if (!that.$newElement.hasClass(classNames.SHOW)) { + that.setSize(); + } + }); + + function setFocus () { + if (that.options.liveSearch) { + that.$searchbox.trigger('focus'); + } else { + that.$menuInner.trigger('focus'); + } + } + + function checkPopperExists () { + if (that.dropdown && that.dropdown._popper && that.dropdown._popper.state.isCreated) { + setFocus(); + } else { + requestAnimationFrame(checkPopperExists); + } + } + + this.$element.on('shown' + EVENT_KEY, function () { + if (that.$menuInner[0].scrollTop !== that.selectpicker.view.scrollTop) { + that.$menuInner[0].scrollTop = that.selectpicker.view.scrollTop; + } + + if (version.major > 3) { + requestAnimationFrame(checkPopperExists); + } else { + setFocus(); + } + }); + + // ensure posinset and setsize are correct before selecting an option via a click + this.$menuInner.on('mouseenter', 'li a', function (e) { + var hoverLi = this.parentElement, + position0 = that.isVirtual() ? that.selectpicker.view.position0 : 0, + index = Array.prototype.indexOf.call(hoverLi.parentElement.children, hoverLi), + hoverData = that.selectpicker.current.data[index + position0]; + + that.focusItem(hoverLi, hoverData, true); + }); + + this.$menuInner.on('click', 'li a', function (e, retainActive) { + var $this = $(this), + element = that.$element[0], + position0 = that.isVirtual() ? that.selectpicker.view.position0 : 0, + clickedData = that.selectpicker.current.data[$this.parent().index() + position0], + clickedIndex = clickedData.index, + prevValue = getSelectValues(element), + prevIndex = element.selectedIndex, + prevOption = element.options[prevIndex], + triggerChange = true; + + // Don't close on multi choice menu + if (that.multiple && that.options.maxOptions !== 1) { + e.stopPropagation(); + } + + e.preventDefault(); + + // Don't run if the select is disabled + if (!that.isDisabled() && !$this.parent().hasClass(classNames.DISABLED)) { + var option = clickedData.option, + $option = $(option), + state = option.selected, + $optgroup = $option.parent('optgroup'), + $optgroupOptions = $optgroup.find('option'), + maxOptions = that.options.maxOptions, + maxOptionsGrp = $optgroup.data('maxOptions') || false; + + if (clickedIndex === that.activeIndex) retainActive = true; + + if (!retainActive) { + that.prevActiveIndex = that.activeIndex; + that.activeIndex = undefined; + } + + if (!that.multiple) { // Deselect all others if not multi select box + if (prevOption) prevOption.selected = false; + option.selected = true; + that.setSelected(clickedIndex, true); + } else { // Toggle the one we have chosen if we are multi select. + option.selected = !state; + + that.setSelected(clickedIndex, !state); + that.focusedParent.focus(); + + if (maxOptions !== false || maxOptionsGrp !== false) { + var maxReached = maxOptions < getSelectedOptions(element).length, + maxReachedGrp = maxOptionsGrp < $optgroup.find('option:selected').length; + + if ((maxOptions && maxReached) || (maxOptionsGrp && maxReachedGrp)) { + if (maxOptions && maxOptions == 1) { + element.selectedIndex = -1; + option.selected = true; + that.setOptionStatus(true); + } else if (maxOptionsGrp && maxOptionsGrp == 1) { + for (var i = 0; i < $optgroupOptions.length; i++) { + var _option = $optgroupOptions[i]; + _option.selected = false; + that.setSelected(_option.liIndex, false); + } + + option.selected = true; + that.setSelected(clickedIndex, true); + } else { + var maxOptionsText = typeof that.options.maxOptionsText === 'string' ? [that.options.maxOptionsText, that.options.maxOptionsText] : that.options.maxOptionsText, + maxOptionsArr = typeof maxOptionsText === 'function' ? maxOptionsText(maxOptions, maxOptionsGrp) : maxOptionsText, + maxTxt = maxOptionsArr[0].replace('{n}', maxOptions), + maxTxtGrp = maxOptionsArr[1].replace('{n}', maxOptionsGrp), + $notify = $('
    '); + // If {var} is set in array, replace it + /** @deprecated */ + if (maxOptionsArr[2]) { + maxTxt = maxTxt.replace('{var}', maxOptionsArr[2][maxOptions > 1 ? 0 : 1]); + maxTxtGrp = maxTxtGrp.replace('{var}', maxOptionsArr[2][maxOptionsGrp > 1 ? 0 : 1]); + } + + option.selected = false; + + that.$menu.append($notify); + + if (maxOptions && maxReached) { + $notify.append($('
    ' + maxTxt + '
    ')); + triggerChange = false; + that.$element.trigger('maxReached' + EVENT_KEY); + } + + if (maxOptionsGrp && maxReachedGrp) { + $notify.append($('
    ' + maxTxtGrp + '
    ')); + triggerChange = false; + that.$element.trigger('maxReachedGrp' + EVENT_KEY); + } + + setTimeout(function () { + that.setSelected(clickedIndex, false); + }, 10); + + $notify[0].classList.add('fadeOut'); + + setTimeout(function () { + $notify.remove(); + }, 1050); + } + } + } + } + + if (!that.multiple || (that.multiple && that.options.maxOptions === 1)) { + that.$button.trigger('focus'); + } else if (that.options.liveSearch) { + that.$searchbox.trigger('focus'); + } + + // Trigger select 'change' + if (triggerChange) { + if (that.multiple || prevIndex !== element.selectedIndex) { + // $option.prop('selected') is current option state (selected/unselected). prevValue is the value of the select prior to being changed. + changedArguments = [option.index, $option.prop('selected'), prevValue]; + that.$element + .triggerNative('change'); + } + } + } + }); + + this.$menu.on('click', 'li.' + classNames.DISABLED + ' a, .' + classNames.POPOVERHEADER + ', .' + classNames.POPOVERHEADER + ' :not(.close)', function (e) { + if (e.currentTarget == this) { + e.preventDefault(); + e.stopPropagation(); + if (that.options.liveSearch && !$(e.target).hasClass('close')) { + that.$searchbox.trigger('focus'); + } else { + that.$button.trigger('focus'); + } + } + }); + + this.$menuInner.on('click', '.divider, .dropdown-header', function (e) { + e.preventDefault(); + e.stopPropagation(); + if (that.options.liveSearch) { + that.$searchbox.trigger('focus'); + } else { + that.$button.trigger('focus'); + } + }); + + this.$menu.on('click', '.' + classNames.POPOVERHEADER + ' .close', function () { + that.$button.trigger('click'); + }); + + this.$searchbox.on('click', function (e) { + e.stopPropagation(); + }); + + this.$menu.on('click', '.actions-btn', function (e) { + if (that.options.liveSearch) { + that.$searchbox.trigger('focus'); + } else { + that.$button.trigger('focus'); + } + + e.preventDefault(); + e.stopPropagation(); + + if ($(this).hasClass('bs-select-all')) { + that.selectAll(); + } else { + that.deselectAll(); + } + }); + + this.$button + .on('focus' + EVENT_KEY, function (e) { + var tabindex = that.$element[0].getAttribute('tabindex'); + + // only change when button is actually focused + if (tabindex !== undefined && e.originalEvent && e.originalEvent.isTrusted) { + // apply select element's tabindex to ensure correct order is followed when tabbing to the next element + this.setAttribute('tabindex', tabindex); + // set element's tabindex to -1 to allow for reverse tabbing + that.$element[0].setAttribute('tabindex', -1); + that.selectpicker.view.tabindex = tabindex; + } + }) + .on('blur' + EVENT_KEY, function (e) { + // revert everything to original tabindex + if (that.selectpicker.view.tabindex !== undefined && e.originalEvent && e.originalEvent.isTrusted) { + that.$element[0].setAttribute('tabindex', that.selectpicker.view.tabindex); + this.setAttribute('tabindex', -1); + that.selectpicker.view.tabindex = undefined; + } + }); + + this.$element + .on('change' + EVENT_KEY, function () { + that.render(); + that.$element.trigger('changed' + EVENT_KEY, changedArguments); + changedArguments = null; + }) + .on('focus' + EVENT_KEY, function () { + if (!that.options.mobile) that.$button[0].focus(); + }); + }, + + liveSearchListener: function () { + var that = this; + + this.$button.on('click.bs.dropdown.data-api', function () { + if (!!that.$searchbox.val()) { + that.$searchbox.val(''); + that.selectpicker.search.previousValue = undefined; + } + }); + + this.$searchbox.on('click.bs.dropdown.data-api focus.bs.dropdown.data-api touchend.bs.dropdown.data-api', function (e) { + e.stopPropagation(); + }); + + this.$searchbox.on('input propertychange', function () { + var searchValue = that.$searchbox[0].value; + + that.selectpicker.search.elements = []; + that.selectpicker.search.data = []; + + if (searchValue) { + var i, + searchMatch = [], + q = searchValue.toUpperCase(), + cache = {}, + cacheArr = [], + searchStyle = that._searchStyle(), + normalizeSearch = that.options.liveSearchNormalize; + + if (normalizeSearch) q = normalizeToBase(q); + + for (var i = 0; i < that.selectpicker.main.data.length; i++) { + var li = that.selectpicker.main.data[i]; + + if (!cache[i]) { + cache[i] = stringSearch(li, q, searchStyle, normalizeSearch); + } + + if (cache[i] && li.headerIndex !== undefined && cacheArr.indexOf(li.headerIndex) === -1) { + if (li.headerIndex > 0) { + cache[li.headerIndex - 1] = true; + cacheArr.push(li.headerIndex - 1); + } + + cache[li.headerIndex] = true; + cacheArr.push(li.headerIndex); + + cache[li.lastIndex + 1] = true; + } + + if (cache[i] && li.type !== 'optgroup-label') cacheArr.push(i); + } + + for (var i = 0, cacheLen = cacheArr.length; i < cacheLen; i++) { + var index = cacheArr[i], + prevIndex = cacheArr[i - 1], + li = that.selectpicker.main.data[index], + liPrev = that.selectpicker.main.data[prevIndex]; + + if (li.type !== 'divider' || (li.type === 'divider' && liPrev && liPrev.type !== 'divider' && cacheLen - 1 !== i)) { + that.selectpicker.search.data.push(li); + searchMatch.push(that.selectpicker.main.elements[index]); + } + } + + that.activeIndex = undefined; + that.noScroll = true; + that.$menuInner.scrollTop(0); + that.selectpicker.search.elements = searchMatch; + that.createView(true); + showNoResults.call(that, searchMatch, searchValue); + } else if (that.selectpicker.search.previousValue) { // for IE11 (#2402) + that.$menuInner.scrollTop(0); + that.createView(false); + } + + that.selectpicker.search.previousValue = searchValue; + }); + }, + + _searchStyle: function () { + return this.options.liveSearchStyle || 'contains'; + }, + + val: function (value) { + var element = this.$element[0]; + + if (typeof value !== 'undefined') { + var prevValue = getSelectValues(element); + + changedArguments = [null, null, prevValue]; + + this.$element + .val(value) + .trigger('changed' + EVENT_KEY, changedArguments); + + if (this.$newElement.hasClass(classNames.SHOW)) { + if (this.multiple) { + this.setOptionStatus(true); + } else { + var liSelectedIndex = (element.options[element.selectedIndex] || {}).liIndex; + + if (typeof liSelectedIndex === 'number') { + this.setSelected(this.selectedIndex, false); + this.setSelected(liSelectedIndex, true); + } + } + } + + this.render(); + + changedArguments = null; + + return this.$element; + } else { + return this.$element.val(); + } + }, + + changeAll: function (status) { + if (!this.multiple) return; + if (typeof status === 'undefined') status = true; + + var element = this.$element[0], + previousSelected = 0, + currentSelected = 0, + prevValue = getSelectValues(element); + + element.classList.add('bs-select-hidden'); + + for (var i = 0, data = this.selectpicker.current.data, len = data.length; i < len; i++) { + var liData = data[i], + option = liData.option; + + if (option && !liData.disabled && liData.type !== 'divider') { + if (liData.selected) previousSelected++; + option.selected = status; + if (status === true) currentSelected++; + } + } + + element.classList.remove('bs-select-hidden'); + + if (previousSelected === currentSelected) return; + + this.setOptionStatus(); + + changedArguments = [null, null, prevValue]; + + this.$element + .triggerNative('change'); + }, + + selectAll: function () { + return this.changeAll(true); + }, + + deselectAll: function () { + return this.changeAll(false); + }, + + toggle: function (e) { + e = e || window.event; + + if (e) e.stopPropagation(); + + this.$button.trigger('click.bs.dropdown.data-api'); + }, + + keydown: function (e) { + var $this = $(this), + isToggle = $this.hasClass('dropdown-toggle'), + $parent = isToggle ? $this.closest('.dropdown') : $this.closest(Selector.MENU), + that = $parent.data('this'), + $items = that.findLis(), + index, + isActive, + liActive, + activeLi, + offset, + updateScroll = false, + downOnTab = e.which === keyCodes.TAB && !isToggle && !that.options.selectOnTab, + isArrowKey = REGEXP_ARROW.test(e.which) || downOnTab, + scrollTop = that.$menuInner[0].scrollTop, + isVirtual = that.isVirtual(), + position0 = isVirtual === true ? that.selectpicker.view.position0 : 0; + + // do nothing if a function key is pressed + if (e.which >= 112 && e.which <= 123) return; + + isActive = that.$newElement.hasClass(classNames.SHOW); + + if ( + !isActive && + ( + isArrowKey || + (e.which >= 48 && e.which <= 57) || + (e.which >= 96 && e.which <= 105) || + (e.which >= 65 && e.which <= 90) + ) + ) { + that.$button.trigger('click.bs.dropdown.data-api'); + + if (that.options.liveSearch) { + that.$searchbox.trigger('focus'); + return; + } + } + + if (e.which === keyCodes.ESCAPE && isActive) { + e.preventDefault(); + that.$button.trigger('click.bs.dropdown.data-api').trigger('focus'); + } + + if (isArrowKey) { // if up or down + if (!$items.length) return; + + liActive = that.selectpicker.main.elements[that.activeIndex]; + index = liActive ? Array.prototype.indexOf.call(liActive.parentElement.children, liActive) : -1; + + if (index !== -1) { + that.defocusItem(liActive); + } + + if (e.which === keyCodes.ARROW_UP) { // up + if (index !== -1) index--; + if (index + position0 < 0) index += $items.length; + + if (!that.selectpicker.view.canHighlight[index + position0]) { + index = that.selectpicker.view.canHighlight.slice(0, index + position0).lastIndexOf(true) - position0; + if (index === -1) index = $items.length - 1; + } + } else if (e.which === keyCodes.ARROW_DOWN || downOnTab) { // down + index++; + if (index + position0 >= that.selectpicker.view.canHighlight.length) index = that.selectpicker.view.firstHighlightIndex; + + if (!that.selectpicker.view.canHighlight[index + position0]) { + index = index + 1 + that.selectpicker.view.canHighlight.slice(index + position0 + 1).indexOf(true); + } + } + + e.preventDefault(); + + var liActiveIndex = position0 + index; + + if (e.which === keyCodes.ARROW_UP) { // up + // scroll to bottom and highlight last option + if (position0 === 0 && index === $items.length - 1) { + that.$menuInner[0].scrollTop = that.$menuInner[0].scrollHeight; + + liActiveIndex = that.selectpicker.current.elements.length - 1; + } else { + activeLi = that.selectpicker.current.data[liActiveIndex]; + offset = activeLi.position - activeLi.height; + + updateScroll = offset < scrollTop; + } + } else if (e.which === keyCodes.ARROW_DOWN || downOnTab) { // down + // scroll to top and highlight first option + if (index === that.selectpicker.view.firstHighlightIndex) { + that.$menuInner[0].scrollTop = 0; + + liActiveIndex = that.selectpicker.view.firstHighlightIndex; + } else { + activeLi = that.selectpicker.current.data[liActiveIndex]; + offset = activeLi.position - that.sizeInfo.menuInnerHeight; + + updateScroll = offset > scrollTop; + } + } + + liActive = that.selectpicker.current.elements[liActiveIndex]; + + that.activeIndex = that.selectpicker.current.data[liActiveIndex].index; + + that.focusItem(liActive); + + that.selectpicker.view.currentActive = liActive; + + if (updateScroll) that.$menuInner[0].scrollTop = offset; + + if (that.options.liveSearch) { + that.$searchbox.trigger('focus'); + } else { + $this.trigger('focus'); + } + } else if ( + (!$this.is('input') && !REGEXP_TAB_OR_ESCAPE.test(e.which)) || + (e.which === keyCodes.SPACE && that.selectpicker.keydown.keyHistory) + ) { + var searchMatch, + matches = [], + keyHistory; + + e.preventDefault(); + + that.selectpicker.keydown.keyHistory += keyCodeMap[e.which]; + + if (that.selectpicker.keydown.resetKeyHistory.cancel) clearTimeout(that.selectpicker.keydown.resetKeyHistory.cancel); + that.selectpicker.keydown.resetKeyHistory.cancel = that.selectpicker.keydown.resetKeyHistory.start(); + + keyHistory = that.selectpicker.keydown.keyHistory; + + // if all letters are the same, set keyHistory to just the first character when searching + if (/^(.)\1+$/.test(keyHistory)) { + keyHistory = keyHistory.charAt(0); + } + + // find matches + for (var i = 0; i < that.selectpicker.current.data.length; i++) { + var li = that.selectpicker.current.data[i], + hasMatch; + + hasMatch = stringSearch(li, keyHistory, 'startsWith', true); + + if (hasMatch && that.selectpicker.view.canHighlight[i]) { + matches.push(li.index); + } + } + + if (matches.length) { + var matchIndex = 0; + + $items.removeClass('active').find('a').removeClass('active'); + + // either only one key has been pressed or they are all the same key + if (keyHistory.length === 1) { + matchIndex = matches.indexOf(that.activeIndex); + + if (matchIndex === -1 || matchIndex === matches.length - 1) { + matchIndex = 0; + } else { + matchIndex++; + } + } + + searchMatch = matches[matchIndex]; + + activeLi = that.selectpicker.main.data[searchMatch]; + + if (scrollTop - activeLi.position > 0) { + offset = activeLi.position - activeLi.height; + updateScroll = true; + } else { + offset = activeLi.position - that.sizeInfo.menuInnerHeight; + // if the option is already visible at the current scroll position, just keep it the same + updateScroll = activeLi.position > scrollTop + that.sizeInfo.menuInnerHeight; + } + + liActive = that.selectpicker.main.elements[searchMatch]; + + that.activeIndex = matches[matchIndex]; + + that.focusItem(liActive); + + if (liActive) liActive.firstChild.focus(); + + if (updateScroll) that.$menuInner[0].scrollTop = offset; + + $this.trigger('focus'); + } + } + + // Select focused option if "Enter", "Spacebar" or "Tab" (when selectOnTab is true) are pressed inside the menu. + if ( + isActive && + ( + (e.which === keyCodes.SPACE && !that.selectpicker.keydown.keyHistory) || + e.which === keyCodes.ENTER || + (e.which === keyCodes.TAB && that.options.selectOnTab) + ) + ) { + if (e.which !== keyCodes.SPACE) e.preventDefault(); + + if (!that.options.liveSearch || e.which !== keyCodes.SPACE) { + that.$menuInner.find('.active a').trigger('click', true); // retain active class + $this.trigger('focus'); + + if (!that.options.liveSearch) { + // Prevent screen from scrolling if the user hits the spacebar + e.preventDefault(); + // Fixes spacebar selection of dropdown items in FF & IE + $(document).data('spaceSelect', true); + } + } + } + }, + + mobile: function () { + // ensure mobile is set to true if mobile function is called after init + this.options.mobile = true; + this.$element[0].classList.add('mobile-device'); + }, + + refresh: function () { + // update options if data attributes have been changed + var config = $.extend({}, this.options, this.$element.data()); + this.options = config; + + this.checkDisabled(); + this.buildData(); + this.setStyle(); + this.render(); + this.buildList(); + this.setWidth(); + + this.setSize(true); + + this.$element.trigger('refreshed' + EVENT_KEY); + }, + + hide: function () { + this.$newElement.hide(); + }, + + show: function () { + this.$newElement.show(); + }, + + remove: function () { + this.$newElement.remove(); + this.$element.remove(); + }, + + destroy: function () { + this.$newElement.before(this.$element).remove(); + + if (this.$bsContainer) { + this.$bsContainer.remove(); + } else { + this.$menu.remove(); + } + + if (this.selectpicker.view.titleOption && this.selectpicker.view.titleOption.parentNode) { + this.selectpicker.view.titleOption.parentNode.removeChild(this.selectpicker.view.titleOption); + } + + this.$element + .off(EVENT_KEY) + .removeData('selectpicker') + .removeClass('bs-select-hidden selectpicker'); + + $(window).off(EVENT_KEY + '.' + this.selectId); + } + }; + + // SELECTPICKER PLUGIN DEFINITION + // ============================== + function Plugin (option) { + // get the args of the outer function.. + var args = arguments; + // The arguments of the function are explicitly re-defined from the argument list, because the shift causes them + // to get lost/corrupted in android 2.3 and IE9 #715 #775 + var _option = option; + + [].shift.apply(args); + + // if the version was not set successfully + if (!version.success) { + // try to retreive it again + try { + version.full = ($.fn.dropdown.Constructor.VERSION || '').split(' ')[0].split('.'); + } catch (err) { + // fall back to use BootstrapVersion if set + if (Selectpicker.BootstrapVersion) { + version.full = Selectpicker.BootstrapVersion.split(' ')[0].split('.'); + } else { + version.full = [version.major, '0', '0']; + + console.warn( + 'There was an issue retrieving Bootstrap\'s version. ' + + 'Ensure Bootstrap is being loaded before bootstrap-select and there is no namespace collision. ' + + 'If loading Bootstrap asynchronously, the version may need to be manually specified via $.fn.selectpicker.Constructor.BootstrapVersion.', + err + ); + } + } + + version.major = version.full[0]; + version.success = true; + } + + if (version.major === '4') { + // some defaults need to be changed if using Bootstrap 4 + // check to see if they have already been manually changed before forcing them to update + var toUpdate = []; + + if (Selectpicker.DEFAULTS.style === classNames.BUTTONCLASS) toUpdate.push({ name: 'style', className: 'BUTTONCLASS' }); + if (Selectpicker.DEFAULTS.iconBase === classNames.ICONBASE) toUpdate.push({ name: 'iconBase', className: 'ICONBASE' }); + if (Selectpicker.DEFAULTS.tickIcon === classNames.TICKICON) toUpdate.push({ name: 'tickIcon', className: 'TICKICON' }); + + classNames.DIVIDER = 'dropdown-divider'; + classNames.SHOW = 'show'; + classNames.BUTTONCLASS = 'btn-light'; + classNames.POPOVERHEADER = 'popover-header'; + classNames.ICONBASE = ''; + classNames.TICKICON = 'bs-ok-default'; + + for (var i = 0; i < toUpdate.length; i++) { + var option = toUpdate[i]; + Selectpicker.DEFAULTS[option.name] = classNames[option.className]; + } + } + + var value; + var chain = this.each(function () { + var $this = $(this); + if ($this.is('select')) { + var data = $this.data('selectpicker'), + options = typeof _option == 'object' && _option; + + if (!data) { + var dataAttributes = $this.data(); + + for (var dataAttr in dataAttributes) { + if (Object.prototype.hasOwnProperty.call(dataAttributes, dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) { + delete dataAttributes[dataAttr]; + } + } + + var config = $.extend({}, Selectpicker.DEFAULTS, $.fn.selectpicker.defaults || {}, dataAttributes, options); + config.template = $.extend({}, Selectpicker.DEFAULTS.template, ($.fn.selectpicker.defaults ? $.fn.selectpicker.defaults.template : {}), dataAttributes.template, options.template); + $this.data('selectpicker', (data = new Selectpicker(this, config))); + } else if (options) { + for (var i in options) { + if (Object.prototype.hasOwnProperty.call(options, i)) { + data.options[i] = options[i]; + } + } + } + + if (typeof _option == 'string') { + if (data[_option] instanceof Function) { + value = data[_option].apply(data, args); + } else { + value = data.options[_option]; + } + } + } + }); + + if (typeof value !== 'undefined') { + // noinspection JSUnusedAssignment + return value; + } else { + return chain; + } + } + + var old = $.fn.selectpicker; + $.fn.selectpicker = Plugin; + $.fn.selectpicker.Constructor = Selectpicker; + + // SELECTPICKER NO CONFLICT + // ======================== + $.fn.selectpicker.noConflict = function () { + $.fn.selectpicker = old; + return this; + }; + + // get Bootstrap's keydown event handler for either Bootstrap 4 or Bootstrap 3 + function keydownHandler () { + if ($.fn.dropdown) { + // wait to define until function is called in case Bootstrap isn't loaded yet + var bootstrapKeydown = $.fn.dropdown.Constructor._dataApiKeydownHandler || $.fn.dropdown.Constructor.prototype.keydown; + return bootstrapKeydown.apply(this, arguments); + } + } + + $(document) + .off('keydown.bs.dropdown.data-api') + .on('keydown.bs.dropdown.data-api', ':not(.bootstrap-select) > [data-toggle="dropdown"]', keydownHandler) + .on('keydown.bs.dropdown.data-api', ':not(.bootstrap-select) > .dropdown-menu', keydownHandler) + .on('keydown' + EVENT_KEY, '.bootstrap-select [data-toggle="dropdown"], .bootstrap-select [role="listbox"], .bootstrap-select .bs-searchbox input', Selectpicker.prototype.keydown) + .on('focusin.modal', '.bootstrap-select [data-toggle="dropdown"], .bootstrap-select [role="listbox"], .bootstrap-select .bs-searchbox input', function (e) { + e.stopPropagation(); + }); + + // SELECTPICKER DATA-API + // ===================== + $(window).on('load' + EVENT_KEY + '.data-api', function () { + $('.selectpicker').each(function () { + var $selectpicker = $(this); + Plugin.call($selectpicker, $selectpicker.data()); + }) + }); +})(jQuery); + + +})); diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-select/bootstrap-select.min.css b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-select/bootstrap-select.min.css new file mode 100644 index 0000000..8d0f049 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-select/bootstrap-select.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap-select v1.13.18 (https://developer.snapappointments.com/bootstrap-select) + * + * Copyright 2012-2020 SnapAppointments, LLC + * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE) + */@-webkit-keyframes bs-notify-fadeOut{0%{opacity:.9}100%{opacity:0}}@-o-keyframes bs-notify-fadeOut{0%{opacity:.9}100%{opacity:0}}@keyframes bs-notify-fadeOut{0%{opacity:.9}100%{opacity:0}}.bootstrap-select>select.bs-select-hidden,select.bs-select-hidden,select.selectpicker{display:none!important}.bootstrap-select{width:220px\0;vertical-align:middle}.bootstrap-select>.dropdown-toggle{position:relative;width:100%;text-align:right;white-space:nowrap;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.bootstrap-select>.dropdown-toggle:after{margin-top:-1px}.bootstrap-select>.dropdown-toggle.bs-placeholder,.bootstrap-select>.dropdown-toggle.bs-placeholder:active,.bootstrap-select>.dropdown-toggle.bs-placeholder:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder:hover{color:#999}.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:hover{color:rgba(255,255,255,.5)}.bootstrap-select>select{position:absolute!important;bottom:0;left:50%;display:block!important;width:.5px!important;height:100%!important;padding:0!important;opacity:0!important;border:none;z-index:0!important}.bootstrap-select>select.mobile-device{top:0;left:0;display:block!important;width:100%!important;z-index:2!important}.bootstrap-select.is-invalid .dropdown-toggle,.error .bootstrap-select .dropdown-toggle,.has-error .bootstrap-select .dropdown-toggle,.was-validated .bootstrap-select select:invalid+.dropdown-toggle{border-color:#b94a48}.bootstrap-select.is-valid .dropdown-toggle,.was-validated .bootstrap-select select:valid+.dropdown-toggle{border-color:#28a745}.bootstrap-select.fit-width{width:auto!important}.bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){width:220px}.bootstrap-select .dropdown-toggle:focus,.bootstrap-select>select.mobile-device:focus+.dropdown-toggle{outline:thin dotted #333!important;outline:5px auto -webkit-focus-ring-color!important;outline-offset:-2px}.bootstrap-select.form-control{margin-bottom:0;padding:0;border:none;height:auto}:not(.input-group)>.bootstrap-select.form-control:not([class*=col-]){width:100%}.bootstrap-select.form-control.input-group-btn{float:none;z-index:auto}.form-inline .bootstrap-select,.form-inline .bootstrap-select.form-control:not([class*=col-]){width:auto}.bootstrap-select:not(.input-group-btn),.bootstrap-select[class*=col-]{float:none;display:inline-block;margin-left:0}.bootstrap-select.dropdown-menu-right,.bootstrap-select[class*=col-].dropdown-menu-right,.row .bootstrap-select[class*=col-].dropdown-menu-right{float:right}.form-group .bootstrap-select,.form-horizontal .bootstrap-select,.form-inline .bootstrap-select{margin-bottom:0}.form-group-lg .bootstrap-select.form-control,.form-group-sm .bootstrap-select.form-control{padding:0}.form-group-lg .bootstrap-select.form-control .dropdown-toggle,.form-group-sm .bootstrap-select.form-control .dropdown-toggle{height:100%;font-size:inherit;line-height:inherit;border-radius:inherit}.bootstrap-select.form-control-lg .dropdown-toggle,.bootstrap-select.form-control-sm .dropdown-toggle{font-size:inherit;line-height:inherit;border-radius:inherit}.bootstrap-select.form-control-sm .dropdown-toggle{padding:.25rem .5rem}.bootstrap-select.form-control-lg .dropdown-toggle{padding:.5rem 1rem}.form-inline .bootstrap-select .form-control{width:100%}.bootstrap-select.disabled,.bootstrap-select>.disabled{cursor:not-allowed}.bootstrap-select.disabled:focus,.bootstrap-select>.disabled:focus{outline:0!important}.bootstrap-select.bs-container{position:absolute;top:0;left:0;height:0!important;padding:0!important}.bootstrap-select.bs-container .dropdown-menu{z-index:1060}.bootstrap-select .dropdown-toggle .filter-option{position:static;top:0;left:0;float:left;height:100%;width:100%;text-align:left;overflow:hidden;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.bs3.bootstrap-select .dropdown-toggle .filter-option{padding-right:inherit}.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option{position:absolute;padding-top:inherit;padding-bottom:inherit;padding-left:inherit;float:none}.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option .filter-option-inner{padding-right:inherit}.bootstrap-select .dropdown-toggle .filter-option-inner-inner{overflow:hidden}.bootstrap-select .dropdown-toggle .filter-expand{width:0!important;float:left;opacity:0!important;overflow:hidden}.bootstrap-select .dropdown-toggle .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.input-group .bootstrap-select.form-control .dropdown-toggle{border-radius:inherit}.bootstrap-select[class*=col-] .dropdown-toggle{width:100%}.bootstrap-select .dropdown-menu{min-width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select .dropdown-menu>.inner:focus{outline:0!important}.bootstrap-select .dropdown-menu.inner{position:static;float:none;border:0;padding:0;margin:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bootstrap-select .dropdown-menu li{position:relative}.bootstrap-select .dropdown-menu li.active small{color:rgba(255,255,255,.5)!important}.bootstrap-select .dropdown-menu li.disabled a{cursor:not-allowed}.bootstrap-select .dropdown-menu li a{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bootstrap-select .dropdown-menu li a.opt{position:relative;padding-left:2.25em}.bootstrap-select .dropdown-menu li a span.check-mark{display:none}.bootstrap-select .dropdown-menu li a span.text{display:inline-block}.bootstrap-select .dropdown-menu li small{padding-left:.5em}.bootstrap-select .dropdown-menu .notify{position:absolute;bottom:5px;width:96%;margin:0 2%;min-height:26px;padding:3px 5px;background:#f5f5f5;border:1px solid #e3e3e3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);pointer-events:none;opacity:.9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select .dropdown-menu .notify.fadeOut{-webkit-animation:.3s linear 750ms forwards bs-notify-fadeOut;-o-animation:.3s linear 750ms forwards bs-notify-fadeOut;animation:.3s linear 750ms forwards bs-notify-fadeOut}.bootstrap-select .no-results{padding:3px;background:#f5f5f5;margin:0 5px;white-space:nowrap}.bootstrap-select.fit-width .dropdown-toggle .filter-option{position:static;display:inline;padding:0}.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner,.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner{display:inline}.bootstrap-select.fit-width .dropdown-toggle .bs-caret:before{content:'\00a0'}.bootstrap-select.fit-width .dropdown-toggle .caret{position:static;top:auto;margin-top:-1px}.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark{position:absolute;display:inline-block;right:15px;top:5px}.bootstrap-select.show-tick .dropdown-menu li a span.text{margin-right:34px}.bootstrap-select .bs-ok-default:after{content:'';display:block;width:.5em;height:1em;border-style:solid;border-width:0 .26em .26em 0;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle{z-index:1061}.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before{content:'';border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(204,204,204,.2);position:absolute;bottom:-4px;left:9px;display:none}.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after{content:'';border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;bottom:-4px;left:10px;display:none}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before{bottom:auto;top:-4px;border-top:7px solid rgba(204,204,204,.2);border-bottom:0}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after{bottom:auto;top:-4px;border-top:6px solid #fff;border-bottom:0}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before{right:12px;left:auto}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after{right:13px;left:auto}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle .filter-option:after,.bootstrap-select.show-menu-arrow.open>.dropdown-toggle .filter-option:before,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle .filter-option:after,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle .filter-option:before{display:block}.bs-actionsbox,.bs-donebutton,.bs-searchbox{padding:4px 8px}.bs-actionsbox{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-actionsbox .btn-group button{width:50%}.bs-donebutton{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-donebutton .btn-group button{width:100%}.bs-searchbox+.bs-actionsbox{padding:0 8px 4px}.bs-searchbox .form-control{margin-bottom:0;width:100%;float:none} \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-select/bootstrap-select.min.js b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-select/bootstrap-select.min.js new file mode 100644 index 0000000..46cf10e --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-select/bootstrap-select.min.js @@ -0,0 +1,8 @@ +/*! + * Bootstrap-select v1.13.18 (https://developer.snapappointments.com/bootstrap-select) + * + * Copyright 2012-2020 SnapAppointments, LLC + * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE) + */ + +!function(e,t){void 0===e&&void 0!==window&&(e=window),"function"==typeof define&&define.amd?define(["jquery"],function(e){return t(e)}):"object"==typeof module&&module.exports?module.exports=t(require("jquery")):t(e.jQuery)}(this,function(e){!function(P){"use strict";var d=["sanitize","whiteList","sanitizeFn"],r=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],e={"*":["class","dir","id","lang","role","tabindex","style",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},l=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,a=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function v(e,t){var i=e.nodeName.toLowerCase();if(-1!==P.inArray(i,t))return-1===P.inArray(i,r)||Boolean(e.nodeValue.match(l)||e.nodeValue.match(a));for(var s=P(t).filter(function(e,t){return t instanceof RegExp}),n=0,o=s.length;n]+>/g,"")),s&&(a=w(a)),a=a.toUpperCase(),o="contains"===i?0<=a.indexOf(t):a.startsWith(t)))break}return o}function N(e){return parseInt(e,10)||0}P.fn.triggerNative=function(e){var t,i=this[0];i.dispatchEvent?(u?t=new Event(e,{bubbles:!0}):(t=document.createEvent("Event")).initEvent(e,!0,!1),i.dispatchEvent(t)):i.fireEvent?((t=document.createEventObject()).eventType=e,i.fireEvent("on"+e,t)):this.trigger(e)};var f={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"},m=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,g=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\u1ab0-\\u1aff\\u1dc0-\\u1dff]","g");function b(e){return f[e]}function w(e){return(e=e.toString())&&e.replace(m,b).replace(g,"")}var I,x,y,$,S=(I={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},x="(?:"+Object.keys(I).join("|")+")",y=RegExp(x),$=RegExp(x,"g"),function(e){return e=null==e?"":""+e,y.test(e)?e.replace($,E):e});function E(e){return I[e]}var C={32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9"},A=27,L=13,D=32,H=9,B=38,R=40,M={success:!1,major:"3"};try{M.full=(P.fn.dropdown.Constructor.VERSION||"").split(" ")[0].split("."),M.major=M.full[0],M.success=!0}catch(e){}var U=0,j=".bs.select",V={DISABLED:"disabled",DIVIDER:"divider",SHOW:"open",DROPUP:"dropup",MENU:"dropdown-menu",MENURIGHT:"dropdown-menu-right",MENULEFT:"dropdown-menu-left",BUTTONCLASS:"btn-default",POPOVERHEADER:"popover-title",ICONBASE:"glyphicon",TICKICON:"glyphicon-ok"},F={MENU:"."+V.MENU},_={div:document.createElement("div"),span:document.createElement("span"),i:document.createElement("i"),subtext:document.createElement("small"),a:document.createElement("a"),li:document.createElement("li"),whitespace:document.createTextNode("\xa0"),fragment:document.createDocumentFragment()};_.noResults=_.li.cloneNode(!1),_.noResults.className="no-results",_.a.setAttribute("role","option"),_.a.className="dropdown-item",_.subtext.className="text-muted",_.text=_.span.cloneNode(!1),_.text.className="text",_.checkMark=_.span.cloneNode(!1);var G=new RegExp(B+"|"+R),q=new RegExp("^"+H+"$|"+A),K={li:function(e,t,i){var s=_.li.cloneNode(!1);return e&&(1===e.nodeType||11===e.nodeType?s.appendChild(e):s.innerHTML=e),void 0!==t&&""!==t&&(s.className=t),null!=i&&s.classList.add("optgroup-"+i),s},a:function(e,t,i){var s=_.a.cloneNode(!0);return e&&(11===e.nodeType?s.appendChild(e):s.insertAdjacentHTML("beforeend",e)),void 0!==t&&""!==t&&s.classList.add.apply(s.classList,t.split(/\s+/)),i&&s.setAttribute("style",i),s},text:function(e,t){var i,s,n=_.text.cloneNode(!1);if(e.content)n.innerHTML=e.content;else{if(n.textContent=e.text,e.icon){var o=_.whitespace.cloneNode(!1);(s=(!0===t?_.i:_.span).cloneNode(!1)).className=this.options.iconBase+" "+e.icon,_.fragment.appendChild(s),_.fragment.appendChild(o)}e.subtext&&((i=_.subtext.cloneNode(!1)).textContent=e.subtext,n.appendChild(i))}if(!0===t)for(;0'},maxOptions:!1,mobile:!1,selectOnTab:!1,dropdownAlignRight:!1,windowPadding:0,virtualScroll:600,display:!1,sanitize:!0,sanitizeFn:null,whiteList:e},Y.prototype={constructor:Y,init:function(){var i=this,e=this.$element.attr("id"),t=this.$element[0],s=t.form;U++,this.selectId="bs-select-"+U,t.classList.add("bs-select-hidden"),this.multiple=this.$element.prop("multiple"),this.autofocus=this.$element.prop("autofocus"),t.classList.contains("show-tick")&&(this.options.showTick=!0),this.$newElement=this.createDropdown(),this.buildData(),this.$element.after(this.$newElement).prependTo(this.$newElement),s&&null===t.form&&(s.id||(s.id="form-"+this.selectId),t.setAttribute("form",s.id)),this.$button=this.$newElement.children("button"),this.$menu=this.$newElement.children(F.MENU),this.$menuInner=this.$menu.children(".inner"),this.$searchbox=this.$menu.find("input"),t.classList.remove("bs-select-hidden"),!0===this.options.dropdownAlignRight&&this.$menu[0].classList.add(V.MENURIGHT),void 0!==e&&this.$button.attr("data-id",e),this.checkDisabled(),this.clickListener(),this.options.liveSearch?(this.liveSearchListener(),this.focusedParent=this.$searchbox[0]):this.focusedParent=this.$menuInner[0],this.setStyle(),this.render(),this.setWidth(),this.options.container?this.selectPosition():this.$element.on("hide"+j,function(){if(i.isVirtual()){var e=i.$menuInner[0],t=e.firstChild.cloneNode(!1);e.replaceChild(t,e.firstChild),e.scrollTop=0}}),this.$menu.data("this",this),this.$newElement.data("this",this),this.options.mobile&&this.mobile(),this.$newElement.on({"hide.bs.dropdown":function(e){i.$element.trigger("hide"+j,e)},"hidden.bs.dropdown":function(e){i.$element.trigger("hidden"+j,e)},"show.bs.dropdown":function(e){i.$element.trigger("show"+j,e)},"shown.bs.dropdown":function(e){i.$element.trigger("shown"+j,e)}}),t.hasAttribute("required")&&this.$element.on("invalid"+j,function(){i.$button[0].classList.add("bs-invalid"),i.$element.on("shown"+j+".invalid",function(){i.$element.val(i.$element.val()).off("shown"+j+".invalid")}).on("rendered"+j,function(){this.validity.valid&&i.$button[0].classList.remove("bs-invalid"),i.$element.off("rendered"+j)}),i.$button.on("blur"+j,function(){i.$element.trigger("focus").trigger("blur"),i.$button.off("blur"+j)})}),setTimeout(function(){i.buildList(),i.$element.trigger("loaded"+j)})},createDropdown:function(){var e=this.multiple||this.options.showTick?" show-tick":"",t=this.multiple?' aria-multiselectable="true"':"",i="",s=this.autofocus?" autofocus":"";M.major<4&&this.$element.parent().hasClass("input-group")&&(i=" input-group-btn");var n,o="",r="",l="",a="";return this.options.header&&(o='
    '+this.options.header+"
    "),this.options.liveSearch&&(r=''),this.multiple&&this.options.actionsBox&&(l='
    "),this.multiple&&this.options.doneButton&&(a='
    "),n='",P(n)},setPositionData:function(){this.selectpicker.view.canHighlight=[],this.selectpicker.view.size=0,this.selectpicker.view.firstHighlightIndex=!1;for(var e=0;e=this.options.virtualScroll||!0===this.options.virtualScroll},createView:function(N,e,t){var A,L,D=this,i=0,H=[];if(this.selectpicker.isSearching=N,this.selectpicker.current=N?this.selectpicker.search:this.selectpicker.main,this.setPositionData(),e)if(t)i=this.$menuInner[0].scrollTop;else if(!D.multiple){var s=D.$element[0],n=(s.options[s.selectedIndex]||{}).liIndex;if("number"==typeof n&&!1!==D.options.size){var o=D.selectpicker.main.data[n],r=o&&o.position;r&&(i=r-(D.sizeInfo.menuInnerHeight+D.sizeInfo.liHeight)/2)}}function l(e,t){var i,s,n,o,r,l,a,c,d=D.selectpicker.current.elements.length,h=[],p=!0,u=D.isVirtual();D.selectpicker.view.scrollTop=e,i=Math.ceil(D.sizeInfo.menuInnerHeight/D.sizeInfo.liHeight*1.5),s=Math.round(d/i)||1;for(var f=0;fd-1?0:D.selectpicker.current.data[d-1].position-D.selectpicker.current.data[D.selectpicker.view.position1-1].position,b.firstChild.style.marginTop=v+"px",b.firstChild.style.marginBottom=g+"px"):(b.firstChild.style.marginTop=0,b.firstChild.style.marginBottom=0),b.firstChild.appendChild(w),!0===u&&D.sizeInfo.hasScrollBar){var C=b.firstChild.offsetWidth;if(t&&CD.sizeInfo.selectWidth)b.firstChild.style.minWidth=D.sizeInfo.menuInnerInnerWidth+"px";else if(C>D.sizeInfo.menuInnerInnerWidth){D.$menu[0].style.minWidth=0;var O=b.firstChild.offsetWidth;O>D.sizeInfo.menuInnerInnerWidth&&(D.sizeInfo.menuInnerInnerWidth=O,b.firstChild.style.minWidth=D.sizeInfo.menuInnerInnerWidth+"px"),D.$menu[0].style.minWidth=""}}}if(D.prevActiveIndex=D.activeIndex,D.options.liveSearch){if(N&&t){var z,T=0;D.selectpicker.view.canHighlight[T]||(T=1+D.selectpicker.view.canHighlight.slice(1).indexOf(!0)),z=D.selectpicker.view.visibleElements[T],D.defocusItem(D.selectpicker.view.currentActive),D.activeIndex=(D.selectpicker.current.data[T]||{}).index,D.focusItem(z)}}else D.$menuInner.trigger("focus")}l(i,!0),this.$menuInner.off("scroll.createView").on("scroll.createView",function(e,t){D.noScroll||l(this.scrollTop,t),D.noScroll=!1}),P(window).off("resize"+j+"."+this.selectId+".createView").on("resize"+j+"."+this.selectId+".createView",function(){D.$newElement.hasClass(V.SHOW)&&l(D.$menuInner[0].scrollTop)})},focusItem:function(e,t,i){if(e){t=t||this.selectpicker.main.data[this.activeIndex];var s=e.firstChild;s&&(s.setAttribute("aria-setsize",this.selectpicker.view.size),s.setAttribute("aria-posinset",t.posinset),!0!==i&&(this.focusedParent.setAttribute("aria-activedescendant",s.id),e.classList.add("active"),s.classList.add("active")))}},defocusItem:function(e){e&&(e.classList.remove("active"),e.firstChild&&e.firstChild.classList.remove("active"))},setPlaceholder:function(){var e=this,t=!1;if(this.options.title&&!this.multiple){this.selectpicker.view.titleOption||(this.selectpicker.view.titleOption=document.createElement("option")),t=!0;var i=this.$element[0],s=!1,n=!this.selectpicker.view.titleOption.parentNode,o=i.selectedIndex,r=i.options[o],l=window.performance&&window.performance.getEntriesByType("navigation"),a=l&&l.length?"back_forward"!==l[0].type:2!==window.performance.navigation.type;n&&(this.selectpicker.view.titleOption.className="bs-title-option",this.selectpicker.view.titleOption.value="",s=!r||0===o&&!1===r.defaultSelected&&void 0===this.$element.data("selected")),!n&&0===this.selectpicker.view.titleOption.index||i.insertBefore(this.selectpicker.view.titleOption,i.firstChild),s&&a?i.selectedIndex=0:"complete"!==document.readyState&&window.addEventListener("pageshow",function(){e.selectpicker.view.displayedValue!==i.value&&e.render()})}return t},buildData:function(){var p=':not([hidden]):not([data-hidden="true"])',u=[],f=0,m=this.setPlaceholder()?1:0;this.options.hideDisabled&&(p+=":not(:disabled)");var e=this.$element[0].querySelectorAll("select > *"+p);function v(e){var t=u[u.length-1];t&&"divider"===t.type&&(t.optID||e.optID)||((e=e||{}).type="divider",u.push(e))}function g(e,t){if((t=t||{}).divider="true"===e.getAttribute("data-divider"),t.divider)v({optID:t.optID});else{var i=u.length,s=e.style.cssText,n=s?S(s):"",o=(e.className||"")+(t.optgroupClass||"");t.optID&&(o="opt "+o),t.optionClass=o.trim(),t.inlineStyle=n,t.text=e.textContent,t.content=e.getAttribute("data-content"),t.tokens=e.getAttribute("data-tokens"),t.subtext=e.getAttribute("data-subtext"),t.icon=e.getAttribute("data-icon"),e.liIndex=i,t.display=t.content||t.text,t.type="option",t.index=i,t.option=e,t.selected=!!e.selected,t.disabled=t.disabled||!!e.disabled,u.push(t)}}function t(e,t){var i=t[e],s=!(e-1 li")},render:function(){var e,t=this,i=this.$element[0],s=this.setPlaceholder()&&0===i.selectedIndex,n=O(i,this.options.hideDisabled),o=n.length,r=this.$button[0],l=r.querySelector(".filter-option-inner-inner"),a=document.createTextNode(this.options.multipleSeparator),c=_.fragment.cloneNode(!1),d=!1;if(r.classList.toggle("bs-placeholder",t.multiple?!o:!z(i,n)),t.multiple||1!==n.length||(t.selectpicker.view.displayedValue=z(i,n)),"static"===this.options.selectedTextFormat)c=K.text.call(this,{text:this.options.title},!0);else if(!1===(this.multiple&&-1!==this.options.selectedTextFormat.indexOf("count")&&1")).length&&o>e[1]||1===e.length&&2<=o))){if(!s){for(var h=0;h option"+m+", optgroup"+m+" option"+m).length,g="function"==typeof this.options.countSelectedText?this.options.countSelectedText(o,v):this.options.countSelectedText;c=K.text.call(this,{text:g.replace("{0}",o.toString()).replace("{1}",v.toString())},!0)}if(null==this.options.title&&(this.options.title=this.$element.attr("title")),c.childNodes.length||(c=K.text.call(this,{text:void 0!==this.options.title?this.options.title:this.options.noneSelectedText},!0)),r.title=c.textContent.replace(/<[^>]*>?/g,"").trim(),this.options.sanitize&&d&&W([c],t.options.whiteList,t.options.sanitizeFn),l.innerHTML="",l.appendChild(c),M.major<4&&this.$newElement[0].classList.contains("bs3-has-addon")){var b=r.querySelector(".filter-expand"),w=l.cloneNode(!0);w.className="filter-expand",b?r.replaceChild(w,b):r.appendChild(w)}this.$element.trigger("rendered"+j)},setStyle:function(e,t){var i,s=this.$button[0],n=this.$newElement[0],o=this.options.style.trim();this.$element.attr("class")&&this.$newElement.addClass(this.$element.attr("class").replace(/selectpicker|mobile-device|bs-select-hidden|validate\[.*\]/gi,"")),M.major<4&&(n.classList.add("bs3"),n.parentNode.classList&&n.parentNode.classList.contains("input-group")&&(n.previousElementSibling||n.nextElementSibling)&&(n.previousElementSibling||n.nextElementSibling).classList.contains("input-group-addon")&&n.classList.add("bs3-has-addon")),i=e?e.trim():o,"add"==t?i&&s.classList.add.apply(s.classList,i.split(" ")):"remove"==t?i&&s.classList.remove.apply(s.classList,i.split(" ")):(o&&s.classList.remove.apply(s.classList,o.split(" ")),i&&s.classList.add.apply(s.classList,i.split(" ")))},liHeight:function(e){if(e||!1!==this.options.size&&!Object.keys(this.sizeInfo).length){var t,i=_.div.cloneNode(!1),s=_.div.cloneNode(!1),n=_.div.cloneNode(!1),o=document.createElement("ul"),r=_.li.cloneNode(!1),l=_.li.cloneNode(!1),a=_.a.cloneNode(!1),c=_.span.cloneNode(!1),d=this.options.header&&0this.sizeInfo.menuExtras.vert&&l+this.sizeInfo.menuExtras.vert+50>this.sizeInfo.selectOffsetBot,!0===this.selectpicker.isSearching&&(a=this.selectpicker.dropup),this.$newElement.toggleClass(V.DROPUP,a),this.selectpicker.dropup=a),"auto"===this.options.size)n=3this.options.size){for(var b=0;bthis.sizeInfo.menuInnerHeight&&(this.sizeInfo.hasScrollBar=!0,this.sizeInfo.totalMenuWidth=this.sizeInfo.menuWidth+this.sizeInfo.scrollBarWidth),"auto"===this.options.dropdownAlignRight&&this.$menu.toggleClass(V.MENURIGHT,this.sizeInfo.selectOffsetLeft>this.sizeInfo.selectOffsetRight&&this.sizeInfo.selectOffsetRightthis.options.size&&i.off("resize"+j+"."+this.selectId+".setMenuSize scroll"+j+"."+this.selectId+".setMenuSize")}this.createView(!1,!0,e)},setWidth:function(){var i=this;"auto"===this.options.width?requestAnimationFrame(function(){i.$menu.css("min-width","0"),i.$element.on("loaded"+j,function(){i.liHeight(),i.setMenuSize();var e=i.$newElement.clone().appendTo("body"),t=e.css("width","auto").children("button").outerWidth();e.remove(),i.sizeInfo.selectWidth=Math.max(i.sizeInfo.totalMenuWidth,t),i.$newElement.css("width",i.sizeInfo.selectWidth+"px")})}):"fit"===this.options.width?(this.$menu.css("min-width",""),this.$newElement.css("width","").addClass("fit-width")):this.options.width?(this.$menu.css("min-width",""),this.$newElement.css("width",this.options.width)):(this.$menu.css("min-width",""),this.$newElement.css("width","")),this.$newElement.hasClass("fit-width")&&"fit"!==this.options.width&&this.$newElement[0].classList.remove("fit-width")},selectPosition:function(){this.$bsContainer=P('
    ');function e(e){var t={},i=r.options.display||!!P.fn.dropdown.Constructor.Default&&P.fn.dropdown.Constructor.Default.display;r.$bsContainer.addClass(e.attr("class").replace(/form-control|fit-width/gi,"")).toggleClass(V.DROPUP,e.hasClass(V.DROPUP)),s=e.offset(),l.is("body")?n={top:0,left:0}:((n=l.offset()).top+=parseInt(l.css("borderTopWidth"))-l.scrollTop(),n.left+=parseInt(l.css("borderLeftWidth"))-l.scrollLeft()),o=e.hasClass(V.DROPUP)?0:e[0].offsetHeight,(M.major<4||"static"===i)&&(t.top=s.top-n.top+o,t.left=s.left-n.left),t.width=e[0].offsetWidth,r.$bsContainer.css(t)}var s,n,o,r=this,l=P(this.options.container);this.$button.on("click.bs.dropdown.data-api",function(){r.isDisabled()||(e(r.$newElement),r.$bsContainer.appendTo(r.options.container).toggleClass(V.SHOW,!r.$button.hasClass(V.SHOW)).append(r.$menu))}),P(window).off("resize"+j+"."+this.selectId+" scroll"+j+"."+this.selectId).on("resize"+j+"."+this.selectId+" scroll"+j+"."+this.selectId,function(){r.$newElement.hasClass(V.SHOW)&&e(r.$newElement)}),this.$element.on("hide"+j,function(){r.$menu.data("height",r.$menu.height()),r.$bsContainer.detach()})},setOptionStatus:function(e){var t=this;if(t.noScroll=!1,t.selectpicker.view.visibleElements&&t.selectpicker.view.visibleElements.length)for(var i=0;i
    ');y[2]&&($=$.replace("{var}",y[2][1"+$+"
    ")),d=!1,C.$element.trigger("maxReached"+j)),g&&w&&(E.append(P("
    "+S+"
    ")),d=!1,C.$element.trigger("maxReachedGrp"+j)),setTimeout(function(){C.setSelected(r,!1)},10),E[0].classList.add("fadeOut"),setTimeout(function(){E.remove()},1050)}}}else c&&(c.selected=!1),h.selected=!0,C.setSelected(r,!0);!C.multiple||C.multiple&&1===C.options.maxOptions?C.$button.trigger("focus"):C.options.liveSearch&&C.$searchbox.trigger("focus"),d&&(!C.multiple&&a===s.selectedIndex||(T=[h.index,p.prop("selected"),l],C.$element.triggerNative("change")))}}),this.$menu.on("click","li."+V.DISABLED+" a, ."+V.POPOVERHEADER+", ."+V.POPOVERHEADER+" :not(.close)",function(e){e.currentTarget==this&&(e.preventDefault(),e.stopPropagation(),C.options.liveSearch&&!P(e.target).hasClass("close")?C.$searchbox.trigger("focus"):C.$button.trigger("focus"))}),this.$menuInner.on("click",".divider, .dropdown-header",function(e){e.preventDefault(),e.stopPropagation(),C.options.liveSearch?C.$searchbox.trigger("focus"):C.$button.trigger("focus")}),this.$menu.on("click","."+V.POPOVERHEADER+" .close",function(){C.$button.trigger("click")}),this.$searchbox.on("click",function(e){e.stopPropagation()}),this.$menu.on("click",".actions-btn",function(e){C.options.liveSearch?C.$searchbox.trigger("focus"):C.$button.trigger("focus"),e.preventDefault(),e.stopPropagation(),P(this).hasClass("bs-select-all")?C.selectAll():C.deselectAll()}),this.$button.on("focus"+j,function(e){var t=C.$element[0].getAttribute("tabindex");void 0!==t&&e.originalEvent&&e.originalEvent.isTrusted&&(this.setAttribute("tabindex",t),C.$element[0].setAttribute("tabindex",-1),C.selectpicker.view.tabindex=t)}).on("blur"+j,function(e){void 0!==C.selectpicker.view.tabindex&&e.originalEvent&&e.originalEvent.isTrusted&&(C.$element[0].setAttribute("tabindex",C.selectpicker.view.tabindex),this.setAttribute("tabindex",-1),C.selectpicker.view.tabindex=void 0)}),this.$element.on("change"+j,function(){C.render(),C.$element.trigger("changed"+j,T),T=null}).on("focus"+j,function(){C.options.mobile||C.$button[0].focus()})},liveSearchListener:function(){var u=this;this.$button.on("click.bs.dropdown.data-api",function(){u.$searchbox.val()&&(u.$searchbox.val(""),u.selectpicker.search.previousValue=void 0)}),this.$searchbox.on("click.bs.dropdown.data-api focus.bs.dropdown.data-api touchend.bs.dropdown.data-api",function(e){e.stopPropagation()}),this.$searchbox.on("input propertychange",function(){var e=u.$searchbox[0].value;if(u.selectpicker.search.elements=[],u.selectpicker.search.data=[],e){var t=[],i=e.toUpperCase(),s={},n=[],o=u._searchStyle(),r=u.options.liveSearchNormalize;r&&(i=w(i));for(var l=0;l=a.selectpicker.view.canHighlight.length&&(t=a.selectpicker.view.firstHighlightIndex),a.selectpicker.view.canHighlight[t+f]||(t=t+1+a.selectpicker.view.canHighlight.slice(t+f+1).indexOf(!0))),e.preventDefault();var m=f+t;e.which===B?0===f&&t===c.length-1?(a.$menuInner[0].scrollTop=a.$menuInner[0].scrollHeight,m=a.selectpicker.current.elements.length-1):d=(o=(n=a.selectpicker.current.data[m]).position-n.height)u+a.sizeInfo.menuInnerHeight),s=a.selectpicker.main.elements[v],a.activeIndex=b[x],a.focusItem(s),s&&s.firstChild.focus(),d&&(a.$menuInner[0].scrollTop=o),r.trigger("focus")}}i&&(e.which===D&&!a.selectpicker.keydown.keyHistory||e.which===L||e.which===H&&a.options.selectOnTab)&&(e.which!==D&&e.preventDefault(),a.options.liveSearch&&e.which===D||(a.$menuInner.find(".active a").trigger("click",!0),r.trigger("focus"),a.options.liveSearch||(e.preventDefault(),P(document).data("spaceSelect",!0))))}},mobile:function(){this.options.mobile=!0,this.$element[0].classList.add("mobile-device")},refresh:function(){var e=P.extend({},this.options,this.$element.data());this.options=e,this.checkDisabled(),this.buildData(),this.setStyle(),this.render(),this.buildList(),this.setWidth(),this.setSize(!0),this.$element.trigger("refreshed"+j)},hide:function(){this.$newElement.hide()},show:function(){this.$newElement.show()},remove:function(){this.$newElement.remove(),this.$element.remove()},destroy:function(){this.$newElement.before(this.$element).remove(),this.$bsContainer?this.$bsContainer.remove():this.$menu.remove(),this.selectpicker.view.titleOption&&this.selectpicker.view.titleOption.parentNode&&this.selectpicker.view.titleOption.parentNode.removeChild(this.selectpicker.view.titleOption),this.$element.off(j).removeData("selectpicker").removeClass("bs-select-hidden selectpicker"),P(window).off(j+"."+this.selectId)}};var J=P.fn.selectpicker;function Q(){if(P.fn.dropdown)return(P.fn.dropdown.Constructor._dataApiKeydownHandler||P.fn.dropdown.Constructor.prototype.keydown).apply(this,arguments)}P.fn.selectpicker=Z,P.fn.selectpicker.Constructor=Y,P.fn.selectpicker.noConflict=function(){return P.fn.selectpicker=J,this},P(document).off("keydown.bs.dropdown.data-api").on("keydown.bs.dropdown.data-api",':not(.bootstrap-select) > [data-toggle="dropdown"]',Q).on("keydown.bs.dropdown.data-api",":not(.bootstrap-select) > .dropdown-menu",Q).on("keydown"+j,'.bootstrap-select [data-toggle="dropdown"], .bootstrap-select [role="listbox"], .bootstrap-select .bs-searchbox input',Y.prototype.keydown).on("focusin.modal",'.bootstrap-select [data-toggle="dropdown"], .bootstrap-select [role="listbox"], .bootstrap-select .bs-searchbox input',function(e){e.stopPropagation()}),P(window).on("load"+j+".data-api",function(){P(".selectpicker").each(function(){var e=P(this);Z.call(e,e.data())})})}(e)}); \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-table/bootstrap-table.min.css b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-table/bootstrap-table.min.css new file mode 100644 index 0000000..7e150cf --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-table/bootstrap-table.min.css @@ -0,0 +1,6 @@ +/** + * @author zhixin wen + * version: 1.19.1 + * https://github.com/wenzhixin/bootstrap-table/ + */ +.bootstrap-table .fixed-table-toolbar::after{content:"";display:block;clear:both}.bootstrap-table .fixed-table-toolbar .bs-bars,.bootstrap-table .fixed-table-toolbar .columns,.bootstrap-table .fixed-table-toolbar .search{position:relative;margin-top:10px;margin-bottom:10px}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group>.btn{border-radius:0}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .fixed-table-toolbar .columns .dropdown-menu{text-align:left;max-height:300px;overflow:auto;-ms-overflow-style:scrollbar;z-index:1001}.bootstrap-table .fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.bootstrap-table .fixed-table-toolbar .columns-left{margin-right:5px}.bootstrap-table .fixed-table-toolbar .columns-right{margin-left:5px}.bootstrap-table .fixed-table-toolbar .pull-right .dropdown-menu{right:0;left:auto}.bootstrap-table .fixed-table-container{position:relative;clear:both}.bootstrap-table .fixed-table-container .table{width:100%;margin-bottom:0!important}.bootstrap-table .fixed-table-container .table td,.bootstrap-table .fixed-table-container .table th{vertical-align:middle;box-sizing:border-box}.bootstrap-table .fixed-table-container .table thead th{vertical-align:bottom;padding:0;margin:0}.bootstrap-table .fixed-table-container .table thead th:focus{outline:0 solid transparent}.bootstrap-table .fixed-table-container .table thead th.detail{width:30px}.bootstrap-table .fixed-table-container .table thead th .th-inner{padding:.75rem;vertical-align:bottom;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bootstrap-table .fixed-table-container .table thead th .sortable{cursor:pointer;background-position:right;background-repeat:no-repeat;padding-right:30px!important}.bootstrap-table .fixed-table-container .table thead th .both{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC")}.bootstrap-table .fixed-table-container .table thead th .asc{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==")}.bootstrap-table .fixed-table-container .table thead th .desc{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= ")}.bootstrap-table .fixed-table-container .table tbody tr.selected td{background-color:rgba(0,0,0,.075)}.bootstrap-table .fixed-table-container .table tbody tr.no-records-found td{text-align:center}.bootstrap-table .fixed-table-container .table tbody tr .card-view{display:flex}.bootstrap-table .fixed-table-container .table tbody tr .card-view .card-view-title{font-weight:700;display:inline-block;min-width:30%;width:auto!important;text-align:left!important}.bootstrap-table .fixed-table-container .table tbody tr .card-view .card-view-value{width:100%!important}.bootstrap-table .fixed-table-container .table .bs-checkbox{text-align:center}.bootstrap-table .fixed-table-container .table .bs-checkbox label{margin-bottom:0}.bootstrap-table .fixed-table-container .table .bs-checkbox label input[type=checkbox],.bootstrap-table .fixed-table-container .table .bs-checkbox label input[type=radio]{margin:0 auto!important}.bootstrap-table .fixed-table-container .table.table-sm .th-inner{padding:.3rem}.bootstrap-table .fixed-table-container.fixed-height:not(.has-footer){border-bottom:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height.has-card-view{border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height .fixed-table-border{border-left:1px solid #dee2e6;border-right:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height .table thead th{border-bottom:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height .table-dark thead th{border-bottom:1px solid #32383e}.bootstrap-table .fixed-table-container .fixed-table-header{overflow:hidden}.bootstrap-table .fixed-table-container .fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading{align-items:center;background:#fff;display:flex;justify-content:center;position:absolute;bottom:0;width:100%;max-width:100%;z-index:1000;transition:visibility 0s,opacity .15s ease-in-out;opacity:0;visibility:hidden}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.open{visibility:visible;opacity:1}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap{align-items:baseline;display:flex;justify-content:center}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .loading-text{margin-right:6px}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap{align-items:center;display:flex;justify-content:center}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-dot,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::after,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::before{content:"";animation-duration:1.5s;animation-iteration-count:infinite;animation-name:LOADING;background:#212529;border-radius:50%;display:block;height:5px;margin:0 4px;opacity:0;width:5px}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-dot{animation-delay:.3s}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::after{animation-delay:.6s}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark{background:#212529}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-dot,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-wrap::after,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-wrap::before{background:#fff}.bootstrap-table .fixed-table-container .fixed-table-footer{overflow:hidden}.bootstrap-table .fixed-table-pagination::after{content:"";display:block;clear:both}.bootstrap-table .fixed-table-pagination>.pagination,.bootstrap-table .fixed-table-pagination>.pagination-detail{margin-top:10px;margin-bottom:10px}.bootstrap-table .fixed-table-pagination>.pagination-detail .pagination-info{line-height:34px;margin-right:5px}.bootstrap-table .fixed-table-pagination>.pagination-detail .page-list{display:inline-block}.bootstrap-table .fixed-table-pagination>.pagination-detail .page-list .btn-group{position:relative;display:inline-block;vertical-align:middle}.bootstrap-table .fixed-table-pagination>.pagination-detail .page-list .btn-group .dropdown-menu{margin-bottom:0}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination{margin:0}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.page-intermediate a{color:#c8c8c8}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.page-intermediate a::before{content:'\2B05'}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.page-intermediate a::after{content:'\27A1'}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.disabled a{pointer-events:none;cursor:default}.bootstrap-table.fullscreen{position:fixed;top:0;left:0;z-index:1050;width:100%!important;background:#fff;height:calc(100vh);overflow-y:scroll}.bootstrap-table.bootstrap4 .pagination-lg .page-link,.bootstrap-table.bootstrap5 .pagination-lg .page-link{padding:.5rem 1rem}.bootstrap-table.bootstrap5 .float-left{float:left}.bootstrap-table.bootstrap5 .float-right{float:right}div.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden}@keyframes LOADING{0%{opacity:0}50%{opacity:1}to{opacity:0}} \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-table/bootstrap-table.min.js b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-table/bootstrap-table.min.js new file mode 100644 index 0000000..3aec87b --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-table/bootstrap-table.min.js @@ -0,0 +1,6 @@ +/** + * @author zhixin wen + * version: 1.22.6 + * https://github.com/wenzhixin/bootstrap-table/ + */ +!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e(require("jquery")):"function"===typeof define&&define.amd?define(["jquery"],e):(t="undefined"!==typeof globalThis?globalThis:t||self,t.BootstrapTable=e(t.jQuery))}(this,function(t){"use strict";function e(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var a,i,n,o,s=[],l=!0,c=!1;try{if(n=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;l=!1}else for(;!(l=(a=n.call(r)).done)&&(s.push(a.value),s.length!==e);l=!0);}catch(t){c=!0,i=t}finally{try{if(!l&&null!=r["return"]&&(o=r["return"](),Object(o)!==o))return}finally{if(c)throw i}}return s}}function r(t,e){if("object"!=typeof t||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var a=r.call(t,e||"default");if("object"!=typeof a)return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function a(t){var e=r(t,"string");return"symbol"==typeof e?e:e+""}function i(t){"@babel/helpers - typeof";return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i(t)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){for(var r=0;rt.length)e=t.length;for(var r=0,a=new Array(e);r=t.length)return{done:true};return{done:false,value:t[a++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var n=true,o=false,s;return{s:function(){r=r.call(t)},n:function(){var t=r.next();n=t.done;return t},e:function(t){o=true;s=t},f:function(){try{if(!n&&null!=r["return"])r["return"]()}finally{if(o)throw s}}}}var m="undefined"!==typeof globalThis?globalThis:"undefined"!==typeof window?window:"undefined"!==typeof global?global:"undefined"!==typeof self?self:{};var y=function(t){return t&&t.Math===Math&&t};var w=y("object"==typeof globalThis&&globalThis)||y("object"==typeof window&&window)||y("object"==typeof self&&self)||y("object"==typeof m&&m)||y("object"==typeof m&&m)||function(){return this}()||Function("return this")();var S={};var x=function(t){try{return!!t()}catch(e){return true}};var O=x;var k=!O(function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]});var P=x;var C=!P(function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")});var T=C;var I=Function.prototype.call;var A=T?I.bind(I):function(){return I.apply(I,arguments)};var $={};var R={}.propertyIsEnumerable;var E=Object.getOwnPropertyDescriptor;var j=E&&!R.call({1:2},1);$.f=j?function ky(t){var e=E(this,t);return!!e&&e.enumerable}:R;var _=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}};var N=C;var F=Function.prototype;var D=F.call;var V=N&&F.bind.bind(D,D);var B=N?V:function(t){return function(){return D.apply(t,arguments)}};var L=B;var H=L({}.toString);var M=L("".slice);var U=function(t){return M(H(t),8,-1)};var z=B;var q=x;var G=U;var W=Object;var K=z("".split);var Y=q(function(){return!W("z").propertyIsEnumerable(0)})?function(t){return"String"===G(t)?K(t,""):W(t)}:W;var J=function(t){return null===t||void 0===t};var X=J;var Q=TypeError;var Z=function(t){if(X(t))throw new Q("Can't call method on "+t);return t};var tt=Y;var et=Z;var rt=function(t){return tt(et(t))};var at="object"==typeof document&&document.all;var it="undefined"==typeof at&&void 0!==at?function(t){return"function"==typeof t||t===at}:function(t){return"function"==typeof t};var nt=it;var ot=function(t){return"object"==typeof t?null!==t:nt(t)};var st=w;var lt=it;var ct=function(t){return lt(t)?t:void 0};var ft=function(t,e){return arguments.length<2?ct(st[t]):st[t]&&st[t][e]};var ut=B;var ht=ut({}.isPrototypeOf);var vt="undefined"!=typeof navigator&&String(navigator.userAgent)||"";var dt=w;var pt=vt;var gt=dt.process;var bt=dt.Deno;var mt=gt&>.versions||bt&&bt.version;var yt=mt&&mt.v8;var wt,St;if(yt){wt=yt.split(".");St=wt[0]>0&&wt[0]<4?1:+(wt[0]+wt[1])}if(!St&&pt){wt=pt.match(/Edge\/(\d+)/);if(!wt||wt[1]>=74){wt=pt.match(/Chrome\/(\d+)/);if(wt)St=+wt[1]}}var xt=St;var Ot=xt;var kt=x;var Pt=w;var Ct=Pt.String;var Tt=!!Object.getOwnPropertySymbols&&!kt(function(){var t=Symbol("symbol detection");return!Ct(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&Ot&&Ot<41});var It=Tt;var At=It&&!Symbol.sham&&"symbol"==typeof Symbol.iterator;var $t=ft;var Rt=it;var Et=ht;var jt=At;var _t=Object;var Nt=jt?function(t){return"symbol"==typeof t}:function(t){var e=$t("Symbol");return Rt(e)&&Et(e.prototype,_t(t))};var Ft=String;var Dt=function(t){try{return Ft(t)}catch(e){return"Object"}};var Vt=it;var Bt=Dt;var Lt=TypeError;var Ht=function(t){if(Vt(t))return t;throw new Lt(Bt(t)+" is not a function")};var Mt=Ht;var Ut=J;var zt=function(t,e){var r=t[e];return Ut(r)?void 0:Mt(r)};var qt=A;var Gt=it;var Wt=ot;var Kt=TypeError;var Yt=function(t,e){var r,a;if("string"===e&&Gt(r=t.toString)&&!Wt(a=qt(r,t)))return a;if(Gt(r=t.valueOf)&&!Wt(a=qt(r,t)))return a;if("string"!==e&&Gt(r=t.toString)&&!Wt(a=qt(r,t)))return a;throw new Kt("Can't convert object to primitive value")};var Jt={exports:{}};var Xt=false;var Qt=w;var Zt=Object.defineProperty;var te=function(t,e){try{Zt(Qt,t,{value:e,configurable:true,writable:true})}catch(r){Qt[t]=e}return e};var ee=w;var re=te;var ae="__core-js_shared__";var ie=Jt.exports=ee[ae]||re(ae,{});(ie.versions||(ie.versions=[])).push({version:"3.36.1",mode:"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.36.1/LICENSE",source:"https://github.com/zloirock/core-js"});var ne=Jt.exports;var oe=ne;var se=function(t,e){return oe[t]||(oe[t]=e||{})};var le=Z;var ce=Object;var fe=function(t){return ce(le(t))};var ue=B;var he=fe;var ve=ue({}.hasOwnProperty);var de=Object.hasOwn||function Py(t,e){return ve(he(t),e)};var pe=B;var ge=0;var be=Math.random();var me=pe(1..toString);var ye=function(t){return"Symbol("+(void 0===t?"":t)+")_"+me(++ge+be,36)};var we=w;var Se=se;var xe=de;var Oe=ye;var ke=Tt;var Pe=At;var Ce=we.Symbol;var Te=Se("wks");var Ie=Pe?Ce["for"]||Ce:Ce&&Ce.withoutSetter||Oe;var Ae=function(t){if(!xe(Te,t))Te[t]=ke&&xe(Ce,t)?Ce[t]:Ie("Symbol."+t);return Te[t]};var $e=A;var Re=ot;var Ee=Nt;var je=zt;var _e=Yt;var Ne=Ae;var Fe=TypeError;var De=Ne("toPrimitive");var Ve=function(t,e){if(!Re(t)||Ee(t))return t;var r=je(t,De);var a;if(r){if(void 0===e)e="default";a=$e(r,t,e);if(!Re(a)||Ee(a))return a;throw new Fe("Can't convert object to primitive value")}if(void 0===e)e="number";return _e(t,e)};var Be=Ve;var Le=Nt;var He=function(t){var e=Be(t,"string");return Le(e)?e:e+""};var Me=w;var Ue=ot;var ze=Me.document;var qe=Ue(ze)&&Ue(ze.createElement);var Ge=function(t){return qe?ze.createElement(t):{}};var We=k;var Ke=x;var Ye=Ge;var Je=!We&&!Ke(function(){return 7!==Object.defineProperty(Ye("div"),"a",{get:function(){return 7}}).a});var Xe=k;var Qe=A;var Ze=$;var tr=_;var er=rt;var rr=He;var ar=de;var ir=Je;var nr=Object.getOwnPropertyDescriptor;S.f=Xe?nr:function Cy(t,e){t=er(t);e=rr(e);if(ir)try{return nr(t,e)}catch(r){}if(ar(t,e))return tr(!Qe(Ze.f,t,e),t[e])};var or={};var sr=k;var lr=x;var cr=sr&&lr(function(){return 42!==Object.defineProperty(function(){},"prototype",{value:42,writable:false}).prototype});var fr=ot;var ur=String;var hr=TypeError;var vr=function(t){if(fr(t))return t;throw new hr(ur(t)+" is not an object")};var dr=k;var pr=Je;var gr=cr;var br=vr;var mr=He;var yr=TypeError;var wr=Object.defineProperty;var Sr=Object.getOwnPropertyDescriptor;var xr="enumerable";var Or="configurable";var kr="writable";or.f=dr?gr?function Ty(t,e,r){br(t);e=mr(e);br(r);if("function"===typeof t&&"prototype"===e&&"value"in r&&kr in r&&!r[kr]){var a=Sr(t,e);if(a&&a[kr]){t[e]=r.value;r={configurable:Or in r?r[Or]:a[Or],enumerable:xr in r?r[xr]:a[xr],writable:false}}}return wr(t,e,r)}:wr:function Iy(t,e,r){br(t);e=mr(e);br(r);if(pr)try{return wr(t,e,r)}catch(a){}if("get"in r||"set"in r)throw new yr("Accessors not supported");if("value"in r)t[e]=r.value;return t};var Pr=k;var Cr=or;var Tr=_;var Ir=Pr?function(t,e,r){return Cr.f(t,e,Tr(1,r))}:function(t,e,r){t[e]=r;return t};var Ar={exports:{}};var $r=k;var Rr=de;var Er=Function.prototype;var jr=$r&&Object.getOwnPropertyDescriptor;var _r=Rr(Er,"name");var Nr=_r&&"something"===function Ay(){}.name;var Fr=_r&&(!$r||$r&&jr(Er,"name").configurable);var Dr={EXISTS:_r,PROPER:Nr,CONFIGURABLE:Fr};var Vr=B;var Br=it;var Lr=ne;var Hr=Vr(Function.toString);if(!Br(Lr.inspectSource))Lr.inspectSource=function(t){return Hr(t)};var Mr=Lr.inspectSource;var Ur=w;var zr=it;var qr=Ur.WeakMap;var Gr=zr(qr)&&/native code/.test(String(qr));var Wr=se;var Kr=ye;var Yr=Wr("keys");var Jr=function(t){return Yr[t]||(Yr[t]=Kr(t))};var Xr={};var Qr=Gr;var Zr=w;var ta=ot;var ea=Ir;var ra=de;var aa=ne;var ia=Jr;var na=Xr;var oa="Object already initialized";var sa=Zr.TypeError;var la=Zr.WeakMap;var ca,fa,ua;var ha=function(t){return ua(t)?fa(t):ca(t,{})};var va=function(t){return function(e){var r;if(!ta(e)||(r=fa(e)).type!==t)throw new sa("Incompatible receiver, "+t+" required");return r}};if(Qr||aa.state){var da=aa.state||(aa.state=new la);da.get=da.get;da.has=da.has;da.set=da.set;ca=function(t,e){if(da.has(t))throw new sa(oa);e.facade=t;da.set(t,e);return e};fa=function(t){return da.get(t)||{}};ua=function(t){return da.has(t)}}else{var pa=ia("state");na[pa]=true;ca=function(t,e){if(ra(t,pa))throw new sa(oa);e.facade=t;ea(t,pa,e);return e};fa=function(t){return ra(t,pa)?t[pa]:{}};ua=function(t){return ra(t,pa)}}var ga={set:ca,get:fa,has:ua,enforce:ha,getterFor:va};var ba=B;var ma=x;var ya=it;var wa=de;var Sa=k;var xa=Dr.CONFIGURABLE;var Oa=Mr;var ka=ga;var Pa=ka.enforce;var Ca=ka.get;var Ta=String;var Ia=Object.defineProperty;var Aa=ba("".slice);var $a=ba("".replace);var Ra=ba([].join);var Ea=Sa&&!ma(function(){return 8!==Ia(function(){},"length",{value:8}).length});var ja=String(String).split("String");var _a=Ar.exports=function(t,e,r){if("Symbol("===Aa(Ta(e),0,7))e="["+$a(Ta(e),/^Symbol\(([^)]*)\).*$/,"$1")+"]";if(r&&r.getter)e="get "+e;if(r&&r.setter)e="set "+e;if(!wa(t,"name")||xa&&t.name!==e)if(Sa)Ia(t,"name",{value:e,configurable:true});else t.name=e;if(Ea&&r&&wa(r,"arity")&&t.length!==r.arity)Ia(t,"length",{value:r.arity});try{if(r&&wa(r,"constructor")&&r.constructor){if(Sa)Ia(t,"prototype",{writable:false})}else if(t.prototype)t.prototype=void 0}catch(a){}var i=Pa(t);if(!wa(i,"source"))i.source=Ra(ja,"string"==typeof e?e:"");return t};Function.prototype.toString=_a(function $y(){return ya(this)&&Ca(this).source||Oa(this)},"toString");var Na=Ar.exports;var Fa=it;var Da=or;var Va=Na;var Ba=te;var La=function(t,e,r,a){if(!a)a={};var i=a.enumerable;var n=void 0!==a.name?a.name:e;if(Fa(r))Va(r,n,a);if(a.global)if(i)t[e]=r;else Ba(e,r);else{try{if(!a.unsafe)delete t[e];else if(t[e])i=true}catch(o){}if(i)t[e]=r;else Da.f(t,e,{value:r,enumerable:false,configurable:!a.nonConfigurable,writable:!a.nonWritable})}return t};var Ha={};var Ma=Math.ceil;var Ua=Math.floor;var za=Math.trunc||function Ry(t){var e=+t;return(e>0?Ua:Ma)(e)};var qa=za;var Ga=function(t){var e=+t;return e!==e||0===e?0:qa(e)};var Wa=Ga;var Ka=Math.max;var Ya=Math.min;var Ja=function(t,e){var r=Wa(t);return r<0?Ka(r+e,0):Ya(r,e)};var Xa=Ga;var Qa=Math.min;var Za=function(t){var e=Xa(t);return e>0?Qa(e,9007199254740991):0};var ti=Za;var ei=function(t){return ti(t.length)};var ri=rt;var ai=Ja;var ii=ei;var ni=function(t){return function(e,r,a){var i=ri(e);var n=ii(i);if(0===n)return!t&&-1;var o=ai(a,n);var s;if(t&&r!==r)while(n>o){s=i[o++];if(s!==s)return true}else for(;n>o;o++)if((t||o in i)&&i[o]===r)return t||o||0;return!t&&-1}};var oi={includes:ni(true),indexOf:ni(false)};var si=B;var li=de;var ci=rt;var fi=oi.indexOf;var ui=Xr;var hi=si([].push);var vi=function(t,e){var r=ci(t);var a=0;var i=[];var n;for(n in r)!li(ui,n)&&li(r,n)&&hi(i,n);while(e.length>a)if(li(r,n=e[a++]))~fi(i,n)||hi(i,n);return i};var di=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"];var pi=vi;var gi=di;var bi=gi.concat("length","prototype");Ha.f=Object.getOwnPropertyNames||function Ey(t){return pi(t,bi)};var mi={};mi.f=Object.getOwnPropertySymbols;var yi=ft;var wi=B;var Si=Ha;var xi=mi;var Oi=vr;var ki=wi([].concat);var Pi=yi("Reflect","ownKeys")||function jy(t){var e=Si.f(Oi(t));var r=xi.f;return r?ki(e,r(t)):e};var Ci=de;var Ti=Pi;var Ii=S;var Ai=or;var $i=function(t,e,r){var a=Ti(e);var i=Ai.f;var n=Ii.f;for(var o=0;oXi)throw Ji("Maximum allowed index exceeded");return t};var Zi=k;var tn=or;var en=_;var rn=function(t,e,r){if(Zi)tn.f(t,e,en(0,r));else t[e]=r};var an=Ae;var nn=an("toStringTag");var on={};on[nn]="z";var sn="[object z]"===String(on);var ln=sn;var cn=it;var fn=U;var un=Ae;var hn=un("toStringTag");var vn=Object;var dn="Arguments"===fn(function(){return arguments}());var pn=function(t,e){try{return t[e]}catch(r){}};var gn=ln?fn:function(t){var e,r,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=pn(e=vn(t),hn))?r:dn?fn(e):"Object"===(a=fn(e))&&cn(e.callee)?"Arguments":a};var bn=B;var mn=x;var yn=it;var wn=gn;var Sn=ft;var xn=Mr;var On=function(){};var kn=Sn("Reflect","construct");var Pn=/^\s*(?:class|function)\b/;var Cn=bn(Pn.exec);var Tn=!Pn.test(On);var In=function Ny(t){if(!yn(t))return false;try{kn(On,[],t);return true}catch(e){return false}};var An=function Fy(t){if(!yn(t))return false;switch(wn(t)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return false}try{return Tn||!!Cn(Pn,xn(t))}catch(e){return true}};An.sham=true;var $n=!kn||mn(function(){var t;return In(In.call)||!In(Object)||!In(function(){t=true})||t})?An:In;var Rn=Yi;var En=$n;var jn=ot;var _n=Ae;var Nn=_n("species");var Fn=Array;var Dn=function(t){var e;if(Rn(t)){e=t.constructor;if(En(e)&&(e===Fn||Rn(e.prototype)))e=void 0;else if(jn(e)){e=e[Nn];if(null===e)e=void 0}}return void 0===e?Fn:e};var Vn=Dn;var Bn=function(t,e){return new(Vn(t))(0===e?0:e)};var Ln=x;var Hn=Ae;var Mn=xt;var Un=Hn("species");var zn=function(t){return Mn>=51||!Ln(function(){var e=[];var r=e.constructor={};r[Un]=function(){return{foo:1}};return 1!==e[t](Boolean).foo})};var qn=Wi;var Gn=x;var Wn=Yi;var Kn=ot;var Yn=fe;var Jn=ei;var Xn=Qi;var Qn=rn;var Zn=Bn;var to=zn;var eo=Ae;var ro=xt;var ao=eo("isConcatSpreadable");var io=ro>=51||!Gn(function(){var t=[];t[ao]=false;return t.concat()[0]!==t});var no=function(t){if(!Kn(t))return false;var e=t[ao];return void 0!==e?!!e:Wn(t)};var oo=!io||!to("concat");qn({target:"Array",proto:true,arity:1,forced:oo},{concat:function Dy(t){var e=Yn(this);var r=Zn(e,0);var a=0;var i,n,o,s,l;for(i=-1,o=arguments.length;ig;g++)if(s||g in v){y=v[g];w=p(y,g,h);if(t)if(e)m[g]=w;else if(w)switch(t){case 3:return true;case 5:return y;case 6:return g;case 2:xo(m,y)}else switch(t){case 4:return false;case 7:xo(m,y)}}return n?-1:a||i?i:m}};var ko={forEach:Oo(0),map:Oo(1),filter:Oo(2),some:Oo(3),every:Oo(4),find:Oo(5),findIndex:Oo(6),filterReject:Oo(7)};var Po=Wi;var Co=ko.filter;var To=zn;var Io=To("filter");Po({target:"Array",proto:true,forced:!Io},{filter:function Vy(t){return Co(this,t,arguments.length>1?arguments[1]:void 0)}});var Ao={};var $o=vi;var Ro=di;var Eo=Object.keys||function By(t){return $o(t,Ro)};var jo=k;var _o=cr;var No=or;var Fo=vr;var Do=rt;var Vo=Eo;Ao.f=jo&&!_o?Object.defineProperties:function Ly(t,e){Fo(t);var r=Do(e);var a=Vo(e);var i=a.length;var n=0;var o;while(i>n)No.f(t,o=a[n++],r[o]);return t};var Bo=ft;var Lo=Bo("document","documentElement");var Ho=vr;var Mo=Ao;var Uo=di;var zo=Xr;var qo=Lo;var Go=Ge;var Wo=Jr;var Ko=">";var Yo="<";var Jo="prototype";var Xo="script";var Qo=Wo("IE_PROTO");var Zo=function(){};var ts=function(t){return Yo+Xo+Ko+t+Yo+"/"+Xo+Ko};var es=function(t){t.write(ts(""));t.close();var e=t.parentWindow.Object;t=null;return e};var rs=function(){var t=Go("iframe");var e="java"+Xo+":";var r;t.style.display="none";qo.appendChild(t);t.src=String(e);r=t.contentWindow.document;r.open();r.write(ts("document.F=Object"));r.close();return r.F};var as;var is=function(){try{as=new ActiveXObject("htmlfile")}catch(t){}is="undefined"!=typeof document?document.domain&&as?es(as):rs():es(as);var e=Uo.length;while(e--)delete is[Jo][Uo[e]];return is()};zo[Qo]=true;var ns=Object.create||function Hy(t,e){var r;if(null!==t){Zo[Jo]=Ho(t);r=new Zo;Zo[Jo]=null;r[Qo]=t}else r=is();return void 0===e?r:Mo.f(r,e)};var os=Ae;var ss=ns;var ls=or.f;var cs=os("unscopables");var fs=Array.prototype;if(void 0===fs[cs])ls(fs,cs,{configurable:true,value:ss(null)});var us=function(t){fs[cs][t]=true};var hs=Wi;var vs=ko.find;var ds=us;var ps="find";var gs=true;if(ps in[])Array(1)[ps](function(){gs=false});hs({target:"Array",proto:true,forced:gs},{find:function My(t){return vs(this,t,arguments.length>1?arguments[1]:void 0)}});ds(ps);var bs=Wi;var ms=ko.findIndex;var ys=us;var ws="findIndex";var Ss=true;if(ws in[])Array(1)[ws](function(){Ss=false});bs({target:"Array",proto:true,forced:Ss},{findIndex:function Uy(t){return ms(this,t,arguments.length>1?arguments[1]:void 0)}});ys(ws);var xs=Wi;var Os=oi.includes;var ks=x;var Ps=us;var Cs=ks(function(){return!Array(1).includes()});xs({target:"Array",proto:true,forced:Cs},{includes:function zy(t){return Os(this,t,arguments.length>1?arguments[1]:void 0)}});Ps("includes");var Ts=x;var Is=function(t,e){var r=[][t];return!!r&&Ts(function(){r.call(null,e||function(){return 1},1)})};var As=Wi;var $s=co;var Rs=oi.indexOf;var Es=Is;var js=$s([].indexOf);var _s=!!js&&1/js([1],1,-0)<0;var Ns=_s||!Es("indexOf");As({target:"Array",proto:true,forced:Ns},{indexOf:function qy(t){var e=arguments.length>1?arguments[1]:void 0;return _s?js(this,t,e)||0:Rs(this,t,e)}});var Fs={};var Ds=x;var Vs=!Ds(function(){function t(){}t.prototype.constructor=null;return Object.getPrototypeOf(new t)!==t.prototype});var Bs=de;var Ls=it;var Hs=fe;var Ms=Jr;var Us=Vs;var zs=Ms("IE_PROTO");var qs=Object;var Gs=qs.prototype;var Ws=Us?qs.getPrototypeOf:function(t){var e=Hs(t);if(Bs(e,zs))return e[zs];var r=e.constructor;if(Ls(r)&&e instanceof r)return r.prototype;return e instanceof qs?Gs:null};var Ks=x;var Ys=it;var Js=ot;var Xs=Ws;var Qs=La;var Zs=Ae;var tl=Zs("iterator");var el=false;var rl,al,il;if([].keys){il=[].keys();if(!("next"in il))el=true;else{al=Xs(Xs(il));if(al!==Object.prototype)rl=al}}var nl=!Js(rl)||Ks(function(){var t={};return rl[tl].call(t)!==t});if(nl)rl={};if(!Ys(rl[tl]))Qs(rl,tl,function(){return this});var ol={IteratorPrototype:rl,BUGGY_SAFARI_ITERATORS:el};var sl=or.f;var ll=de;var cl=Ae;var fl=cl("toStringTag");var ul=function(t,e,r){if(t&&!r)t=t.prototype;if(t&&!ll(t,fl))sl(t,fl,{configurable:true,value:e})};var hl=ol.IteratorPrototype;var vl=ns;var dl=_;var pl=ul;var gl=Fs;var bl=function(){return this};var ml=function(t,e,r,a){var i=e+" Iterator";t.prototype=vl(hl,{next:dl(+!a,r)});pl(t,i,false);gl[i]=bl;return t};var yl=B;var wl=Ht;var Sl=function(t,e,r){try{return yl(wl(Object.getOwnPropertyDescriptor(t,e)[r]))}catch(a){}};var xl=ot;var Ol=function(t){return xl(t)||null===t};var kl=Ol;var Pl=String;var Cl=TypeError;var Tl=function(t){if(kl(t))return t;throw new Cl("Can't set "+Pl(t)+" as a prototype")};var Il=Sl;var Al=ot;var $l=Z;var Rl=Tl;var El=Object.setPrototypeOf||("__proto__"in{}?function(){var t=false;var e={};var r;try{r=Il(Object.prototype,"__proto__","set");r(e,[]);t=e instanceof Array}catch(a){}return function i(e,a){$l(e);Rl(a);if(!Al(e))return e;if(t)r(e,a);else e.__proto__=a;return e}}():void 0);var jl=Wi;var _l=A;var Nl=Dr;var Fl=it;var Dl=ml;var Vl=Ws;var Bl=El;var Ll=ul;var Hl=Ir;var Ml=La;var Ul=Ae;var zl=Fs;var ql=ol;var Gl=Nl.PROPER;var Wl=Nl.CONFIGURABLE;var Kl=ql.IteratorPrototype;var Yl=ql.BUGGY_SAFARI_ITERATORS;var Jl=Ul("iterator");var Xl="keys";var Ql="values";var Zl="entries";var tc=function(){return this};var ec=function(t,e,r,a,i,n,o){Dl(r,e,a);var s=function(t){if(t===i&&h)return h;if(!Yl&&t&&t in f)return f[t];switch(t){case Xl:return function e(){return new r(this,t)};case Ql:return function a(){return new r(this,t)};case Zl:return function n(){return new r(this,t)}}return function(){return new r(this)}};var l=e+" Iterator";var c=false;var f=t.prototype;var u=f[Jl]||f["@@iterator"]||i&&f[i];var h=!Yl&&u||s(i);var v="Array"===e?f.entries||u:u;var d,p,g;if(v){d=Vl(v.call(new t));if(d!==Object.prototype&&d.next){if(Vl(d)!==Kl)if(Bl)Bl(d,Kl);else if(!Fl(d[Jl]))Ml(d,Jl,tc);Ll(d,l,true)}}if(Gl&&i===Ql&&u&&u.name!==Ql)if(Wl)Hl(f,"name",Ql);else{c=true;h=function b(){return _l(u,this)}}if(i){p={values:s(Ql),keys:n?h:s(Xl),entries:s(Zl)};if(o){for(g in p)if(Yl||c||!(g in f))Ml(f,g,p[g])}else jl({target:e,proto:true,forced:Yl||c},p)}if(f[Jl]!==h)Ml(f,Jl,h,{name:i});zl[e]=h;return p};var rc=function(t,e){return{value:t,done:e}};var ac=rt;var ic=us;var nc=Fs;var oc=ga;var sc=or.f;var lc=ec;var cc=rc;var fc=k;var uc="Array Iterator";var hc=oc.set;var vc=oc.getterFor(uc);var dc=lc(Array,"Array",function(t,e){hc(this,{type:uc,target:ac(t),index:0,kind:e})},function(){var t=vc(this);var e=t.target;var r=t.index++;if(!e||r>=e.length){t.target=void 0;return cc(void 0,true)}switch(t.kind){case"keys":return cc(r,false);case"values":return cc(e[r],false)}return cc([r,e[r]],false)},"values");var pc=nc.Arguments=nc.Array;ic("keys");ic("values");ic("entries");if(fc&&"values"!==pc.name)try{sc(pc,"name",{value:"values"})}catch(gc){}var bc=Wi;var mc=B;var yc=Y;var wc=rt;var Sc=Is;var xc=mc([].join);var Oc=yc!==Object;var kc=Oc||!Sc("join",",");bc({target:"Array",proto:true,forced:kc},{join:function Gy(t){return xc(wc(this),void 0===t?",":t)}});var Pc=Wi;var Cc=ko.map;var Tc=zn;var Ic=Tc("map");Pc({target:"Array",proto:true,forced:!Ic},{map:function Wy(t){return Cc(this,t,arguments.length>1?arguments[1]:void 0)}});var Ac=Wi;var $c=B;var Rc=Yi;var Ec=$c([].reverse);var jc=[1,2];Ac({target:"Array",proto:true,forced:String(jc)===String(jc.reverse())},{reverse:function Ky(){if(Rc(this))this.length=this.length;return Ec(this)}});var _c=B;var Nc=_c([].slice);var Fc=Wi;var Dc=Yi;var Vc=$n;var Bc=ot;var Lc=Ja;var Hc=ei;var Mc=rt;var Uc=rn;var zc=Ae;var qc=zn;var Gc=Nc;var Wc=qc("slice");var Kc=zc("species");var Yc=Array;var Jc=Math.max;Fc({target:"Array",proto:true,forced:!Wc},{slice:function Yy(t,e){var r=Mc(this);var a=Hc(r);var i=Lc(t,a);var n=Lc(void 0===e?a:e,a);var o,s,l;if(Dc(r)){o=r.constructor;if(Vc(o)&&(o===Yc||Dc(o.prototype)))o=void 0;else if(Bc(o)){o=o[Kc];if(null===o)o=void 0}if(o===Yc||void 0===o)return Gc(r,i,n)}s=new(void 0===o?Yc:o)(Jc(n-i,0));for(l=0;i0)t[n]=t[--n];if(n!==a++)t[n]=i}}else{var o=nf(r/2);var s=of(af(t,0,o),e);var l=of(af(t,o),e);var c=s.length;var f=l.length;var u=0;var h=0;while(u3)return;if(Tf)return true;if(Af)return Af<603;var t="";var e,r,a,i;for(e=65;e<76;e++){r=String.fromCharCode(e);switch(e){case 66:case 69:case 70:case 72:a=3;break;case 68:case 71:a=4;break;default:a=2}for(i=0;i<47;i++)$f.push({k:r+i,v:a})}$f.sort(function(t,e){return e.v-t.v});for(i=0;i<$f.length;i++){r=$f[i].k.charAt(0);if(t.charAt(t.length-1)!==r)t+=r}return"DGBEFHACIJK"!==t});var Df=jf||!_f||!Nf||!Ff;var Vf=function(t){return function(e,r){if(void 0===r)return-1;if(void 0===e)return 1;if(void 0!==t)return+t(e,r)||0;return xf(e)>xf(r)?1:-1}};gf({target:"Array",proto:true,forced:Df},{sort:function Jy(t){if(void 0!==t)mf(t);var e=yf(this);if(Ff)return void 0===t?Rf(e):Rf(e,t);var r=[];var a=wf(e);var i,n;for(n=0;na-s+o;c--)tu(r,c-1)}else if(o>s)for(c=a-s;c>i;c--){f=c+s-1;u=c+o-1;if(f in r)r[u]=r[f];else tu(r,u)}for(c=0;c2){e=qu(e);r=Xu(e,0);if(43===r||45===r){a=Xu(e,2);if(88===a||120===a)return NaN}else if(48===r){switch(Xu(e,1)){case 66:case 98:i=2;n=49;break;case 79:case 111:i=8;n=55;break;default:return+e}o=Ju(e,2);s=o.length;for(l=0;ln)return NaN}return parseInt(o,i)}}return+e};var th=_u(Gu,!Wu(" 0o1")||!Wu("0b1")||Wu("+0x1"));var eh=function(t){return Du(Ku,t)&&Lu(function(){zu(t)})};var rh=function Zy(t){var e=arguments.length<1?0:Wu(Qu(t));return eh(this)?Fu(Object(e),this,rh):e};rh.prototype=Ku;if(th&&!Au)Ku.constructor=rh;Iu({global:true,constructor:true,wrap:true,forced:th},{Number:rh});var ah=function(t,e){for(var r=$u?Hu(e):("MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,"+"EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,"+"fromString,range").split(","),a=0,i;r.length>a;a++)if(Nu(e,i=r[a])&&!Nu(t,i))Uu(t,i,Mu(e,i))};if(th||Au)ah(Eu[Gu],Wu);var ih=k;var nh=B;var oh=A;var sh=x;var lh=Eo;var ch=mi;var fh=$;var uh=fe;var hh=Y;var vh=Object.assign;var dh=Object.defineProperty;var ph=nh([].concat);var gh=!vh||sh(function(){if(ih&&1!==vh({b:1},vh(dh({},"a",{enumerable:true,get:function(){dh(this,"b",{value:3,enumerable:false})}}),{b:2})).b)return true;var t={};var e={};var r=Symbol("assign detection");var a="abcdefghijklmnopqrst";t[r]=7;a.split("").forEach(function(t){e[t]=t});return 7!==vh({},t)[r]||lh(vh({},e)).join("")!==a})?function tw(t,e){var r=uh(t);var a=arguments.length;var i=1;var n=ch.f;var o=fh.f;while(a>i){var s=hh(arguments[i++]);var l=n?ph(lh(s),n(s)):lh(s);var c=l.length;var f=0;var u;while(c>f){u=l[f++];if(!ih||oh(o,s,u))r[u]=s[u]}}return r}:vh;var bh=Wi;var mh=gh;bh({target:"Object",stat:true,arity:2,forced:Object.assign!==mh},{assign:mh});var yh=k;var wh=x;var Sh=B;var xh=Ws;var Oh=Eo;var kh=rt;var Ph=$.f;var Ch=Sh(Ph);var Th=Sh([].push);var Ih=yh&&wh(function(){var t=Object.create(null);t[2]=2;return!Ch(t,2)});var Ah=function(t){return function(e){var r=kh(e);var a=Oh(r);var i=Ih&&null===xh(r);var n=a.length;var o=0;var s=[];var l;while(n>o){l=a[o++];if(!yh||(i?l in r:Ch(r,l)))Th(s,t?[l,r[l]]:r[l])}return s}};var $h={entries:Ah(true),values:Ah(false)};var Rh=Wi;var Eh=$h.entries;Rh({target:"Object",stat:true},{entries:function ew(t){return Eh(t)}});var jh=Wi;var _h=fe;var Nh=Eo;var Fh=x;var Dh=Fh(function(){Nh(1)});jh({target:"Object",stat:true,forced:Dh},{keys:function rw(t){return Nh(_h(t))}});var Vh=sn;var Bh=gn;var Lh=Vh?{}.toString:function aw(){return"[object "+Bh(this)+"]"};var Hh=sn;var Mh=La;var Uh=Lh;if(!Hh)Mh(Object.prototype,"toString",Uh,{unsafe:true});var zh=w;var qh=x;var Gh=B;var Wh=rf;var Kh=Tu.trim;var Yh=mu;var Jh=Gh("".charAt);var Xh=zh.parseFloat;var Qh=zh.Symbol;var Zh=Qh&&Qh.iterator;var tv=1/Xh(Yh+"-0")!==-(1/0)||Zh&&!qh(function(){Xh(Object(Zh))});var ev=tv?function iw(t){var e=Kh(Wh(t));var r=Xh(e);return 0===r&&"-"===Jh(e,0)?-0:r}:Xh;var rv=Wi;var av=ev;rv({global:true,forced:parseFloat!==av},{parseFloat:av});var iv=w;var nv=x;var ov=B;var sv=rf;var lv=Tu.trim;var cv=mu;var fv=iv.parseInt;var uv=iv.Symbol;var hv=uv&&uv.iterator;var vv=/^[+-]?0x/i;var dv=ov(vv.exec);var pv=8!==fv(cv+"08")||22!==fv(cv+"0x16")||hv&&!nv(function(){fv(Object(hv))});var gv=pv?function nw(t,e){var r=lv(sv(t));return fv(r,e>>>0||(dv(vv,r)?16:10))}:fv;var bv=Wi;var mv=gv;bv({global:true,forced:parseInt!==mv},{parseInt:mv});var yv=ot;var wv=U;var Sv=Ae;var xv=Sv("match");var Ov=function(t){var e;return yv(t)&&(void 0!==(e=t[xv])?!!e:"RegExp"===wv(t))};var kv=vr;var Pv=function(){var t=kv(this);var e="";if(t.hasIndices)e+="d";if(t.global)e+="g";if(t.ignoreCase)e+="i";if(t.multiline)e+="m";if(t.dotAll)e+="s";if(t.unicode)e+="u";if(t.unicodeSets)e+="v";if(t.sticky)e+="y";return e};var Cv=A;var Tv=de;var Iv=ht;var Av=Pv;var $v=RegExp.prototype;var Rv=function(t){var e=t.flags;return void 0===e&&!("flags"in $v)&&!Tv(t,"flags")&&Iv($v,t)?Cv(Av,t):e};var Ev=x;var jv=w;var _v=jv.RegExp;var Nv=Ev(function(){var t=_v("a","y");t.lastIndex=2;return null!==t.exec("abcd")});var Fv=Nv||Ev(function(){return!_v("a","y").sticky});var Dv=Nv||Ev(function(){var t=_v("^r","gy");t.lastIndex=2;return null!==t.exec("str")});var Vv={BROKEN_CARET:Dv,MISSED_STICKY:Fv,UNSUPPORTED_Y:Nv};var Bv=or.f;var Lv=function(t,e,r){r in t||Bv(t,r,{configurable:true,get:function(){return e[r]},set:function(t){e[r]=t}})};var Hv=Na;var Mv=or;var Uv=function(t,e,r){if(r.get)Hv(r.get,e,{getter:true});if(r.set)Hv(r.set,e,{setter:true});return Mv.f(t,e,r)};var zv=ft;var qv=Uv;var Gv=Ae;var Wv=k;var Kv=Gv("species");var Yv=function(t){var e=zv(t);if(Wv&&e&&!e[Kv])qv(e,Kv,{configurable:true,get:function(){return this}})};var Jv=x;var Xv=w;var Qv=Xv.RegExp;var Zv=Jv(function(){var t=Qv(".","s");return!(t.dotAll&&t.test("\n")&&"s"===t.flags)});var td=x;var ed=w;var rd=ed.RegExp;var ad=td(function(){var t=rd("(?b)","g");return"b"!==t.exec("b").groups.a||"bc"!=="b".replace(t,"$c")});var id=k;var nd=w;var od=B;var sd=Bi;var ld=pu;var cd=Ir;var fd=ns;var ud=Ha.f;var hd=ht;var vd=Ov;var dd=rf;var pd=Rv;var gd=Vv;var bd=Lv;var md=La;var yd=x;var wd=de;var Sd=ga.enforce;var xd=Yv;var Od=Ae;var kd=Zv;var Pd=ad;var Cd=Od("match");var Td=nd.RegExp;var Id=Td.prototype;var Ad=nd.SyntaxError;var $d=od(Id.exec);var Rd=od("".charAt);var Ed=od("".replace);var jd=od("".indexOf);var _d=od("".slice);var Nd=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/;var Fd=/a/g;var Dd=/a/g;var Vd=new Td(Fd)!==Fd;var Bd=gd.MISSED_STICKY;var Ld=gd.UNSUPPORTED_Y;var Hd=id&&(!Vd||Bd||kd||Pd||yd(function(){Dd[Cd]=false;return Td(Fd)!==Fd||Td(Dd)===Dd||"/a/i"!==String(Td(Fd,"i"))}));var Md=function(t){var e=t.length;var r=0;var a="";var i=false;var n;for(;r<=e;r++){n=Rd(t,r);if("\\"===n){a+=n+Rd(t,++r);continue}if(!i&&"."===n)a+="[\\s\\S]";else{if("["===n)i=true;else if("]"===n)i=false;a+=n}}return a};var Ud=function(t){var e=t.length;var r=0;var a="";var i=[];var n=fd(null);var o=false;var s=false;var l=0;var c="";var f;for(;r<=e;r++){f=Rd(t,r);if("\\"===f)f+=Rd(t,++r);else if("]"===f)o=false;else if(!o)switch(true){case"["===f:o=true;break;case"("===f:if($d(Nd,_d(t,r+1))){r+=2;s=true}a+=f;l++;continue;case">"===f&&s:if(""===c||wd(n,c))throw new Ad("Invalid capture group name");n[c]=true;i[i.length]=[c,l];s=false;c="";continue}if(s)c+=f;else a+=f}return[a,i]};if(sd("RegExp",Hd)){var zd=function ow(t,e){var r=hd(Id,this);var a=vd(t);var i=void 0===e;var n=[];var o=t;var s,l,c,f,u,h;if(!r&&a&&i&&t.constructor===zd)return t;if(a||hd(Id,t)){t=t.source;if(i)e=pd(o)}t=void 0===t?"":dd(t);e=void 0===e?"":dd(e);o=t;if(kd&&"dotAll"in Fd){l=!!e&&jd(e,"s")>-1;if(l)e=Ed(e,/s/g,"")}s=e;if(Bd&&"sticky"in Fd){c=!!e&&jd(e,"y")>-1;if(c&&Ld)e=Ed(e,/y/g,"")}if(Pd){f=Ud(t);t=f[0];n=f[1]}u=ld(Td(t,e),r?this:Id,zd);if(l||c||n.length){h=Sd(u);if(l){h.dotAll=true;h.raw=zd(Md(t),s)}if(c)h.sticky=true;if(n.length)h.groups=n}if(t!==o)try{cd(u,"source",""===o?"(?:)":o)}catch(v){}return u};for(var qd=ud(Td),Gd=0;qd.length>Gd;)bd(zd,Td,qd[Gd++]);Id.constructor=zd;zd.prototype=Id;md(nd,"RegExp",zd,{constructor:true})}xd("RegExp");var Wd=A;var Kd=B;var Yd=rf;var Jd=Pv;var Xd=Vv;var Qd=se;var Zd=ns;var tp=ga.get;var ep=Zv;var rp=ad;var ap=Qd("native-string-replace",String.prototype.replace);var ip=RegExp.prototype.exec;var np=ip;var op=Kd("".charAt);var sp=Kd("".indexOf);var lp=Kd("".replace);var cp=Kd("".slice);var fp=function(){var t=/a/;var e=/b*/g;Wd(ip,t,"a");Wd(ip,e,"a");return 0!==t.lastIndex||0!==e.lastIndex}();var up=Xd.BROKEN_CARET;var hp=void 0!==/()??/.exec("")[1];var vp=fp||hp||up||ep||rp;if(vp)np=function sw(t){var e=this;var r=tp(e);var a=Yd(t);var i=r.raw;var n,o,s,l,c,f,u;if(i){i.lastIndex=e.lastIndex;n=Wd(np,i,a);e.lastIndex=i.lastIndex;return n}var h=r.groups;var v=up&&e.sticky;var d=Wd(Jd,e);var p=e.source;var g=0;var b=a;if(v){d=lp(d,"y","");if(sp(d,"g")===-1)d+="g";b=cp(a,e.lastIndex);if(e.lastIndex>0&&(!e.multiline||e.multiline&&"\n"!==op(a,e.lastIndex-1))){p="(?: "+p+")";b=" "+b;g++}o=new RegExp("^(?:"+p+")",d)}if(hp)o=new RegExp("^"+p+"$(?!\\s)",d);if(fp)s=e.lastIndex;l=Wd(ip,v?o:e,b);if(v)if(l){l.input=cp(l.input,g);l[0]=cp(l[0],g);l.index=e.lastIndex;e.lastIndex+=l[0].length}else e.lastIndex=0;else if(fp&&l)e.lastIndex=e.global?l.index+l[0].length:s;if(hp&&l&&l.length>1)Wd(ap,l[0],o,function(){for(c=1;c1?arguments[1]:void 0)}});var Hp=C;var Mp=Function.prototype;var Up=Mp.apply;var zp=Mp.call;var qp="object"==typeof Reflect&&Reflect.apply||(Hp?zp.bind(Up):function(){return zp.apply(Up,arguments)});var Gp=A;var Wp=La;var Kp=dp;var Yp=x;var Jp=Ae;var Xp=Ir;var Qp=Jp("species");var Zp=RegExp.prototype;var tg=function(t,e,r,a){var i=Jp(t);var n=!Yp(function(){var e={};e[i]=function(){return 7};return 7!==""[t](e)});var o=n&&!Yp(function(){var e=false;var r=/a/;if("split"===t){r={};r.constructor={};r.constructor[Qp]=function(){return r};r.flags="";r[i]=/./[i]}r.exec=function(){e=true;return null};r[i]("");return!e});if(!n||!o||r){var s=/./[i];var l=e(i,""[t],function(t,e,r,a,i){var o=e.exec;if(o===Kp||o===Zp.exec){if(n&&!i)return{done:true,value:Gp(s,e,r,a)};return{done:true,value:Gp(t,r,e,a)}}return{done:false}});Wp(String.prototype,t,l[0]);Wp(Zp,i,l[1])}if(a)Xp(Zp[i],"sham",true)};var eg=B;var rg=Ga;var ag=rf;var ig=Z;var ng=eg("".charAt);var og=eg("".charCodeAt);var sg=eg("".slice);var lg=function(t){return function(e,r){var a=ag(ig(e));var i=rg(r);var n=a.length;var o,s;if(i<0||i>=n)return t?"":void 0;o=og(a,i);return o<55296||o>56319||i+1===n||(s=og(a,i+1))<56320||s>57343?t?ng(a,i):o:t?sg(a,i,i+2):(o-55296<<10)+(s-56320)+65536}};var cg={codeAt:lg(false),charAt:lg(true)};var fg=cg.charAt;var ug=function(t,e,r){return e+(r?fg(t,e).length:1)};var hg=B;var vg=fe;var dg=Math.floor;var pg=hg("".charAt);var gg=hg("".replace);var bg=hg("".slice);var mg=/\$([$&'`]|\d{1,2}|<[^>]*>)/g;var yg=/\$([$&'`]|\d{1,2})/g;var wg=function(t,e,r,a,i,n){var o=r+t.length;var s=a.length;var l=yg;if(void 0!==i){i=vg(i);l=mg}return gg(n,l,function(n,l){var c;switch(pg(l,0)){case"$":return"$";case"&":return t;case"`":return bg(e,0,r);case"'":return bg(e,o);case"<":c=i[bg(l,1,-1)];break;default:var f=+l;if(0===f)return n;if(f>s){var u=dg(f/10);if(0===u)return n;if(u<=s)return void 0===a[u-1]?pg(l,1):a[u-1]+pg(l,1);return n}c=a[f-1]}return void 0===c?"":c})};var Sg=A;var xg=vr;var Og=it;var kg=U;var Pg=dp;var Cg=TypeError;var Tg=function(t,e){var r=t.exec;if(Og(r)){var a=Sg(r,t,e);if(null!==a)xg(a);return a}if("RegExp"===kg(t))return Sg(Pg,t,e);throw new Cg("RegExp#exec called on incompatible receiver")};var Ig=qp;var Ag=A;var $g=B;var Rg=tg;var Eg=x;var jg=vr;var _g=it;var Ng=J;var Fg=Ga;var Dg=Za;var Vg=rf;var Bg=Z;var Lg=ug;var Hg=zt;var Mg=wg;var Ug=Tg;var zg=Ae;var qg=zg("replace");var Gg=Math.max;var Wg=Math.min;var Kg=$g([].concat);var Yg=$g([].push);var Jg=$g("".indexOf);var Xg=$g("".slice);var Qg=function(t){return void 0===t?t:String(t)};var Zg=function(){return"$0"==="a".replace(/./,"$0")}();var tb=function(){if(/./[qg])return""===/./[qg]("a","$0");return false}();var eb=!Eg(function(){var t=/./;t.exec=function(){var t=[];t.groups={a:"7"};return t};return"7"!=="".replace(t,"$")});Rg("replace",function(t,e,r){var a=tb?"$":"$0";return[function i(t,r){var a=Bg(this);var i=Ng(t)?void 0:Hg(t,qg);return i?Ag(i,t,a,r):Ag(e,Vg(a),t,r)},function(t,i){var n=jg(this);var o=Vg(t);if("string"==typeof i&&Jg(i,a)===-1&&Jg(i,"$<")===-1){var s=r(e,n,o,i);if(s.done)return s.value}var l=_g(i);if(!l)i=Vg(i);var c=n.global;var f;if(c){f=n.unicode;n.lastIndex=0}var u=[];var h;while(true){h=Ug(n,o);if(null===h)break;Yg(u,h);if(!c)break;var v=Vg(h[0]);if(""===v)n.lastIndex=Lg(o,Dg(n.lastIndex),f)}var d="";var p=0;for(var g=0;g=p){d+=Xg(o,p,m)+w;p=m+b.length}}return d+Xg(o,p)}]},!eb||!Zg||tb);var rb=Object.is||function fw(t,e){return t===e?0!==t||1/t===1/e:t!==t&&e!==e};var ab=A;var ib=tg;var nb=vr;var ob=J;var sb=Z;var lb=rb;var cb=rf;var fb=zt;var ub=Tg;ib("search",function(t,e,r){return[function a(e){var r=sb(this);var a=ob(e)?void 0:fb(e,t);return a?ab(a,e,r):new RegExp(e)[t](cb(r))},function(t){var a=nb(this);var i=cb(t);var n=r(e,a,i);if(n.done)return n.value;var o=a.lastIndex;if(!lb(o,0))a.lastIndex=0;var s=ub(a,i);if(!lb(a.lastIndex,o))a.lastIndex=o;return null===s?-1:s.index}]});var hb=$n;var vb=Dt;var db=TypeError;var pb=function(t){if(hb(t))return t;throw new db(vb(t)+" is not a constructor")};var gb=vr;var bb=pb;var mb=J;var yb=Ae;var wb=yb("species");var Sb=function(t,e){var r=gb(t).constructor;var a;return void 0===r||mb(a=gb(r)[wb])?e:bb(a)};var xb=A;var Ob=B;var kb=tg;var Pb=vr;var Cb=J;var Tb=Z;var Ib=Sb;var Ab=ug;var $b=Za;var Rb=rf;var Eb=zt;var jb=Tg;var _b=Vv;var Nb=x;var Fb=_b.UNSUPPORTED_Y;var Db=4294967295;var Vb=Math.min;var Bb=Ob([].push);var Lb=Ob("".slice);var Hb=!Nb(function(){var t=/(?:)/;var e=t.exec;t.exec=function(){return e.apply(this,arguments)};var r="ab".split(t);return 2!==r.length||"a"!==r[0]||"b"!==r[1]});var Mb="c"==="abbc".split(/(b)*/)[1]||4!=="test".split(/(?:)/,-1).length||2!=="ab".split(/(?:ab)*/).length||4!==".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length;kb("split",function(t,e,r){var a="0".split(void 0,0).length?function(t,r){return void 0===t&&0===r?[]:xb(e,this,t,r)}:e;return[function i(e,r){var i=Tb(this);var n=Cb(e)?void 0:Eb(e,t);return n?xb(n,e,i,r):xb(a,Rb(i),e,r)},function(t,i){var n=Pb(this);var o=Rb(t);if(!Mb){var s=r(a,n,o,i,a!==e);if(s.done)return s.value}var l=Ib(n,RegExp);var c=n.unicode;var f=(n.ignoreCase?"i":"")+(n.multiline?"m":"")+(n.unicode?"u":"")+(Fb?"g":"y");var u=new l(Fb?"^(?:"+n.source+")":n,f);var h=void 0===i?Db:i>>>0;if(0===h)return[];if(0===o.length)return null===jb(u,o)?[o]:[];var v=0;var d=0;var p=[];while(d1?arguments[1]:void 0)}:[].forEach;var om=w;var sm=Xb;var lm=em;var cm=nm;var fm=Ir;var um=function(t){if(t&&t.forEach!==cm)try{fm(t,"forEach",cm)}catch(e){t.forEach=cm}};for(var hm in sm)if(sm[hm])um(om[hm]&&om[hm].prototype);um(lm);var vm=w;var dm=Xb;var pm=em;var gm=dc;var bm=Ir;var mm=ul;var ym=Ae;var wm=ym("iterator");var Sm=gm.values;var xm=function(t,e){if(t){if(t[wm]!==Sm)try{bm(t,wm,Sm)}catch(r){t[wm]=Sm}mm(t,e,true);if(dm[e])for(var a in gm)if(t[a]!==gm[a])try{bm(t,a,gm[a])}catch(r){t[a]=gm[a]}}};for(var Om in dm)xm(vm[Om]&&vm[Om].prototype,Om);xm(pm,"DOMTokenList");var km=Wi;var Pm=x;var Cm=fe;var Tm=Ws;var Im=Vs;var Am=Pm(function(){Tm(1)});km({target:"Object",stat:true,forced:Am,sham:!Im},{getPrototypeOf:function vw(t){return Tm(Cm(t))}});var $m=Wi;var Rm=co;var Em=S.f;var jm=Za;var _m=rf;var Nm=$p;var Fm=Z;var Dm=jp;var Vm=Rm("".slice);var Bm=Math.min;var Lm=Dm("endsWith");var Hm=!Lm&&!!function(){var t=Em(String.prototype,"endsWith");return t&&!t.writable}();$m({target:"String",proto:true,forced:!Hm&&!Lm},{endsWith:function dw(t){var e=_m(Fm(this));Nm(t);var r=arguments.length>1?arguments[1]:void 0;var a=e.length;var i=void 0===r?a:Bm(jm(r),a);var n=_m(t);return Vm(e,i-n.length,i)===n}});var Mm=A;var Um=tg;var zm=vr;var qm=J;var Gm=Za;var Wm=rf;var Km=Z;var Ym=zt;var Jm=ug;var Xm=Tg;Um("match",function(t,e,r){return[function a(e){var r=Km(this);var a=qm(e)?void 0:Ym(e,t);return a?Mm(a,e,r):new RegExp(e)[t](Wm(r))},function(t){var a=zm(this);var i=Wm(t);var n=r(e,a,i);if(n.done)return n.value;if(!a.global)return Xm(a,i);var o=a.unicode;a.lastIndex=0;var s=[];var l=0;var c;while(null!==(c=Xm(a,i))){var f=Wm(c[0]);s[l]=f;if(""===f)a.lastIndex=Jm(i,Gm(a.lastIndex),o);l++}return 0===l?null:s}]});var Qm=Wi;var Zm=co;var ty=S.f;var ey=Za;var ry=rf;var ay=$p;var iy=Z;var ny=jp;var oy=Zm("".slice);var sy=Math.min;var ly=ny("startsWith");var cy=!ly&&!!function(){var t=ty(String.prototype,"startsWith");return t&&!t.writable}();Qm({target:"String",proto:true,forced:!cy&&!ly},{startsWith:function pw(t){var e=ry(iy(this));ay(t);var r=ey(sy(arguments.length>1?arguments[1]:void 0,e.length));var a=ry(t);return oy(e,r,r+a.length)===a}});var fy={getBootstrapVersion:function gw(){var e=5;try{var r=t.fn.dropdown.Constructor.VERSION;if(void 0!==r)e=parseInt(r,10)}catch(a){}try{var i=bootstrap.Tooltip.VERSION;if(void 0!==i)e=parseInt(i,10)}catch(a){}return e},getIconsPrefix:function bw(t){return{bootstrap3:"glyphicon",bootstrap4:"fa",bootstrap5:"bi","bootstrap-table":"icon",bulma:"fa",foundation:"fa",materialize:"material-icons",semantic:"fa"}[t]||"fa"},getIcons:function mw(t){return{glyphicon:{paginationSwitchDown:"glyphicon-collapse-down icon-chevron-down",paginationSwitchUp:"glyphicon-collapse-up icon-chevron-up",refresh:"glyphicon-refresh icon-refresh",toggleOff:"glyphicon-list-alt icon-list-alt",toggleOn:"glyphicon-list-alt icon-list-alt",columns:"glyphicon-th icon-th",detailOpen:"glyphicon-plus icon-plus",detailClose:"glyphicon-minus icon-minus",fullscreen:"glyphicon-fullscreen",search:"glyphicon-search",clearSearch:"glyphicon-trash"},fa:{paginationSwitchDown:"fa-caret-square-down",paginationSwitchUp:"fa-caret-square-up",refresh:"fa-sync",toggleOff:"fa-toggle-off",toggleOn:"fa-toggle-on",columns:"fa-th-list",detailOpen:"fa-plus",detailClose:"fa-minus",fullscreen:"fa-arrows-alt",search:"fa-search",clearSearch:"fa-trash"},bi:{paginationSwitchDown:"bi-caret-down-square",paginationSwitchUp:"bi-caret-up-square",refresh:"bi-arrow-clockwise",toggleOff:"bi-toggle-off",toggleOn:"bi-toggle-on",columns:"bi-list-ul",detailOpen:"bi-plus",detailClose:"bi-dash",fullscreen:"bi-arrows-move",search:"bi-search",clearSearch:"bi-trash"},icon:{paginationSwitchDown:"icon-arrow-up-circle",paginationSwitchUp:"icon-arrow-down-circle",refresh:"icon-refresh-cw",toggleOff:"icon-toggle-right",toggleOn:"icon-toggle-right",columns:"icon-list",detailOpen:"icon-plus",detailClose:"icon-minus",fullscreen:"icon-maximize",search:"icon-search",clearSearch:"icon-trash-2"},"material-icons":{paginationSwitchDown:"grid_on",paginationSwitchUp:"grid_off",refresh:"refresh",toggleOff:"tablet",toggleOn:"tablet_android",columns:"view_list",detailOpen:"add",detailClose:"remove",fullscreen:"fullscreen",sort:"sort",search:"search",clearSearch:"delete"}}[t]||{}},getSearchInput:function yw(e){if("string"===typeof e.options.searchSelector)return t(e.options.searchSelector);return e.$toolbar.find(".search input")},extend:function ww(){var t=this;for(var e=arguments.length,r=new Array(e),a=0;a1?e-1:0),a=1;a0&&void 0!==arguments[0]?arguments[0]:{};return 0===Object.entries(t).length&&t.constructor===Object},isNumeric:function kw(t){return!isNaN(parseFloat(t))&&isFinite(t)},getFieldTitle:function Pw(t,e){var r=b(t),a;try{for(r.s();!(a=r.n()).done;){var i=a.value;if(i.field===e)return i.title}}catch(n){r.e(n)}finally{r.f()}return""},setFieldIndex:function Cw(t){var e=0;var r=[];var a=b(t[0]),i;try{for(a.s();!(i=a.n()).done;){var n=i.value;e+=n.colspan||1}}catch(o){a.e(o)}finally{a.f()}for(var s=0;s1){var u=0;var h=function y(t){var e=a.filter(function(e){return e.fieldIndex===t});var r=e[e.length-1];if(e.length>1)for(var i=0;i0}}}catch(d){s.e(d)}finally{s.f()}}}catch(d){i.e(d)}finally{i.f()}if(t.length<2)return;var p=b(e),g;try{var m=function w(){var t=g.value;var e=a.filter(function(e){return e.fieldIndex===t.fieldIndex});if(e.length>1){var r=b(e),i;try{for(r.s();!(i=r.n()).done;){var n=i.value;n.visible=t.visible}}catch(o){r.e(o)}finally{r.f()}}};for(p.s();!(g=p.n()).done;)m()}catch(d){p.e(d)}finally{p.f()}},getScrollBarWidth:function Aw(){if(void 0===this.cachedWidth){var e=t("
    ").addClass("fixed-table-scroll-inner");var r=t("
    ").addClass("fixed-table-scroll-outer");r.append(e);t("body").append(r);var a=e[0].offsetWidth;r.css("overflow","scroll");var i=e[0].offsetWidth;if(a===i)i=r[0].clientWidth;r.remove();this.cachedWidth=a-i}return this.cachedWidth},calculateObjectValue:function $w(t,e,r,a){var n=e;if("string"===typeof e){var o=e.split(".");if(o.length>1){n=window;var s=b(o),l;try{for(s.s();!(l=s.n()).done;){var f=l.value;n=n[f]}}catch(u){s.e(u)}finally{s.f()}}else n=window[e]}if(null!==n&&"object"===i(n))return n;if("function"===typeof n)return n.apply(t,r||[]);if(!n&&"string"===typeof e&&r&&this.sprintf.apply(this,[e].concat(c(r))))return this.sprintf.apply(this,[e].concat(c(r)));return a},compareObjects:function Rw(t,e,r){var a=Object.keys(t);var i=Object.keys(e);if(r&&a.length!==i.length)return false;for(var n=0,o=a;n/g,">").replace(/"/g,""").replace(/'/g,"'")},unescapeHTML:function Nw(t){if("string"!==typeof t||!t)return t;return t.toString().replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'")},removeHTML:function Fw(t){if(!t)return t;return t.toString().replace(/(<([^>]+)>)/gi,"").replace(/&[#A-Za-z0-9]+;/gi,"").trim()},getRealDataAttr:function Dw(t){for(var e=0,r=Object.entries(t);e3&&void 0!==arguments[3]?arguments[3]:void 0;var i=t;if("undefined"!==typeof a)r=a;if("string"!==typeof e||t.hasOwnProperty(e))return r?this.escapeHTML(t[e]):t[e];var n=e.split(".");var o=b(n),s;try{for(o.s();!(s=o.n()).done;){var l=s.value;i=i&&i[l]}}catch(c){o.e(c)}finally{o.f()}return r?this.escapeHTML(i):i},isIEBrowser:function Bw(){return navigator.userAgent.includes("MSIE ")||/Trident.*rv:11\./.test(navigator.userAgent)},findIndex:function Lw(t,e){var r=b(t),a;try{for(r.s();!(a=r.n()).done;){var i=a.value;if(JSON.stringify(i)===JSON.stringify(e))return t.indexOf(i)}}catch(n){r.e(n)}finally{r.f()}return-1},trToData:function Hw(e,r){var a=this;var i=[];var n=[];r.each(function(r,o){var s=t(o);var l={};l._id=s.attr("id");l._class=s.attr("class");l._data=a.getRealDataAttr(s.data());l._style=s.attr("style");s.find(">td,>th").each(function(i,o){var s=t(o);var c=+s.attr("colspan")||1;var f=+s.attr("rowspan")||1;var u=i;for(;n[r]&&n[r][u];u++);for(var h=u;he)return r;return 0}if(a.sortEmptyLast){if(""===t)return 1;if(""===e)return-1}if(t===e)return 0;if("string"!==typeof t)t=t.toString();if(t.localeCompare(e)===-1)return r*-1;return r},getEventName:function Uw(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";e=e||"".concat(+new Date).concat(~~(1e6*Math.random()));return"".concat(t,"-").concat(e)},hasDetailViewIcon:function zw(t){return t.detailView&&t.detailViewIcon&&!t.cardView},getDetailViewIndexOffset:function qw(t){return this.hasDetailViewIcon(t)&&"right"!==t.detailViewAlign?1:0},checkAutoMergeCells:function Gw(t){var e=b(t),r;try{for(e.s();!(r=e.n()).done;){var a=r.value;for(var i=0,n=Object.keys(a);i',""],toolbarDropdownItem:'
  • ',toolbarDropdownSeparator:'
  • ',pageDropdown:['"],pageDropdownItem:'
    ',dropdownCaret:'',pagination:['
      ',"
    "],paginationItem:'
  • %s
  • ',icon:'',inputGroup:'
    %s%s
    ',searchInput:'',searchButton:'',searchClearButton:''}},4:{classes:{buttonsPrefix:"btn",buttons:"secondary",buttonsGroup:"btn-group",buttonsDropdown:"btn-group",pull:"float",inputGroup:"btn-group",inputPrefix:"form-control-",input:"form-control",select:"form-control",paginationDropdown:"btn-group dropdown",dropup:"dropup",dropdownActive:"active",paginationActive:"active",buttonActive:"active"},html:{toolbarDropdown:['"],toolbarDropdownItem:'',pageDropdown:['"],pageDropdownItem:'%s',toolbarDropdownSeparator:'',dropdownCaret:'',pagination:['
      ',"
    "],paginationItem:'
  • %s
  • ',icon:'',inputGroup:'
    %s
    %s
    ',searchInput:'',searchButton:'',searchClearButton:''}},5:{classes:{buttonsPrefix:"btn",buttons:"secondary",buttonsGroup:"btn-group",buttonsDropdown:"btn-group",pull:"float",inputGroup:"btn-group",inputPrefix:"form-control-",input:"form-control",select:"form-select",paginationDropdown:"btn-group dropdown",dropup:"dropup",dropdownActive:"active",paginationActive:"active",buttonActive:"active"},html:{dataToggle:"data-bs-toggle",toolbarDropdown:['"],toolbarDropdownItem:'',pageDropdown:['"],pageDropdownItem:'%s',toolbarDropdownSeparator:'',dropdownCaret:'',pagination:['
      ',"
    "],paginationItem:'
  • %s
  • ',icon:'',inputGroup:'
    %s%s
    ',searchInput:'',searchButton:'',searchClearButton:''}}}[hy];var dy={id:void 0,firstLoad:true,height:void 0,classes:"table table-bordered table-hover",buttons:{},theadClasses:"",striped:false,headerStyle:function Yw(t){return{}},rowStyle:function Jw(t,e){return{}},rowAttributes:function Xw(t,e){return{}},undefinedText:"-",locale:void 0,virtualScroll:false,virtualScrollItemHeight:void 0,sortable:true,sortClass:void 0,silentSort:true,sortEmptyLast:false,sortName:void 0,sortOrder:void 0,sortReset:false,sortStable:false,sortResetPage:false,rememberOrder:false,serverSort:true,customSort:void 0,columns:[[]],data:[],url:void 0,method:"get",cache:true,contentType:"application/json",dataType:"json",ajax:void 0,ajaxOptions:{},queryParams:function Qw(t){return t},queryParamsType:"limit",responseHandler:function Zw(t){return t},totalField:"total",totalNotFilteredField:"totalNotFiltered",dataField:"rows",footerField:"footer",pagination:false,paginationParts:["pageInfo","pageSize","pageList"],showExtendedPagination:false,paginationLoop:true,sidePagination:"client",totalRows:0,totalNotFiltered:0,pageNumber:1,pageSize:10,pageList:[10,25,50,100],paginationHAlign:"right",paginationVAlign:"bottom",paginationDetailHAlign:"left",paginationPreText:"‹",paginationNextText:"›",paginationSuccessivelySize:5,paginationPagesBySide:1,paginationUseIntermediate:false,paginationLoadMore:false,search:false,searchable:false,searchHighlight:false,searchOnEnterKey:false,strictSearch:false,regexSearch:false,searchSelector:false,visibleSearch:false,showButtonIcons:true,showButtonText:false,showSearchButton:false,showSearchClearButton:false,trimOnSearch:true,searchAlign:"right",searchTimeOut:500,searchText:"",customSearch:void 0,showHeader:true,showFooter:false,footerStyle:function tS(t){return{}},searchAccentNeutralise:false,showColumns:false,showSearch:false,showPageGo:false,showColumnsToggleAll:false,showColumnsSearch:false,minimumCountColumns:1,showPaginationSwitch:false,showRefresh:false,showToggle:false,showFullscreen:false,smartDisplay:true,escape:false,escapeTitle:true,filterOptions:{filterAlgorithm:"and"},idField:void 0,selectItemName:"btSelectItem",clickToSelect:false,ignoreClickToSelectOn:function eS(t){var e=t.tagName;return["A","BUTTON"].includes(e)},singleSelect:false,checkboxHeader:true,maintainMetaData:false,multipleSelectRow:false,uniqueId:void 0,cardView:false,detailView:false,detailViewIcon:true,detailViewByClick:false,detailViewAlign:"left",detailFormatter:function rS(t,e){return""},detailFilter:function aS(t,e){return true},toolbar:void 0,toolbarAlign:"left",buttonsToolbar:void 0,buttonsAlign:"right",buttonsOrder:["search","paginationSwitch","refresh","toggle","fullscreen","columns"],buttonsPrefix:vy.classes.buttonsPrefix,buttonsClass:vy.classes.buttons,iconsPrefix:void 0,icons:{},iconSize:void 0,fixedScroll:false,loadingFontSize:"auto",loadingTemplate:function iS(t){return'\n '.concat(t,'\n \n \n ')},onAll:function nS(t,e){return false},onClickCell:function oS(t,e,r,a){return false},onDblClickCell:function sS(t,e,r,a){return false},onClickRow:function lS(t,e){return false},onDblClickRow:function cS(t,e){return false},onSort:function fS(t,e){return false},onCheck:function uS(t){return false},onUncheck:function hS(t){return false},onCheckAll:function vS(t){return false},onUncheckAll:function dS(t){return false},onCheckSome:function pS(t){return false},onUncheckSome:function gS(t){return false},onLoadSuccess:function bS(t){return false},onLoadError:function mS(t){return false},onColumnSwitch:function yS(t,e){return false},onColumnSwitchAll:function wS(t){return false},onPageChange:function SS(t,e){return false},onSearch:function xS(t){return false},onShowSearch:function OS(){return false},onToggle:function kS(t){return false},onPreBody:function PS(t){return false},onPostBody:function CS(){return false},onPostHeader:function TS(){return false},onPostFooter:function IS(){return false},onExpandRow:function AS(t,e,r){return false},onCollapseRow:function $S(t,e){return false},onRefreshOptions:function RS(t){return false},onRefresh:function ES(t){return false},onResetView:function jS(){return false},onScrollBody:function _S(){return false},onTogglePagination:function NS(t){return false},onVirtualScroll:function FS(t,e){return false}};var py={formatLoadingMessage:function DS(){return"Loading, please wait"},formatRecordsPerPage:function VS(t){return"".concat(t," rows per page")},formatShowingRows:function BS(t,e,r,a){if(void 0!==a&&a>0&&a>r)return"Showing ".concat(t," to ").concat(e," of ").concat(r," rows (filtered from ").concat(a," total rows)");return"Showing ".concat(t," to ").concat(e," of ").concat(r," rows")},formatSRPaginationPreText:function LS(){return"previous page"},formatSRPaginationPageText:function HS(t){return"to page ".concat(t)},formatSRPaginationNextText:function MS(){return"next page"},formatDetailPagination:function US(t){return"Showing ".concat(t," rows")},formatSearch:function zS(){return"Search"},formatShowSearch:function qS(){return"Show Search"},formatPageGo:function(){return"Go"},formatClearSearch:function GS(){return"Clear Search"},formatNoMatches:function WS(){return"No matching records found"},formatPaginationSwitch:function KS(){return"Hide/Show pagination"},formatPaginationSwitchDown:function YS(){return"Show pagination"},formatPaginationSwitchUp:function JS(){return"Hide pagination"},formatRefresh:function XS(){return"Refresh"},formatToggleOn:function QS(){return"Show card view"},formatToggleOff:function ZS(){return"Hide card view"},formatColumns:function tx(){return"Columns"},formatColumnsToggleAll:function ex(){return"Toggle all"},formatFullscreen:function rx(){return"Fullscreen"},formatAllRows:function ax(){return"All"}};var gy={field:void 0,title:void 0,titleTooltip:void 0,class:void 0,width:void 0,widthUnit:"px",rowspan:void 0,colspan:void 0,align:void 0,halign:void 0,falign:void 0,valign:void 0,cellStyle:void 0,radio:false,checkbox:false,checkboxEnabled:true,clickToSelect:true,showSelectTitle:false,sortable:false,sortName:void 0,order:"asc",sorter:void 0,visible:true,ignore:false,switchable:true,switchableLabel:void 0,cardVisible:true,searchable:true,formatter:void 0,footerFormatter:void 0,footerStyle:void 0,detailFormatter:void 0,searchFormatter:true,searchHighlightFormatter:false,escape:void 0,events:void 0};var by=["getOptions","refreshOptions","getData","getSelections","load","append","prepend","remove","removeAll","insertRow","updateRow","getRowByUniqueId","updateByUniqueId","removeByUniqueId","updateCell","updateCellByUniqueId","showRow","hideRow","getHiddenRows","showColumn","hideColumn","getVisibleColumns","getHiddenColumns","showAllColumns","hideAllColumns","mergeCells","checkAll","uncheckAll","checkInvert","check","uncheck","checkBy","uncheckBy","refresh","destroy","resetView","showLoading","hideLoading","togglePagination","toggleFullscreen","toggleView","resetSearch","filterBy","sortBy","scrollTo","getScrollPosition","selectPage","prevPage","nextPage","toggleDetailView","expandRow","collapseRow","expandRowByUniqueId","collapseRowByUniqueId","expandAllRows","collapseAllRows","updateColumnTitle","updateFormatText"];var my={"all.bs.table":"onAll","click-row.bs.table":"onClickRow","dbl-click-row.bs.table":"onDblClickRow","click-cell.bs.table":"onClickCell","dbl-click-cell.bs.table":"onDblClickCell","sort.bs.table":"onSort","check.bs.table":"onCheck","uncheck.bs.table":"onUncheck","check-all.bs.table":"onCheckAll","uncheck-all.bs.table":"onUncheckAll","check-some.bs.table":"onCheckSome","uncheck-some.bs.table":"onUncheckSome","load-success.bs.table":"onLoadSuccess","load-error.bs.table":"onLoadError","column-switch.bs.table":"onColumnSwitch","column-switch-all.bs.table":"onColumnSwitchAll","page-change.bs.table":"onPageChange","search.bs.table":"onSearch","toggle.bs.table":"onToggle","pre-body.bs.table":"onPreBody","post-body.bs.table":"onPostBody","post-header.bs.table":"onPostHeader","post-footer.bs.table":"onPostFooter","expand-row.bs.table":"onExpandRow","collapse-row.bs.table":"onCollapseRow","refresh-options.bs.table":"onRefreshOptions","reset-view.bs.table":"onResetView","refresh.bs.table":"onRefresh","scroll-body.bs.table":"onScrollBody","toggle-pagination.bs.table":"onTogglePagination","virtual-scroll.bs.table":"onVirtualScroll"};Object.assign(dy,py);var yy={VERSION:uy,THEME:"bootstrap".concat(hy),CONSTANTS:vy,DEFAULTS:dy,COLUMN_DEFAULTS:gy,METHODS:by,EVENTS:my,LOCALES:{en:py,"en-US":py}};var wy=50;var Sy=4;var xy=function(){function t(e){var r=this;n(this,t);this.rows=e.rows;this.scrollEl=e.scrollEl;this.contentEl=e.contentEl;this.callback=e.callback;this.itemHeight=e.itemHeight;this.cache={};this.scrollTop=this.scrollEl.scrollTop;this.initDOM(this.rows,e.fixedScroll);this.scrollEl.scrollTop=this.scrollTop;this.lastCluster=0;var a=function i(){if(r.lastCluster!==(r.lastCluster=r.getNum())){r.initDOM(r.rows);r.callback(r.startIndex,r.endIndex)}};this.scrollEl.addEventListener("scroll",a,false);this.destroy=function(){r.contentEl.innerHtml="";r.scrollEl.removeEventListener("scroll",a,false)}}return s(t,[{key:"initDOM",value:function e(t,r){if("undefined"===typeof this.clusterHeight){this.cache.scrollTop=this.scrollEl.scrollTop;this.cache.data=this.contentEl.innerHTML=t[0]+t[0]+t[0];this.getRowsHeight(t)}else if(0===this.blockHeight)this.getRowsHeight(t);var a=this.initData(t,this.getNum(r));var i=a.rows.join("");var n=this.checkChanges("data",i);var o=this.checkChanges("top",a.topOffset);var s=this.checkChanges("bottom",a.bottomOffset);var l=[];if(n&&o){if(a.topOffset)l.push(this.getExtra("top",a.topOffset));l.push(i);if(a.bottomOffset)l.push(this.getExtra("bottom",a.bottomOffset));this.startIndex=a.start;this.endIndex=a.end;this.contentEl.innerHTML=l.join("");if(r)this.contentEl.scrollTop=this.cache.scrollTop}else if(s)this.contentEl.lastChild.style.height="".concat(a.bottomOffset,"px")}},{key:"getRowsHeight",value:function r(){if("undefined"===typeof this.itemHeight||0===this.itemHeight){var t=this.contentEl.children;var e=t[Math.floor(t.length/2)];this.itemHeight=e.offsetHeight}this.blockHeight=this.itemHeight*wy;this.clusterRows=wy*Sy;this.clusterHeight=this.blockHeight*Sy}},{key:"getNum",value:function a(t){this.scrollTop=t?this.cache.scrollTop:this.scrollEl.scrollTop;return Math.floor(this.scrollTop/(this.clusterHeight-this.blockHeight))||0}},{key:"initData",value:function i(t,e){if(t.length
    ':"";var r=["bottom","both"].includes(this.options.paginationVAlign)?'
    ':"";var a=fy.calculateObjectValue(this.options,this.options.loadingTemplate,[this.options.formatLoadingMessage()]);this.$container=t('\n
    \n
    \n ').concat(e,'\n
    \n
    \n
    \n
    \n ').concat(a,'\n
    \n
    \n \n
    \n ').concat(r,"\n
    \n "));this.$container.insertAfter(this.$el);this.$tableContainer=this.$container.find(".fixed-table-container");this.$tableHeader=this.$container.find(".fixed-table-header");this.$tableBody=this.$container.find(".fixed-table-body");this.$tableLoading=this.$container.find(".fixed-table-loading");this.$tableFooter=this.$el.find("tfoot");if(this.options.buttonsToolbar)this.$toolbar=t("body").find(this.options.buttonsToolbar);else this.$toolbar=this.$container.find(".fixed-table-toolbar");this.$pagination=this.$container.find(".fixed-table-pagination");this.$tableBody.append(this.$el);this.$container.after('
    ');this.$el.addClass(this.options.classes);this.$tableLoading.addClass(this.options.classes);if(this.options.striped)this.$el.addClass("table-striped");if(this.options.height){this.$tableContainer.addClass("fixed-height");if(this.options.showFooter)this.$tableContainer.addClass("has-footer");if(this.options.classes.split(" ").includes("table-bordered")){this.$tableBody.append('
    ');this.$tableBorder=this.$tableBody.find(".fixed-table-border");this.$tableLoading.addClass("fixed-table-border")}this.$tableFooter=this.$container.find(".fixed-table-footer")}}},{key:"initTable",value:function u(){var r=this;var a=[];this.$header=this.$el.find(">thead");if(!this.$header.length)this.$header=t('')).appendTo(this.$el);else if(this.options.theadClasses)this.$header.addClass(this.options.theadClasses);this._headerTrClasses=[];this._headerTrStyles=[];this.$header.find("tr").each(function(e,i){var n=t(i);var o=[];n.find("th").each(function(e,r){var a=t(r);if("undefined"!==typeof a.data("field"))a.data("field","".concat(a.data("field")));var i=Object.assign({},a.data());for(var n in i)if(t.fn.bootstrapTable.columnDefaults.hasOwnProperty(n))delete i[n];o.push(fy.extend({},{_data:fy.getRealDataAttr(i),title:a.html(),class:a.attr("class"),titleTooltip:a.attr("title"),rowspan:a.attr("rowspan")?+a.attr("rowspan"):void 0,colspan:a.attr("colspan")?+a.attr("colspan"):void 0},a.data()))});a.push(o);if(n.attr("class"))r._headerTrClasses.push(n.attr("class"));if(n.attr("style"))r._headerTrStyles.push(n.attr("style"))});if(!Array.isArray(this.options.columns[0]))this.options.columns=[this.options.columns];this.options.columns=fy.extend(true,[],a,this.options.columns);this.columns=[];this.fieldsColumnsIndex=[];fy.setFieldIndex(this.options.columns);this.options.columns.forEach(function(t,a){t.forEach(function(t,i){var n=fy.extend({},e.COLUMN_DEFAULTS,t,{passed:t});if("undefined"!==typeof n.fieldIndex){r.columns[n.fieldIndex]=n;r.fieldsColumnsIndex[n.field]=n.fieldIndex}r.options.columns[a][i]=n})});if(!this.options.data.length){var i=fy.trToData(this.columns,this.$el.find(">tbody>tr"));if(i.length){this.options.data=i;this.fromHtml=true}}if(!(this.options.pagination&&"server"!==this.options.sidePagination))this.footerData=fy.trToData(this.columns,this.$el.find(">tfoot>tr"));if(this.footerData)this.$el.find("tfoot").html("");if(!this.options.showFooter||this.options.cardView)this.$tableFooter.hide();else this.$tableFooter.show()}},{key:"initHeader",value:function h(){var e=this;var r={};var a=[];this.header={fields:[],styles:[],classes:[],formatters:[],detailFormatters:[],events:[],sorters:[],sortNames:[],cellStyles:[],searchables:[]};fy.updateFieldGroup(this.options.columns,this.columns);this.options.columns.forEach(function(t,n){var o=[];o.push(""));var s="";if(0===n&&fy.hasDetailViewIcon(e.options)){var c=e.options.columns.length>1?' rowspan="'.concat(e.options.columns.length,'"'):"";s='\n
    \n ')}if(s&&"right"!==e.options.detailViewAlign)o.push(s);t.forEach(function(t,a){var s=fy.sprintf(' class="%s"',t["class"]);var c=t.widthUnit;var f=parseFloat(t.width);var u=t.halign?t.halign:t.align;var h=fy.sprintf("text-align: %s; ",u);var v=fy.sprintf("text-align: %s; ",t.align);var d=fy.sprintf("vertical-align: %s; ",t.valign);d+=fy.sprintf("width: %s; ",(t.checkbox||t.radio)&&!f?!t.showSelectTitle?"36px":void 0:f?f+c:void 0);if("undefined"===typeof t.fieldIndex&&!t.visible)return;var p=fy.calculateObjectValue(null,e.options.headerStyle,[t]);var g=[];var b=[];var m="";if(p&&p.css)for(var y=0,w=Object.entries(p.css);y0)for(var k=0,P=Object.entries(t._data);k0?" data-not-first-th":"",b.length>0?b.join(" "):"",">");o.push(fy.sprintf('
    ',e.options.sortable&&t.sortable?"sortable".concat("center"===u?" sortable-center":""," both"):""));var A=e.options.escape&&e.options.escapeTitle?fy.escapeHTML(t.title):t.title;var $=A;if(t.checkbox){A="";if(!e.options.singleSelect&&e.options.checkboxHeader)A='';e.header.stateField=t.field}if(t.radio){A="";e.header.stateField=t.field}if(!A&&t.showSelectTitle)A+=$;o.push(A);o.push("
    ");o.push('
    ');o.push("
    ");o.push("")});if(s&&"right"===e.options.detailViewAlign)o.push(s);o.push("");if(o.length>3)a.push(o.join(""))});this.$header.html(a.join(""));this.$header.find("th[data-field]").each(function(e,a){t(a).data(r[t(a).data("field")])});this.$container.off("click",".th-inner").on("click",".th-inner",function(r){var a=t(r.currentTarget);if(e.options.detailView&&!a.parent().hasClass("bs-checkbox"))if(a.closest(".bootstrap-table")[0]!==e.$container[0])return false;if(e.options.sortable&&a.parent().data().sortable)e.onSort(r)});var n=fy.getEventName("resize.bootstrap-table",this.$el.attr("id"));t(window).off(n);if(!this.options.showHeader||this.options.cardView){this.$header.hide();this.$tableHeader.hide();this.$tableLoading.css("top",0)}else{this.$header.show();this.$tableHeader.show();this.$tableLoading.css("top",this.$header.outerHeight()+1);this.getCaret();t(window).on(n,function(){return e.resetView()})}this.$selectAll=this.$header.find('[name="btSelectAll"]');this.$selectAll.off("click").on("click",function(r){r.stopPropagation();var a=t(r.currentTarget).prop("checked");e[a?"checkAll":"uncheckAll"]();e.updateSelected()})}},{key:"initData",value:function v(t,e){if("append"===e)this.options.data=this.options.data.concat(t);else if("prepend"===e)this.options.data=[].concat(t).concat(this.options.data);else{t=t||fy.deepCopy(this.options.data);this.options.data=Array.isArray(t)?t:t[this.options.dataField]}this.data=c(this.options.data);if(this.options.sortReset)this.unsortedData=c(this.data);if("server"===this.options.sidePagination)return;this.initSort()}},{key:"initSort",value:function d(){var t=this;var e=this.options.sortName;var r="desc"===this.options.sortOrder?-1:1;var a=this.header.fields.indexOf(this.options.sortName);var i=0;if(a!==-1){if(this.options.sortStable)this.data.forEach(function(t,e){if(!t.hasOwnProperty("_position"))t._position=e});if(this.options.customSort)fy.calculateObjectValue(this.options,this.options.customSort,[this.options.sortName,this.options.sortOrder,this.data]);else this.data.sort(function(i,n){if(t.header.sortNames[a])e=t.header.sortNames[a];var o=fy.getItemField(i,e,t.options.escape);var s=fy.getItemField(n,e,t.options.escape);var l=fy.calculateObjectValue(t.header,t.header.sorters[a],[o,s,i,n]);if(void 0!==l){if(t.options.sortStable&&0===l)return r*(i._position-n._position);return r*l}return fy.sort(o,s,r,t.options,i._position,n._position)});if(void 0!==this.options.sortClass){clearTimeout(i);i=setTimeout(function(){t.$el.removeClass(t.options.sortClass);var e=t.$header.find('[data-field="'.concat(t.options.sortName,'"]')).index();t.$el.find("tr td:nth-child(".concat(e+1,")")).addClass(t.options.sortClass)},250)}}else if(this.options.sortReset)this.data=c(this.unsortedData)}},{key:"sortBy",value:function p(t){this.options.sortName=t.field;this.options.sortOrder=t.hasOwnProperty("sortOrder")?t.sortOrder:"asc";this._sort()}},{key:"onSort",value:function g(e){var r=e.type,a=e.currentTarget;var i="keypress"===r?t(a):t(a).parent();var n=this.$header.find("th").eq(i.index());this.$header.add(this.$header_).find("span.order").remove();if(this.options.sortName===i.data("field")){var o=this.options.sortOrder;var s=this.columns[this.fieldsColumnsIndex[i.data("field")]].sortOrder||this.columns[this.fieldsColumnsIndex[i.data("field")]].order;if(void 0===o)this.options.sortOrder="asc";else if("asc"===o)this.options.sortOrder=this.options.sortReset?"asc"===s?"desc":void 0:"desc";else if("desc"===this.options.sortOrder)this.options.sortOrder=this.options.sortReset?"desc"===s?"asc":void 0:"asc";if(void 0===this.options.sortOrder)this.options.sortName=void 0}else{this.options.sortName=i.data("field");if(this.options.rememberOrder)this.options.sortOrder="asc"===i.data("order")?"desc":"asc";else this.options.sortOrder=this.columns[this.fieldsColumnsIndex[i.data("field")]].sortOrder||this.columns[this.fieldsColumnsIndex[i.data("field")]].order}i.add(n).data("order",this.options.sortOrder);this.getCaret();this._sort()}},{key:"_sort",value:function m(){if("server"===this.options.sidePagination&&this.options.serverSort){this.options.pageNumber=1;this.trigger("sort",this.options.sortName,this.options.sortOrder);this.initServer(this.options.silentSort);return}if(this.options.pagination&&this.options.sortResetPage){this.options.pageNumber=1;this.initPagination()}this.trigger("sort",this.options.sortName,this.options.sortOrder);this.initSort();this.initBody()}},{key:"initToolbar",value:function y(){var e=this;var r=this.options;var a=[];var n=0;var o;var s=0;if(this.$toolbar.find(".bs-bars").children().length)t("body").append(t(r.toolbar));this.$toolbar.html("");if("string"===typeof r.toolbar||"object"===i(r.toolbar))t(fy.sprintf('
    ',this.constants.classes.pull,r.toolbarAlign)).appendTo(this.$toolbar).append(t(r.toolbar));a=['
    ')];if("string"===typeof r.buttonsOrder)r.buttonsOrder=r.buttonsOrder.replace(/\[|\]| |'/g,"").split(",");this.buttons=Object.assign(this.buttons,{search:{text:r.formatSearch(),icon:r.icons.search,render:false,event:this.toggleShowSearch,attributes:{"aria-label":r.formatShowSearch(),title:r.formatShowSearch()}},paginationSwitch:{text:r.pagination?r.formatPaginationSwitchUp():r.formatPaginationSwitchDown(),icon:r.pagination?r.icons.paginationSwitchDown:r.icons.paginationSwitchUp,render:false,event:this.togglePagination,attributes:{"aria-label":r.formatPaginationSwitch(),title:r.formatPaginationSwitch()}},refresh:{text:r.formatRefresh(),icon:r.icons.refresh,render:false,event:this.refresh,attributes:{"aria-label":r.formatRefresh(),title:r.formatRefresh()}},toggle:{text:r.formatToggleOn(),icon:r.icons.toggleOff,render:false,event:this.toggleView,attributes:{"aria-label":r.formatToggleOn(),title:r.formatToggleOn()}},fullscreen:{text:r.formatFullscreen(),icon:r.icons.fullscreen,render:false,event:this.toggleFullscreen,attributes:{"aria-label":r.formatFullscreen(),title:r.formatFullscreen()}},columns:{render:false,html:function z(){var z=[];z.push('
    \n \n ").concat(e.constants.html.toolbarDropdown[0]));if(r.showColumnsSearch){z.push(fy.sprintf(e.constants.html.toolbarDropdownItem,fy.sprintf('',e.constants.classes.input,r.formatSearch())));z.push(e.constants.html.toolbarDropdownSeparator)}if(r.showColumnsToggleAll){var t=e.getVisibleColumns().length===e.columns.filter(function(t){return!e.isSelectionColumn(t)}).length;z.push(fy.sprintf(e.constants.html.toolbarDropdownItem,fy.sprintf(' %s',t?'checked="checked"':"",r.formatColumnsToggleAll())));z.push(e.constants.html.toolbarDropdownSeparator)}var a=0;e.columns.forEach(function(t){if(t.visible)a++});e.columns.forEach(function(t,i){if(e.isSelectionColumn(t))return;if(r.cardView&&!t.cardVisible)return;if(t.ignore)return;var n=t.visible?' checked="checked"':"";var o=a<=r.minimumCountColumns&&n?' disabled="disabled"':"";if(t.switchable){z.push(fy.sprintf(e.constants.html.toolbarDropdownItem,fy.sprintf(' %s',t.field,i,n,o,t.switchableLabel||t.title)));s++}});z.push(e.constants.html.toolbarDropdown[1],"
    ");return z.join("")}}});var c={};for(var f=0,u=Object.entries(this.buttons);f"}c[v]=p;var O="show".concat(v.charAt(0).toUpperCase()).concat(v.substring(1));var k=r[O];if((!d.hasOwnProperty("render")||d.hasOwnProperty("render")&&d.render)&&(void 0===k||true===k))r[O]=true;if(!r.buttonsOrder.includes(v))r.buttonsOrder.push(v)}var P=b(r.buttonsOrder),C;try{for(P.s();!(C=P.n()).done;){var T=C.value;var I=r["show".concat(T.charAt(0).toUpperCase()).concat(T.substring(1))];if(I)a.push(c[T])}}catch(A){P.e(A)}finally{P.f()}a.push("
    ");if(this.showToolbar||a.length>2)this.$toolbar.append(a.join(""));if(r.showSearch)this.$toolbar.find('button[name="showSearch"]').off("click").on("click",function(){return e.toggleShowSearch()});var $=function q(){var t=l(E[R],2),r=t[0],a=t[1];if(a.hasOwnProperty("event")){if("function"===typeof a.event||"string"===typeof a.event){var i="string"===typeof a.event?window[a.event]:a.event;e.$toolbar.find('button[name="'.concat(r,'"]')).off("click").on("click",function(){return i.call(e)});return 1}var n=function c(){var t=l(s[o],2),a=t[0],i=t[1];var n="string"===typeof i?window[i]:i;e.$toolbar.find('button[name="'.concat(r,'"]')).off(a).on(a,function(){return n.call(e)})};for(var o=0,s=Object.entries(a.event);o');var H=L;if(r.showSearchButton||r.showSearchClearButton){var M=(r.showSearchButton?V:"")+(r.showSearchClearButton?B:"");H=r.search?fy.sprintf(this.constants.html.inputGroup,L,M):M}a.push(fy.sprintf('\n
    \n %s\n
    \n '),H));this.$toolbar.append(a.join(""));var U=fy.getSearchInput(this);if(r.showSearchButton){this.$toolbar.find(".search button[name=search]").off("click").on("click",function(){clearTimeout(n);n=setTimeout(function(){e.onSearch({currentTarget:U})},r.searchTimeOut)});if(r.searchOnEnterKey)D(U)}else D(U);if(r.showSearchClearButton)this.$toolbar.find(".search button[name=clearSearch]").click(function(){e.resetSearch()})}else if("string"===typeof r.searchSelector)D(fy.getSearchInput(this))}},{key:"onSearch",value:function w(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=e.currentTarget,a=e.firedByInitSearchText;var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:true;if(void 0!==r&&t(r).length&&i){var n=t(r).val().trim();if(this.options.trimOnSearch&&t(r).val()!==n)t(r).val(n);if(this.searchText===n)return;var o=fy.getSearchInput(this);var s=r instanceof jQuery?r:t(r);if(s.is(o)||s.hasClass("search-input")){this.searchText=n;this.options.searchText=n}}if(!a)this.options.pageNumber=1;this.initSearch();if(a){if("client"===this.options.sidePagination)this.updatePagination()}else this.updatePagination();this.trigger("search",this.searchText)}},{key:"initSearch",value:function S(){var t=this;this.filterOptions=this.filterOptions||this.options.filterOptions;if("server"!==this.options.sidePagination){if(this.options.customSearch){this.data=fy.calculateObjectValue(this.options,this.options.customSearch,[this.options.data,this.searchText,this.filterColumns]);if(this.options.sortReset)this.unsortedData=c(this.data);this.initSort();return}var e=this.searchText&&(this.fromHtml?fy.escapeHTML(this.searchText):this.searchText);var r=e?e.toLowerCase():"";var a=fy.isEmptyObject(this.filterColumns)?null:this.filterColumns;if(this.options.searchAccentNeutralise)r=fy.normalizeAccent(r);if("function"===typeof this.filterOptions.filterAlgorithm)this.data=this.options.data.filter(function(e){return t.filterOptions.filterAlgorithm.apply(null,[e,a])});else if("string"===typeof this.filterOptions.filterAlgorithm)this.data=a?this.options.data.filter(function(e){var r=t.filterOptions.filterAlgorithm;if("and"===r){for(var i in a)if(Array.isArray(a[i])&&!a[i].includes(e[i])||!Array.isArray(a[i])&&e[i]!==a[i])return false}else if("or"===r){var n=false;for(var o in a)if(Array.isArray(a[o])&&a[o].includes(e[o])||!Array.isArray(a[o])&&e[o]===a[o])n=true;return n}return true}):c(this.options.data);var i=this.getVisibleFields();this.data=r?this.data.filter(function(a,n){for(var o=0;o|=<|>=|>|<)(?:\s+)?(-?\d+)?|(-?\d+)?(\s+)?(<=|=>|=<|>=|>|<))/gm;var v=h.exec(t.searchText);var d=false;if(v){var p=v[1]||"".concat(v[5],"l");var g=v[2]||v[3];var b=parseInt(c,10);var m=parseInt(g,10);switch(p){case">":case"m;break;case"<":case">l":d=b=l":case"=>l":d=b<=m;break;case">=":case"=>":case"<=l":case"==m}}if(d||"".concat(c).toLowerCase().includes(r))return true}}return false}):this.data;if(this.options.sortReset)this.unsortedData=c(this.data);this.initSort()}}},{key:"initPagination",value:function x(){var e=this;var r=this.options;if(!r.pagination){this.$pagination.hide();return}this.$pagination.show();var a=[];var i=false;var n;var o;var s;var l;var c;var f;var u;var h=this.getData({includeHiddenRows:false});var v=r.pageList;if("string"===typeof v)v=v.replace(/\[|\]| /g,"").toLowerCase().split(",");v=v.map(function(t){if("string"===typeof t)return t.toLowerCase()===r.formatAllRows().toLowerCase()||["all","unlimited"].includes(t.toLowerCase())?r.formatAllRows():+t;return t});this.paginationParts=r.paginationParts;if("string"===typeof this.paginationParts)this.paginationParts=this.paginationParts.replace(/\[|\]| |'/g,"").split(",");if("server"!==r.sidePagination)r.totalRows=h.length;this.totalPages=0;if(r.totalRows){if(r.pageSize===r.formatAllRows()){r.pageSize=r.totalRows;i=true}this.totalPages=~~((r.totalRows-1)/r.pageSize)+1;r.totalPages=this.totalPages}if(this.totalPages>0&&r.pageNumber>this.totalPages)r.pageNumber=this.totalPages;this.pageFrom=(r.pageNumber-1)*r.pageSize+1;this.pageTo=r.pageNumber*r.pageSize;if(this.pageTo>r.totalRows)this.pageTo=r.totalRows;if(this.options.pagination&&"server"!==this.options.sidePagination)this.options.totalNotFiltered=this.options.data.length;if(!this.options.showExtendedPagination)this.options.totalNotFiltered=void 0;if(this.paginationParts.includes("pageInfo")||this.paginationParts.includes("pageInfoShort")||this.paginationParts.includes("pageSize"))a.push('
    '));if(this.paginationParts.includes("pageInfo")||this.paginationParts.includes("pageInfoShort")){var d=this.options.totalRows+("client"===this.options.sidePagination&&this.options.paginationLoadMore&&!this._paginationLoaded?" +":"");var p=this.paginationParts.includes("pageInfoShort")?r.formatDetailPagination(d):r.formatShowingRows(this.pageFrom,this.pageTo,d,r.totalNotFiltered);a.push('\n '.concat(p,"\n "))}if(this.paginationParts.includes("pageSize")){a.push('
    ');var g=['
    \n \n ").concat(this.constants.html.pageDropdown[0])];v.forEach(function(t,a){if(!r.smartDisplay||0===a||v[a-1]"));a.push(r.formatRecordsPerPage(g.join("")))}if(this.paginationParts.includes("pageInfo")||this.paginationParts.includes("pageInfoShort")||this.paginationParts.includes("pageSize"))a.push("
    ");if(this.paginationParts.includes("pageList")){a.push('
    '),fy.sprintf(this.constants.html.pagination[0],fy.sprintf(" pagination-%s",r.iconSize)),fy.sprintf(this.constants.html.paginationItem," page-pre",r.formatSRPaginationPreText(),r.paginationPreText));if(this.totalPagesthis.totalPages-o)o=o-(r.paginationSuccessivelySize-(this.totalPages-o))+1;if(o<1)o=1;if(s>this.totalPages)s=this.totalPages;var b=Math.round(r.paginationPagesBySide/2);var m=function P(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return fy.sprintf(e.constants.html.paginationItem,a+(t===r.pageNumber?" ".concat(e.constants.classes.paginationActive):""),r.formatSRPaginationPageText(t),t)};if(o>1){var y=r.paginationPagesBySide;if(y>=o)y=o-1;for(n=1;n<=y;n++)a.push(m(n));if(o-1===y+1){n=o-1;a.push(m(n))}else if(o-1>y)if(o-2*r.paginationPagesBySide>r.paginationPagesBySide&&r.paginationUseIntermediate){n=Math.round((o-b)/2+b);a.push(m(n," page-intermediate"))}else a.push(fy.sprintf(this.constants.html.paginationItem," page-first-separator disabled","","..."))}for(n=o;n<=s;n++)a.push(m(n));if(this.totalPages>s){var w=this.totalPages-(r.paginationPagesBySide-1);if(s>=w)w=s+1;if(s+1===w-1){n=s+1;a.push(m(n))}else if(w>s+1)if(this.totalPages-s>2*r.paginationPagesBySide&&r.paginationUseIntermediate){n=Math.round((this.totalPages-b-s)/2+s);a.push(m(n," page-intermediate"))}else a.push(fy.sprintf(this.constants.html.paginationItem," page-last-separator disabled","","..."));for(n=w;n<=this.totalPages;n++)a.push(m(n))}a.push(fy.sprintf(this.constants.html.paginationItem," page-next",r.formatSRPaginationNextText(),r.paginationNextText));a.push(this.constants.html.pagination[1],"
    ")}this.$pagination.html(a.join(""));var S=["bottom","both"].includes(r.paginationVAlign)?" ".concat(this.constants.classes.dropup):"";this.$pagination.last().find(".page-list > div").addClass(S);if(!r.onlyInfoPagination){l=this.$pagination.find(".page-list a");c=this.$pagination.find(".page-pre");f=this.$pagination.find(".page-next");u=this.$pagination.find(".page-item").not(".page-next, .page-pre, .page-last-separator, .page-first-separator");if(this.totalPages<=1)this.$pagination.find("div.pagination").hide();if(r.smartDisplay)if(v.length<2||r.totalRows<=v[0])this.$pagination.find("div.page-list").hide();this.$pagination[this.getData().length?"show":"hide"]();if(!r.paginationLoop){if(1===r.pageNumber)c.addClass("disabled");if(r.pageNumber===this.totalPages)f.addClass("disabled")}if(i)r.pageSize=r.formatAllRows();l.off("click").on("click",function(t){return e.onPageListChange(t)});c.off("click").on("click",function(t){return e.onPagePre(t)});f.off("click").on("click",function(t){return e.onPageNext(t)});u.off("click").on("click",function(t){return e.onPageNumber(t)});if(this.options.showPageGo){var x=this,O=this.$pagination.find("ul.pagination"),k=O.find("li.pageGo");if(!k.length){k=t(['
  • ',fy.sprintf('',this.options.pageNumber),'","
  • "].join("")).appendTo(O);k.find("button").click(function(){var t=parseInt(k.find("input").val())||1;if(t<1||t>x.options.totalPages)t=1;x.selectPage(t)})}}}}},{key:"updatePagination",value:function O(e){if(e&&t(e.currentTarget).hasClass("disabled"))return;if(!this.options.maintainMetaData)this.resetRows();this.initPagination();this.trigger("page-change",this.options.pageNumber,this.options.pageSize);if("server"===this.options.sidePagination||"client"===this.options.sidePagination&&this.options.paginationLoadMore&&!this._paginationLoaded&&this.options.pageNumber===this.totalPages)this.initServer();else this.initBody()}},{key:"onPageListChange",value:function k(e){e.preventDefault();var r=t(e.currentTarget);r.parent().addClass(this.constants.classes.dropdownActive).siblings().removeClass(this.constants.classes.dropdownActive);this.options.pageSize=r.text().toUpperCase()===this.options.formatAllRows().toUpperCase()?this.options.formatAllRows():+r.text();this.$toolbar.find(".page-size").text(this.options.pageSize);this.updatePagination(e);return false}},{key:"onPagePre",value:function P(e){if(t(e.target).hasClass("disabled"))return;e.preventDefault();if(this.options.pageNumber-1===0)this.options.pageNumber=this.options.totalPages;else this.options.pageNumber--;this.updatePagination(e);return false}},{key:"onPageNext",value:function C(e){if(t(e.target).hasClass("disabled"))return;e.preventDefault();if(this.options.pageNumber+1>this.options.totalPages)this.options.pageNumber=1;else this.options.pageNumber++;this.updatePagination(e);return false}},{key:"onPageNumber",value:function T(e){e.preventDefault();if(this.options.pageNumber===+t(e.currentTarget).text())return;this.options.pageNumber=+t(e.currentTarget).text();this.updatePagination(e);return false}},{key:"initRow",value:function I(t,e,r,a){var n=this;var o=[];var s={};var c=[];var f="";var u={};var h=[];if(fy.findIndex(this.hiddenRows,t)>-1)return;s=fy.calculateObjectValue(this.options,this.options.rowStyle,[t,e],s);if(s&&s.css)for(var v=0,d=Object.entries(s.css);v");if(this.options.cardView)o.push('
    '));var I="";if(fy.hasDetailViewIcon(this.options)){I="";if(fy.calculateObjectValue(null,this.options.detailFilter,[e,t]))I+='\n \n '.concat(fy.sprintf(this.constants.html.icon,this.options.iconsPrefix,this.options.icons.detailOpen),"\n \n ");I+=""}if(I&&"right"!==this.options.detailViewAlign)o.push(I);this.header.fields.forEach(function(r,a){var i=n.columns[a];var s="";var f=fy.getItemField(t,r,n.options.escape,i.escape);var u="";var h="";var v={};var d="";var p=n.header.classes[a];var g="";var b="";var m="";var y="";var w="";var S="";if((n.fromHtml||n.autoMergeCells)&&"undefined"===typeof f)if(!i.checkbox&&!i.radio)return;if(!i.visible)return;if(n.options.cardView&&!i.cardVisible)return;if(c.concat([n.header.styles[a]]).length)b+="".concat(c.concat([n.header.styles[a]]).join("; "));if(t["_".concat(r,"_style")])b+="".concat(t["_".concat(r,"_style")]);if(b)g=' style="'.concat(b,'"');if(t["_".concat(r,"_id")])d=fy.sprintf(' id="%s"',t["_".concat(r,"_id")]);if(t["_".concat(r,"_class")])p=fy.sprintf(' class="%s"',t["_".concat(r,"_class")]);if(t["_".concat(r,"_rowspan")])y=fy.sprintf(' rowspan="%s"',t["_".concat(r,"_rowspan")]);if(t["_".concat(r,"_colspan")])w=fy.sprintf(' colspan="%s"',t["_".concat(r,"_colspan")]);if(t["_".concat(r,"_title")])S=fy.sprintf(' title="%s"',t["_".concat(r,"_title")]);v=fy.calculateObjectValue(n.header,n.header.cellStyles[a],[f,t,e,r],v);if(v.classes)p=' class="'.concat(v.classes,'"');if(v.css){var x=[];for(var O=0,k=Object.entries(v.css);O|br|hr|input|!--|wbr)[a-z]+.*?>|<([a-z]+).*?<\/\1>/i.test(u);if(_){var N=(new DOMParser).parseFromString(u.toString(),"text/html").documentElement.textContent;var F=N.replace(E,j);N=N.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");I=u.replace(new RegExp("(>\\s*)(".concat(N,")(\\s*)"),"gm"),"$1".concat(F,"$3"))}else I=u.toString().replace(E,j);u=fy.calculateObjectValue(i,i.searchHighlightFormatter,[u,n.searchText],I)}if(t["_".concat(r,"_data")]&&!fy.isEmptyObject(t["_".concat(r,"_data")]))for(var D=0,V=Object.entries(t["_".concat(r,"_data")]);D'):'"),'"),n.header.formatters[a]&&"string"===typeof u?u:"",n.options.cardView?"
    ":""].join("");t[n.header.stateField]=true===u||!!f||u&&u.checked}else if(n.options.cardView){var q=n.options.showHeader?'").concat(fy.getFieldTitle(n.columns,r),""):"";s='
    '.concat(q,'").concat(u,"
    ");if(n.options.smartDisplay&&""===u)s='
    '}else s="").concat(u,"");o.push(s)});if(I&&"right"===this.options.detailViewAlign)o.push(I);if(this.options.cardView)o.push("
    ");o.push("");return o.join("")}},{key:"initBody",value:function A(e,r){var a=this;var i=this.getData();this.trigger("pre-body",i);this.$body=this.$el.find(">tbody");if(!this.$body.length)this.$body=t("").appendTo(this.$el);if(!this.options.pagination||"server"===this.options.sidePagination){this.pageFrom=1;this.pageTo=i.length}var n=[];var o=t(document.createDocumentFragment());var s=false;var l=[];this.autoMergeCells=fy.checkAutoMergeCells(i.slice(this.pageFrom-1,this.pageTo));for(var c=this.pageFrom-1;c tr[data-uniqueid="%s"][data-has-detail-view]',v));var p=d.next();if(p.is("tr.detail-view")){l.push(c);if(!r||v!==r)u+=p[0].outerHTML}}if(!this.options.virtualScroll)o.append(u);else n.push(u)}}if(!s)this.$body.html(''.concat(fy.sprintf('%s',this.getVisibleFields().length+fy.getDetailViewIndexOffset(this.options),this.options.formatNoMatches()),""));else if(!this.options.virtualScroll)this.$body.html(o);else{if(this.virtualScroll)this.virtualScroll.destroy();this.virtualScroll=new xy({rows:n,fixedScroll:e,scrollEl:this.$tableBody[0],contentEl:this.$body[0],itemHeight:this.options.virtualScrollItemHeight,callback:function g(t,e){a.fitHeader();a.initBodyEvent();a.trigger("virtual-scroll",t,e)}})}l.forEach(function(t){a.expandRow(t)});if(!e)this.scrollTo(0);this.initBodyEvent();this.initFooter();this.resetView();this.updateSelected();if("server"!==this.options.sidePagination)this.options.totalRows=i.length;this.trigger("post-body",i)}},{key:"initBodyEvent",value:function $(){var e=this;this.$body.find("> tr[data-index] > td").off("click dblclick").on("click dblclick",function(r){var a=t(r.currentTarget);if(a.find(".detail-icon").length||a.index()-fy.getDetailViewIndexOffset(e.options)<0)return;var i=a.parent();var n=t(r.target).parents(".card-views").children();var o=t(r.target).parents(".card-view");var s=i.data("index");var l=e.data[s];var c=e.options.cardView?n.index(o):a[0].cellIndex;var f=e.getVisibleFields();var u=f[c-fy.getDetailViewIndexOffset(e.options)];var h=e.columns[e.fieldsColumnsIndex[u]];var v=fy.getItemField(l,u,e.options.escape,h.escape);e.trigger("click"===r.type?"click-cell":"dbl-click-cell",u,v,l,a);e.trigger("click"===r.type?"click-row":"dbl-click-row",l,i,u);if("click"===r.type&&e.options.clickToSelect&&h.clickToSelect&&!fy.calculateObjectValue(e.options,e.options.ignoreClickToSelectOn,[r.target])){var d=i.find(fy.sprintf('[name="%s"]',e.options.selectItemName));if(d.length)d[0].click()}if("click"===r.type&&e.options.detailViewByClick)e.toggleDetailView(s,e.header.detailFormatters[e.fieldsColumnsIndex[u]])}).off("mousedown").on("mousedown",function(t){e.multipleSelectRowCtrlKey=t.ctrlKey||t.metaKey;e.multipleSelectRowShiftKey=t.shiftKey});this.$body.find("> tr[data-index] > td > .detail-icon").off("click").on("click",function(r){r.preventDefault();e.toggleDetailView(t(r.currentTarget).parent().parent().data("index"));return false});this.$selectItem=this.$body.find(fy.sprintf('[name="%s"]',this.options.selectItemName));this.$selectItem.off("click").on("click",function(r){r.stopImmediatePropagation();var a=t(r.currentTarget);e._toggleCheck(a.prop("checked"),a.data("index"))});this.header.events.forEach(function(r,a){var i=r;if(!i)return;if("string"===typeof i)i=fy.calculateObjectValue(null,i);if(!i)throw new Error("Unknown event in the scope: ".concat(r));var n=e.header.fields[a];var o=e.getVisibleFields().indexOf(n);if(o===-1)return;o+=fy.getDetailViewIndexOffset(e.options);var s=function c(r){if(!i.hasOwnProperty(r))return 1;var a=i[r];e.$body.find(">tr:not(.no-records-found)").each(function(i,s){var l=t(s);var c=l.find(e.options.cardView?".card-views>.card-view":">td").eq(o);var f=r.indexOf(" ");var u=r.substring(0,f);var h=r.substring(f+1);c.find(h).off(u).on(u,function(t){var r=l.data("index");var i=e.data[r];var o=i[n];a.apply(e,[t,o,i,r])})})};for(var l in i)if(s(l))continue})}},{key:"initServer",value:function R(e,r,a){var i=this;var n={};var o=this.header.fields.indexOf(this.options.sortName);var s={searchText:this.searchText,sortName:this.options.sortName,sortOrder:this.options.sortOrder};if(this.header.sortNames[o])s.sortName=this.header.sortNames[o];if(this.options.pagination&&"server"===this.options.sidePagination){s.pageSize=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize;s.pageNumber=this.options.pageNumber}if(!this.options.firstLoad&&!firstLoadTable.includes(this.options.id)){firstLoadTable.push(this.options.id);return}if(!(a||this.options.url)&&!this.options.ajax)return;if("limit"===this.options.queryParamsType){s={search:s.searchText,sort:s.sortName,order:s.sortOrder};if(this.options.pagination&&"server"===this.options.sidePagination){s.offset=this.options.pageSize===this.options.formatAllRows()?0:this.options.pageSize*(this.options.pageNumber-1);s.limit=this.options.pageSize;if(0===s.limit||this.options.pageSize===this.options.formatAllRows())delete s.limit}}if(this.options.search&&"server"===this.options.sidePagination&&this.options.searchable&&this.columns.filter(function(t){return t.searchable}).length){s.searchable=[];var l=b(this.columns),c;try{for(l.s();!(c=l.n()).done;){var f=c.value;if(!f.checkbox&&f.searchable&&(this.options.visibleSearch&&f.visible||!this.options.visibleSearch))s.searchable.push(f.field)}}catch(u){l.e(u)}finally{l.f()}}if(!fy.isEmptyObject(this.filterColumnsPartial))s.filter=JSON.stringify(this.filterColumnsPartial,null);fy.extend(s,r||{});n=fy.calculateObjectValue(this.options,this.options.queryParams,[s],n);if(false===n)return;if(!e)this.showLoading();var h=fy.extend({},fy.calculateObjectValue(null,this.options.ajaxOptions),{type:this.options.method,url:a||this.options.url,data:"application/json"===this.options.contentType&&"post"===this.options.method?JSON.stringify(n):n,cache:this.options.cache,contentType:this.options.contentType,dataType:this.options.dataType,success:function v(t,r,a){var n=fy.calculateObjectValue(i.options,i.options.responseHandler,[t,a],t);if("client"===i.options.sidePagination&&i.options.paginationLoadMore)i._paginationLoaded=i.data.length===n.length;i.load(n);i.trigger("load-success",n,a&&a.status,a);if(!e)i.hideLoading();if("server"===i.options.sidePagination&&i.options.pageNumber>1&&n[i.options.totalField]>0&&!n[i.options.dataField].length)i.updatePagination()},error:function d(t){if(t&&0===t.status&&i._xhrAbort){i._xhrAbort=false;return}var r=[];if("server"===i.options.sidePagination){r={};r[i.options.totalField]=0;r[i.options.dataField]=[]}i.load(r);i.trigger("load-error",t&&t.status,t);if(!e)i.hideLoading()}});if(this.options.ajax)fy.calculateObjectValue(this,this.options.ajax,[h],null);else{if(this._xhr&&4!==this._xhr.readyState){this._xhrAbort=true;this._xhr.abort()}this._xhr=t.ajax(h)}return n}},{key:"initSearchText",value:function E(){if(this.options.search){this.searchText="";if(""!==this.options.searchText){var t=fy.getSearchInput(this);t.val(this.options.searchText);this.onSearch({currentTarget:t,firedByInitSearchText:true})}}}},{key:"getCaret",value:function j(){var e=this;this.$header.find("th").each(function(r,a){t(a).find(".sortable").removeClass("desc asc").addClass(t(a).data("field")===e.options.sortName?e.options.sortOrder:"both")})}},{key:"updateSelected",value:function _(){var e=this.$selectItem.filter(":enabled").length&&this.$selectItem.filter(":enabled").length===this.$selectItem.filter(":enabled").filter(":checked").length;this.$selectAll.add(this.$selectAll_).prop("checked",e);this.$selectItem.each(function(e,r){t(r).closest("tr")[t(r).prop("checked")?"addClass":"removeClass"]("selected")})}},{key:"updateRows",value:function N(){var e=this;this.$selectItem.each(function(r,a){e.data[t(a).data("index")][e.header.stateField]=t(a).prop("checked")})}},{key:"resetRows",value:function F(){var t=b(this.data),e;try{for(t.s();!(e=t.n()).done;){var r=e.value;this.$selectAll.prop("checked",false);this.$selectItem.prop("checked",false);if(this.header.stateField)r[this.header.stateField]=false}}catch(a){t.e(a)}finally{t.f()}this.initHiddenRows()}},{key:"trigger",value:function D(r){var a,i;var n="".concat(r,".bs.table");for(var o=arguments.length,s=new Array(o>1?o-1:0),l=1;lr.clientHeight+this.$header.outerHeight()?fy.getScrollBarWidth():0;this.$el.css("margin-top",-this.$header.outerHeight());var i=this.$tableHeader.find(":focus");if(i.length>0){var n=i.parents("th");if(n.length>0){var o=n.attr("data-field");if(void 0!==o){var s=this.$header.find("[data-field='".concat(o,"']"));if(s.length>0)s.find(":input").addClass("focus-temp")}}}this.$header_=this.$header.clone(true,true);this.$selectAll_=this.$header_.find('[name="btSelectAll"]');this.$tableHeader.css("margin-right",a).find("table").css("width",this.$el.outerWidth()).html("").attr("class",this.$el.attr("class")).append(this.$header_);this.$tableLoading.css("width",this.$el.outerWidth());var l=t(".focus-temp:visible:eq(0)");if(l.length>0){l.focus();this.$header.find(".focus-temp").removeClass("focus-temp")}this.$header.find("th[data-field]").each(function(r,a){e.$header_.find(fy.sprintf('th[data-field="%s"]',t(a).data("field"))).data(t(a).data())});var c=this.getVisibleFields();var f=this.$header_.find("th");var u=this.$body.find(">tr:not(.no-records-found,.virtual-scroll-top)").eq(0);while(u.length&&u.find('>td[colspan]:not([colspan="1"])').length)u=u.next();var h=u.find("> *").length;u.find("> *").each(function(r,a){var i=t(a);if(fy.hasDetailViewIcon(e.options))if(0===r&&"right"!==e.options.detailViewAlign||r===h-1&&"right"===e.options.detailViewAlign){var n=f.filter(".detail");var o=n.innerWidth()-n.find(".fht-cell").width();n.find(".fht-cell").width(i.innerWidth()-o);return}var s=r-fy.getDetailViewIndexOffset(e.options);var l=e.$header_.find(fy.sprintf('th[data-field="%s"]',c[s]));if(l.length>1)l=t(f[i[0].cellIndex]);var u=l.innerWidth()-l.find(".fht-cell").width();l.find(".fht-cell").width(i.innerWidth()-u)});this.horizontalScroll();this.trigger("post-header")}},{key:"initFooter",value:function L(){if(!this.options.showFooter||this.options.cardView)return;var t=this.getData();var e=[];var r="";if(fy.hasDetailViewIcon(this.options))r='
    ';if(r&&"right"!==this.options.detailViewAlign)e.push(r);var a=b(this.columns),i;try{for(a.s();!(i=a.n()).done;){var n=i.value;var o="";var s="";var c=[];var f={};var u=fy.sprintf(' class="%s"',n["class"]);if(!n.visible||this.footerData&&this.footerData.length>0&&!(n.field in this.footerData[0]))continue;if(this.options.cardView&&!n.cardVisible)return;o=fy.sprintf("text-align: %s; ",n.falign?n.falign:n.align);s=fy.sprintf("vertical-align: %s; ",n.valign);f=fy.calculateObjectValue(null,n.footerStyle||this.options.footerStyle,[n]);if(f&&f.css)for(var h=0,v=Object.entries(f.css);h0)m=this.footerData[0]["_".concat(n.field,"_colspan")]||0;if(m)e.push(' colspan="'.concat(m,'" '));e.push(">");e.push('
    ');var y="";if(this.footerData&&this.footerData.length>0)y=this.footerData[0][n.field]||"";e.push(fy.calculateObjectValue(n,n.footerFormatter,[t,y],y));e.push("
    ");e.push('
    ');e.push("");e.push("")}}catch(w){a.e(w)}finally{a.f()}if(r&&"right"===this.options.detailViewAlign)e.push(r);if(!this.options.height&&!this.$tableFooter.length){this.$el.append("");this.$tableFooter=this.$el.find("tfoot")}if(!this.$tableFooter.find("tr").length)this.$tableFooter.html("
    ");this.$tableFooter.find("tr").html(e.join(""));this.trigger("post-footer",this.$tableFooter)}},{key:"fitFooter",value:function H(){var e=this;if(this.$el.is(":hidden")){setTimeout(function(){return e.fitFooter()},100);return}var r=this.$tableBody.get(0);var a=this.hasScrollBar&&r.scrollHeight>r.clientHeight+this.$header.outerHeight()?fy.getScrollBarWidth():0;this.$tableFooter.css("margin-right",a).find("table").css("width",this.$el.outerWidth()).attr("class",this.$el.attr("class"));var i=this.$tableFooter.find("th");var n=this.$body.find(">tr:first-child:not(.no-records-found)");i.find(".fht-cell").width("auto");while(n.length&&n.find('>td[colspan]:not([colspan="1"])').length)n=n.next();var o=n.find("> *").length;n.find("> *").each(function(r,a){var n=t(a);if(fy.hasDetailViewIcon(e.options))if(0===r&&"left"===e.options.detailViewAlign||r===o-1&&"right"===e.options.detailViewAlign){var s=i.filter(".detail");var l=s.innerWidth()-s.find(".fht-cell").width();s.find(".fht-cell").width(n.innerWidth()-l);return}var c=i.eq(r);var f=c.innerWidth()-c.find(".fht-cell").width();c.find(".fht-cell").width(n.innerWidth()-f)});this.horizontalScroll()}},{key:"horizontalScroll",value:function M(){var t=this;this.$tableBody.off("scroll").on("scroll",function(){var e=t.$tableBody.scrollLeft();if(t.options.showHeader&&t.options.height)t.$tableHeader.scrollLeft(e);if(t.options.showFooter&&!t.options.cardView)t.$tableFooter.scrollLeft(e);t.trigger("scroll-body",t.$tableBody)})}},{key:"getVisibleFields",value:function U(){var t=[];var e=b(this.header.fields),r;try{for(e.s();!(r=e.n()).done;){var a=r.value;var i=this.columns[this.fieldsColumnsIndex[a]];if(!i||!i.visible||this.options.cardView&&!i.cardVisible)continue;t.push(a)}}catch(n){e.e(n)}finally{e.f()}return t}},{key:"initHiddenRows",value:function z(){this.hiddenRows=[]}},{key:"getOptions",value:function q(){var t=fy.extend({},this.options);delete t.data;return fy.extend(true,{},t)}},{key:"refreshOptions",value:function G(t){if(fy.compareObjects(this.options,t,true))return;this.options=fy.extend(this.options,t);this.trigger("refresh-options",this.options);this.destroy();this.init()}},{key:"getData",value:function W(t){var e=this;var r=this.options.data;if((this.searchText||this.options.customSearch||void 0!==this.options.sortName||this.enableCustomSort||!fy.isEmptyObject(this.filterColumns)||"function"===typeof this.options.filterOptions.filterAlgorithm||!fy.isEmptyObject(this.filterColumnsPartial))&&(!t||!t.unfiltered))r=this.data;if(t&&!t.includeHiddenRows){var a=this.getHiddenRows();r=r.filter(function(t){return fy.findIndex(a,t)===-1})}if(t&&t.useCurrentPage)r=r.slice(this.pageFrom-1,this.pageTo);if(t&&t.formatted)r.forEach(function(t){for(var r=0,a=Object.entries(t);r=0;r--){var a=this.options.data[r];var i=fy.getItemField(a,t.field,this.options.escape,a.escape);if(void 0===i&&"$index"!==t.field)continue;if(!a.hasOwnProperty(t.field)&&"$index"===t.field&&t.values.includes(r)||t.values.includes(i)){e++;this.options.data.splice(r,1)}}if(!e)return;if("server"===this.options.sidePagination){this.options.totalRows-=e;this.data=c(this.options.data)}this.initSearch();this.initPagination();this.initSort();this.initBody(true)}},{key:"removeAll",value:function Z(){if(this.options.data.length>0){this.options.data.splice(0,this.options.data.length);this.initSearch();this.initPagination();this.initBody(true)}}},{key:"insertRow",value:function tt(t){if(!t.hasOwnProperty("index")||!t.hasOwnProperty("row"))return;this.options.data.splice(t.index,0,t.row);this.initSearch();this.initPagination();this.initSort();this.initBody(true)}},{key:"updateRow",value:function et(t){var e=Array.isArray(t)?t:[t];var r=b(e),a;try{for(r.s();!(a=r.n()).done;){var i=a.value;if(!i.hasOwnProperty("index")||!i.hasOwnProperty("row"))continue;if(i.hasOwnProperty("replace")&&i.replace)this.options.data[i.index]=i.row;else fy.extend(this.options.data[i.index],i.row)}}catch(n){r.e(n)}finally{r.f()}this.initSearch();this.initPagination();this.initSort();this.initBody(true)}},{key:"getRowByUniqueId",value:function rt(t){var e=this.options.uniqueId;var r=this.options.data.length;var a=t;var i=null;var n;var o;for(n=r-1;n>=0;n--){o=this.options.data[n];var s=fy.getItemField(o,e,this.options.escape,o.escape);if(void 0===s)continue;if("string"===typeof s)a=t.toString();else if("number"===typeof s)if(Number(s)===s&&s%1===0)a=parseInt(t,10);else if(s===Number(s)&&0!==s)a=parseFloat(t);if(s===a){i=o;break}}return i}},{key:"updateByUniqueId",value:function at(t){var e=Array.isArray(t)?t:[t];var r=null;var a=b(e),i;try{for(a.s();!(i=a.n()).done;){var n=i.value;if(!n.hasOwnProperty("id")||!n.hasOwnProperty("row"))continue;var o=this.options.data.indexOf(this.getRowByUniqueId(n.id));if(o===-1)continue;if(n.hasOwnProperty("replace")&&n.replace)this.options.data[o]=n.row;else fy.extend(this.options.data[o],n.row);r=n.id}}catch(s){a.e(s)}finally{a.f()}this.initSearch();this.initPagination();this.initSort();this.initBody(true,r)}},{key:"removeByUniqueId",value:function it(t){var e=this.options.data.length;var r=this.getRowByUniqueId(t);if(r)this.options.data.splice(this.options.data.indexOf(r),1);if(e===this.options.data.length)return;if("server"===this.options.sidePagination){this.options.totalRows-=1;this.data=c(this.options.data)}this.initSearch();this.initPagination();this.initBody(true)}},{key:"_updateCellOnly",value:function nt(e,r){var a=this.initRow(this.options.data[r],r);var i=this.getVisibleFields().indexOf(e);if(i===-1)return;i+=fy.getDetailViewIndexOffset(this.options);this.$body.find(">tr[data-index=".concat(r,"]")).find(">td:eq(".concat(i,")")).replaceWith(t(a).find(">td:eq(".concat(i,")")));this.initBodyEvent();this.initFooter();this.resetView();this.updateSelected()}},{key:"updateCell",value:function ot(t){if(!t.hasOwnProperty("index")||!t.hasOwnProperty("field")||!t.hasOwnProperty("value"))return;this.options.data[t.index][t.field]=t.value;if(false===t.reinit){this._updateCellOnly(t.field,t.index);return}this.initSort();this.initBody(true)}},{key:"updateCellByUniqueId",value:function st(t){var e=this;var r=Array.isArray(t)?t:[t];r.forEach(function(t){var r=t.id,a=t.field,i=t.value;var n=e.options.data.indexOf(e.getRowByUniqueId(r));if(n===-1)return;e.options.data[n][a]=i});if(false===t.reinit){this._updateCellOnly(t.field,this.options.data.indexOf(this.getRowByUniqueId(t.id)));return}this.initSort();this.initBody(true)}},{key:"showRow",value:function lt(t){this._toggleRow(t,true)}},{key:"hideRow",value:function ct(t){this._toggleRow(t,false)}},{key:"_toggleRow",value:function ft(t,e){var r;if(t.hasOwnProperty("index"))r=this.getData()[t.index];else if(t.hasOwnProperty("uniqueId"))r=this.getRowByUniqueId(t.uniqueId);if(!r)return;var a=fy.findIndex(this.hiddenRows,r);if(!e&&a===-1)this.hiddenRows.push(r);else if(e&&a>-1)this.hiddenRows.splice(a,1);this.initBody(true);this.initPagination()}},{key:"getHiddenRows",value:function ut(t){if(t){this.initHiddenRows();this.initBody(true);this.initPagination();return}var e=this.getData();var r=[];var a=b(e),i;try{for(a.s();!(i=a.n()).done;){var n=i.value;if(this.hiddenRows.includes(n))r.push(n)}}catch(o){a.e(o)}finally{a.f()}this.hiddenRows=r;return r}},{key:"showColumn",value:function ht(t){var e=this;var r=Array.isArray(t)?t:[t];r.forEach(function(t){e._toggleColumn(e.fieldsColumnsIndex[t],true,true)})}},{key:"hideColumn",value:function vt(t){var e=this;var r=Array.isArray(t)?t:[t];r.forEach(function(t){e._toggleColumn(e.fieldsColumnsIndex[t],false,true)})}},{key:"_toggleColumn",value:function dt(t,e,r){if(t===-1||this.columns[t].visible===e)return;this.columns[t].visible=e;this.initHeader();this.initSearch();this.initPagination();this.initBody();if(this.options.showColumns){var a=this.$toolbar.find('.keep-open input:not(".toggle-all")').prop("disabled",false);if(r)a.filter(fy.sprintf('[value="%s"]',t)).prop("checked",e);if(a.filter(":checked").length<=this.options.minimumCountColumns)a.filter(":checked").prop("disabled",true)}}},{key:"getVisibleColumns",value:function pt(){var t=this;return this.columns.filter(function(e){return e.visible&&!t.isSelectionColumn(e)})}},{key:"getHiddenColumns",value:function gt(){return this.columns.filter(function(t){var e=t.visible;return!e})}},{key:"isSelectionColumn",value:function bt(t){return t.radio||t.checkbox}},{key:"showAllColumns",value:function mt(){this._toggleAllColumns(true)}},{key:"hideAllColumns",value:function yt(){this._toggleAllColumns(false)}},{key:"_toggleAllColumns",value:function wt(e){var r=this;var a=b(this.columns.slice().reverse()),i;try{for(a.s();!(i=a.n()).done;){var n=i.value;if(n.switchable){if(!e&&this.options.showColumns&&this.getVisibleColumns().filter(function(t){return t.switchable}).length===this.options.minimumCountColumns)continue;n.visible=e}}}catch(o){a.e(o)}finally{a.f()}this.initHeader();this.initSearch();this.initPagination();this.initBody();if(this.options.showColumns){var s=this.$toolbar.find('.keep-open input[type="checkbox"]:not(".toggle-all")').prop("disabled",false);if(e)s.prop("checked",e);else s.get().reverse().forEach(function(a){if(s.filter(":checked").length>r.options.minimumCountColumns)t(a).prop("checked",e)});if(s.filter(":checked").length<=this.options.minimumCountColumns)s.filter(":checked").prop("disabled",true)}}},{key:"mergeCells",value:function St(t){var e=t.index;var r=this.getVisibleFields().indexOf(t.field);var a=t.rowspan||1;var i=t.colspan||1;var n;var o;var s=this.$body.find(">tr[data-index]");r+=fy.getDetailViewIndexOffset(this.options);var l=s.eq(e).find(">td").eq(r);if(e<0||r<0||e>=this.data.length)return;for(n=e;ntd").eq(o).hide();l.attr("rowspan",a).attr("colspan",i).show()}},{key:"checkAll",value:function xt(){this._toggleCheckAll(true)}},{key:"uncheckAll",value:function Ot(){this._toggleCheckAll(false)}},{key:"_toggleCheckAll",value:function kt(t){var e=this.getSelections();this.$selectAll.add(this.$selectAll_).prop("checked",t);this.$selectItem.filter(":enabled").prop("checked",t);this.updateRows();this.updateSelected();var r=this.getSelections();if(t){this.trigger("check-all",r,e);return}this.trigger("uncheck-all",r,e)}},{key:"checkInvert",value:function Pt(){var e=this.$selectItem.filter(":enabled");var r=e.filter(":checked");e.each(function(e,r){t(r).prop("checked",!t(r).prop("checked"))});this.updateRows();this.updateSelected();this.trigger("uncheck-some",r);r=this.getSelections();this.trigger("check-some",r)}},{key:"check",value:function Ct(t){this._toggleCheck(true,t)}},{key:"uncheck",value:function Tt(t){this._toggleCheck(false,t)}},{key:"_toggleCheck",value:function It(t,e){var r=this.$selectItem.filter('[data-index="'.concat(e,'"]'));var a=this.data[e];if(r.is(":radio")||this.options.singleSelect||this.options.multipleSelectRow&&!this.multipleSelectRowCtrlKey&&!this.multipleSelectRowShiftKey){var i=b(this.options.data),n;try{for(i.s();!(n=i.n()).done;){var o=n.value;o[this.header.stateField]=false}}catch(s){i.e(s)}finally{i.f()}this.$selectItem.filter(":checked").not(r).prop("checked",false)}a[this.header.stateField]=t;if(this.options.multipleSelectRow){if(this.multipleSelectRowShiftKey&&this.multipleSelectRowLastSelectedIndex>=0){var c=this.multipleSelectRowLastSelectedIndexr.clientWidth}if(!this.options.cardView&&this.options.showHeader&&this.options.height){this.$tableHeader.show();this.resetHeader();e+=this.$header.outerHeight(true)+1}else{this.$tableHeader.hide();this.trigger("post-header")}if(!this.options.cardView&&this.options.showFooter){this.$tableFooter.show();this.fitFooter();if(this.options.height)e+=this.$tableFooter.outerHeight(true)}if(this.$container.hasClass("fullscreen")){this.$tableContainer.css("height","");this.$tableContainer.css("width","")}else if(this.options.height){if(this.$tableBorder){this.$tableBorder.css("width","");this.$tableBorder.css("height","")}var a=this.$toolbar.outerHeight(true);var i=this.$pagination.outerHeight(true);var n=this.options.height-a-i;var o=this.$tableBody.find(">table");var s=o.outerHeight();this.$tableContainer.css("height","".concat(n,"px"));if(this.$tableBorder&&o.is(":visible")){var l=n-s-2;if(this.hasScrollBar)l-=fy.getScrollBarWidth();this.$tableBorder.css("width","".concat(o.outerWidth(),"px"));this.$tableBorder.css("height","".concat(l,"px"))}}if(this.options.cardView){this.$el.css("margin-top","0");this.$tableContainer.css("padding-bottom","0");this.$tableFooter.hide()}else{this.getCaret();this.$tableContainer.css("padding-bottom","".concat(e,"px"))}this.trigger("reset-view")}},{key:"showLoading",value:function Nt(){this.$tableLoading.toggleClass("open",true);var t=this.options.loadingFontSize;if("auto"===this.options.loadingFontSize){t=.04*this.$tableLoading.width();t=Math.max(12,t);t=Math.min(32,t);t="".concat(t,"px")}this.$tableLoading.find(".loading-text").css("font-size",t)}},{key:"hideLoading",value:function Ft(){this.$tableLoading.toggleClass("open",false)}},{key:"toggleShowSearch",value:function Dt(){this.$el.parents(".select-table").siblings().slideToggle()}},{key:"togglePagination",value:function Vt(){this.options.pagination=!this.options.pagination;var t=this.options.showButtonIcons?this.options.pagination?this.options.icons.paginationSwitchDown:this.options.icons.paginationSwitchUp:"";var e=this.options.showButtonText?this.options.pagination?this.options.formatPaginationSwitchUp():this.options.formatPaginationSwitchDown():"";this.$toolbar.find('button[name="paginationSwitch"]').html("".concat(fy.sprintf(this.constants.html.icon,this.options.iconsPrefix,t)," ").concat(e));this.updatePagination();this.trigger("toggle-pagination",this.options.pagination)}},{key:"toggleFullscreen",value:function Bt(){this.$el.closest(".bootstrap-table").toggleClass("fullscreen");this.resetView()}},{key:"toggleView",value:function Lt(){this.options.cardView=!this.options.cardView;this.initHeader();var t=this.options.showButtonIcons?this.options.cardView?this.options.icons.toggleOn:this.options.icons.toggleOff:"";var e=this.options.showButtonText?this.options.cardView?this.options.formatToggleOff():this.options.formatToggleOn():"";this.$toolbar.find('button[name="toggle"]').html("".concat(fy.sprintf(this.constants.html.icon,this.options.iconsPrefix,t)," ").concat(e)).attr("aria-label",e).attr("title",e);this.initBody();this.trigger("toggle",this.options.cardView)}},{key:"resetSearch",value:function Ht(t){var e=fy.getSearchInput(this);var r=t||"";e.val(r);this.searchText=r;this.onSearch({currentTarget:e},false)}},{key:"filterBy",value:function Mt(t,e){this.filterOptions=fy.isEmptyObject(e)?this.options.filterOptions:fy.extend(this.options.filterOptions,e);this.filterColumns=fy.isEmptyObject(t)?{}:t;this.options.pageNumber=1;this.initSearch();this.updatePagination()}},{key:"scrollTo",value:function Ut(e){var r={unit:"px",value:0};if("object"===i(e))r=Object.assign(r,e);else if("string"===typeof e&&"bottom"===e)r.value=this.$tableBody[0].scrollHeight;else if("string"===typeof e||"number"===typeof e)r.value=e;var Ut=r.value;if("rows"===r.unit){Ut=0;this.$body.find("> tr:lt(".concat(r.value,")")).each(function(e,r){Ut+=t(r).outerHeight(true)})}this.$tableBody.scrollTop(Ut)}},{key:"getScrollPosition",value:function zt(){return this.$tableBody.scrollTop()}},{key:"selectPage",value:function qt(t){if(t>0&&t<=this.options.totalPages){this.options.pageNumber=t;this.updatePagination()}}},{key:"prevPage",value:function Gt(){if(this.options.pageNumber>1){this.options.pageNumber--;this.updatePagination()}}},{key:"nextPage",value:function Wt(){if(this.options.pageNumber tr[data-index="%s"]',t));if(r.next().is("tr.detail-view"))this.collapseRow(t);else this.expandRow(t,e);this.resetView()}},{key:"expandRow",value:function Yt(t,e){var r=this.data[t];var a=this.$body.find(fy.sprintf('> tr[data-index="%s"][data-has-detail-view]',t));if(this.options.detailViewIcon)a.find("a.detail-icon").html(fy.sprintf(this.constants.html.icon,this.options.iconsPrefix,this.options.icons.detailClose));if(a.next().is("tr.detail-view"))return;a.after(fy.sprintf('',a.children("td").length));var i=a.next().find("td");var n=e||this.options.detailFormatter;var o=fy.calculateObjectValue(this.options,n,[t,r,i],"");if(1===i.length)i.append(o);this.trigger("expand-row",t,r,i)}},{key:"expandRowByUniqueId",value:function Jt(t){var e=this.getRowByUniqueId(t);if(!e)return;this.expandRow(this.data.indexOf(e))}},{key:"collapseRow",value:function Xt(t){var e=this.data[t];var r=this.$body.find(fy.sprintf('> tr[data-index="%s"][data-has-detail-view]',t));if(!r.next().is("tr.detail-view"))return;if(this.options.detailViewIcon)r.find("a.detail-icon").html(fy.sprintf(this.constants.html.icon,this.options.iconsPrefix,this.options.icons.detailOpen));this.trigger("collapse-row",t,e,r.next());r.next().remove()}},{key:"collapseRowByUniqueId",value:function Qt(t){var e=this.getRowByUniqueId(t);if(!e)return;this.collapseRow(this.data.indexOf(e))}},{key:"expandAllRows",value:function Zt(){var e=this.$body.find("> tr[data-index][data-has-detail-view]");for(var r=0;r tr[data-index][data-has-detail-view]");for(var r=0;r1?r-1:0),n=1;n + */ + +var Utils = $.fn.bootstrapTable.utils + +$.extend($.fn.bootstrapTable.defaults, { + autoRefresh: false, + showAutoRefresh: true, + autoRefreshInterval: 60, + autoRefreshSilent: true, + autoRefreshStatus: true, + autoRefreshFunction: null +}) + +$.extend($.fn.bootstrapTable.defaults.icons, { + autoRefresh: { + bootstrap3: 'glyphicon-time icon-time', + bootstrap5: 'bi-clock', + materialize: 'access_time', + 'bootstrap-table': 'icon-clock' + }[$.fn.bootstrapTable.theme] || 'fa-clock' +}) + +$.extend($.fn.bootstrapTable.locales, { + formatAutoRefresh () { + return 'Auto Refresh' + } +}) + +$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales) + +$.BootstrapTable = class extends $.BootstrapTable { + init (...args) { + super.init(...args) + + if (this.options.autoRefresh && this.options.autoRefreshStatus) { + this.setupRefreshInterval() + } + } + + initToolbar (...args) { + if (this.options.autoRefresh) { + this.buttons = Object.assign(this.buttons, { + autoRefresh: { + html: ` + + `, + event: this.toggleAutoRefresh + } + }) + } + + super.initToolbar(...args) + } + + toggleAutoRefresh () { + if (this.options.autoRefresh) { + if (this.options.autoRefreshStatus) { + clearInterval(this.options.autoRefreshFunction) + this.$toolbar.find('>.columns .auto-refresh') + .removeClass(this.constants.classes.buttonActive) + } else { + this.setupRefreshInterval() + this.$toolbar.find('>.columns .auto-refresh') + .addClass(this.constants.classes.buttonActive) + } + this.options.autoRefreshStatus = !this.options.autoRefreshStatus + } + } + + destroy () { + if (this.options.autoRefresh && this.options.autoRefreshStatus) { + clearInterval(this.options.autoRefreshFunction) + } + + super.destroy() + } + + setupRefreshInterval () { + this.options.autoRefreshFunction = setInterval(() => { + if (!this.options.autoRefresh || !this.options.autoRefreshStatus) { + return + } + this.refresh({ silent: this.options.autoRefreshSilent }) + }, this.options.autoRefreshInterval * 1000) + } +} diff --git a/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-table/extensions/columns/bootstrap-table-fixed-columns.js b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-table/extensions/columns/bootstrap-table-fixed-columns.js new file mode 100644 index 0000000..e35b89f --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-table/extensions/columns/bootstrap-table-fixed-columns.js @@ -0,0 +1,5 @@ +/** + * @author zhixin wen + * @github: bootstrap-table/dist/extensions/fixed-columns/bootstrap-table-fixed-columns.min.js + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).jQuery)}(this,(function(t){"use strict";function e(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var n=e(t);function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){for(var n=0;n0&&S[0]<4?1:+(S[0]+S[1])),!j&<&&(!(S=lt.match(/Edge\/(\d+)/))||S[1]>=74)&&(S=lt.match(/Chrome\/(\d+)/))&&(j=+S[1]);var bt=j,gt=bt,vt=y,mt=!!Object.getOwnPropertySymbols&&!vt((function(){var t=Symbol();return!String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&>&><41})),xt=mt&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,$t=at,wt=et,Ct=ct,Ot=Object,St=xt?function(t){return"symbol"==typeof t}:function(t){var e=$t("Symbol");return wt(e)&&Ct(e.prototype,Ot(t))},jt=String,Rt=et,Bt=function(t){try{return jt(t)}catch(t){return"Object"}},Tt=TypeError,Ft=function(t){if(Rt(t))return t;throw Tt(Bt(t)+" is not a function")},kt=Ft,Pt=Y,Et=x,At=et,Nt=rt,Ht=TypeError,Dt={exports:{}},It=h,Lt=Object.defineProperty,Mt=function(t,e){try{Lt(It,t,{value:e,configurable:!0,writable:!0})}catch(n){It[t]=e}return e},_t=Mt,Wt="__core-js_shared__",zt=h[Wt]||_t(Wt,{}),Xt=zt;(Dt.exports=function(t,e){return Xt[t]||(Xt[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.25.5",mode:"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.25.5/LICENSE",source:"https://github.com/zloirock/core-js"});var Yt=V,qt=Object,Gt=function(t){return qt(Yt(t))},Vt=Gt,Ut=L({}.hasOwnProperty),Kt=Object.hasOwn||function(t,e){return Ut(Vt(t),e)},Qt=L,Zt=0,Jt=Math.random(),te=Qt(1..toString),ee=function(t){return"Symbol("+(void 0===t?"":t)+")_"+te(++Zt+Jt,36)},ne=h,ie=Dt.exports,re=Kt,oe=ee,ue=mt,fe=xt,ae=ie("wks"),ce=ne.Symbol,se=ce&&ce.for,le=fe?ce:ce&&ce.withoutSetter||oe,de=function(t){if(!re(ae,t)||!ue&&"string"!=typeof ae[t]){var e="Symbol."+t;ue&&re(ce,t)?ae[t]=ce[t]:ae[t]=fe&&se?se(e):le(e)}return ae[t]},he=x,pe=rt,ye=St,be=function(t,e){var n=t[e];return Pt(n)?void 0:kt(n)},ge=function(t,e){var n,i;if("string"===e&&At(n=t.toString)&&!Nt(i=Et(n,t)))return i;if(At(n=t.valueOf)&&!Nt(i=Et(n,t)))return i;if("string"!==e&&At(n=t.toString)&&!Nt(i=Et(n,t)))return i;throw Ht("Can't convert object to primitive value")},ve=TypeError,me=de("toPrimitive"),xe=function(t,e){if(!pe(t)||ye(t))return t;var n,i=be(t,me);if(i){if(void 0===e&&(e="default"),n=he(i,t,e),!pe(n)||ye(n))return n;throw ve("Can't convert object to primitive value")}return void 0===e&&(e="number"),ge(t,e)},$e=St,we=function(t){var e=xe(t,"string");return $e(e)?e:e+""},Ce=rt,Oe=h.document,Se=Ce(Oe)&&Ce(Oe.createElement),je=function(t){return Se?Oe.createElement(t):{}},Re=je,Be=!b&&!y((function(){return 7!=Object.defineProperty(Re("div"),"a",{get:function(){return 7}}).a})),Te=b,Fe=x,ke=$,Pe=R,Ee=Q,Ae=we,Ne=Kt,He=Be,De=Object.getOwnPropertyDescriptor;p.f=Te?De:function(t,e){if(t=Ee(t),e=Ae(e),He)try{return De(t,e)}catch(t){}if(Ne(t,e))return Pe(!Fe(ke.f,t,e),t[e])};var Ie={},Le=b&&y((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype})),Me=rt,_e=String,We=TypeError,ze=function(t){if(Me(t))return t;throw We(_e(t)+" is not an object")},Xe=b,Ye=Be,qe=Le,Ge=ze,Ve=we,Ue=TypeError,Ke=Object.defineProperty,Qe=Object.getOwnPropertyDescriptor,Ze="enumerable",Je="configurable",tn="writable";Ie.f=Xe?qe?function(t,e,n){if(Ge(t),e=Ve(e),Ge(n),"function"==typeof t&&"prototype"===e&&"value"in n&&tn in n&&!n.writable){var i=Qe(t,e);i&&i.writable&&(t[e]=n.value,n={configurable:Je in n?n.configurable:i.configurable,enumerable:Ze in n?n.enumerable:i.enumerable,writable:!1})}return Ke(t,e,n)}:Ke:function(t,e,n){if(Ge(t),e=Ve(e),Ge(n),Ye)try{return Ke(t,e,n)}catch(t){}if("get"in n||"set"in n)throw Ue("Accessors not supported");return"value"in n&&(t[e]=n.value),t};var en=Ie,nn=R,rn=b?function(t,e,n){return en.f(t,e,nn(1,n))}:function(t,e,n){return t[e]=n,t},on={exports:{}},un=b,fn=Kt,an=Function.prototype,cn=un&&Object.getOwnPropertyDescriptor,sn=fn(an,"name"),ln={EXISTS:sn,PROPER:sn&&"something"===function(){}.name,CONFIGURABLE:sn&&(!un||un&&cn(an,"name").configurable)},dn=et,hn=zt,pn=L(Function.toString);dn(hn.inspectSource)||(hn.inspectSource=function(t){return pn(t)});var yn,bn,gn,vn=hn.inspectSource,mn=et,xn=h.WeakMap,$n=mn(xn)&&/native code/.test(String(xn)),wn=Dt.exports,Cn=ee,On=wn("keys"),Sn=function(t){return On[t]||(On[t]=Cn(t))},jn={},Rn=$n,Bn=h,Tn=rt,Fn=rn,kn=Kt,Pn=zt,En=Sn,An=jn,Nn="Object already initialized",Hn=Bn.TypeError,Dn=Bn.WeakMap;if(Rn||Pn.state){var In=Pn.state||(Pn.state=new Dn);In.get=In.get,In.has=In.has,In.set=In.set,yn=function(t,e){if(In.has(t))throw Hn(Nn);return e.facade=t,In.set(t,e),e},bn=function(t){return In.get(t)||{}},gn=function(t){return In.has(t)}}else{var Ln=En("state");An[Ln]=!0,yn=function(t,e){if(kn(t,Ln))throw Hn(Nn);return e.facade=t,Fn(t,Ln,e),e},bn=function(t){return kn(t,Ln)?t[Ln]:{}},gn=function(t){return kn(t,Ln)}}var Mn={set:yn,get:bn,has:gn,enforce:function(t){return gn(t)?bn(t):yn(t,{})},getterFor:function(t){return function(e){var n;if(!Tn(e)||(n=bn(e)).type!==t)throw Hn("Incompatible receiver, "+t+" required");return n}}},_n=y,Wn=et,zn=Kt,Xn=b,Yn=ln.CONFIGURABLE,qn=vn,Gn=Mn.enforce,Vn=Mn.get,Un=Object.defineProperty,Kn=Xn&&!_n((function(){return 8!==Un((function(){}),"length",{value:8}).length})),Qn=String(String).split("String"),Zn=on.exports=function(t,e,n){"Symbol("===String(e).slice(0,7)&&(e="["+String(e).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),n&&n.getter&&(e="get "+e),n&&n.setter&&(e="set "+e),(!zn(t,"name")||Yn&&t.name!==e)&&(Xn?Un(t,"name",{value:e,configurable:!0}):t.name=e),Kn&&n&&zn(n,"arity")&&t.length!==n.arity&&Un(t,"length",{value:n.arity});try{n&&zn(n,"constructor")&&n.constructor?Xn&&Un(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var i=Gn(t);return zn(i,"source")||(i.source=Qn.join("string"==typeof e?e:"")),t};Function.prototype.toString=Zn((function(){return Wn(this)&&Vn(this).source||qn(this)}),"toString");var Jn=et,ti=Ie,ei=on.exports,ni=Mt,ii=function(t,e,n,i){i||(i={});var r=i.enumerable,o=void 0!==i.name?i.name:e;if(Jn(n)&&ei(n,o,i),i.global)r?t[e]=n:ni(e,n);else{try{i.unsafe?t[e]&&(r=!0):delete t[e]}catch(t){}r?t[e]=n:ti.f(t,e,{value:n,enumerable:!1,configurable:!i.nonConfigurable,writable:!i.nonWritable})}return t},ri={},oi=Math.ceil,ui=Math.floor,fi=Math.trunc||function(t){var e=+t;return(e>0?ui:oi)(e)},ai=function(t){var e=+t;return e!=e||0===e?0:fi(e)},ci=ai,si=Math.max,li=Math.min,di=ai,hi=Math.min,pi=function(t){return t>0?hi(di(t),9007199254740991):0},yi=function(t){return pi(t.length)},bi=Q,gi=function(t,e){var n=ci(t);return n<0?si(n+e,0):li(n,e)},vi=yi,mi=function(t){return function(e,n,i){var r,o=bi(e),u=vi(o),f=gi(i,u);if(t&&n!=n){for(;u>f;)if((r=o[f++])!=r)return!0}else for(;u>f;f++)if((t||f in o)&&o[f]===n)return t||f||0;return!t&&-1}},xi={includes:mi(!0),indexOf:mi(!1)},$i=Kt,wi=Q,Ci=xi.indexOf,Oi=jn,Si=L([].push),ji=function(t,e){var n,i=wi(t),r=0,o=[];for(n in i)!$i(Oi,n)&&$i(i,n)&&Si(o,n);for(;e.length>r;)$i(i,n=e[r++])&&(~Ci(o,n)||Si(o,n));return o},Ri=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Bi=ji,Ti=Ri.concat("length","prototype");ri.f=Object.getOwnPropertyNames||function(t){return Bi(t,Ti)};var Fi={};Fi.f=Object.getOwnPropertySymbols;var ki=at,Pi=ri,Ei=Fi,Ai=ze,Ni=L([].concat),Hi=ki("Reflect","ownKeys")||function(t){var e=Pi.f(Ai(t)),n=Ei.f;return n?Ni(e,n(t)):e},Di=Kt,Ii=Hi,Li=p,Mi=Ie,_i=y,Wi=et,zi=/#|\.prototype\./,Xi=function(t,e){var n=qi[Yi(t)];return n==Vi||n!=Gi&&(Wi(e)?_i(e):!!e)},Yi=Xi.normalize=function(t){return String(t).replace(zi,".").toLowerCase()},qi=Xi.data={},Gi=Xi.NATIVE="N",Vi=Xi.POLYFILL="P",Ui=Xi,Ki=h,Qi=p.f,Zi=rn,Ji=ii,tr=Mt,er=function(t,e,n){for(var i=Ii(e),r=Mi.f,o=Li.f,u=0;uv;v++)if((f||v in y)&&(h=b(d=y[v],v,p),t))if(e)x[v]=h;else if(h)switch(t){case 3:return!0;case 5:return d;case 6:return v;case 2:Xr(x,d)}else switch(t){case 4:return!1;case 7:Xr(x,d)}return o?-1:i||r?r:x}},qr={forEach:Yr(0),map:Yr(1),filter:Yr(2),some:Yr(3),every:Yr(4),find:Yr(5),findIndex:Yr(6),filterReject:Yr(7)},Gr={},Vr=ji,Ur=Ri,Kr=Object.keys||function(t){return Vr(t,Ur)},Qr=b,Zr=Le,Jr=Ie,to=ze,eo=Q,no=Kr;Gr.f=Qr&&!Zr?Object.defineProperties:function(t,e){to(t);for(var n,i=eo(e),r=no(e),o=r.length,u=0;o>u;)Jr.f(t,n=r[u++],i[n]);return t};var io,ro=at("document","documentElement"),oo=ze,uo=Gr,fo=Ri,ao=jn,co=ro,so=je,lo=Sn("IE_PROTO"),ho=function(){},po=function(t){return" + + diff --git a/src/ruoyi-admin/src/main/resources/templates/error/500.html b/src/ruoyi-admin/src/main/resources/templates/error/500.html new file mode 100644 index 0000000..918e965 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/error/500.html @@ -0,0 +1,28 @@ + + + + + + RuoYi - 500 + + + + + +
    +

    500

    +

    内部服务器错误!

    + +
    + 服务器遇到意外事件,不允许完成请求。我们抱歉。您可以返回主页面。 + 主页 +
    +
    + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/error/service.html b/src/ruoyi-admin/src/main/resources/templates/error/service.html new file mode 100644 index 0000000..b64341d --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/error/service.html @@ -0,0 +1,20 @@ + + + + + + RuoYi - 500 + + + + + +
    +

    操作异常!

    + +
    + [[${errorMessage}]] +
    +
    + + diff --git a/src/ruoyi-admin/src/main/resources/templates/error/unauth.html b/src/ruoyi-admin/src/main/resources/templates/error/unauth.html new file mode 100644 index 0000000..74053c7 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/error/unauth.html @@ -0,0 +1,28 @@ + + + + + + RuoYi - 403 + + + + + +
    +

    403

    +

    您没有访问权限!

    + +
    + 对不起,您没有访问权限,请不要进行非法操作!您可以返回主页面 + 返回主页 +
    +
    + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/include.html b/src/ruoyi-admin/src/main/resources/templates/include.html new file mode 100644 index 0000000..e8ef0da --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/include.html @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    + +
    + + +
    + + +
    +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + +
    +
    + + +
    + + +
    + + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    diff --git a/src/ruoyi-admin/src/main/resources/templates/index.html b/src/ruoyi-admin/src/main/resources/templates/index.html new file mode 100644 index 0000000..0c94e18 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/index.html @@ -0,0 +1,384 @@ + + + + + + + 若依系统首页 + + + + + + + + + + + + +
    + + + + + + +
    + +
    + + + + 刷新 +
    + + + +
    + +
    + + +
    + +
    + + + + + + + + + + + + + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/ky/account.html b/src/ruoyi-admin/src/main/resources/templates/ky/account.html new file mode 100644 index 0000000..5e89b15 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/ky/account.html @@ -0,0 +1,406 @@ + + + + + + 个人财务管理系统 - 账户管理 + + + + + + + + + +
    +

    账户管理

    + + +
    + +
    + + + +
    +
    + + + + + + + + + + + + + + + + +
    序号账户名称账户类型余额最后更新日期
    + + + + +
    +
    +
    + 加载中 +
    +
    +
    + + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/ky/datasis.html b/src/ruoyi-admin/src/main/resources/templates/ky/datasis.html new file mode 100644 index 0000000..ea0e223 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/ky/datasis.html @@ -0,0 +1,506 @@ + + + + + + 个人财务管理系统 - 数据分析 + + + + + + + + + +
    +

    数据分析

    + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + +
    +

    预算跟踪

    +

    设定月度或年度预算,系统实时跟踪预算执行情况。

    + + + +

    +
    +
    + + + + + + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/ky/files/bootstrap.bundle.min.js b/src/ruoyi-admin/src/main/resources/templates/ky/files/bootstrap.bundle.min.js new file mode 100644 index 0000000..d0ba093 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/ky/files/bootstrap.bundle.min.js @@ -0,0 +1,2833 @@ +/*! + * Bootstrap v5.3.0 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function (t, e) { + "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).bootstrap = e() +}(this, (function () { + "use strict"; + const t = new Map, e = { + set(e, i, n) { + t.has(e) || t.set(e, new Map); + const s = t.get(e); + s.has(i) || 0 === s.size ? s.set(i, n) : console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`) + }, get: (e, i) => t.has(e) && t.get(e).get(i) || null, remove(e, i) { + if (!t.has(e)) return; + const n = t.get(e); + n.delete(i), 0 === n.size && t.delete(e) + } + }, i = "transitionend", + n = t => (t && window.CSS && window.CSS.escape && (t = t.replace(/#([^\s"#']+)/g, ((t, e) => `#${CSS.escape(e)}`))), t), + s = t => { + t.dispatchEvent(new Event(i)) + }, o = t => !(!t || "object" != typeof t) && (void 0 !== t.jquery && (t = t[0]), void 0 !== t.nodeType), + r = t => o(t) ? t.jquery ? t[0] : t : "string" == typeof t && t.length > 0 ? document.querySelector(n(t)) : null, + a = t => { + if (!o(t) || 0 === t.getClientRects().length) return !1; + const e = "visible" === getComputedStyle(t).getPropertyValue("visibility"), + i = t.closest("details:not([open])"); + if (!i) return e; + if (i !== t) { + const e = t.closest("summary"); + if (e && e.parentNode !== i) return !1; + if (null === e) return !1 + } + return e + }, + l = t => !t || t.nodeType !== Node.ELEMENT_NODE || !!t.classList.contains("disabled") || (void 0 !== t.disabled ? t.disabled : t.hasAttribute("disabled") && "false" !== t.getAttribute("disabled")), + c = t => { + if (!document.documentElement.attachShadow) return null; + if ("function" == typeof t.getRootNode) { + const e = t.getRootNode(); + return e instanceof ShadowRoot ? e : null + } + return t instanceof ShadowRoot ? t : t.parentNode ? c(t.parentNode) : null + }, h = () => { + }, d = t => { + t.offsetHeight + }, u = () => window.jQuery && !document.body.hasAttribute("data-bs-no-jquery") ? window.jQuery : null, f = [], + p = () => "rtl" === document.documentElement.dir, m = t => { + var e; + e = () => { + const e = u(); + if (e) { + const i = t.NAME, n = e.fn[i]; + e.fn[i] = t.jQueryInterface, e.fn[i].Constructor = t, e.fn[i].noConflict = () => (e.fn[i] = n, t.jQueryInterface) + } + }, "loading" === document.readyState ? (f.length || document.addEventListener("DOMContentLoaded", (() => { + for (const t of f) t() + })), f.push(e)) : e() + }, g = (t, e = [], i = t) => "function" == typeof t ? t(...e) : i, _ = (t, e, n = !0) => { + if (!n) return void g(t); + const o = (t => { + if (!t) return 0; + let {transitionDuration: e, transitionDelay: i} = window.getComputedStyle(t); + const n = Number.parseFloat(e), s = Number.parseFloat(i); + return n || s ? (e = e.split(",")[0], i = i.split(",")[0], 1e3 * (Number.parseFloat(e) + Number.parseFloat(i))) : 0 + })(e) + 5; + let r = !1; + const a = ({target: n}) => { + n === e && (r = !0, e.removeEventListener(i, a), g(t)) + }; + e.addEventListener(i, a), setTimeout((() => { + r || s(e) + }), o) + }, b = (t, e, i, n) => { + const s = t.length; + let o = t.indexOf(e); + return -1 === o ? !i && n ? t[s - 1] : t[0] : (o += i ? 1 : -1, n && (o = (o + s) % s), t[Math.max(0, Math.min(o, s - 1))]) + }, v = /[^.]*(?=\..*)\.|.*/, y = /\..*/, w = /::\d+$/, A = {}; + let E = 1; + const T = {mouseenter: "mouseover", mouseleave: "mouseout"}, + C = new Set(["click", "dblclick", "mouseup", "mousedown", "contextmenu", "mousewheel", "DOMMouseScroll", "mouseover", "mouseout", "mousemove", "selectstart", "selectend", "keydown", "keypress", "keyup", "orientationchange", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointercancel", "gesturestart", "gesturechange", "gestureend", "focus", "blur", "change", "reset", "select", "submit", "focusin", "focusout", "load", "unload", "beforeunload", "resize", "move", "DOMContentLoaded", "readystatechange", "error", "abort", "scroll"]); + + function O(t, e) { + return e && `${e}::${E++}` || t.uidEvent || E++ + } + + function x(t) { + const e = O(t); + return t.uidEvent = e, A[e] = A[e] || {}, A[e] + } + + function k(t, e, i = null) { + return Object.values(t).find((t => t.callable === e && t.delegationSelector === i)) + } + + function L(t, e, i) { + const n = "string" == typeof e, s = n ? i : e || i; + let o = N(t); + return C.has(o) || (o = t), [n, s, o] + } + + function S(t, e, i, n, s) { + if ("string" != typeof e || !t) return; + let [o, r, a] = L(e, i, n); + if (e in T) { + const t = t => function (e) { + if (!e.relatedTarget || e.relatedTarget !== e.delegateTarget && !e.delegateTarget.contains(e.relatedTarget)) return t.call(this, e) + }; + r = t(r) + } + const l = x(t), c = l[a] || (l[a] = {}), h = k(c, r, o ? i : null); + if (h) return void (h.oneOff = h.oneOff && s); + const d = O(r, e.replace(v, "")), u = o ? function (t, e, i) { + return function n(s) { + const o = t.querySelectorAll(e); + for (let {target: r} = s; r && r !== this; r = r.parentNode) for (const a of o) if (a === r) return M(s, {delegateTarget: r}), n.oneOff && P.off(t, s.type, e, i), i.apply(r, [s]) + } + }(t, i, r) : function (t, e) { + return function i(n) { + return M(n, {delegateTarget: t}), i.oneOff && P.off(t, n.type, e), e.apply(t, [n]) + } + }(t, r); + u.delegationSelector = o ? i : null, u.callable = r, u.oneOff = s, u.uidEvent = d, c[d] = u, t.addEventListener(a, u, o) + } + + function D(t, e, i, n, s) { + const o = k(e[i], n, s); + o && (t.removeEventListener(i, o, Boolean(s)), delete e[i][o.uidEvent]) + } + + function I(t, e, i, n) { + const s = e[i] || {}; + for (const [o, r] of Object.entries(s)) o.includes(n) && D(t, e, i, r.callable, r.delegationSelector) + } + + function N(t) { + return t = t.replace(y, ""), T[t] || t + } + + const P = { + on(t, e, i, n) { + S(t, e, i, n, !1) + }, one(t, e, i, n) { + S(t, e, i, n, !0) + }, off(t, e, i, n) { + if ("string" != typeof e || !t) return; + const [s, o, r] = L(e, i, n), a = r !== e, l = x(t), c = l[r] || {}, h = e.startsWith("."); + if (void 0 === o) { + if (h) for (const i of Object.keys(l)) I(t, l, i, e.slice(1)); + for (const [i, n] of Object.entries(c)) { + const s = i.replace(w, ""); + a && !e.includes(s) || D(t, l, r, n.callable, n.delegationSelector) + } + } else { + if (!Object.keys(c).length) return; + D(t, l, r, o, s ? i : null) + } + }, trigger(t, e, i) { + if ("string" != typeof e || !t) return null; + const n = u(); + let s = null, o = !0, r = !0, a = !1; + e !== N(e) && n && (s = n.Event(e, i), n(t).trigger(s), o = !s.isPropagationStopped(), r = !s.isImmediatePropagationStopped(), a = s.isDefaultPrevented()); + const l = M(new Event(e, {bubbles: o, cancelable: !0}), i); + return a && l.preventDefault(), r && t.dispatchEvent(l), l.defaultPrevented && s && s.preventDefault(), l + } + }; + + function M(t, e = {}) { + for (const [i, n] of Object.entries(e)) try { + t[i] = n + } catch (e) { + Object.defineProperty(t, i, {configurable: !0, get: () => n}) + } + return t + } + + function j(t) { + if ("true" === t) return !0; + if ("false" === t) return !1; + if (t === Number(t).toString()) return Number(t); + if ("" === t || "null" === t) return null; + if ("string" != typeof t) return t; + try { + return JSON.parse(decodeURIComponent(t)) + } catch (e) { + return t + } + } + + function F(t) { + return t.replace(/[A-Z]/g, (t => `-${t.toLowerCase()}`)) + } + + const H = { + setDataAttribute(t, e, i) { + t.setAttribute(`data-bs-${F(e)}`, i) + }, removeDataAttribute(t, e) { + t.removeAttribute(`data-bs-${F(e)}`) + }, getDataAttributes(t) { + if (!t) return {}; + const e = {}, i = Object.keys(t.dataset).filter((t => t.startsWith("bs") && !t.startsWith("bsConfig"))); + for (const n of i) { + let i = n.replace(/^bs/, ""); + i = i.charAt(0).toLowerCase() + i.slice(1, i.length), e[i] = j(t.dataset[n]) + } + return e + }, getDataAttribute: (t, e) => j(t.getAttribute(`data-bs-${F(e)}`)) + }; + + class ${static get Default(){return{} +} +static +get +DefaultType() +{ + return {} +} +static +get +NAME() +{ + throw new Error('You have to implement the static method "NAME", for each component!') +} +_getConfig(t) +{ + return t = this._mergeConfigObj(t), t = this._configAfterMerge(t), this._typeCheckConfig(t), t +} +_configAfterMerge(t) +{ + return t +} +_mergeConfigObj(t, e) +{ + const i = o(e) ? H.getDataAttribute(e, "config") : {}; + return {...this.constructor.Default, ..."object" == typeof i ? i : {}, ...o(e) ? H.getDataAttributes(e) : {}, ..."object" == typeof t ? t : {}} +} +_typeCheckConfig(t, e = this.constructor.DefaultType) +{ + for (const [n, s] of Object.entries(e)) { + const e = t[n], + r = o(e) ? "element" : null == (i = e) ? `${i}` : Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase(); + if (!new RegExp(s).test(r)) throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`) + } + var i +} +} + +class W extends ${constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose() { + e +. + + remove( + + this +. + _element +, + this +. + constructor +. + DATA_KEY +), + P +. + + off( + + this +. + _element +, + this +. + constructor +. + EVENT_KEY +) + ; + + for( + + const + t + of + Object +. + + getOwnPropertyNames( + + this +)) + this + [t] = null +} + +_queueCallback(t, e, i = !0) +{ + _(t, e, i) +} +_getConfig(t) +{ + return t = this._mergeConfigObj(t, this._element), t = this._configAfterMerge(t), this._typeCheckConfig(t), t +} +static +getInstance(t) +{ + return e.get(r(t), this.DATA_KEY) +} +static +getOrCreateInstance(t, e = {}) +{ + return this.getInstance(t) || new this(t, "object" == typeof e ? e : null) +} +static +get +VERSION() +{ + return "5.3.0" +} +static +get +DATA_KEY() +{ + return `bs.${this.NAME}` +} +static +get +EVENT_KEY() +{ + return `.${this.DATA_KEY}` +} +static +eventName(t) +{ + return `${t}${this.EVENT_KEY}` +} +} +const B = t => { + let e = t.getAttribute("data-bs-target"); + if (!e || "#" === e) { + let i = t.getAttribute("href"); + if (!i || !i.includes("#") && !i.startsWith(".")) return null; + i.includes("#") && !i.startsWith("#") && (i = `#${i.split("#")[1]}`), e = i && "#" !== i ? i.trim() : null + } + return n(e) +}, z = { + find: (t, e = document.documentElement) => [].concat(...Element.prototype.querySelectorAll.call(e, t)), + findOne: (t, e = document.documentElement) => Element.prototype.querySelector.call(e, t), + children: (t, e) => [].concat(...t.children).filter((t => t.matches(e))), + parents(t, e) { + const i = []; + let n = t.parentNode.closest(e); + for (; n;) i.push(n), n = n.parentNode.closest(e); + return i + }, + prev(t, e) { + let i = t.previousElementSibling; + for (; i;) { + if (i.matches(e)) return [i]; + i = i.previousElementSibling + } + return [] + }, + next(t, e) { + let i = t.nextElementSibling; + for (; i;) { + if (i.matches(e)) return [i]; + i = i.nextElementSibling + } + return [] + }, + focusableChildren(t) { + const e = ["a", "button", "input", "textarea", "select", "details", "[tabindex]", '[contenteditable="true"]'].map((t => `${t}:not([tabindex^="-"])`)).join(","); + return this.find(e, t).filter((t => !l(t) && a(t))) + }, + getSelectorFromElement(t) { + const e = B(t); + return e && z.findOne(e) ? e : null + }, + getElementFromSelector(t) { + const e = B(t); + return e ? z.findOne(e) : null + }, + getMultipleElementsFromSelector(t) { + const e = B(t); + return e ? z.find(e) : [] + } +}, R = (t, e = "hide") => { + const i = `click.dismiss${t.EVENT_KEY}`, n = t.NAME; + P.on(document, i, `[data-bs-dismiss="${n}"]`, (function (i) { + if (["A", "AREA"].includes(this.tagName) && i.preventDefault(), l(this)) return; + const s = z.getElementFromSelector(this) || this.closest(`.${n}`); + t.getOrCreateInstance(s)[e]() + })) +}; + +class q extends W { + static get NAME() { + return "alert" + } + + close() { + if (P.trigger(this._element, "close.bs.alert").defaultPrevented) return; + this._element.classList.remove("show"); + const t = this._element.classList.contains("fade"); + this._queueCallback((() => this._destroyElement()), this._element, t) + } + + _destroyElement() { + this._element.remove(), P.trigger(this._element, "closed.bs.alert"), this.dispose() + } + + static jQueryInterface(t) { + return this.each((function () { + const e = q.getOrCreateInstance(this); + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t](this) + } + })) + } +} + +R(q, "close"), m(q); +const V = '[data-bs-toggle="button"]'; + +class K extends W { + static get NAME() { + return "button" + } + + toggle() { + this._element.setAttribute("aria-pressed", this._element.classList.toggle("active")) + } + + static jQueryInterface(t) { + return this.each((function () { + const e = K.getOrCreateInstance(this); + "toggle" === t && e[t]() + })) + } +} + +P.on(document, "click.bs.button.data-api", V, (t => { + t.preventDefault(); + const e = t.target.closest(V); + K.getOrCreateInstance(e).toggle() +})), m(K); +const Q = {endCallback: null, leftCallback: null, rightCallback: null}, + X = {endCallback: "(function|null)", leftCallback: "(function|null)", rightCallback: "(function|null)"}; + +class Y extends ${constructor(t,e){super(),this._element=t,t&&Y.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static + +get +Default() +{ + return Q +} +static +get +DefaultType() +{ + return X +} +static +get +NAME() +{ + return "swipe" +} +dispose() +{ + P.off(this._element, ".bs.swipe") +} +_start(t) +{ + this._supportPointerEvents ? this._eventIsPointerPenTouch(t) && (this._deltaX = t.clientX) : this._deltaX = t.touches[0].clientX +} +_end(t) +{ + this._eventIsPointerPenTouch(t) && (this._deltaX = t.clientX - this._deltaX), this._handleSwipe(), g(this._config.endCallback) +} +_move(t) +{ + this._deltaX = t.touches && t.touches.length > 1 ? 0 : t.touches[0].clientX - this._deltaX +} +_handleSwipe() +{ + const t = Math.abs(this._deltaX); + if (t <= 40) return; + const e = t / this._deltaX; + this._deltaX = 0, e && g(e > 0 ? this._config.rightCallback : this._config.leftCallback) +} +_initEvents() +{ + this._supportPointerEvents ? (P.on(this._element, "pointerdown.bs.swipe", (t => this._start(t))), P.on(this._element, "pointerup.bs.swipe", (t => this._end(t))), this._element.classList.add("pointer-event")) : (P.on(this._element, "touchstart.bs.swipe", (t => this._start(t))), P.on(this._element, "touchmove.bs.swipe", (t => this._move(t))), P.on(this._element, "touchend.bs.swipe", (t => this._end(t)))) +} +_eventIsPointerPenTouch(t) +{ + return this._supportPointerEvents && ("pen" === t.pointerType || "touch" === t.pointerType) +} +static +isSupported() +{ + return "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0 +} +} +const U = "next", G = "prev", J = "left", Z = "right", tt = "slid.bs.carousel", et = "carousel", it = "active", + nt = {ArrowLeft: Z, ArrowRight: J}, + st = {interval: 5e3, keyboard: !0, pause: "hover", ride: !1, touch: !0, wrap: !0}, ot = { + interval: "(number|boolean)", + keyboard: "boolean", + pause: "(string|boolean)", + ride: "(boolean|string)", + touch: "boolean", + wrap: "boolean" + }; + +class rt extends W { + constructor(t, e) { + super(t, e), this._interval = null, this._activeElement = null, this._isSliding = !1, this.touchTimeout = null, this._swipeHelper = null, this._indicatorsElement = z.findOne(".carousel-indicators", this._element), this._addEventListeners(), this._config.ride === et && this.cycle() + } + + static get Default() { + return st + } + + static get DefaultType() { + return ot + } + + static get NAME() { + return "carousel" + } + + next() { + this._slide(U) + } + + nextWhenVisible() { + !document.hidden && a(this._element) && this.next() + } + + prev() { + this._slide(G) + } + + pause() { + this._isSliding && s(this._element), this._clearInterval() + } + + cycle() { + this._clearInterval(), this._updateInterval(), this._interval = setInterval((() => this.nextWhenVisible()), this._config.interval) + } + + _maybeEnableCycle() { + this._config.ride && (this._isSliding ? P.one(this._element, tt, (() => this.cycle())) : this.cycle()) + } + + to(t) { + const e = this._getItems(); + if (t > e.length - 1 || t < 0) return; + if (this._isSliding) return void P.one(this._element, tt, (() => this.to(t))); + const i = this._getItemIndex(this._getActive()); + if (i === t) return; + const n = t > i ? U : G; + this._slide(n, e[t]) + } + + dispose() { + this._swipeHelper && this._swipeHelper.dispose(), super.dispose() + } + + _configAfterMerge(t) { + return t.defaultInterval = t.interval, t + } + + _addEventListeners() { + this._config.keyboard && P.on(this._element, "keydown.bs.carousel", (t => this._keydown(t))), "hover" === this._config.pause && (P.on(this._element, "mouseenter.bs.carousel", (() => this.pause())), P.on(this._element, "mouseleave.bs.carousel", (() => this._maybeEnableCycle()))), this._config.touch && Y.isSupported() && this._addTouchEventListeners() + } + + _addTouchEventListeners() { + for (const t of z.find(".carousel-item img", this._element)) P.on(t, "dragstart.bs.carousel", (t => t.preventDefault())); + const t = { + leftCallback: () => this._slide(this._directionToOrder(J)), + rightCallback: () => this._slide(this._directionToOrder(Z)), + endCallback: () => { + "hover" === this._config.pause && (this.pause(), this.touchTimeout && clearTimeout(this.touchTimeout), this.touchTimeout = setTimeout((() => this._maybeEnableCycle()), 500 + this._config.interval)) + } + }; + this._swipeHelper = new Y(this._element, t) + } + + _keydown(t) { + if (/input|textarea/i.test(t.target.tagName)) return; + const e = nt[t.key]; + e && (t.preventDefault(), this._slide(this._directionToOrder(e))) + } + + _getItemIndex(t) { + return this._getItems().indexOf(t) + } + + _setActiveIndicatorElement(t) { + if (!this._indicatorsElement) return; + const e = z.findOne(".active", this._indicatorsElement); + e.classList.remove(it), e.removeAttribute("aria-current"); + const i = z.findOne(`[data-bs-slide-to="${t}"]`, this._indicatorsElement); + i && (i.classList.add(it), i.setAttribute("aria-current", "true")) + } + + _updateInterval() { + const t = this._activeElement || this._getActive(); + if (!t) return; + const e = Number.parseInt(t.getAttribute("data-bs-interval"), 10); + this._config.interval = e || this._config.defaultInterval + } + + _slide(t, e = null) { + if (this._isSliding) return; + const i = this._getActive(), n = t === U, s = e || b(this._getItems(), i, n, this._config.wrap); + if (s === i) return; + const o = this._getItemIndex(s), r = e => P.trigger(this._element, e, { + relatedTarget: s, + direction: this._orderToDirection(t), + from: this._getItemIndex(i), + to: o + }); + if (r("slide.bs.carousel").defaultPrevented) return; + if (!i || !s) return; + const a = Boolean(this._interval); + this.pause(), this._isSliding = !0, this._setActiveIndicatorElement(o), this._activeElement = s; + const l = n ? "carousel-item-start" : "carousel-item-end", c = n ? "carousel-item-next" : "carousel-item-prev"; + s.classList.add(c), d(s), i.classList.add(l), s.classList.add(l), this._queueCallback((() => { + s.classList.remove(l, c), s.classList.add(it), i.classList.remove(it, c, l), this._isSliding = !1, r(tt) + }), i, this._isAnimated()), a && this.cycle() + } + + _isAnimated() { + return this._element.classList.contains("slide") + } + + _getActive() { + return z.findOne(".active.carousel-item", this._element) + } + + _getItems() { + return z.find(".carousel-item", this._element) + } + + _clearInterval() { + this._interval && (clearInterval(this._interval), this._interval = null) + } + + _directionToOrder(t) { + return p() ? t === J ? G : U : t === J ? U : G + } + + _orderToDirection(t) { + return p() ? t === G ? J : Z : t === G ? Z : J + } + + static jQueryInterface(t) { + return this.each((function () { + const e = rt.getOrCreateInstance(this, t); + if ("number" != typeof t) { + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t]() + } + } else e.to(t) + })) + } +} + +P.on(document, "click.bs.carousel.data-api", "[data-bs-slide], [data-bs-slide-to]", (function (t) { + const e = z.getElementFromSelector(this); + if (!e || !e.classList.contains(et)) return; + t.preventDefault(); + const i = rt.getOrCreateInstance(e), n = this.getAttribute("data-bs-slide-to"); + return n ? (i.to(n), void i._maybeEnableCycle()) : "next" === H.getDataAttribute(this, "slide") ? (i.next(), void i._maybeEnableCycle()) : (i.prev(), void i._maybeEnableCycle()) +})), P.on(window, "load.bs.carousel.data-api", (() => { + const t = z.find('[data-bs-ride="carousel"]'); + for (const e of t) rt.getOrCreateInstance(e) +})), m(rt); +const at = "show", lt = "collapse", ct = "collapsing", ht = '[data-bs-toggle="collapse"]', + dt = {parent: null, toggle: !0}, ut = {parent: "(null|element)", toggle: "boolean"}; + +class ft extends W { + constructor(t, e) { + super(t, e), this._isTransitioning = !1, this._triggerArray = []; + const i = z.find(ht); + for (const t of i) { + const e = z.getSelectorFromElement(t), i = z.find(e).filter((t => t === this._element)); + null !== e && i.length && this._triggerArray.push(t) + } + this._initializeChildren(), this._config.parent || this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()), this._config.toggle && this.toggle() + } + + static get Default() { + return dt + } + + static get DefaultType() { + return ut + } + + static get NAME() { + return "collapse" + } + + toggle() { + this._isShown() ? this.hide() : this.show() + } + + show() { + if (this._isTransitioning || this._isShown()) return; + let t = []; + if (this._config.parent && (t = this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t => t !== this._element)).map((t => ft.getOrCreateInstance(t, {toggle: !1})))), t.length && t[0]._isTransitioning) return; + if (P.trigger(this._element, "show.bs.collapse").defaultPrevented) return; + for (const e of t) e.hide(); + const e = this._getDimension(); + this._element.classList.remove(lt), this._element.classList.add(ct), this._element.style[e] = 0, this._addAriaAndCollapsedClass(this._triggerArray, !0), this._isTransitioning = !0; + const i = `scroll${e[0].toUpperCase() + e.slice(1)}`; + this._queueCallback((() => { + this._isTransitioning = !1, this._element.classList.remove(ct), this._element.classList.add(lt, at), this._element.style[e] = "", P.trigger(this._element, "shown.bs.collapse") + }), this._element, !0), this._element.style[e] = `${this._element[i]}px` + } + + hide() { + if (this._isTransitioning || !this._isShown()) return; + if (P.trigger(this._element, "hide.bs.collapse").defaultPrevented) return; + const t = this._getDimension(); + this._element.style[t] = `${this._element.getBoundingClientRect()[t]}px`, d(this._element), this._element.classList.add(ct), this._element.classList.remove(lt, at); + for (const t of this._triggerArray) { + const e = z.getElementFromSelector(t); + e && !this._isShown(e) && this._addAriaAndCollapsedClass([t], !1) + } + this._isTransitioning = !0, this._element.style[t] = "", this._queueCallback((() => { + this._isTransitioning = !1, this._element.classList.remove(ct), this._element.classList.add(lt), P.trigger(this._element, "hidden.bs.collapse") + }), this._element, !0) + } + + _isShown(t = this._element) { + return t.classList.contains(at) + } + + _configAfterMerge(t) { + return t.toggle = Boolean(t.toggle), t.parent = r(t.parent), t + } + + _getDimension() { + return this._element.classList.contains("collapse-horizontal") ? "width" : "height" + } + + _initializeChildren() { + if (!this._config.parent) return; + const t = this._getFirstLevelChildren(ht); + for (const e of t) { + const t = z.getElementFromSelector(e); + t && this._addAriaAndCollapsedClass([e], this._isShown(t)) + } + } + + _getFirstLevelChildren(t) { + const e = z.find(":scope .collapse .collapse", this._config.parent); + return z.find(t, this._config.parent).filter((t => !e.includes(t))) + } + + _addAriaAndCollapsedClass(t, e) { + if (t.length) for (const i of t) i.classList.toggle("collapsed", !e), i.setAttribute("aria-expanded", e) + } + + static jQueryInterface(t) { + const e = {}; + return "string" == typeof t && /show|hide/.test(t) && (e.toggle = !1), this.each((function () { + const i = ft.getOrCreateInstance(this, e); + if ("string" == typeof t) { + if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); + i[t]() + } + })) + } +} + +P.on(document, "click.bs.collapse.data-api", ht, (function (t) { + ("A" === t.target.tagName || t.delegateTarget && "A" === t.delegateTarget.tagName) && t.preventDefault(); + for (const t of z.getMultipleElementsFromSelector(this)) ft.getOrCreateInstance(t, {toggle: !1}).toggle() +})), m(ft); +var pt = "top", mt = "bottom", gt = "right", _t = "left", bt = "auto", vt = [pt, mt, gt, _t], yt = "start", wt = "end", + At = "clippingParents", Et = "viewport", Tt = "popper", Ct = "reference", Ot = vt.reduce((function (t, e) { + return t.concat([e + "-" + yt, e + "-" + wt]) + }), []), xt = [].concat(vt, [bt]).reduce((function (t, e) { + return t.concat([e, e + "-" + yt, e + "-" + wt]) + }), []), kt = "beforeRead", Lt = "read", St = "afterRead", Dt = "beforeMain", It = "main", Nt = "afterMain", + Pt = "beforeWrite", Mt = "write", jt = "afterWrite", Ft = [kt, Lt, St, Dt, It, Nt, Pt, Mt, jt]; + +function Ht(t) { + return t ? (t.nodeName || "").toLowerCase() : null +} + +function $t(t) { + if (null == t) return window; + if ("[object Window]" !== t.toString()) { + var e = t.ownerDocument; + return e && e.defaultView || window + } + return t +} + +function Wt(t) { + return t instanceof $t(t).Element || t instanceof Element +} + +function Bt(t) { + return t instanceof $t(t).HTMLElement || t instanceof HTMLElement +} + +function zt(t) { + return "undefined" != typeof ShadowRoot && (t instanceof $t(t).ShadowRoot || t instanceof ShadowRoot) +} + +const Rt = { + name: "applyStyles", enabled: !0, phase: "write", fn: function (t) { + var e = t.state; + Object.keys(e.elements).forEach((function (t) { + var i = e.styles[t] || {}, n = e.attributes[t] || {}, s = e.elements[t]; + Bt(s) && Ht(s) && (Object.assign(s.style, i), Object.keys(n).forEach((function (t) { + var e = n[t]; + !1 === e ? s.removeAttribute(t) : s.setAttribute(t, !0 === e ? "" : e) + }))) + })) + }, effect: function (t) { + var e = t.state, i = { + popper: {position: e.options.strategy, left: "0", top: "0", margin: "0"}, + arrow: {position: "absolute"}, + reference: {} + }; + return Object.assign(e.elements.popper.style, i.popper), e.styles = i, e.elements.arrow && Object.assign(e.elements.arrow.style, i.arrow), function () { + Object.keys(e.elements).forEach((function (t) { + var n = e.elements[t], s = e.attributes[t] || {}, + o = Object.keys(e.styles.hasOwnProperty(t) ? e.styles[t] : i[t]).reduce((function (t, e) { + return t[e] = "", t + }), {}); + Bt(n) && Ht(n) && (Object.assign(n.style, o), Object.keys(s).forEach((function (t) { + n.removeAttribute(t) + }))) + })) + } + }, requires: ["computeStyles"] +}; + +function qt(t) { + return t.split("-")[0] +} + +var Vt = Math.max, Kt = Math.min, Qt = Math.round; + +function Xt() { + var t = navigator.userAgentData; + return null != t && t.brands && Array.isArray(t.brands) ? t.brands.map((function (t) { + return t.brand + "/" + t.version + })).join(" ") : navigator.userAgent +} + +function Yt() { + return !/^((?!chrome|android).)*safari/i.test(Xt()) +} + +function Ut(t, e, i) { + void 0 === e && (e = !1), void 0 === i && (i = !1); + var n = t.getBoundingClientRect(), s = 1, o = 1; + e && Bt(t) && (s = t.offsetWidth > 0 && Qt(n.width) / t.offsetWidth || 1, o = t.offsetHeight > 0 && Qt(n.height) / t.offsetHeight || 1); + var r = (Wt(t) ? $t(t) : window).visualViewport, a = !Yt() && i, l = (n.left + (a && r ? r.offsetLeft : 0)) / s, + c = (n.top + (a && r ? r.offsetTop : 0)) / o, h = n.width / s, d = n.height / o; + return {width: h, height: d, top: c, right: l + h, bottom: c + d, left: l, x: l, y: c} +} + +function Gt(t) { + var e = Ut(t), i = t.offsetWidth, n = t.offsetHeight; + return Math.abs(e.width - i) <= 1 && (i = e.width), Math.abs(e.height - n) <= 1 && (n = e.height), { + x: t.offsetLeft, + y: t.offsetTop, + width: i, + height: n + } +} + +function Jt(t, e) { + var i = e.getRootNode && e.getRootNode(); + if (t.contains(e)) return !0; + if (i && zt(i)) { + var n = e; + do { + if (n && t.isSameNode(n)) return !0; + n = n.parentNode || n.host + } while (n) + } + return !1 +} + +function Zt(t) { + return $t(t).getComputedStyle(t) +} + +function te(t) { + return ["table", "td", "th"].indexOf(Ht(t)) >= 0 +} + +function ee(t) { + return ((Wt(t) ? t.ownerDocument : t.document) || window.document).documentElement +} + +function ie(t) { + return "html" === Ht(t) ? t : t.assignedSlot || t.parentNode || (zt(t) ? t.host : null) || ee(t) +} + +function ne(t) { + return Bt(t) && "fixed" !== Zt(t).position ? t.offsetParent : null +} + +function se(t) { + for (var e = $t(t), i = ne(t); i && te(i) && "static" === Zt(i).position;) i = ne(i); + return i && ("html" === Ht(i) || "body" === Ht(i) && "static" === Zt(i).position) ? e : i || function (t) { + var e = /firefox/i.test(Xt()); + if (/Trident/i.test(Xt()) && Bt(t) && "fixed" === Zt(t).position) return null; + var i = ie(t); + for (zt(i) && (i = i.host); Bt(i) && ["html", "body"].indexOf(Ht(i)) < 0;) { + var n = Zt(i); + if ("none" !== n.transform || "none" !== n.perspective || "paint" === n.contain || -1 !== ["transform", "perspective"].indexOf(n.willChange) || e && "filter" === n.willChange || e && n.filter && "none" !== n.filter) return i; + i = i.parentNode + } + return null + }(t) || e +} + +function oe(t) { + return ["top", "bottom"].indexOf(t) >= 0 ? "x" : "y" +} + +function re(t, e, i) { + return Vt(t, Kt(e, i)) +} + +function ae(t) { + return Object.assign({}, {top: 0, right: 0, bottom: 0, left: 0}, t) +} + +function le(t, e) { + return e.reduce((function (e, i) { + return e[i] = t, e + }), {}) +} + +const ce = { + name: "arrow", enabled: !0, phase: "main", fn: function (t) { + var e, i = t.state, n = t.name, s = t.options, o = i.elements.arrow, r = i.modifiersData.popperOffsets, + a = qt(i.placement), l = oe(a), c = [_t, gt].indexOf(a) >= 0 ? "height" : "width"; + if (o && r) { + var h = function (t, e) { + return ae("number" != typeof (t = "function" == typeof t ? t(Object.assign({}, e.rects, {placement: e.placement})) : t) ? t : le(t, vt)) + }(s.padding, i), d = Gt(o), u = "y" === l ? pt : _t, f = "y" === l ? mt : gt, + p = i.rects.reference[c] + i.rects.reference[l] - r[l] - i.rects.popper[c], + m = r[l] - i.rects.reference[l], g = se(o), + _ = g ? "y" === l ? g.clientHeight || 0 : g.clientWidth || 0 : 0, b = p / 2 - m / 2, v = h[u], + y = _ - d[c] - h[f], w = _ / 2 - d[c] / 2 + b, A = re(v, w, y), E = l; + i.modifiersData[n] = ((e = {})[E] = A, e.centerOffset = A - w, e) + } + }, effect: function (t) { + var e = t.state, i = t.options.element, n = void 0 === i ? "[data-popper-arrow]" : i; + null != n && ("string" != typeof n || (n = e.elements.popper.querySelector(n))) && Jt(e.elements.popper, n) && (e.elements.arrow = n) + }, requires: ["popperOffsets"], requiresIfExists: ["preventOverflow"] +}; + +function he(t) { + return t.split("-")[1] +} + +var de = {top: "auto", right: "auto", bottom: "auto", left: "auto"}; + +function ue(t) { + var e, i = t.popper, n = t.popperRect, s = t.placement, o = t.variation, r = t.offsets, a = t.position, + l = t.gpuAcceleration, c = t.adaptive, h = t.roundOffsets, d = t.isFixed, u = r.x, f = void 0 === u ? 0 : u, + p = r.y, m = void 0 === p ? 0 : p, g = "function" == typeof h ? h({x: f, y: m}) : {x: f, y: m}; + f = g.x, m = g.y; + var _ = r.hasOwnProperty("x"), b = r.hasOwnProperty("y"), v = _t, y = pt, w = window; + if (c) { + var A = se(i), E = "clientHeight", T = "clientWidth"; + A === $t(i) && "static" !== Zt(A = ee(i)).position && "absolute" === a && (E = "scrollHeight", T = "scrollWidth"), (s === pt || (s === _t || s === gt) && o === wt) && (y = mt, m -= (d && A === w && w.visualViewport ? w.visualViewport.height : A[E]) - n.height, m *= l ? 1 : -1), s !== _t && (s !== pt && s !== mt || o !== wt) || (v = gt, f -= (d && A === w && w.visualViewport ? w.visualViewport.width : A[T]) - n.width, f *= l ? 1 : -1) + } + var C, O = Object.assign({position: a}, c && de), x = !0 === h ? function (t, e) { + var i = t.x, n = t.y, s = e.devicePixelRatio || 1; + return {x: Qt(i * s) / s || 0, y: Qt(n * s) / s || 0} + }({x: f, y: m}, $t(i)) : {x: f, y: m}; + return f = x.x, m = x.y, l ? Object.assign({}, O, ((C = {})[y] = b ? "0" : "", C[v] = _ ? "0" : "", C.transform = (w.devicePixelRatio || 1) <= 1 ? "translate(" + f + "px, " + m + "px)" : "translate3d(" + f + "px, " + m + "px, 0)", C)) : Object.assign({}, O, ((e = {})[y] = b ? m + "px" : "", e[v] = _ ? f + "px" : "", e.transform = "", e)) +} + +const fe = { + name: "computeStyles", enabled: !0, phase: "beforeWrite", fn: function (t) { + var e = t.state, i = t.options, n = i.gpuAcceleration, s = void 0 === n || n, o = i.adaptive, + r = void 0 === o || o, a = i.roundOffsets, l = void 0 === a || a, c = { + placement: qt(e.placement), + variation: he(e.placement), + popper: e.elements.popper, + popperRect: e.rects.popper, + gpuAcceleration: s, + isFixed: "fixed" === e.options.strategy + }; + null != e.modifiersData.popperOffsets && (e.styles.popper = Object.assign({}, e.styles.popper, ue(Object.assign({}, c, { + offsets: e.modifiersData.popperOffsets, + position: e.options.strategy, + adaptive: r, + roundOffsets: l + })))), null != e.modifiersData.arrow && (e.styles.arrow = Object.assign({}, e.styles.arrow, ue(Object.assign({}, c, { + offsets: e.modifiersData.arrow, + position: "absolute", + adaptive: !1, + roundOffsets: l + })))), e.attributes.popper = Object.assign({}, e.attributes.popper, {"data-popper-placement": e.placement}) + }, data: {} +}; +var pe = {passive: !0}; +const me = { + name: "eventListeners", enabled: !0, phase: "write", fn: function () { + }, effect: function (t) { + var e = t.state, i = t.instance, n = t.options, s = n.scroll, o = void 0 === s || s, r = n.resize, + a = void 0 === r || r, l = $t(e.elements.popper), + c = [].concat(e.scrollParents.reference, e.scrollParents.popper); + return o && c.forEach((function (t) { + t.addEventListener("scroll", i.update, pe) + })), a && l.addEventListener("resize", i.update, pe), function () { + o && c.forEach((function (t) { + t.removeEventListener("scroll", i.update, pe) + })), a && l.removeEventListener("resize", i.update, pe) + } + }, data: {} +}; +var ge = {left: "right", right: "left", bottom: "top", top: "bottom"}; + +function _e(t) { + return t.replace(/left|right|bottom|top/g, (function (t) { + return ge[t] + })) +} + +var be = {start: "end", end: "start"}; + +function ve(t) { + return t.replace(/start|end/g, (function (t) { + return be[t] + })) +} + +function ye(t) { + var e = $t(t); + return {scrollLeft: e.pageXOffset, scrollTop: e.pageYOffset} +} + +function we(t) { + return Ut(ee(t)).left + ye(t).scrollLeft +} + +function Ae(t) { + var e = Zt(t), i = e.overflow, n = e.overflowX, s = e.overflowY; + return /auto|scroll|overlay|hidden/.test(i + s + n) +} + +function Ee(t) { + return ["html", "body", "#document"].indexOf(Ht(t)) >= 0 ? t.ownerDocument.body : Bt(t) && Ae(t) ? t : Ee(ie(t)) +} + +function Te(t, e) { + var i; + void 0 === e && (e = []); + var n = Ee(t), s = n === (null == (i = t.ownerDocument) ? void 0 : i.body), o = $t(n), + r = s ? [o].concat(o.visualViewport || [], Ae(n) ? n : []) : n, a = e.concat(r); + return s ? a : a.concat(Te(ie(r))) +} + +function Ce(t) { + return Object.assign({}, t, {left: t.x, top: t.y, right: t.x + t.width, bottom: t.y + t.height}) +} + +function Oe(t, e, i) { + return e === Et ? Ce(function (t, e) { + var i = $t(t), n = ee(t), s = i.visualViewport, o = n.clientWidth, r = n.clientHeight, a = 0, l = 0; + if (s) { + o = s.width, r = s.height; + var c = Yt(); + (c || !c && "fixed" === e) && (a = s.offsetLeft, l = s.offsetTop) + } + return {width: o, height: r, x: a + we(t), y: l} + }(t, i)) : Wt(e) ? function (t, e) { + var i = Ut(t, !1, "fixed" === e); + return i.top = i.top + t.clientTop, i.left = i.left + t.clientLeft, i.bottom = i.top + t.clientHeight, i.right = i.left + t.clientWidth, i.width = t.clientWidth, i.height = t.clientHeight, i.x = i.left, i.y = i.top, i + }(e, i) : Ce(function (t) { + var e, i = ee(t), n = ye(t), s = null == (e = t.ownerDocument) ? void 0 : e.body, + o = Vt(i.scrollWidth, i.clientWidth, s ? s.scrollWidth : 0, s ? s.clientWidth : 0), + r = Vt(i.scrollHeight, i.clientHeight, s ? s.scrollHeight : 0, s ? s.clientHeight : 0), + a = -n.scrollLeft + we(t), l = -n.scrollTop; + return "rtl" === Zt(s || i).direction && (a += Vt(i.clientWidth, s ? s.clientWidth : 0) - o), { + width: o, + height: r, + x: a, + y: l + } + }(ee(t))) +} + +function xe(t) { + var e, i = t.reference, n = t.element, s = t.placement, o = s ? qt(s) : null, r = s ? he(s) : null, + a = i.x + i.width / 2 - n.width / 2, l = i.y + i.height / 2 - n.height / 2; + switch (o) { + case pt: + e = {x: a, y: i.y - n.height}; + break; + case mt: + e = {x: a, y: i.y + i.height}; + break; + case gt: + e = {x: i.x + i.width, y: l}; + break; + case _t: + e = {x: i.x - n.width, y: l}; + break; + default: + e = {x: i.x, y: i.y} + } + var c = o ? oe(o) : null; + if (null != c) { + var h = "y" === c ? "height" : "width"; + switch (r) { + case yt: + e[c] = e[c] - (i[h] / 2 - n[h] / 2); + break; + case wt: + e[c] = e[c] + (i[h] / 2 - n[h] / 2) + } + } + return e +} + +function ke(t, e) { + void 0 === e && (e = {}); + var i = e, n = i.placement, s = void 0 === n ? t.placement : n, o = i.strategy, r = void 0 === o ? t.strategy : o, + a = i.boundary, l = void 0 === a ? At : a, c = i.rootBoundary, h = void 0 === c ? Et : c, d = i.elementContext, + u = void 0 === d ? Tt : d, f = i.altBoundary, p = void 0 !== f && f, m = i.padding, g = void 0 === m ? 0 : m, + _ = ae("number" != typeof g ? g : le(g, vt)), b = u === Tt ? Ct : Tt, v = t.rects.popper, + y = t.elements[p ? b : u], w = function (t, e, i, n) { + var s = "clippingParents" === e ? function (t) { + var e = Te(ie(t)), i = ["absolute", "fixed"].indexOf(Zt(t).position) >= 0 && Bt(t) ? se(t) : t; + return Wt(i) ? e.filter((function (t) { + return Wt(t) && Jt(t, i) && "body" !== Ht(t) + })) : [] + }(t) : [].concat(e), o = [].concat(s, [i]), r = o[0], a = o.reduce((function (e, i) { + var s = Oe(t, i, n); + return e.top = Vt(s.top, e.top), e.right = Kt(s.right, e.right), e.bottom = Kt(s.bottom, e.bottom), e.left = Vt(s.left, e.left), e + }), Oe(t, r, n)); + return a.width = a.right - a.left, a.height = a.bottom - a.top, a.x = a.left, a.y = a.top, a + }(Wt(y) ? y : y.contextElement || ee(t.elements.popper), l, h, r), A = Ut(t.elements.reference), + E = xe({reference: A, element: v, strategy: "absolute", placement: s}), T = Ce(Object.assign({}, v, E)), + C = u === Tt ? T : A, O = { + top: w.top - C.top + _.top, + bottom: C.bottom - w.bottom + _.bottom, + left: w.left - C.left + _.left, + right: C.right - w.right + _.right + }, x = t.modifiersData.offset; + if (u === Tt && x) { + var k = x[s]; + Object.keys(O).forEach((function (t) { + var e = [gt, mt].indexOf(t) >= 0 ? 1 : -1, i = [pt, mt].indexOf(t) >= 0 ? "y" : "x"; + O[t] += k[i] * e + })) + } + return O +} + +function Le(t, e) { + void 0 === e && (e = {}); + var i = e, n = i.placement, s = i.boundary, o = i.rootBoundary, r = i.padding, a = i.flipVariations, + l = i.allowedAutoPlacements, c = void 0 === l ? xt : l, h = he(n), d = h ? a ? Ot : Ot.filter((function (t) { + return he(t) === h + })) : vt, u = d.filter((function (t) { + return c.indexOf(t) >= 0 + })); + 0 === u.length && (u = d); + var f = u.reduce((function (e, i) { + return e[i] = ke(t, {placement: i, boundary: s, rootBoundary: o, padding: r})[qt(i)], e + }), {}); + return Object.keys(f).sort((function (t, e) { + return f[t] - f[e] + })) +} + +const Se = { + name: "flip", enabled: !0, phase: "main", fn: function (t) { + var e = t.state, i = t.options, n = t.name; + if (!e.modifiersData[n]._skip) { + for (var s = i.mainAxis, o = void 0 === s || s, r = i.altAxis, a = void 0 === r || r, l = i.fallbackPlacements, c = i.padding, h = i.boundary, d = i.rootBoundary, u = i.altBoundary, f = i.flipVariations, p = void 0 === f || f, m = i.allowedAutoPlacements, g = e.options.placement, _ = qt(g), b = l || (_ !== g && p ? function (t) { + if (qt(t) === bt) return []; + var e = _e(t); + return [ve(t), e, ve(e)] + }(g) : [_e(g)]), v = [g].concat(b).reduce((function (t, i) { + return t.concat(qt(i) === bt ? Le(e, { + placement: i, + boundary: h, + rootBoundary: d, + padding: c, + flipVariations: p, + allowedAutoPlacements: m + }) : i) + }), []), y = e.rects.reference, w = e.rects.popper, A = new Map, E = !0, T = v[0], C = 0; C < v.length; C++) { + var O = v[C], x = qt(O), k = he(O) === yt, L = [pt, mt].indexOf(x) >= 0, S = L ? "width" : "height", + D = ke(e, {placement: O, boundary: h, rootBoundary: d, altBoundary: u, padding: c}), + I = L ? k ? gt : _t : k ? mt : pt; + y[S] > w[S] && (I = _e(I)); + var N = _e(I), P = []; + if (o && P.push(D[x] <= 0), a && P.push(D[I] <= 0, D[N] <= 0), P.every((function (t) { + return t + }))) { + T = O, E = !1; + break + } + A.set(O, P) + } + if (E) for (var M = function (t) { + var e = v.find((function (e) { + var i = A.get(e); + if (i) return i.slice(0, t).every((function (t) { + return t + })) + })); + if (e) return T = e, "break" + }, j = p ? 3 : 1; j > 0 && "break" !== M(j); j--) ; + e.placement !== T && (e.modifiersData[n]._skip = !0, e.placement = T, e.reset = !0) + } + }, requiresIfExists: ["offset"], data: {_skip: !1} +}; + +function De(t, e, i) { + return void 0 === i && (i = {x: 0, y: 0}), { + top: t.top - e.height - i.y, + right: t.right - e.width + i.x, + bottom: t.bottom - e.height + i.y, + left: t.left - e.width - i.x + } +} + +function Ie(t) { + return [pt, gt, mt, _t].some((function (e) { + return t[e] >= 0 + })) +} + +const Ne = { + name: "hide", enabled: !0, phase: "main", requiresIfExists: ["preventOverflow"], fn: function (t) { + var e = t.state, i = t.name, n = e.rects.reference, s = e.rects.popper, o = e.modifiersData.preventOverflow, + r = ke(e, {elementContext: "reference"}), a = ke(e, {altBoundary: !0}), l = De(r, n), c = De(a, s, o), + h = Ie(l), d = Ie(c); + e.modifiersData[i] = { + referenceClippingOffsets: l, + popperEscapeOffsets: c, + isReferenceHidden: h, + hasPopperEscaped: d + }, e.attributes.popper = Object.assign({}, e.attributes.popper, { + "data-popper-reference-hidden": h, + "data-popper-escaped": d + }) + } +}, Pe = { + name: "offset", enabled: !0, phase: "main", requires: ["popperOffsets"], fn: function (t) { + var e = t.state, i = t.options, n = t.name, s = i.offset, o = void 0 === s ? [0, 0] : s, + r = xt.reduce((function (t, i) { + return t[i] = function (t, e, i) { + var n = qt(t), s = [_t, pt].indexOf(n) >= 0 ? -1 : 1, + o = "function" == typeof i ? i(Object.assign({}, e, {placement: t})) : i, r = o[0], a = o[1]; + return r = r || 0, a = (a || 0) * s, [_t, gt].indexOf(n) >= 0 ? {x: a, y: r} : {x: r, y: a} + }(i, e.rects, o), t + }), {}), a = r[e.placement], l = a.x, c = a.y; + null != e.modifiersData.popperOffsets && (e.modifiersData.popperOffsets.x += l, e.modifiersData.popperOffsets.y += c), e.modifiersData[n] = r + } +}, Me = { + name: "popperOffsets", enabled: !0, phase: "read", fn: function (t) { + var e = t.state, i = t.name; + e.modifiersData[i] = xe({ + reference: e.rects.reference, + element: e.rects.popper, + strategy: "absolute", + placement: e.placement + }) + }, data: {} +}, je = { + name: "preventOverflow", enabled: !0, phase: "main", fn: function (t) { + var e = t.state, i = t.options, n = t.name, s = i.mainAxis, o = void 0 === s || s, r = i.altAxis, + a = void 0 !== r && r, l = i.boundary, c = i.rootBoundary, h = i.altBoundary, d = i.padding, u = i.tether, + f = void 0 === u || u, p = i.tetherOffset, m = void 0 === p ? 0 : p, + g = ke(e, {boundary: l, rootBoundary: c, padding: d, altBoundary: h}), _ = qt(e.placement), + b = he(e.placement), v = !b, y = oe(_), w = "x" === y ? "y" : "x", A = e.modifiersData.popperOffsets, + E = e.rects.reference, T = e.rects.popper, + C = "function" == typeof m ? m(Object.assign({}, e.rects, {placement: e.placement})) : m, + O = "number" == typeof C ? {mainAxis: C, altAxis: C} : Object.assign({mainAxis: 0, altAxis: 0}, C), + x = e.modifiersData.offset ? e.modifiersData.offset[e.placement] : null, k = {x: 0, y: 0}; + if (A) { + if (o) { + var L, S = "y" === y ? pt : _t, D = "y" === y ? mt : gt, I = "y" === y ? "height" : "width", N = A[y], + P = N + g[S], M = N - g[D], j = f ? -T[I] / 2 : 0, F = b === yt ? E[I] : T[I], + H = b === yt ? -T[I] : -E[I], $ = e.elements.arrow, W = f && $ ? Gt($) : {width: 0, height: 0}, + B = e.modifiersData["arrow#persistent"] ? e.modifiersData["arrow#persistent"].padding : { + top: 0, + right: 0, + bottom: 0, + left: 0 + }, z = B[S], R = B[D], q = re(0, E[I], W[I]), + V = v ? E[I] / 2 - j - q - z - O.mainAxis : F - q - z - O.mainAxis, + K = v ? -E[I] / 2 + j + q + R + O.mainAxis : H + q + R + O.mainAxis, + Q = e.elements.arrow && se(e.elements.arrow), + X = Q ? "y" === y ? Q.clientTop || 0 : Q.clientLeft || 0 : 0, + Y = null != (L = null == x ? void 0 : x[y]) ? L : 0, U = N + K - Y, + G = re(f ? Kt(P, N + V - Y - X) : P, N, f ? Vt(M, U) : M); + A[y] = G, k[y] = G - N + } + if (a) { + var J, Z = "x" === y ? pt : _t, tt = "x" === y ? mt : gt, et = A[w], + it = "y" === w ? "height" : "width", nt = et + g[Z], st = et - g[tt], + ot = -1 !== [pt, _t].indexOf(_), rt = null != (J = null == x ? void 0 : x[w]) ? J : 0, + at = ot ? nt : et - E[it] - T[it] - rt + O.altAxis, + lt = ot ? et + E[it] + T[it] - rt - O.altAxis : st, ct = f && ot ? function (t, e, i) { + var n = re(t, e, i); + return n > i ? i : n + }(at, et, lt) : re(f ? at : nt, et, f ? lt : st); + A[w] = ct, k[w] = ct - et + } + e.modifiersData[n] = k + } + }, requiresIfExists: ["offset"] +}; + +function Fe(t, e, i) { + void 0 === i && (i = !1); + var n, s, o = Bt(e), r = Bt(e) && function (t) { + var e = t.getBoundingClientRect(), i = Qt(e.width) / t.offsetWidth || 1, n = Qt(e.height) / t.offsetHeight || 1; + return 1 !== i || 1 !== n + }(e), a = ee(e), l = Ut(t, r, i), c = {scrollLeft: 0, scrollTop: 0}, h = {x: 0, y: 0}; + return (o || !o && !i) && (("body" !== Ht(e) || Ae(a)) && (c = (n = e) !== $t(n) && Bt(n) ? { + scrollLeft: (s = n).scrollLeft, + scrollTop: s.scrollTop + } : ye(n)), Bt(e) ? ((h = Ut(e, !0)).x += e.clientLeft, h.y += e.clientTop) : a && (h.x = we(a))), { + x: l.left + c.scrollLeft - h.x, + y: l.top + c.scrollTop - h.y, + width: l.width, + height: l.height + } +} + +function He(t) { + var e = new Map, i = new Set, n = []; + + function s(t) { + i.add(t.name), [].concat(t.requires || [], t.requiresIfExists || []).forEach((function (t) { + if (!i.has(t)) { + var n = e.get(t); + n && s(n) + } + })), n.push(t) + } + + return t.forEach((function (t) { + e.set(t.name, t) + })), t.forEach((function (t) { + i.has(t.name) || s(t) + })), n +} + +var $e = {placement: "bottom", modifiers: [], strategy: "absolute"}; + +function We() { + for (var t = arguments.length, e = new Array(t), i = 0; i < t; i++) e[i] = arguments[i]; + return !e.some((function (t) { + return !(t && "function" == typeof t.getBoundingClientRect) + })) +} + +function Be(t) { + void 0 === t && (t = {}); + var e = t, i = e.defaultModifiers, n = void 0 === i ? [] : i, s = e.defaultOptions, o = void 0 === s ? $e : s; + return function (t, e, i) { + void 0 === i && (i = o); + var s, r, a = { + placement: "bottom", + orderedModifiers: [], + options: Object.assign({}, $e, o), + modifiersData: {}, + elements: {reference: t, popper: e}, + attributes: {}, + styles: {} + }, l = [], c = !1, h = { + state: a, setOptions: function (i) { + var s = "function" == typeof i ? i(a.options) : i; + d(), a.options = Object.assign({}, o, a.options, s), a.scrollParents = { + reference: Wt(t) ? Te(t) : t.contextElement ? Te(t.contextElement) : [], + popper: Te(e) + }; + var r, c, u = function (t) { + var e = He(t); + return Ft.reduce((function (t, i) { + return t.concat(e.filter((function (t) { + return t.phase === i + }))) + }), []) + }((r = [].concat(n, a.options.modifiers), c = r.reduce((function (t, e) { + var i = t[e.name]; + return t[e.name] = i ? Object.assign({}, i, e, { + options: Object.assign({}, i.options, e.options), + data: Object.assign({}, i.data, e.data) + }) : e, t + }), {}), Object.keys(c).map((function (t) { + return c[t] + })))); + return a.orderedModifiers = u.filter((function (t) { + return t.enabled + })), a.orderedModifiers.forEach((function (t) { + var e = t.name, i = t.options, n = void 0 === i ? {} : i, s = t.effect; + if ("function" == typeof s) { + var o = s({state: a, name: e, instance: h, options: n}); + l.push(o || function () { + }) + } + })), h.update() + }, forceUpdate: function () { + if (!c) { + var t = a.elements, e = t.reference, i = t.popper; + if (We(e, i)) { + a.rects = { + reference: Fe(e, se(i), "fixed" === a.options.strategy), + popper: Gt(i) + }, a.reset = !1, a.placement = a.options.placement, a.orderedModifiers.forEach((function (t) { + return a.modifiersData[t.name] = Object.assign({}, t.data) + })); + for (var n = 0; n < a.orderedModifiers.length; n++) if (!0 !== a.reset) { + var s = a.orderedModifiers[n], o = s.fn, r = s.options, l = void 0 === r ? {} : r, + d = s.name; + "function" == typeof o && (a = o({state: a, options: l, name: d, instance: h}) || a) + } else a.reset = !1, n = -1 + } + } + }, update: (s = function () { + return new Promise((function (t) { + h.forceUpdate(), t(a) + })) + }, function () { + return r || (r = new Promise((function (t) { + Promise.resolve().then((function () { + r = void 0, t(s()) + })) + }))), r + }), destroy: function () { + d(), c = !0 + } + }; + if (!We(t, e)) return h; + + function d() { + l.forEach((function (t) { + return t() + })), l = [] + } + + return h.setOptions(i).then((function (t) { + !c && i.onFirstUpdate && i.onFirstUpdate(t) + })), h + } +} + +var ze = Be(), Re = Be({defaultModifiers: [me, Me, fe, Rt]}), + qe = Be({defaultModifiers: [me, Me, fe, Rt, Pe, Se, je, ce, Ne]}); +const Ve = Object.freeze(Object.defineProperty({ + __proto__: null, + afterMain: Nt, + afterRead: St, + afterWrite: jt, + applyStyles: Rt, + arrow: ce, + auto: bt, + basePlacements: vt, + beforeMain: Dt, + beforeRead: kt, + beforeWrite: Pt, + bottom: mt, + clippingParents: At, + computeStyles: fe, + createPopper: qe, + createPopperBase: ze, + createPopperLite: Re, + detectOverflow: ke, + end: wt, + eventListeners: me, + flip: Se, + hide: Ne, + left: _t, + main: It, + modifierPhases: Ft, + offset: Pe, + placements: xt, + popper: Tt, + popperGenerator: Be, + popperOffsets: Me, + preventOverflow: je, + read: Lt, + reference: Ct, + right: gt, + start: yt, + top: pt, + variationPlacements: Ot, + viewport: Et, + write: Mt + }, Symbol.toStringTag, {value: "Module"})), Ke = "dropdown", Qe = "ArrowUp", Xe = "ArrowDown", + Ye = "click.bs.dropdown.data-api", Ue = "keydown.bs.dropdown.data-api", Ge = "show", + Je = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)', Ze = `${Je}.show`, ti = ".dropdown-menu", + ei = p() ? "top-end" : "top-start", ii = p() ? "top-start" : "top-end", ni = p() ? "bottom-end" : "bottom-start", + si = p() ? "bottom-start" : "bottom-end", oi = p() ? "left-start" : "right-start", + ri = p() ? "right-start" : "left-start", ai = { + autoClose: !0, + boundary: "clippingParents", + display: "dynamic", + offset: [0, 2], + popperConfig: null, + reference: "toggle" + }, li = { + autoClose: "(boolean|string)", + boundary: "(string|element)", + display: "string", + offset: "(array|string|function)", + popperConfig: "(null|object|function)", + reference: "(string|element|object)" + }; + +class ci extends W { + constructor(t, e) { + super(t, e), this._popper = null, this._parent = this._element.parentNode, this._menu = z.next(this._element, ti)[0] || z.prev(this._element, ti)[0] || z.findOne(ti, this._parent), this._inNavbar = this._detectNavbar() + } + + static get Default() { + return ai + } + + static get DefaultType() { + return li + } + + static get NAME() { + return Ke + } + + toggle() { + return this._isShown() ? this.hide() : this.show() + } + + show() { + if (l(this._element) || this._isShown()) return; + const t = {relatedTarget: this._element}; + if (!P.trigger(this._element, "show.bs.dropdown", t).defaultPrevented) { + if (this._createPopper(), "ontouchstart" in document.documentElement && !this._parent.closest(".navbar-nav")) for (const t of [].concat(...document.body.children)) P.on(t, "mouseover", h); + this._element.focus(), this._element.setAttribute("aria-expanded", !0), this._menu.classList.add(Ge), this._element.classList.add(Ge), P.trigger(this._element, "shown.bs.dropdown", t) + } + } + + hide() { + if (l(this._element) || !this._isShown()) return; + const t = {relatedTarget: this._element}; + this._completeHide(t) + } + + dispose() { + this._popper && this._popper.destroy(), super.dispose() + } + + update() { + this._inNavbar = this._detectNavbar(), this._popper && this._popper.update() + } + + _completeHide(t) { + if (!P.trigger(this._element, "hide.bs.dropdown", t).defaultPrevented) { + if ("ontouchstart" in document.documentElement) for (const t of [].concat(...document.body.children)) P.off(t, "mouseover", h); + this._popper && this._popper.destroy(), this._menu.classList.remove(Ge), this._element.classList.remove(Ge), this._element.setAttribute("aria-expanded", "false"), H.removeDataAttribute(this._menu, "popper"), P.trigger(this._element, "hidden.bs.dropdown", t) + } + } + + _getConfig(t) { + if ("object" == typeof (t = super._getConfig(t)).reference && !o(t.reference) && "function" != typeof t.reference.getBoundingClientRect) throw new TypeError(`${Ke.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); + return t + } + + _createPopper() { + if (void 0 === Ve) throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)"); + let t = this._element; + "parent" === this._config.reference ? t = this._parent : o(this._config.reference) ? t = r(this._config.reference) : "object" == typeof this._config.reference && (t = this._config.reference); + const e = this._getPopperConfig(); + this._popper = qe(t, this._menu, e) + } + + _isShown() { + return this._menu.classList.contains(Ge) + } + + _getPlacement() { + const t = this._parent; + if (t.classList.contains("dropend")) return oi; + if (t.classList.contains("dropstart")) return ri; + if (t.classList.contains("dropup-center")) return "top"; + if (t.classList.contains("dropdown-center")) return "bottom"; + const e = "end" === getComputedStyle(this._menu).getPropertyValue("--bs-position").trim(); + return t.classList.contains("dropup") ? e ? ii : ei : e ? si : ni + } + + _detectNavbar() { + return null !== this._element.closest(".navbar") + } + + _getOffset() { + const {offset: t} = this._config; + return "string" == typeof t ? t.split(",").map((t => Number.parseInt(t, 10))) : "function" == typeof t ? e => t(e, this._element) : t + } + + _getPopperConfig() { + const t = { + placement: this._getPlacement(), + modifiers: [{name: "preventOverflow", options: {boundary: this._config.boundary}}, { + name: "offset", + options: {offset: this._getOffset()} + }] + }; + return (this._inNavbar || "static" === this._config.display) && (H.setDataAttribute(this._menu, "popper", "static"), t.modifiers = [{ + name: "applyStyles", + enabled: !1 + }]), {...t, ...g(this._config.popperConfig, [t])} + } + + _selectMenuItem({key: t, target: e}) { + const i = z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)", this._menu).filter((t => a(t))); + i.length && b(i, e, t === Xe, !i.includes(e)).focus() + } + + static jQueryInterface(t) { + return this.each((function () { + const e = ci.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + + static clearMenus(t) { + if (2 === t.button || "keyup" === t.type && "Tab" !== t.key) return; + const e = z.find(Ze); + for (const i of e) { + const e = ci.getInstance(i); + if (!e || !1 === e._config.autoClose) continue; + const n = t.composedPath(), s = n.includes(e._menu); + if (n.includes(e._element) || "inside" === e._config.autoClose && !s || "outside" === e._config.autoClose && s) continue; + if (e._menu.contains(t.target) && ("keyup" === t.type && "Tab" === t.key || /input|select|option|textarea|form/i.test(t.target.tagName))) continue; + const o = {relatedTarget: e._element}; + "click" === t.type && (o.clickEvent = t), e._completeHide(o) + } + } + + static dataApiKeydownHandler(t) { + const e = /input|textarea/i.test(t.target.tagName), i = "Escape" === t.key, n = [Qe, Xe].includes(t.key); + if (!n && !i) return; + if (e && !i) return; + t.preventDefault(); + const s = this.matches(Je) ? this : z.prev(this, Je)[0] || z.next(this, Je)[0] || z.findOne(Je, t.delegateTarget.parentNode), + o = ci.getOrCreateInstance(s); + if (n) return t.stopPropagation(), o.show(), void o._selectMenuItem(t); + o._isShown() && (t.stopPropagation(), o.hide(), s.focus()) + } +} + +P.on(document, Ue, Je, ci.dataApiKeydownHandler), P.on(document, Ue, ti, ci.dataApiKeydownHandler), P.on(document, Ye, ci.clearMenus), P.on(document, "keyup.bs.dropdown.data-api", ci.clearMenus), P.on(document, Ye, Je, (function (t) { + t.preventDefault(), ci.getOrCreateInstance(this).toggle() +})), m(ci); +const hi = "show", di = "mousedown.bs.backdrop", + ui = {className: "modal-backdrop", clickCallback: null, isAnimated: !1, isVisible: !0, rootElement: "body"}, fi = { + className: "string", + clickCallback: "(function|null)", + isAnimated: "boolean", + isVisible: "boolean", + rootElement: "(element|string)" + }; + +class pi extends ${constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static + +get +Default() +{ + return ui +} +static +get +DefaultType() +{ + return fi +} +static +get +NAME() +{ + return "backdrop" +} +show(t) +{ + if (!this._config.isVisible) return void g(t); + this._append(); + const e = this._getElement(); + this._config.isAnimated && d(e), e.classList.add(hi), this._emulateAnimation((() => { + g(t) + })) +} +hide(t) +{ + this._config.isVisible ? (this._getElement().classList.remove(hi), this._emulateAnimation((() => { + this.dispose(), g(t) + }))) : g(t) +} +dispose() +{ + this._isAppended && (P.off(this._element, di), this._element.remove(), this._isAppended = !1) +} +_getElement() +{ + if (!this._element) { + const t = document.createElement("div"); + t.className = this._config.className, this._config.isAnimated && t.classList.add("fade"), this._element = t + } + return this._element +} +_configAfterMerge(t) +{ + return t.rootElement = r(t.rootElement), t +} +_append() +{ + if (this._isAppended) return; + const t = this._getElement(); + this._config.rootElement.append(t), P.on(t, di, (() => { + g(this._config.clickCallback) + })), this._isAppended = !0 +} +_emulateAnimation(t) +{ + _(t, this._getElement(), this._config.isAnimated) +} +} +const mi = ".bs.focustrap", gi = "backward", _i = {autofocus: !0, trapElement: null}, + bi = {autofocus: "boolean", trapElement: "element"}; + +class vi extends ${constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static + +get +Default() +{ + return _i +} +static +get +DefaultType() +{ + return bi +} +static +get +NAME() +{ + return "focustrap" +} +activate() +{ + this._isActive || (this._config.autofocus && this._config.trapElement.focus(), P.off(document, mi), P.on(document, "focusin.bs.focustrap", (t => this._handleFocusin(t))), P.on(document, "keydown.tab.bs.focustrap", (t => this._handleKeydown(t))), this._isActive = !0) +} +deactivate() +{ + this._isActive && (this._isActive = !1, P.off(document, mi)) +} +_handleFocusin(t) +{ + const {trapElement: e} = this._config; + if (t.target === document || t.target === e || e.contains(t.target)) return; + const i = z.focusableChildren(e); + 0 === i.length ? e.focus() : this._lastTabNavDirection === gi ? i[i.length - 1].focus() : i[0].focus() +} +_handleKeydown(t) +{ + "Tab" === t.key && (this._lastTabNavDirection = t.shiftKey ? gi : "forward") +} +} +const yi = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top", wi = ".sticky-top", Ai = "padding-right", + Ei = "margin-right"; + +class Ti { + constructor() { + this._element = document.body + } + + getWidth() { + const t = document.documentElement.clientWidth; + return Math.abs(window.innerWidth - t) + } + + hide() { + const t = this.getWidth(); + this._disableOverFlow(), this._setElementAttributes(this._element, Ai, (e => e + t)), this._setElementAttributes(yi, Ai, (e => e + t)), this._setElementAttributes(wi, Ei, (e => e - t)) + } + + reset() { + this._resetElementAttributes(this._element, "overflow"), this._resetElementAttributes(this._element, Ai), this._resetElementAttributes(yi, Ai), this._resetElementAttributes(wi, Ei) + } + + isOverflowing() { + return this.getWidth() > 0 + } + + _disableOverFlow() { + this._saveInitialAttribute(this._element, "overflow"), this._element.style.overflow = "hidden" + } + + _setElementAttributes(t, e, i) { + const n = this.getWidth(); + this._applyManipulationCallback(t, (t => { + if (t !== this._element && window.innerWidth > t.clientWidth + n) return; + this._saveInitialAttribute(t, e); + const s = window.getComputedStyle(t).getPropertyValue(e); + t.style.setProperty(e, `${i(Number.parseFloat(s))}px`) + })) + } + + _saveInitialAttribute(t, e) { + const i = t.style.getPropertyValue(e); + i && H.setDataAttribute(t, e, i) + } + + _resetElementAttributes(t, e) { + this._applyManipulationCallback(t, (t => { + const i = H.getDataAttribute(t, e); + null !== i ? (H.removeDataAttribute(t, e), t.style.setProperty(e, i)) : t.style.removeProperty(e) + })) + } + + _applyManipulationCallback(t, e) { + if (o(t)) e(t); else for (const i of z.find(t, this._element)) e(i) + } +} + +const Ci = ".bs.modal", Oi = "hidden.bs.modal", xi = "show.bs.modal", ki = "modal-open", Li = "show", + Si = "modal-static", Di = {backdrop: !0, focus: !0, keyboard: !0}, + Ii = {backdrop: "(boolean|string)", focus: "boolean", keyboard: "boolean"}; + +class Ni extends W { + constructor(t, e) { + super(t, e), this._dialog = z.findOne(".modal-dialog", this._element), this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._isShown = !1, this._isTransitioning = !1, this._scrollBar = new Ti, this._addEventListeners() + } + + static get Default() { + return Di + } + + static get DefaultType() { + return Ii + } + + static get NAME() { + return "modal" + } + + toggle(t) { + return this._isShown ? this.hide() : this.show(t) + } + + show(t) { + this._isShown || this._isTransitioning || P.trigger(this._element, xi, {relatedTarget: t}).defaultPrevented || (this._isShown = !0, this._isTransitioning = !0, this._scrollBar.hide(), document.body.classList.add(ki), this._adjustDialog(), this._backdrop.show((() => this._showElement(t)))) + } + + hide() { + this._isShown && !this._isTransitioning && (P.trigger(this._element, "hide.bs.modal").defaultPrevented || (this._isShown = !1, this._isTransitioning = !0, this._focustrap.deactivate(), this._element.classList.remove(Li), this._queueCallback((() => this._hideModal()), this._element, this._isAnimated()))) + } + + dispose() { + P.off(window, Ci), P.off(this._dialog, Ci), this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose() + } + + handleUpdate() { + this._adjustDialog() + } + + _initializeBackDrop() { + return new pi({isVisible: Boolean(this._config.backdrop), isAnimated: this._isAnimated()}) + } + + _initializeFocusTrap() { + return new vi({trapElement: this._element}) + } + + _showElement(t) { + document.body.contains(this._element) || document.body.append(this._element), this._element.style.display = "block", this._element.removeAttribute("aria-hidden"), this._element.setAttribute("aria-modal", !0), this._element.setAttribute("role", "dialog"), this._element.scrollTop = 0; + const e = z.findOne(".modal-body", this._dialog); + e && (e.scrollTop = 0), d(this._element), this._element.classList.add(Li), this._queueCallback((() => { + this._config.focus && this._focustrap.activate(), this._isTransitioning = !1, P.trigger(this._element, "shown.bs.modal", {relatedTarget: t}) + }), this._dialog, this._isAnimated()) + } + + _addEventListeners() { + P.on(this._element, "keydown.dismiss.bs.modal", (t => { + "Escape" === t.key && (this._config.keyboard ? this.hide() : this._triggerBackdropTransition()) + })), P.on(window, "resize.bs.modal", (() => { + this._isShown && !this._isTransitioning && this._adjustDialog() + })), P.on(this._element, "mousedown.dismiss.bs.modal", (t => { + P.one(this._element, "click.dismiss.bs.modal", (e => { + this._element === t.target && this._element === e.target && ("static" !== this._config.backdrop ? this._config.backdrop && this.hide() : this._triggerBackdropTransition()) + })) + })) + } + + _hideModal() { + this._element.style.display = "none", this._element.setAttribute("aria-hidden", !0), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._isTransitioning = !1, this._backdrop.hide((() => { + document.body.classList.remove(ki), this._resetAdjustments(), this._scrollBar.reset(), P.trigger(this._element, Oi) + })) + } + + _isAnimated() { + return this._element.classList.contains("fade") + } + + _triggerBackdropTransition() { + if (P.trigger(this._element, "hidePrevented.bs.modal").defaultPrevented) return; + const t = this._element.scrollHeight > document.documentElement.clientHeight, e = this._element.style.overflowY; + "hidden" === e || this._element.classList.contains(Si) || (t || (this._element.style.overflowY = "hidden"), this._element.classList.add(Si), this._queueCallback((() => { + this._element.classList.remove(Si), this._queueCallback((() => { + this._element.style.overflowY = e + }), this._dialog) + }), this._dialog), this._element.focus()) + } + + _adjustDialog() { + const t = this._element.scrollHeight > document.documentElement.clientHeight, e = this._scrollBar.getWidth(), + i = e > 0; + if (i && !t) { + const t = p() ? "paddingLeft" : "paddingRight"; + this._element.style[t] = `${e}px` + } + if (!i && t) { + const t = p() ? "paddingRight" : "paddingLeft"; + this._element.style[t] = `${e}px` + } + } + + _resetAdjustments() { + this._element.style.paddingLeft = "", this._element.style.paddingRight = "" + } + + static jQueryInterface(t, e) { + return this.each((function () { + const i = Ni.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); + i[t](e) + } + })) + } +} + +P.on(document, "click.bs.modal.data-api", '[data-bs-toggle="modal"]', (function (t) { + const e = z.getElementFromSelector(this); + ["A", "AREA"].includes(this.tagName) && t.preventDefault(), P.one(e, xi, (t => { + t.defaultPrevented || P.one(e, Oi, (() => { + a(this) && this.focus() + })) + })); + const i = z.findOne(".modal.show"); + i && Ni.getInstance(i).hide(), Ni.getOrCreateInstance(e).toggle(this) +})), R(Ni), m(Ni); +const Pi = "show", Mi = "showing", ji = "hiding", Fi = ".offcanvas.show", Hi = "hidePrevented.bs.offcanvas", + $i = "hidden.bs.offcanvas", Wi = {backdrop: !0, keyboard: !0, scroll: !1}, + Bi = {backdrop: "(boolean|string)", keyboard: "boolean", scroll: "boolean"}; + +class zi extends W { + constructor(t, e) { + super(t, e), this._isShown = !1, this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._addEventListeners() + } + + static get Default() { + return Wi + } + + static get DefaultType() { + return Bi + } + + static get NAME() { + return "offcanvas" + } + + toggle(t) { + return this._isShown ? this.hide() : this.show(t) + } + + show(t) { + this._isShown || P.trigger(this._element, "show.bs.offcanvas", {relatedTarget: t}).defaultPrevented || (this._isShown = !0, this._backdrop.show(), this._config.scroll || (new Ti).hide(), this._element.setAttribute("aria-modal", !0), this._element.setAttribute("role", "dialog"), this._element.classList.add(Mi), this._queueCallback((() => { + this._config.scroll && !this._config.backdrop || this._focustrap.activate(), this._element.classList.add(Pi), this._element.classList.remove(Mi), P.trigger(this._element, "shown.bs.offcanvas", {relatedTarget: t}) + }), this._element, !0)) + } + + hide() { + this._isShown && (P.trigger(this._element, "hide.bs.offcanvas").defaultPrevented || (this._focustrap.deactivate(), this._element.blur(), this._isShown = !1, this._element.classList.add(ji), this._backdrop.hide(), this._queueCallback((() => { + this._element.classList.remove(Pi, ji), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._config.scroll || (new Ti).reset(), P.trigger(this._element, $i) + }), this._element, !0))) + } + + dispose() { + this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose() + } + + _initializeBackDrop() { + const t = Boolean(this._config.backdrop); + return new pi({ + className: "offcanvas-backdrop", + isVisible: t, + isAnimated: !0, + rootElement: this._element.parentNode, + clickCallback: t ? () => { + "static" !== this._config.backdrop ? this.hide() : P.trigger(this._element, Hi) + } : null + }) + } + + _initializeFocusTrap() { + return new vi({trapElement: this._element}) + } + + _addEventListeners() { + P.on(this._element, "keydown.dismiss.bs.offcanvas", (t => { + "Escape" === t.key && (this._config.keyboard ? this.hide() : P.trigger(this._element, Hi)) + })) + } + + static jQueryInterface(t) { + return this.each((function () { + const e = zi.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t](this) + } + })) + } +} + +P.on(document, "click.bs.offcanvas.data-api", '[data-bs-toggle="offcanvas"]', (function (t) { + const e = z.getElementFromSelector(this); + if (["A", "AREA"].includes(this.tagName) && t.preventDefault(), l(this)) return; + P.one(e, $i, (() => { + a(this) && this.focus() + })); + const i = z.findOne(Fi); + i && i !== e && zi.getInstance(i).hide(), zi.getOrCreateInstance(e).toggle(this) +})), P.on(window, "load.bs.offcanvas.data-api", (() => { + for (const t of z.find(Fi)) zi.getOrCreateInstance(t).show() +})), P.on(window, "resize.bs.offcanvas", (() => { + for (const t of z.find("[aria-modal][class*=show][class*=offcanvas-]")) "fixed" !== getComputedStyle(t).position && zi.getOrCreateInstance(t).hide() +})), R(zi), m(zi); +const Ri = { + "*": ["class", "dir", "id", "lang", "role", /^aria-[\w-]*$/i], + a: ["target", "href", "title", "rel"], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ["src", "srcset", "alt", "title", "width", "height"], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + }, qi = new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]), + Vi = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i, Ki = (t, e) => { + const i = t.nodeName.toLowerCase(); + return e.includes(i) ? !qi.has(i) || Boolean(Vi.test(t.nodeValue)) : e.filter((t => t instanceof RegExp)).some((t => t.test(i))) + }, Qi = {allowList: Ri, content: {}, extraClass: "", html: !1, sanitize: !0, sanitizeFn: null, template: "
    "}, + Xi = { + allowList: "object", + content: "object", + extraClass: "(string|function)", + html: "boolean", + sanitize: "boolean", + sanitizeFn: "(null|function)", + template: "string" + }, Yi = {entry: "(string|element|function|null)", selector: "(string|element)"}; + +class Ui extends ${constructor(t){super(),this._config=this._getConfig(t)}static + +get +Default() +{ + return Qi +} +static +get +DefaultType() +{ + return Xi +} +static +get +NAME() +{ + return "TemplateFactory" +} +getContent() +{ + return Object.values(this._config.content).map((t => this._resolvePossibleFunction(t))).filter(Boolean) +} +hasContent() +{ + return this.getContent().length > 0 +} +changeContent(t) +{ + return this._checkContent(t), this._config.content = {...this._config.content, ...t}, this +} +toHtml() +{ + const t = document.createElement("div"); + t.innerHTML = this._maybeSanitize(this._config.template); + for (const [e, i] of Object.entries(this._config.content)) this._setContent(t, i, e); + const e = t.children[0], i = this._resolvePossibleFunction(this._config.extraClass); + return i && e.classList.add(...i.split(" ")), e +} +_typeCheckConfig(t) +{ + super._typeCheckConfig(t), this._checkContent(t.content) +} +_checkContent(t) +{ + for (const [e, i] of Object.entries(t)) super._typeCheckConfig({selector: e, entry: i}, Yi) +} +_setContent(t, e, i) +{ + const n = z.findOne(i, t); + n && ((e = this._resolvePossibleFunction(e)) ? o(e) ? this._putElementInTemplate(r(e), n) : this._config.html ? n.innerHTML = this._maybeSanitize(e) : n.textContent = e : n.remove()) +} +_maybeSanitize(t) +{ + return this._config.sanitize ? function (t, e, i) { + if (!t.length) return t; + if (i && "function" == typeof i) return i(t); + const n = (new window.DOMParser).parseFromString(t, "text/html"), + s = [].concat(...n.body.querySelectorAll("*")); + for (const t of s) { + const i = t.nodeName.toLowerCase(); + if (!Object.keys(e).includes(i)) { + t.remove(); + continue + } + const n = [].concat(...t.attributes), s = [].concat(e["*"] || [], e[i] || []); + for (const e of n) Ki(e, s) || t.removeAttribute(e.nodeName) + } + return n.body.innerHTML + }(t, this._config.allowList, this._config.sanitizeFn) : t +} +_resolvePossibleFunction(t) +{ + return g(t, [this]) +} +_putElementInTemplate(t, e) +{ + if (this._config.html) return e.innerHTML = "", void e.append(t); + e.textContent = t.textContent +} +} +const Gi = new Set(["sanitize", "allowList", "sanitizeFn"]), Ji = "fade", Zi = "show", tn = ".modal", + en = "hide.bs.modal", nn = "hover", sn = "focus", + on = {AUTO: "auto", TOP: "top", RIGHT: p() ? "left" : "right", BOTTOM: "bottom", LEFT: p() ? "right" : "left"}, + rn = { + allowList: Ri, + animation: !0, + boundary: "clippingParents", + container: !1, + customClass: "", + delay: 0, + fallbackPlacements: ["top", "right", "bottom", "left"], + html: !1, + offset: [0, 6], + placement: "top", + popperConfig: null, + sanitize: !0, + sanitizeFn: null, + selector: !1, + template: '', + title: "", + trigger: "hover focus" + }, an = { + allowList: "object", + animation: "boolean", + boundary: "(string|element)", + container: "(string|element|boolean)", + customClass: "(string|function)", + delay: "(number|object)", + fallbackPlacements: "array", + html: "boolean", + offset: "(array|string|function)", + placement: "(string|function)", + popperConfig: "(null|object|function)", + sanitize: "boolean", + sanitizeFn: "(null|function)", + selector: "(string|boolean)", + template: "string", + title: "(string|element|function)", + trigger: "string" + }; + +class ln extends W { + constructor(t, e) { + if (void 0 === Ve) throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)"); + super(t, e), this._isEnabled = !0, this._timeout = 0, this._isHovered = null, this._activeTrigger = {}, this._popper = null, this._templateFactory = null, this._newContent = null, this.tip = null, this._setListeners(), this._config.selector || this._fixTitle() + } + + static get Default() { + return rn + } + + static get DefaultType() { + return an + } + + static get NAME() { + return "tooltip" + } + + enable() { + this._isEnabled = !0 + } + + disable() { + this._isEnabled = !1 + } + + toggleEnabled() { + this._isEnabled = !this._isEnabled + } + + toggle() { + this._isEnabled && (this._activeTrigger.click = !this._activeTrigger.click, this._isShown() ? this._leave() : this._enter()) + } + + dispose() { + clearTimeout(this._timeout), P.off(this._element.closest(tn), en, this._hideModalHandler), this._element.getAttribute("data-bs-original-title") && this._element.setAttribute("title", this._element.getAttribute("data-bs-original-title")), this._disposePopper(), super.dispose() + } + + show() { + if ("none" === this._element.style.display) throw new Error("Please use show on visible elements"); + if (!this._isWithContent() || !this._isEnabled) return; + const t = P.trigger(this._element, this.constructor.eventName("show")), + e = (c(this._element) || this._element.ownerDocument.documentElement).contains(this._element); + if (t.defaultPrevented || !e) return; + this._disposePopper(); + const i = this._getTipElement(); + this._element.setAttribute("aria-describedby", i.getAttribute("id")); + const {container: n} = this._config; + if (this._element.ownerDocument.documentElement.contains(this.tip) || (n.append(i), P.trigger(this._element, this.constructor.eventName("inserted"))), this._popper = this._createPopper(i), i.classList.add(Zi), "ontouchstart" in document.documentElement) for (const t of [].concat(...document.body.children)) P.on(t, "mouseover", h); + this._queueCallback((() => { + P.trigger(this._element, this.constructor.eventName("shown")), !1 === this._isHovered && this._leave(), this._isHovered = !1 + }), this.tip, this._isAnimated()) + } + + hide() { + if (this._isShown() && !P.trigger(this._element, this.constructor.eventName("hide")).defaultPrevented) { + if (this._getTipElement().classList.remove(Zi), "ontouchstart" in document.documentElement) for (const t of [].concat(...document.body.children)) P.off(t, "mouseover", h); + this._activeTrigger.click = !1, this._activeTrigger.focus = !1, this._activeTrigger.hover = !1, this._isHovered = null, this._queueCallback((() => { + this._isWithActiveTrigger() || (this._isHovered || this._disposePopper(), this._element.removeAttribute("aria-describedby"), P.trigger(this._element, this.constructor.eventName("hidden"))) + }), this.tip, this._isAnimated()) + } + } + + update() { + this._popper && this._popper.update() + } + + _isWithContent() { + return Boolean(this._getTitle()) + } + + _getTipElement() { + return this.tip || (this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())), this.tip + } + + _createTipElement(t) { + const e = this._getTemplateFactory(t).toHtml(); + if (!e) return null; + e.classList.remove(Ji, Zi), e.classList.add(`bs-${this.constructor.NAME}-auto`); + const i = (t => { + do { + t += Math.floor(1e6 * Math.random()) + } while (document.getElementById(t)); + return t + })(this.constructor.NAME).toString(); + return e.setAttribute("id", i), this._isAnimated() && e.classList.add(Ji), e + } + + setContent(t) { + this._newContent = t, this._isShown() && (this._disposePopper(), this.show()) + } + + _getTemplateFactory(t) { + return this._templateFactory ? this._templateFactory.changeContent(t) : this._templateFactory = new Ui({ + ...this._config, + content: t, + extraClass: this._resolvePossibleFunction(this._config.customClass) + }), this._templateFactory + } + + _getContentForTemplate() { + return {".tooltip-inner": this._getTitle()} + } + + _getTitle() { + return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute("data-bs-original-title") + } + + _initializeOnDelegatedTarget(t) { + return this.constructor.getOrCreateInstance(t.delegateTarget, this._getDelegateConfig()) + } + + _isAnimated() { + return this._config.animation || this.tip && this.tip.classList.contains(Ji) + } + + _isShown() { + return this.tip && this.tip.classList.contains(Zi) + } + + _createPopper(t) { + const e = g(this._config.placement, [this, t, this._element]), i = on[e.toUpperCase()]; + return qe(this._element, t, this._getPopperConfig(i)) + } + + _getOffset() { + const {offset: t} = this._config; + return "string" == typeof t ? t.split(",").map((t => Number.parseInt(t, 10))) : "function" == typeof t ? e => t(e, this._element) : t + } + + _resolvePossibleFunction(t) { + return g(t, [this._element]) + } + + _getPopperConfig(t) { + const e = { + placement: t, + modifiers: [{name: "flip", options: {fallbackPlacements: this._config.fallbackPlacements}}, { + name: "offset", + options: {offset: this._getOffset()} + }, {name: "preventOverflow", options: {boundary: this._config.boundary}}, { + name: "arrow", + options: {element: `.${this.constructor.NAME}-arrow`} + }, { + name: "preSetPlacement", enabled: !0, phase: "beforeMain", fn: t => { + this._getTipElement().setAttribute("data-popper-placement", t.state.placement) + } + }] + }; + return {...e, ...g(this._config.popperConfig, [e])} + } + + _setListeners() { + const t = this._config.trigger.split(" "); + for (const e of t) if ("click" === e) P.on(this._element, this.constructor.eventName("click"), this._config.selector, (t => { + this._initializeOnDelegatedTarget(t).toggle() + })); else if ("manual" !== e) { + const t = e === nn ? this.constructor.eventName("mouseenter") : this.constructor.eventName("focusin"), + i = e === nn ? this.constructor.eventName("mouseleave") : this.constructor.eventName("focusout"); + P.on(this._element, t, this._config.selector, (t => { + const e = this._initializeOnDelegatedTarget(t); + e._activeTrigger["focusin" === t.type ? sn : nn] = !0, e._enter() + })), P.on(this._element, i, this._config.selector, (t => { + const e = this._initializeOnDelegatedTarget(t); + e._activeTrigger["focusout" === t.type ? sn : nn] = e._element.contains(t.relatedTarget), e._leave() + })) + } + this._hideModalHandler = () => { + this._element && this.hide() + }, P.on(this._element.closest(tn), en, this._hideModalHandler) + } + + _fixTitle() { + const t = this._element.getAttribute("title"); + t && (this._element.getAttribute("aria-label") || this._element.textContent.trim() || this._element.setAttribute("aria-label", t), this._element.setAttribute("data-bs-original-title", t), this._element.removeAttribute("title")) + } + + _enter() { + this._isShown() || this._isHovered ? this._isHovered = !0 : (this._isHovered = !0, this._setTimeout((() => { + this._isHovered && this.show() + }), this._config.delay.show)) + } + + _leave() { + this._isWithActiveTrigger() || (this._isHovered = !1, this._setTimeout((() => { + this._isHovered || this.hide() + }), this._config.delay.hide)) + } + + _setTimeout(t, e) { + clearTimeout(this._timeout), this._timeout = setTimeout(t, e) + } + + _isWithActiveTrigger() { + return Object.values(this._activeTrigger).includes(!0) + } + + _getConfig(t) { + const e = H.getDataAttributes(this._element); + for (const t of Object.keys(e)) Gi.has(t) && delete e[t]; + return t = {...e, ..."object" == typeof t && t ? t : {}}, t = this._mergeConfigObj(t), t = this._configAfterMerge(t), this._typeCheckConfig(t), t + } + + _configAfterMerge(t) { + return t.container = !1 === t.container ? document.body : r(t.container), "number" == typeof t.delay && (t.delay = { + show: t.delay, + hide: t.delay + }), "number" == typeof t.title && (t.title = t.title.toString()), "number" == typeof t.content && (t.content = t.content.toString()), t + } + + _getDelegateConfig() { + const t = {}; + for (const [e, i] of Object.entries(this._config)) this.constructor.Default[e] !== i && (t[e] = i); + return t.selector = !1, t.trigger = "manual", t + } + + _disposePopper() { + this._popper && (this._popper.destroy(), this._popper = null), this.tip && (this.tip.remove(), this.tip = null) + } + + static jQueryInterface(t) { + return this.each((function () { + const e = ln.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } +} + +m(ln); +const cn = { + ...ln.Default, + content: "", + offset: [0, 8], + placement: "right", + template: '', + trigger: "click" +}, hn = {...ln.DefaultType, content: "(null|string|element|function)"}; + +class dn extends ln { + static get Default() { + return cn + } + + static get DefaultType() { + return hn + } + + static get NAME() { + return "popover" + } + + _isWithContent() { + return this._getTitle() || this._getContent() + } + + _getContentForTemplate() { + return {".popover-header": this._getTitle(), ".popover-body": this._getContent()} + } + + _getContent() { + return this._resolvePossibleFunction(this._config.content) + } + + static jQueryInterface(t) { + return this.each((function () { + const e = dn.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } +} + +m(dn); +const un = "click.bs.scrollspy", fn = "active", pn = "[href]", + mn = {offset: null, rootMargin: "0px 0px -25%", smoothScroll: !1, target: null, threshold: [.1, .5, 1]}, gn = { + offset: "(number|null)", + rootMargin: "string", + smoothScroll: "boolean", + target: "element", + threshold: "array" + }; + +class _n extends W { + constructor(t, e) { + super(t, e), this._targetLinks = new Map, this._observableSections = new Map, this._rootElement = "visible" === getComputedStyle(this._element).overflowY ? null : this._element, this._activeTarget = null, this._observer = null, this._previousScrollData = { + visibleEntryTop: 0, + parentScrollTop: 0 + }, this.refresh() + } + + static get Default() { + return mn + } + + static get DefaultType() { + return gn + } + + static get NAME() { + return "scrollspy" + } + + refresh() { + this._initializeTargetsAndObservables(), this._maybeEnableSmoothScroll(), this._observer ? this._observer.disconnect() : this._observer = this._getNewObserver(); + for (const t of this._observableSections.values()) this._observer.observe(t) + } + + dispose() { + this._observer.disconnect(), super.dispose() + } + + _configAfterMerge(t) { + return t.target = r(t.target) || document.body, t.rootMargin = t.offset ? `${t.offset}px 0px -30%` : t.rootMargin, "string" == typeof t.threshold && (t.threshold = t.threshold.split(",").map((t => Number.parseFloat(t)))), t + } + + _maybeEnableSmoothScroll() { + this._config.smoothScroll && (P.off(this._config.target, un), P.on(this._config.target, un, pn, (t => { + const e = this._observableSections.get(t.target.hash); + if (e) { + t.preventDefault(); + const i = this._rootElement || window, n = e.offsetTop - this._element.offsetTop; + if (i.scrollTo) return void i.scrollTo({top: n, behavior: "smooth"}); + i.scrollTop = n + } + }))) + } + + _getNewObserver() { + const t = {root: this._rootElement, threshold: this._config.threshold, rootMargin: this._config.rootMargin}; + return new IntersectionObserver((t => this._observerCallback(t)), t) + } + + _observerCallback(t) { + const e = t => this._targetLinks.get(`#${t.target.id}`), i = t => { + this._previousScrollData.visibleEntryTop = t.target.offsetTop, this._process(e(t)) + }, n = (this._rootElement || document.documentElement).scrollTop, + s = n >= this._previousScrollData.parentScrollTop; + this._previousScrollData.parentScrollTop = n; + for (const o of t) { + if (!o.isIntersecting) { + this._activeTarget = null, this._clearActiveClass(e(o)); + continue + } + const t = o.target.offsetTop >= this._previousScrollData.visibleEntryTop; + if (s && t) { + if (i(o), !n) return + } else s || t || i(o) + } + } + + _initializeTargetsAndObservables() { + this._targetLinks = new Map, this._observableSections = new Map; + const t = z.find(pn, this._config.target); + for (const e of t) { + if (!e.hash || l(e)) continue; + const t = z.findOne(decodeURI(e.hash), this._element); + a(t) && (this._targetLinks.set(decodeURI(e.hash), e), this._observableSections.set(e.hash, t)) + } + } + + _process(t) { + this._activeTarget !== t && (this._clearActiveClass(this._config.target), this._activeTarget = t, t.classList.add(fn), this._activateParents(t), P.trigger(this._element, "activate.bs.scrollspy", {relatedTarget: t})) + } + + _activateParents(t) { + if (t.classList.contains("dropdown-item")) z.findOne(".dropdown-toggle", t.closest(".dropdown")).classList.add(fn); else for (const e of z.parents(t, ".nav, .list-group")) for (const t of z.prev(e, ".nav-link, .nav-item > .nav-link, .list-group-item")) t.classList.add(fn) + } + + _clearActiveClass(t) { + t.classList.remove(fn); + const e = z.find("[href].active", t); + for (const t of e) t.classList.remove(fn) + } + + static jQueryInterface(t) { + return this.each((function () { + const e = _n.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } +} + +P.on(window, "load.bs.scrollspy.data-api", (() => { + for (const t of z.find('[data-bs-spy="scroll"]')) _n.getOrCreateInstance(t) +})), m(_n); +const bn = "ArrowLeft", vn = "ArrowRight", yn = "ArrowUp", wn = "ArrowDown", An = "active", En = "fade", Tn = "show", + Cn = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]', + On = `.nav-link:not(.dropdown-toggle), .list-group-item:not(.dropdown-toggle), [role="tab"]:not(.dropdown-toggle), ${Cn}`; + +class xn extends W { + constructor(t) { + super(t), this._parent = this._element.closest('.list-group, .nav, [role="tablist"]'), this._parent && (this._setInitialAttributes(this._parent, this._getChildren()), P.on(this._element, "keydown.bs.tab", (t => this._keydown(t)))) + } + + static get NAME() { + return "tab" + } + + show() { + const t = this._element; + if (this._elemIsActive(t)) return; + const e = this._getActiveElem(), i = e ? P.trigger(e, "hide.bs.tab", {relatedTarget: t}) : null; + P.trigger(t, "show.bs.tab", {relatedTarget: e}).defaultPrevented || i && i.defaultPrevented || (this._deactivate(e, t), this._activate(t, e)) + } + + _activate(t, e) { + t && (t.classList.add(An), this._activate(z.getElementFromSelector(t)), this._queueCallback((() => { + "tab" === t.getAttribute("role") ? (t.removeAttribute("tabindex"), t.setAttribute("aria-selected", !0), this._toggleDropDown(t, !0), P.trigger(t, "shown.bs.tab", {relatedTarget: e})) : t.classList.add(Tn) + }), t, t.classList.contains(En))) + } + + _deactivate(t, e) { + t && (t.classList.remove(An), t.blur(), this._deactivate(z.getElementFromSelector(t)), this._queueCallback((() => { + "tab" === t.getAttribute("role") ? (t.setAttribute("aria-selected", !1), t.setAttribute("tabindex", "-1"), this._toggleDropDown(t, !1), P.trigger(t, "hidden.bs.tab", {relatedTarget: e})) : t.classList.remove(Tn) + }), t, t.classList.contains(En))) + } + + _keydown(t) { + if (![bn, vn, yn, wn].includes(t.key)) return; + t.stopPropagation(), t.preventDefault(); + const e = [vn, wn].includes(t.key), i = b(this._getChildren().filter((t => !l(t))), t.target, e, !0); + i && (i.focus({preventScroll: !0}), xn.getOrCreateInstance(i).show()) + } + + _getChildren() { + return z.find(On, this._parent) + } + + _getActiveElem() { + return this._getChildren().find((t => this._elemIsActive(t))) || null + } + + _setInitialAttributes(t, e) { + this._setAttributeIfNotExists(t, "role", "tablist"); + for (const t of e) this._setInitialAttributesOnChild(t) + } + + _setInitialAttributesOnChild(t) { + t = this._getInnerElement(t); + const e = this._elemIsActive(t), i = this._getOuterElement(t); + t.setAttribute("aria-selected", e), i !== t && this._setAttributeIfNotExists(i, "role", "presentation"), e || t.setAttribute("tabindex", "-1"), this._setAttributeIfNotExists(t, "role", "tab"), this._setInitialAttributesOnTargetPanel(t) + } + + _setInitialAttributesOnTargetPanel(t) { + const e = z.getElementFromSelector(t); + e && (this._setAttributeIfNotExists(e, "role", "tabpanel"), t.id && this._setAttributeIfNotExists(e, "aria-labelledby", `${t.id}`)) + } + + _toggleDropDown(t, e) { + const i = this._getOuterElement(t); + if (!i.classList.contains("dropdown")) return; + const n = (t, n) => { + const s = z.findOne(t, i); + s && s.classList.toggle(n, e) + }; + n(".dropdown-toggle", An), n(".dropdown-menu", Tn), i.setAttribute("aria-expanded", e) + } + + _setAttributeIfNotExists(t, e, i) { + t.hasAttribute(e) || t.setAttribute(e, i) + } + + _elemIsActive(t) { + return t.classList.contains(An) + } + + _getInnerElement(t) { + return t.matches(On) ? t : z.findOne(On, t) + } + + _getOuterElement(t) { + return t.closest(".nav-item, .list-group-item") || t + } + + static jQueryInterface(t) { + return this.each((function () { + const e = xn.getOrCreateInstance(this); + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } +} + +P.on(document, "click.bs.tab", Cn, (function (t) { + ["A", "AREA"].includes(this.tagName) && t.preventDefault(), l(this) || xn.getOrCreateInstance(this).show() +})), P.on(window, "load.bs.tab", (() => { + for (const t of z.find('.active[data-bs-toggle="tab"], .active[data-bs-toggle="pill"], .active[data-bs-toggle="list"]')) xn.getOrCreateInstance(t) +})), m(xn); +const kn = "hide", Ln = "show", Sn = "showing", Dn = {animation: "boolean", autohide: "boolean", delay: "number"}, + In = {animation: !0, autohide: !0, delay: 5e3}; + +class Nn extends W { + constructor(t, e) { + super(t, e), this._timeout = null, this._hasMouseInteraction = !1, this._hasKeyboardInteraction = !1, this._setListeners() + } + + static get Default() { + return In + } + + static get DefaultType() { + return Dn + } + + static get NAME() { + return "toast" + } + + show() { + P.trigger(this._element, "show.bs.toast").defaultPrevented || (this._clearTimeout(), this._config.animation && this._element.classList.add("fade"), this._element.classList.remove(kn), d(this._element), this._element.classList.add(Ln, Sn), this._queueCallback((() => { + this._element.classList.remove(Sn), P.trigger(this._element, "shown.bs.toast"), this._maybeScheduleHide() + }), this._element, this._config.animation)) + } + + hide() { + this.isShown() && (P.trigger(this._element, "hide.bs.toast").defaultPrevented || (this._element.classList.add(Sn), this._queueCallback((() => { + this._element.classList.add(kn), this._element.classList.remove(Sn, Ln), P.trigger(this._element, "hidden.bs.toast") + }), this._element, this._config.animation))) + } + + dispose() { + this._clearTimeout(), this.isShown() && this._element.classList.remove(Ln), super.dispose() + } + + isShown() { + return this._element.classList.contains(Ln) + } + + _maybeScheduleHide() { + this._config.autohide && (this._hasMouseInteraction || this._hasKeyboardInteraction || (this._timeout = setTimeout((() => { + this.hide() + }), this._config.delay))) + } + + _onInteraction(t, e) { + switch (t.type) { + case"mouseover": + case"mouseout": + this._hasMouseInteraction = e; + break; + case"focusin": + case"focusout": + this._hasKeyboardInteraction = e + } + if (e) return void this._clearTimeout(); + const i = t.relatedTarget; + this._element === i || this._element.contains(i) || this._maybeScheduleHide() + } + + _setListeners() { + P.on(this._element, "mouseover.bs.toast", (t => this._onInteraction(t, !0))), P.on(this._element, "mouseout.bs.toast", (t => this._onInteraction(t, !1))), P.on(this._element, "focusin.bs.toast", (t => this._onInteraction(t, !0))), P.on(this._element, "focusout.bs.toast", (t => this._onInteraction(t, !1))) + } + + _clearTimeout() { + clearTimeout(this._timeout), this._timeout = null + } + + static jQueryInterface(t) { + return this.each((function () { + const e = Nn.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t](this) + } + })) + } +} + +return R(Nn), m(Nn), { + Alert: q, + Button: K, + Carousel: rt, + Collapse: ft, + Dropdown: ci, + Modal: Ni, + Offcanvas: zi, + Popover: dn, + ScrollSpy: _n, + Tab: xn, + Toast: Nn, + Tooltip: ln +} +})) +; +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/templates/ky/files/bootstrap.min.css b/src/ruoyi-admin/src/main/resources/templates/ky/files/bootstrap.min.css new file mode 100644 index 0000000..a6d00ef --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/ky/files/bootstrap.min.css @@ -0,0 +1,13471 @@ +@charset "UTF-8"; +/*! + * Bootstrap v5.3.0 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root, [data-bs-theme=light] { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-black: #000; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 13, 110, 253; + --bs-secondary-rgb: 108, 117, 125; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-primary-text-emphasis: #052c65; + --bs-secondary-text-emphasis: #2b2f32; + --bs-success-text-emphasis: #0a3622; + --bs-info-text-emphasis: #055160; + --bs-warning-text-emphasis: #664d03; + --bs-danger-text-emphasis: #58151c; + --bs-light-text-emphasis: #495057; + --bs-dark-text-emphasis: #495057; + --bs-primary-bg-subtle: #cfe2ff; + --bs-secondary-bg-subtle: #e2e3e5; + --bs-success-bg-subtle: #d1e7dd; + --bs-info-bg-subtle: #cff4fc; + --bs-warning-bg-subtle: #fff3cd; + --bs-danger-bg-subtle: #f8d7da; + --bs-light-bg-subtle: #fcfcfd; + --bs-dark-bg-subtle: #ced4da; + --bs-primary-border-subtle: #9ec5fe; + --bs-secondary-border-subtle: #c4c8cb; + --bs-success-border-subtle: #a3cfbb; + --bs-info-border-subtle: #9eeaf9; + --bs-warning-border-subtle: #ffe69c; + --bs-danger-border-subtle: #f1aeb5; + --bs-light-border-subtle: #e9ecef; + --bs-dark-border-subtle: #adb5bd; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #212529; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg: #fff; + --bs-body-bg-rgb: 255, 255, 255; + --bs-emphasis-color: #000; + --bs-emphasis-color-rgb: 0, 0, 0; + --bs-secondary-color: rgba(33, 37, 41, 0.75); + --bs-secondary-color-rgb: 33, 37, 41; + --bs-secondary-bg: #e9ecef; + --bs-secondary-bg-rgb: 233, 236, 239; + --bs-tertiary-color: rgba(33, 37, 41, 0.5); + --bs-tertiary-color-rgb: 33, 37, 41; + --bs-tertiary-bg: #f8f9fa; + --bs-tertiary-bg-rgb: 248, 249, 250; + --bs-heading-color: inherit; + --bs-link-color: #0d6efd; + --bs-link-color-rgb: 13, 110, 253; + --bs-link-decoration: underline; + --bs-link-hover-color: #0a58ca; + --bs-link-hover-color-rgb: 10, 88, 202; + --bs-code-color: #d63384; + --bs-highlight-bg: #fff3cd; + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #dee2e6; + --bs-border-color-translucent: rgba(0, 0, 0, 0.175); + --bs-border-radius: 0.375rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-xxl: 2rem; + --bs-border-radius-2xl: var(--bs-border-radius-xxl); + --bs-border-radius-pill: 50rem; + --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); + --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-focus-ring-width: 0.25rem; + --bs-focus-ring-opacity: 0.25; + --bs-focus-ring-color: rgba(13, 110, 253, 0.25); + --bs-form-valid-color: #198754; + --bs-form-valid-border-color: #198754; + --bs-form-invalid-color: #dc3545; + --bs-form-invalid-border-color: #dc3545 +} + +[data-bs-theme=dark] { + color-scheme: dark; + --bs-body-color: #adb5bd; + --bs-body-color-rgb: 173, 181, 189; + --bs-body-bg: #212529; + --bs-body-bg-rgb: 33, 37, 41; + --bs-emphasis-color: #fff; + --bs-emphasis-color-rgb: 255, 255, 255; + --bs-secondary-color: rgba(173, 181, 189, 0.75); + --bs-secondary-color-rgb: 173, 181, 189; + --bs-secondary-bg: #343a40; + --bs-secondary-bg-rgb: 52, 58, 64; + --bs-tertiary-color: rgba(173, 181, 189, 0.5); + --bs-tertiary-color-rgb: 173, 181, 189; + --bs-tertiary-bg: #2b3035; + --bs-tertiary-bg-rgb: 43, 48, 53; + --bs-primary-text-emphasis: #6ea8fe; + --bs-secondary-text-emphasis: #a7acb1; + --bs-success-text-emphasis: #75b798; + --bs-info-text-emphasis: #6edff6; + --bs-warning-text-emphasis: #ffda6a; + --bs-danger-text-emphasis: #ea868f; + --bs-light-text-emphasis: #f8f9fa; + --bs-dark-text-emphasis: #dee2e6; + --bs-primary-bg-subtle: #031633; + --bs-secondary-bg-subtle: #161719; + --bs-success-bg-subtle: #051b11; + --bs-info-bg-subtle: #032830; + --bs-warning-bg-subtle: #332701; + --bs-danger-bg-subtle: #2c0b0e; + --bs-light-bg-subtle: #343a40; + --bs-dark-bg-subtle: #1a1d20; + --bs-primary-border-subtle: #084298; + --bs-secondary-border-subtle: #41464b; + --bs-success-border-subtle: #0f5132; + --bs-info-border-subtle: #087990; + --bs-warning-border-subtle: #997404; + --bs-danger-border-subtle: #842029; + --bs-light-border-subtle: #495057; + --bs-dark-border-subtle: #343a40; + --bs-heading-color: inherit; + --bs-link-color: #6ea8fe; + --bs-link-hover-color: #8bb9fe; + --bs-link-color-rgb: 110, 168, 254; + --bs-link-hover-color-rgb: 139, 185, 254; + --bs-code-color: #e685b5; + --bs-border-color: #495057; + --bs-border-color-translucent: rgba(255, 255, 255, 0.15); + --bs-form-valid-color: #75b798; + --bs-form-valid-border-color: #75b798; + --bs-form-invalid-color: #ea868f; + --bs-form-invalid-border-color: #ea868f +} + +*, ::after, ::before { + box-sizing: border-box +} + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth + } +} + +body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent +} + +hr { + margin: 1rem 0; + color: inherit; + border: 0; + border-top: var(--bs-border-width) solid; + opacity: .25 +} + +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: .5rem; + font-weight: 500; + line-height: 1.2; + color: var(--bs-heading-color) +} + +.h1, h1 { + font-size: calc(1.375rem + 1.5vw) +} + +@media (min-width: 1200px) { + .h1, h1 { + font-size: 2.5rem + } +} + +.h2, h2 { + font-size: calc(1.325rem + .9vw) +} + +@media (min-width: 1200px) { + .h2, h2 { + font-size: 2rem + } +} + +.h3, h3 { + font-size: calc(1.3rem + .6vw) +} + +@media (min-width: 1200px) { + .h3, h3 { + font-size: 1.75rem + } +} + +.h4, h4 { + font-size: calc(1.275rem + .3vw) +} + +@media (min-width: 1200px) { + .h4, h4 { + font-size: 1.5rem + } +} + +.h5, h5 { + font-size: 1.25rem +} + +.h6, h6 { + font-size: 1rem +} + +p { + margin-top: 0; + margin-bottom: 1rem +} + +abbr[title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit +} + +ol, ul { + padding-left: 2rem +} + +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 +} + +b, strong { + font-weight: bolder +} + +.small, small { + font-size: .875em +} + +.mark, mark { + padding: .1875em; + background-color: var(--bs-highlight-bg) +} + +sub, sup { + position: relative; + font-size: .75em; + line-height: 0; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +a { + color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); + text-decoration: underline +} + +a:hover { + --bs-link-color-rgb: var(--bs-link-hover-color-rgb) +} + +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none +} + +code, kbd, pre, samp { + font-family: var(--bs-font-monospace); + font-size: 1em +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: .875em +} + +pre code { + font-size: inherit; + color: inherit; + word-break: normal +} + +code { + font-size: .875em; + color: var(--bs-code-color); + word-wrap: break-word +} + +a > code { + color: inherit +} + +kbd { + padding: .1875rem .375rem; + font-size: .875em; + color: var(--bs-body-bg); + background-color: var(--bs-body-color); + border-radius: .25rem +} + +kbd kbd { + padding: 0; + font-size: 1em +} + +figure { + margin: 0 0 1rem +} + +img, svg { + vertical-align: middle +} + +table { + caption-side: bottom; + border-collapse: collapse +} + +caption { + padding-top: .5rem; + padding-bottom: .5rem; + color: var(--bs-secondary-color); + text-align: left +} + +th { + text-align: inherit; + text-align: -webkit-match-parent +} + +tbody, td, tfoot, th, thead, tr { + border-color: inherit; + border-style: solid; + border-width: 0 +} + +label { + display: inline-block +} + +button { + border-radius: 0 +} + +button:focus:not(:focus-visible) { + outline: 0 +} + +button, input, optgroup, select, textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit +} + +button, select { + text-transform: none +} + +[role=button] { + cursor: pointer +} + +select { + word-wrap: normal +} + +select:disabled { + opacity: 1 +} + +[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { + display: none !important +} + +[type=button], [type=reset], [type=submit], button { + -webkit-appearance: button +} + +[type=button]:not(:disabled), [type=reset]:not(:disabled), [type=submit]:not(:disabled), button:not(:disabled) { + cursor: pointer +} + +::-moz-focus-inner { + padding: 0; + border-style: none +} + +textarea { + resize: vertical +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0 +} + +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: calc(1.275rem + .3vw); + line-height: inherit +} + +@media (min-width: 1200px) { + legend { + font-size: 1.5rem + } +} + +legend + * { + clear: left +} + +::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-fields-wrapper, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-text, ::-webkit-datetime-edit-year-field { + padding: 0 +} + +::-webkit-inner-spin-button { + height: auto +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: textfield +} + +::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-color-swatch-wrapper { + padding: 0 +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button +} + +::file-selector-button { + font: inherit; + -webkit-appearance: button +} + +output { + display: inline-block +} + +iframe { + border: 0 +} + +summary { + display: list-item; + cursor: pointer +} + +progress { + vertical-align: baseline +} + +[hidden] { + display: none !important +} + +.lead { + font-size: 1.25rem; + font-weight: 300 +} + +.display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2 +} + +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem + } +} + +.display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2 +} + +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem + } +} + +.display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2 +} + +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem + } +} + +.display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2 +} + +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem + } +} + +.display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2 +} + +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem + } +} + +.display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2 +} + +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem + } +} + +.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: .875em; + text-transform: uppercase +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem +} + +.blockquote > :last-child { + margin-bottom: 0 +} + +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: .875em; + color: #6c757d +} + +.blockquote-footer::before { + content: "— " +} + +.img-fluid { + max-width: 100%; + height: auto +} + +.img-thumbnail { + padding: .25rem; + background-color: var(--bs-body-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + max-width: 100%; + height: auto +} + +.figure { + display: inline-block +} + +.figure-img { + margin-bottom: .5rem; + line-height: 1 +} + +.figure-caption { + font-size: .875em; + color: var(--bs-secondary-color) +} + +.container, .container-fluid, .container-lg, .container-md, .container-sm, .container-xl, .container-xxl { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + width: 100%; + padding-right: calc(var(--bs-gutter-x) * .5); + padding-left: calc(var(--bs-gutter-x) * .5); + margin-right: auto; + margin-left: auto +} + +@media (min-width: 576px) { + .container, .container-sm { + max-width: 540px + } +} + +@media (min-width: 768px) { + .container, .container-md, .container-sm { + max-width: 720px + } +} + +@media (min-width: 992px) { + .container, .container-lg, .container-md, .container-sm { + max-width: 960px + } +} + +@media (min-width: 1200px) { + .container, .container-lg, .container-md, .container-sm, .container-xl { + max-width: 1140px + } +} + +@media (min-width: 1400px) { + .container, .container-lg, .container-md, .container-sm, .container-xl, .container-xxl { + max-width: 1320px + } +} + +:root { + --bs-breakpoint-xs: 0; + --bs-breakpoint-sm: 576px; + --bs-breakpoint-md: 768px; + --bs-breakpoint-lg: 992px; + --bs-breakpoint-xl: 1200px; + --bs-breakpoint-xxl: 1400px +} + +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-.5 * var(--bs-gutter-x)); + margin-left: calc(-.5 * var(--bs-gutter-x)) +} + +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * .5); + padding-left: calc(var(--bs-gutter-x) * .5); + margin-top: var(--bs-gutter-y) +} + +.col { + flex: 1 0 0% +} + +.row-cols-auto > * { + flex: 0 0 auto; + width: auto +} + +.row-cols-1 > * { + flex: 0 0 auto; + width: 100% +} + +.row-cols-2 > * { + flex: 0 0 auto; + width: 50% +} + +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.3333333333% +} + +.row-cols-4 > * { + flex: 0 0 auto; + width: 25% +} + +.row-cols-5 > * { + flex: 0 0 auto; + width: 20% +} + +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.6666666667% +} + +.col-auto { + flex: 0 0 auto; + width: auto +} + +.col-1 { + flex: 0 0 auto; + width: 8.33333333% +} + +.col-2 { + flex: 0 0 auto; + width: 16.66666667% +} + +.col-3 { + flex: 0 0 auto; + width: 25% +} + +.col-4 { + flex: 0 0 auto; + width: 33.33333333% +} + +.col-5 { + flex: 0 0 auto; + width: 41.66666667% +} + +.col-6 { + flex: 0 0 auto; + width: 50% +} + +.col-7 { + flex: 0 0 auto; + width: 58.33333333% +} + +.col-8 { + flex: 0 0 auto; + width: 66.66666667% +} + +.col-9 { + flex: 0 0 auto; + width: 75% +} + +.col-10 { + flex: 0 0 auto; + width: 83.33333333% +} + +.col-11 { + flex: 0 0 auto; + width: 91.66666667% +} + +.col-12 { + flex: 0 0 auto; + width: 100% +} + +.offset-1 { + margin-left: 8.33333333% +} + +.offset-2 { + margin-left: 16.66666667% +} + +.offset-3 { + margin-left: 25% +} + +.offset-4 { + margin-left: 33.33333333% +} + +.offset-5 { + margin-left: 41.66666667% +} + +.offset-6 { + margin-left: 50% +} + +.offset-7 { + margin-left: 58.33333333% +} + +.offset-8 { + margin-left: 66.66666667% +} + +.offset-9 { + margin-left: 75% +} + +.offset-10 { + margin-left: 83.33333333% +} + +.offset-11 { + margin-left: 91.66666667% +} + +.g-0, .gx-0 { + --bs-gutter-x: 0 +} + +.g-0, .gy-0 { + --bs-gutter-y: 0 +} + +.g-1, .gx-1 { + --bs-gutter-x: 0.25rem +} + +.g-1, .gy-1 { + --bs-gutter-y: 0.25rem +} + +.g-2, .gx-2 { + --bs-gutter-x: 0.5rem +} + +.g-2, .gy-2 { + --bs-gutter-y: 0.5rem +} + +.g-3, .gx-3 { + --bs-gutter-x: 1rem +} + +.g-3, .gy-3 { + --bs-gutter-y: 1rem +} + +.g-4, .gx-4 { + --bs-gutter-x: 1.5rem +} + +.g-4, .gy-4 { + --bs-gutter-y: 1.5rem +} + +.g-5, .gx-5 { + --bs-gutter-x: 3rem +} + +.g-5, .gy-5 { + --bs-gutter-y: 3rem +} + +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0% + } + + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto + } + + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100% + } + + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50% + } + + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.3333333333% + } + + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25% + } + + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20% + } + + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.6666666667% + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto + } + + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333% + } + + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667% + } + + .col-sm-3 { + flex: 0 0 auto; + width: 25% + } + + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333% + } + + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667% + } + + .col-sm-6 { + flex: 0 0 auto; + width: 50% + } + + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333% + } + + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667% + } + + .col-sm-9 { + flex: 0 0 auto; + width: 75% + } + + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333% + } + + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667% + } + + .col-sm-12 { + flex: 0 0 auto; + width: 100% + } + + .offset-sm-0 { + margin-left: 0 + } + + .offset-sm-1 { + margin-left: 8.33333333% + } + + .offset-sm-2 { + margin-left: 16.66666667% + } + + .offset-sm-3 { + margin-left: 25% + } + + .offset-sm-4 { + margin-left: 33.33333333% + } + + .offset-sm-5 { + margin-left: 41.66666667% + } + + .offset-sm-6 { + margin-left: 50% + } + + .offset-sm-7 { + margin-left: 58.33333333% + } + + .offset-sm-8 { + margin-left: 66.66666667% + } + + .offset-sm-9 { + margin-left: 75% + } + + .offset-sm-10 { + margin-left: 83.33333333% + } + + .offset-sm-11 { + margin-left: 91.66666667% + } + + .g-sm-0, .gx-sm-0 { + --bs-gutter-x: 0 + } + + .g-sm-0, .gy-sm-0 { + --bs-gutter-y: 0 + } + + .g-sm-1, .gx-sm-1 { + --bs-gutter-x: 0.25rem + } + + .g-sm-1, .gy-sm-1 { + --bs-gutter-y: 0.25rem + } + + .g-sm-2, .gx-sm-2 { + --bs-gutter-x: 0.5rem + } + + .g-sm-2, .gy-sm-2 { + --bs-gutter-y: 0.5rem + } + + .g-sm-3, .gx-sm-3 { + --bs-gutter-x: 1rem + } + + .g-sm-3, .gy-sm-3 { + --bs-gutter-y: 1rem + } + + .g-sm-4, .gx-sm-4 { + --bs-gutter-x: 1.5rem + } + + .g-sm-4, .gy-sm-4 { + --bs-gutter-y: 1.5rem + } + + .g-sm-5, .gx-sm-5 { + --bs-gutter-x: 3rem + } + + .g-sm-5, .gy-sm-5 { + --bs-gutter-y: 3rem + } +} + +@media (min-width: 768px) { + .col-md { + flex: 1 0 0% + } + + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto + } + + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100% + } + + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50% + } + + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.3333333333% + } + + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25% + } + + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20% + } + + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.6666666667% + } + + .col-md-auto { + flex: 0 0 auto; + width: auto + } + + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333% + } + + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667% + } + + .col-md-3 { + flex: 0 0 auto; + width: 25% + } + + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333% + } + + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667% + } + + .col-md-6 { + flex: 0 0 auto; + width: 50% + } + + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333% + } + + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667% + } + + .col-md-9 { + flex: 0 0 auto; + width: 75% + } + + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333% + } + + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667% + } + + .col-md-12 { + flex: 0 0 auto; + width: 100% + } + + .offset-md-0 { + margin-left: 0 + } + + .offset-md-1 { + margin-left: 8.33333333% + } + + .offset-md-2 { + margin-left: 16.66666667% + } + + .offset-md-3 { + margin-left: 25% + } + + .offset-md-4 { + margin-left: 33.33333333% + } + + .offset-md-5 { + margin-left: 41.66666667% + } + + .offset-md-6 { + margin-left: 50% + } + + .offset-md-7 { + margin-left: 58.33333333% + } + + .offset-md-8 { + margin-left: 66.66666667% + } + + .offset-md-9 { + margin-left: 75% + } + + .offset-md-10 { + margin-left: 83.33333333% + } + + .offset-md-11 { + margin-left: 91.66666667% + } + + .g-md-0, .gx-md-0 { + --bs-gutter-x: 0 + } + + .g-md-0, .gy-md-0 { + --bs-gutter-y: 0 + } + + .g-md-1, .gx-md-1 { + --bs-gutter-x: 0.25rem + } + + .g-md-1, .gy-md-1 { + --bs-gutter-y: 0.25rem + } + + .g-md-2, .gx-md-2 { + --bs-gutter-x: 0.5rem + } + + .g-md-2, .gy-md-2 { + --bs-gutter-y: 0.5rem + } + + .g-md-3, .gx-md-3 { + --bs-gutter-x: 1rem + } + + .g-md-3, .gy-md-3 { + --bs-gutter-y: 1rem + } + + .g-md-4, .gx-md-4 { + --bs-gutter-x: 1.5rem + } + + .g-md-4, .gy-md-4 { + --bs-gutter-y: 1.5rem + } + + .g-md-5, .gx-md-5 { + --bs-gutter-x: 3rem + } + + .g-md-5, .gy-md-5 { + --bs-gutter-y: 3rem + } +} + +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0% + } + + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto + } + + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100% + } + + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50% + } + + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.3333333333% + } + + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25% + } + + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20% + } + + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.6666666667% + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto + } + + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333% + } + + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667% + } + + .col-lg-3 { + flex: 0 0 auto; + width: 25% + } + + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333% + } + + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667% + } + + .col-lg-6 { + flex: 0 0 auto; + width: 50% + } + + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333% + } + + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667% + } + + .col-lg-9 { + flex: 0 0 auto; + width: 75% + } + + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333% + } + + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667% + } + + .col-lg-12 { + flex: 0 0 auto; + width: 100% + } + + .offset-lg-0 { + margin-left: 0 + } + + .offset-lg-1 { + margin-left: 8.33333333% + } + + .offset-lg-2 { + margin-left: 16.66666667% + } + + .offset-lg-3 { + margin-left: 25% + } + + .offset-lg-4 { + margin-left: 33.33333333% + } + + .offset-lg-5 { + margin-left: 41.66666667% + } + + .offset-lg-6 { + margin-left: 50% + } + + .offset-lg-7 { + margin-left: 58.33333333% + } + + .offset-lg-8 { + margin-left: 66.66666667% + } + + .offset-lg-9 { + margin-left: 75% + } + + .offset-lg-10 { + margin-left: 83.33333333% + } + + .offset-lg-11 { + margin-left: 91.66666667% + } + + .g-lg-0, .gx-lg-0 { + --bs-gutter-x: 0 + } + + .g-lg-0, .gy-lg-0 { + --bs-gutter-y: 0 + } + + .g-lg-1, .gx-lg-1 { + --bs-gutter-x: 0.25rem + } + + .g-lg-1, .gy-lg-1 { + --bs-gutter-y: 0.25rem + } + + .g-lg-2, .gx-lg-2 { + --bs-gutter-x: 0.5rem + } + + .g-lg-2, .gy-lg-2 { + --bs-gutter-y: 0.5rem + } + + .g-lg-3, .gx-lg-3 { + --bs-gutter-x: 1rem + } + + .g-lg-3, .gy-lg-3 { + --bs-gutter-y: 1rem + } + + .g-lg-4, .gx-lg-4 { + --bs-gutter-x: 1.5rem + } + + .g-lg-4, .gy-lg-4 { + --bs-gutter-y: 1.5rem + } + + .g-lg-5, .gx-lg-5 { + --bs-gutter-x: 3rem + } + + .g-lg-5, .gy-lg-5 { + --bs-gutter-y: 3rem + } +} + +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0% + } + + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto + } + + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100% + } + + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50% + } + + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.3333333333% + } + + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25% + } + + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20% + } + + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.6666666667% + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto + } + + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333% + } + + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667% + } + + .col-xl-3 { + flex: 0 0 auto; + width: 25% + } + + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333% + } + + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667% + } + + .col-xl-6 { + flex: 0 0 auto; + width: 50% + } + + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333% + } + + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667% + } + + .col-xl-9 { + flex: 0 0 auto; + width: 75% + } + + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333% + } + + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667% + } + + .col-xl-12 { + flex: 0 0 auto; + width: 100% + } + + .offset-xl-0 { + margin-left: 0 + } + + .offset-xl-1 { + margin-left: 8.33333333% + } + + .offset-xl-2 { + margin-left: 16.66666667% + } + + .offset-xl-3 { + margin-left: 25% + } + + .offset-xl-4 { + margin-left: 33.33333333% + } + + .offset-xl-5 { + margin-left: 41.66666667% + } + + .offset-xl-6 { + margin-left: 50% + } + + .offset-xl-7 { + margin-left: 58.33333333% + } + + .offset-xl-8 { + margin-left: 66.66666667% + } + + .offset-xl-9 { + margin-left: 75% + } + + .offset-xl-10 { + margin-left: 83.33333333% + } + + .offset-xl-11 { + margin-left: 91.66666667% + } + + .g-xl-0, .gx-xl-0 { + --bs-gutter-x: 0 + } + + .g-xl-0, .gy-xl-0 { + --bs-gutter-y: 0 + } + + .g-xl-1, .gx-xl-1 { + --bs-gutter-x: 0.25rem + } + + .g-xl-1, .gy-xl-1 { + --bs-gutter-y: 0.25rem + } + + .g-xl-2, .gx-xl-2 { + --bs-gutter-x: 0.5rem + } + + .g-xl-2, .gy-xl-2 { + --bs-gutter-y: 0.5rem + } + + .g-xl-3, .gx-xl-3 { + --bs-gutter-x: 1rem + } + + .g-xl-3, .gy-xl-3 { + --bs-gutter-y: 1rem + } + + .g-xl-4, .gx-xl-4 { + --bs-gutter-x: 1.5rem + } + + .g-xl-4, .gy-xl-4 { + --bs-gutter-y: 1.5rem + } + + .g-xl-5, .gx-xl-5 { + --bs-gutter-x: 3rem + } + + .g-xl-5, .gy-xl-5 { + --bs-gutter-y: 3rem + } +} + +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0% + } + + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto + } + + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100% + } + + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50% + } + + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.3333333333% + } + + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25% + } + + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20% + } + + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.6666666667% + } + + .col-xxl-auto { + flex: 0 0 auto; + width: auto + } + + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333% + } + + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667% + } + + .col-xxl-3 { + flex: 0 0 auto; + width: 25% + } + + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333% + } + + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667% + } + + .col-xxl-6 { + flex: 0 0 auto; + width: 50% + } + + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333% + } + + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667% + } + + .col-xxl-9 { + flex: 0 0 auto; + width: 75% + } + + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333% + } + + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667% + } + + .col-xxl-12 { + flex: 0 0 auto; + width: 100% + } + + .offset-xxl-0 { + margin-left: 0 + } + + .offset-xxl-1 { + margin-left: 8.33333333% + } + + .offset-xxl-2 { + margin-left: 16.66666667% + } + + .offset-xxl-3 { + margin-left: 25% + } + + .offset-xxl-4 { + margin-left: 33.33333333% + } + + .offset-xxl-5 { + margin-left: 41.66666667% + } + + .offset-xxl-6 { + margin-left: 50% + } + + .offset-xxl-7 { + margin-left: 58.33333333% + } + + .offset-xxl-8 { + margin-left: 66.66666667% + } + + .offset-xxl-9 { + margin-left: 75% + } + + .offset-xxl-10 { + margin-left: 83.33333333% + } + + .offset-xxl-11 { + margin-left: 91.66666667% + } + + .g-xxl-0, .gx-xxl-0 { + --bs-gutter-x: 0 + } + + .g-xxl-0, .gy-xxl-0 { + --bs-gutter-y: 0 + } + + .g-xxl-1, .gx-xxl-1 { + --bs-gutter-x: 0.25rem + } + + .g-xxl-1, .gy-xxl-1 { + --bs-gutter-y: 0.25rem + } + + .g-xxl-2, .gx-xxl-2 { + --bs-gutter-x: 0.5rem + } + + .g-xxl-2, .gy-xxl-2 { + --bs-gutter-y: 0.5rem + } + + .g-xxl-3, .gx-xxl-3 { + --bs-gutter-x: 1rem + } + + .g-xxl-3, .gy-xxl-3 { + --bs-gutter-y: 1rem + } + + .g-xxl-4, .gx-xxl-4 { + --bs-gutter-x: 1.5rem + } + + .g-xxl-4, .gy-xxl-4 { + --bs-gutter-y: 1.5rem + } + + .g-xxl-5, .gx-xxl-5 { + --bs-gutter-x: 3rem + } + + .g-xxl-5, .gy-xxl-5 { + --bs-gutter-y: 3rem + } +} + +.table { + --bs-table-color-type: initial; + --bs-table-bg-type: initial; + --bs-table-color-state: initial; + --bs-table-bg-state: initial; + --bs-table-color: var(--bs-body-color); + --bs-table-bg: var(--bs-body-bg); + --bs-table-border-color: var(--bs-border-color); + --bs-table-accent-bg: transparent; + --bs-table-striped-color: var(--bs-body-color); + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: var(--bs-body-color); + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: var(--bs-body-color); + --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + width: 100%; + margin-bottom: 1rem; + vertical-align: top; + border-color: var(--bs-table-border-color) +} + +.table > :not(caption) > * > * { + padding: .5rem .5rem; + color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color))); + background-color: var(--bs-table-bg); + border-bottom-width: var(--bs-border-width); + box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg))) +} + +.table > tbody { + vertical-align: inherit +} + +.table > thead { + vertical-align: bottom +} + +.table-group-divider { + border-top: calc(var(--bs-border-width) * 2) solid currentcolor +} + +.caption-top { + caption-side: top +} + +.table-sm > :not(caption) > * > * { + padding: .25rem .25rem +} + +.table-bordered > :not(caption) > * { + border-width: var(--bs-border-width) 0 +} + +.table-bordered > :not(caption) > * > * { + border-width: 0 var(--bs-border-width) +} + +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0 +} + +.table-borderless > :not(:first-child) { + border-top-width: 0 +} + +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg) +} + +.table-striped-columns > :not(caption) > tr > :nth-child(2n) { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg) +} + +.table-active { + --bs-table-color-state: var(--bs-table-active-color); + --bs-table-bg-state: var(--bs-table-active-bg) +} + +.table-hover > tbody > tr:hover > * { + --bs-table-color-state: var(--bs-table-hover-color); + --bs-table-bg-state: var(--bs-table-hover-bg) +} + +.table-primary { + --bs-table-color: #000; + --bs-table-bg: #cfe2ff; + --bs-table-border-color: #bacbe6; + --bs-table-striped-bg: #c5d7f2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bacbe6; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfd1ec; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color) +} + +.table-secondary { + --bs-table-color: #000; + --bs-table-bg: #e2e3e5; + --bs-table-border-color: #cbccce; + --bs-table-striped-bg: #d7d8da; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cbccce; + --bs-table-active-color: #000; + --bs-table-hover-bg: #d1d2d4; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color) +} + +.table-success { + --bs-table-color: #000; + --bs-table-bg: #d1e7dd; + --bs-table-border-color: #bcd0c7; + --bs-table-striped-bg: #c7dbd2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bcd0c7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c1d6cc; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color) +} + +.table-info { + --bs-table-color: #000; + --bs-table-bg: #cff4fc; + --bs-table-border-color: #badce3; + --bs-table-striped-bg: #c5e8ef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #badce3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfe2e9; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color) +} + +.table-warning { + --bs-table-color: #000; + --bs-table-bg: #fff3cd; + --bs-table-border-color: #e6dbb9; + --bs-table-striped-bg: #f2e7c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6dbb9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ece1be; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color) +} + +.table-danger { + --bs-table-color: #000; + --bs-table-bg: #f8d7da; + --bs-table-border-color: #dfc2c4; + --bs-table-striped-bg: #eccccf; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfc2c4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5c7ca; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color) +} + +.table-light { + --bs-table-color: #000; + --bs-table-bg: #f8f9fa; + --bs-table-border-color: #dfe0e1; + --bs-table-striped-bg: #ecedee; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfe0e1; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5e6e7; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color) +} + +.table-dark { + --bs-table-color: #fff; + --bs-table-bg: #212529; + --bs-table-border-color: #373b3e; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color) +} + +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch + } +} + +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch + } +} + +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch + } +} + +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch + } +} + +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch + } +} + +.form-label { + margin-bottom: .5rem +} + +.col-form-label { + padding-top: calc(.375rem + var(--bs-border-width)); + padding-bottom: calc(.375rem + var(--bs-border-width)); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5 +} + +.col-form-label-lg { + padding-top: calc(.5rem + var(--bs-border-width)); + padding-bottom: calc(.5rem + var(--bs-border-width)); + font-size: 1.25rem +} + +.col-form-label-sm { + padding-top: calc(.25rem + var(--bs-border-width)); + padding-bottom: calc(.25rem + var(--bs-border-width)); + font-size: .875rem +} + +.form-text { + margin-top: .25rem; + font-size: .875em; + color: var(--bs-secondary-color) +} + +.form-control { + display: block; + width: 100%; + padding: .375rem .75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + background-clip: padding-box; + border: var(--bs-border-width) solid var(--bs-border-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: var(--bs-border-radius); + transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none + } +} + +.form-control[type=file] { + overflow: hidden +} + +.form-control[type=file]:not(:disabled):not([readonly]) { + cursor: pointer +} + +.form-control:focus { + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25) +} + +.form-control::-webkit-date-and-time-value { + min-width: 85px; + height: 1.5em; + margin: 0 +} + +.form-control::-webkit-datetime-edit { + display: block; + padding: 0 +} + +.form-control::-moz-placeholder { + color: var(--bs-secondary-color); + opacity: 1 +} + +.form-control::placeholder { + color: var(--bs-secondary-color); + opacity: 1 +} + +.form-control:disabled { + background-color: var(--bs-secondary-bg); + opacity: 1 +} + +.form-control::-webkit-file-upload-button { + padding: .375rem .75rem; + margin: -.375rem -.75rem; + -webkit-margin-end: .75rem; + margin-inline-end: .75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +.form-control::file-selector-button { + padding: .375rem .75rem; + margin: -.375rem -.75rem; + -webkit-margin-end: .75rem; + margin-inline-end: .75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none + } + + .form-control::file-selector-button { + transition: none + } +} + +.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: var(--bs-secondary-bg) +} + +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: var(--bs-secondary-bg) +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: .375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: var(--bs-body-color); + background-color: transparent; + border: solid transparent; + border-width: var(--bs-border-width) 0 +} + +.form-control-plaintext:focus { + outline: 0 +} + +.form-control-plaintext.form-control-lg, .form-control-plaintext.form-control-sm { + padding-right: 0; + padding-left: 0 +} + +.form-control-sm { + min-height: calc(1.5em + .5rem + calc(var(--bs-border-width) * 2)); + padding: .25rem .5rem; + font-size: .875rem; + border-radius: var(--bs-border-radius-sm) +} + +.form-control-sm::-webkit-file-upload-button { + padding: .25rem .5rem; + margin: -.25rem -.5rem; + -webkit-margin-end: .5rem; + margin-inline-end: .5rem +} + +.form-control-sm::file-selector-button { + padding: .25rem .5rem; + margin: -.25rem -.5rem; + -webkit-margin-end: .5rem; + margin-inline-end: .5rem +} + +.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); + padding: .5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg) +} + +.form-control-lg::-webkit-file-upload-button { + padding: .5rem 1rem; + margin: -.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem +} + +.form-control-lg::file-selector-button { + padding: .5rem 1rem; + margin: -.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem +} + +textarea.form-control { + min-height: calc(1.5em + .75rem + calc(var(--bs-border-width) * 2)) +} + +textarea.form-control-sm { + min-height: calc(1.5em + .5rem + calc(var(--bs-border-width) * 2)) +} + +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)) +} + +.form-control-color { + width: 3rem; + height: calc(1.5em + .75rem + calc(var(--bs-border-width) * 2)); + padding: .375rem +} + +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer +} + +.form-control-color::-moz-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius) +} + +.form-control-color::-webkit-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius) +} + +.form-control-color.form-control-sm { + height: calc(1.5em + .5rem + calc(var(--bs-border-width) * 2)) +} + +.form-control-color.form-control-lg { + height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)) +} + +.form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + display: block; + width: 100%; + padding: .375rem 2.25rem .375rem .75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none); + background-repeat: no-repeat; + background-position: right .75rem center; + background-size: 16px 12px; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +@media (prefers-reduced-motion: reduce) { + .form-select { + transition: none + } +} + +.form-select:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25) +} + +.form-select[multiple], .form-select[size]:not([size="1"]) { + padding-right: .75rem; + background-image: none +} + +.form-select:disabled { + background-color: var(--bs-secondary-bg) +} + +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 var(--bs-body-color) +} + +.form-select-sm { + padding-top: .25rem; + padding-bottom: .25rem; + padding-left: .5rem; + font-size: .875rem; + border-radius: var(--bs-border-radius-sm) +} + +.form-select-lg { + padding-top: .5rem; + padding-bottom: .5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg) +} + +[data-bs-theme=dark] .form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23adb5bd' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e") +} + +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: .125rem +} + +.form-check .form-check-input { + float: left; + margin-left: -1.5em +} + +.form-check-reverse { + padding-right: 1.5em; + padding-left: 0; + text-align: right +} + +.form-check-reverse .form-check-input { + float: right; + margin-right: -1.5em; + margin-left: 0 +} + +.form-check-input { + --bs-form-check-bg: var(--bs-body-bg); + width: 1em; + height: 1em; + margin-top: .25em; + vertical-align: top; + background-color: var(--bs-form-check-bg); + background-image: var(--bs-form-check-bg-image); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: var(--bs-border-width) solid var(--bs-border-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-print-color-adjust: exact; + color-adjust: exact; + print-color-adjust: exact +} + +.form-check-input[type=checkbox] { + border-radius: .25em +} + +.form-check-input[type=radio] { + border-radius: 50% +} + +.form-check-input:active { + filter: brightness(90%) +} + +.form-check-input:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25) +} + +.form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd +} + +.form-check-input:checked[type=checkbox] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e") +} + +.form-check-input:checked[type=radio] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e") +} + +.form-check-input[type=checkbox]:indeterminate { + background-color: #0d6efd; + border-color: #0d6efd; + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e") +} + +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: .5 +} + +.form-check-input:disabled ~ .form-check-label, .form-check-input[disabled] ~ .form-check-label { + cursor: default; + opacity: .5 +} + +.form-switch { + padding-left: 2.5em +} + +.form-switch .form-check-input { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + width: 2em; + margin-left: -2.5em; + background-image: var(--bs-form-switch-bg); + background-position: left center; + border-radius: 2em; + transition: background-position .15s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none + } +} + +.form-switch .form-check-input:focus { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e") +} + +.form-switch .form-check-input:checked { + background-position: right center; + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e") +} + +.form-switch.form-check-reverse { + padding-right: 2.5em; + padding-left: 0 +} + +.form-switch.form-check-reverse .form-check-input { + margin-right: -2.5em; + margin-left: 0 +} + +.form-check-inline { + display: inline-block; + margin-right: 1rem +} + +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none +} + +.btn-check:disabled + .btn, .btn-check[disabled] + .btn { + pointer-events: none; + filter: none; + opacity: .65 +} + +[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e") +} + +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.form-range:focus { + outline: 0 +} + +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 .25rem rgba(13, 110, 253, .25) +} + +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 .25rem rgba(13, 110, 253, .25) +} + +.form-range::-moz-focus-outer { + border: 0 +} + +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -.25rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + -webkit-appearance: none; + appearance: none +} + +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none + } +} + +.form-range::-webkit-slider-thumb:active { + background-color: #b6d4fe +} + +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-tertiary-bg); + border-color: transparent; + border-radius: 1rem +} + +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -moz-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + -moz-appearance: none; + appearance: none +} + +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none + } +} + +.form-range::-moz-range-thumb:active { + background-color: #b6d4fe +} + +.form-range::-moz-range-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-tertiary-bg); + border-color: transparent; + border-radius: 1rem +} + +.form-range:disabled { + pointer-events: none +} + +.form-range:disabled::-webkit-slider-thumb { + background-color: var(--bs-secondary-color) +} + +.form-range:disabled::-moz-range-thumb { + background-color: var(--bs-secondary-color) +} + +.form-floating { + position: relative +} + +.form-floating > .form-control, .form-floating > .form-control-plaintext, .form-floating > .form-select { + height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + min-height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + line-height: 1.25 +} + +.form-floating > label { + position: absolute; + top: 0; + left: 0; + z-index: 2; + height: 100%; + padding: 1rem .75rem; + overflow: hidden; + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; + pointer-events: none; + border: var(--bs-border-width) solid transparent; + transform-origin: 0 0; + transition: opacity .1s ease-in-out, transform .1s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none + } +} + +.form-floating > .form-control, .form-floating > .form-control-plaintext { + padding: 1rem .75rem +} + +.form-floating > .form-control-plaintext::-moz-placeholder, .form-floating > .form-control::-moz-placeholder { + color: transparent +} + +.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder { + color: transparent +} + +.form-floating > .form-control-plaintext:not(:-moz-placeholder-shown), .form-floating > .form-control:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: .625rem +} + +.form-floating > .form-control-plaintext:focus, .form-floating > .form-control-plaintext:not(:placeholder-shown), .form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: .625rem +} + +.form-floating > .form-control-plaintext:-webkit-autofill, .form-floating > .form-control:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: .625rem +} + +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: .625rem +} + +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + color: rgba(var(--bs-body-color-rgb), .65); + transform: scale(.85) translateY(-.5rem) translateX(.15rem) +} + +.form-floating > .form-control-plaintext ~ label, .form-floating > .form-control:focus ~ label, .form-floating > .form-control:not(:placeholder-shown) ~ label, .form-floating > .form-select ~ label { + color: rgba(var(--bs-body-color-rgb), .65); + transform: scale(.85) translateY(-.5rem) translateX(.15rem) +} + +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius) +} + +.form-floating > .form-control-plaintext ~ label::after, .form-floating > .form-control:focus ~ label::after, .form-floating > .form-control:not(:placeholder-shown) ~ label::after, .form-floating > .form-select ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius) +} + +.form-floating > .form-control:-webkit-autofill ~ label { + color: rgba(var(--bs-body-color-rgb), .65); + transform: scale(.85) translateY(-.5rem) translateX(.15rem) +} + +.form-floating > .form-control-plaintext ~ label { + border-width: var(--bs-border-width) 0 +} + +.form-floating > :disabled ~ label { + color: #6c757d +} + +.form-floating > :disabled ~ label::after { + background-color: var(--bs-secondary-bg) +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100% +} + +.input-group > .form-control, .input-group > .form-floating, .input-group > .form-select { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0 +} + +.input-group > .form-control:focus, .input-group > .form-floating:focus-within, .input-group > .form-select:focus { + z-index: 5 +} + +.input-group .btn { + position: relative; + z-index: 2 +} + +.input-group .btn:focus { + z-index: 5 +} + +.input-group-text { + display: flex; + align-items: center; + padding: .375rem .75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-tertiary-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius) +} + +.input-group-lg > .btn, .input-group-lg > .form-control, .input-group-lg > .form-select, .input-group-lg > .input-group-text { + padding: .5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg) +} + +.input-group-sm > .btn, .input-group-sm > .form-control, .input-group-sm > .form-select, .input-group-sm > .input-group-text { + padding: .25rem .5rem; + font-size: .875rem; + border-radius: var(--bs-border-radius-sm) +} + +.input-group-lg > .form-select, .input-group-sm > .form-select { + padding-right: 3rem +} + +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select, .input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control, .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select, .input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: calc(var(--bs-border-width) * -1); + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.input-group > .form-floating:not(:first-child) > .form-control, .input-group > .form-floating:not(:first-child) > .form-select { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: .25rem; + font-size: .875em; + color: var(--bs-form-valid-color) +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: .25rem .5rem; + margin-top: .1rem; + font-size: .875rem; + color: #fff; + background-color: var(--bs-success); + border-radius: var(--bs-border-radius) +} + +.is-valid ~ .valid-feedback, .is-valid ~ .valid-tooltip, .was-validated :valid ~ .valid-feedback, .was-validated :valid ~ .valid-tooltip { + display: block +} + +.form-control.is-valid, .was-validated .form-control:valid { + border-color: var(--bs-form-valid-border-color); + padding-right: calc(1.5em + .75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(.375em + .1875rem) center; + background-size: calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-control.is-valid:focus, .was-validated .form-control:valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 .25rem rgba(var(--bs-success-rgb), .25) +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + .75rem); + background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) +} + +.form-select.is-valid, .was-validated .form-select:valid { + border-color: var(--bs-form-valid-border-color) +} + +.form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"], .was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right .75rem center, center right 2.25rem; + background-size: 16px 12px, calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-select.is-valid:focus, .was-validated .form-select:valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 .25rem rgba(var(--bs-success-rgb), .25) +} + +.form-control-color.is-valid, .was-validated .form-control-color:valid { + width: calc(3rem + calc(1.5em + .75rem)) +} + +.form-check-input.is-valid, .was-validated .form-check-input:valid { + border-color: var(--bs-form-valid-border-color) +} + +.form-check-input.is-valid:checked, .was-validated .form-check-input:valid:checked { + background-color: var(--bs-form-valid-color) +} + +.form-check-input.is-valid:focus, .was-validated .form-check-input:valid:focus { + box-shadow: 0 0 0 .25rem rgba(var(--bs-success-rgb), .25) +} + +.form-check-input.is-valid ~ .form-check-label, .was-validated .form-check-input:valid ~ .form-check-label { + color: var(--bs-form-valid-color) +} + +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: .5em +} + +.input-group > .form-control:not(:focus).is-valid, .input-group > .form-floating:not(:focus-within).is-valid, .input-group > .form-select:not(:focus).is-valid, .was-validated .input-group > .form-control:not(:focus):valid, .was-validated .input-group > .form-floating:not(:focus-within):valid, .was-validated .input-group > .form-select:not(:focus):valid { + z-index: 3 +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: .25rem; + font-size: .875em; + color: var(--bs-form-invalid-color) +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: .25rem .5rem; + margin-top: .1rem; + font-size: .875rem; + color: #fff; + background-color: var(--bs-danger); + border-radius: var(--bs-border-radius) +} + +.is-invalid ~ .invalid-feedback, .is-invalid ~ .invalid-tooltip, .was-validated :invalid ~ .invalid-feedback, .was-validated :invalid ~ .invalid-tooltip { + display: block +} + +.form-control.is-invalid, .was-validated .form-control:invalid { + border-color: var(--bs-form-invalid-border-color); + padding-right: calc(1.5em + .75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(.375em + .1875rem) center; + background-size: calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-control.is-invalid:focus, .was-validated .form-control:invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 .25rem rgba(var(--bs-danger-rgb), .25) +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + .75rem); + background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) +} + +.form-select.is-invalid, .was-validated .form-select:invalid { + border-color: var(--bs-form-invalid-border-color) +} + +.form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"], .was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right .75rem center, center right 2.25rem; + background-size: 16px 12px, calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-select.is-invalid:focus, .was-validated .form-select:invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 .25rem rgba(var(--bs-danger-rgb), .25) +} + +.form-control-color.is-invalid, .was-validated .form-control-color:invalid { + width: calc(3rem + calc(1.5em + .75rem)) +} + +.form-check-input.is-invalid, .was-validated .form-check-input:invalid { + border-color: var(--bs-form-invalid-border-color) +} + +.form-check-input.is-invalid:checked, .was-validated .form-check-input:invalid:checked { + background-color: var(--bs-form-invalid-color) +} + +.form-check-input.is-invalid:focus, .was-validated .form-check-input:invalid:focus { + box-shadow: 0 0 0 .25rem rgba(var(--bs-danger-rgb), .25) +} + +.form-check-input.is-invalid ~ .form-check-label, .was-validated .form-check-input:invalid ~ .form-check-label { + color: var(--bs-form-invalid-color) +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: .5em +} + +.input-group > .form-control:not(:focus).is-invalid, .input-group > .form-floating:not(:focus-within).is-invalid, .input-group > .form-select:not(:focus).is-invalid, .was-validated .input-group > .form-control:not(:focus):invalid, .was-validated .input-group > .form-floating:not(:focus-within):invalid, .was-validated .input-group > .form-select:not(:focus):invalid { + z-index: 4 +} + +.btn { + --bs-btn-padding-x: 0.75rem; + --bs-btn-padding-y: 0.375rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 400; + --bs-btn-line-height: 1.5; + --bs-btn-color: var(--bs-body-color); + --bs-btn-bg: transparent; + --bs-btn-border-width: var(--bs-border-width); + --bs-btn-border-color: transparent; + --bs-btn-border-radius: var(--bs-border-radius); + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); + display: inline-block; + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + color: var(--bs-btn-color); + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + border-radius: var(--bs-btn-border-radius); + background-color: var(--bs-btn-bg); + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none + } +} + +.btn:hover { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color) +} + +.btn-check + .btn:hover { + color: var(--bs-btn-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color) +} + +.btn:focus-visible { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow) +} + +.btn-check:focus-visible + .btn { + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow) +} + +.btn-check:checked + .btn, .btn.active, .btn.show, .btn:first-child:active, :not(.btn-check) + .btn:active { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color) +} + +.btn-check:checked + .btn:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible, .btn:first-child:active:focus-visible, :not(.btn-check) + .btn:active:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow) +} + +.btn.disabled, .btn:disabled, fieldset:disabled .btn { + color: var(--bs-btn-disabled-color); + pointer-events: none; + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + opacity: var(--bs-btn-disabled-opacity) +} + +.btn-primary { + --bs-btn-color: #fff; + --bs-btn-bg: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0b5ed7; + --bs-btn-hover-border-color: #0a58ca; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0a58ca; + --bs-btn-active-border-color: #0a53be; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #0d6efd; + --bs-btn-disabled-border-color: #0d6efd +} + +.btn-secondary { + --bs-btn-color: #fff; + --bs-btn-bg: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #5c636a; + --bs-btn-hover-border-color: #565e64; + --bs-btn-focus-shadow-rgb: 130, 138, 145; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #565e64; + --bs-btn-active-border-color: #51585e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #6c757d; + --bs-btn-disabled-border-color: #6c757d +} + +.btn-success { + --bs-btn-color: #fff; + --bs-btn-bg: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #157347; + --bs-btn-hover-border-color: #146c43; + --bs-btn-focus-shadow-rgb: 60, 153, 110; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #146c43; + --bs-btn-active-border-color: #13653f; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #198754; + --bs-btn-disabled-border-color: #198754 +} + +.btn-info { + --bs-btn-color: #000; + --bs-btn-bg: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #31d2f2; + --bs-btn-hover-border-color: #25cff2; + --bs-btn-focus-shadow-rgb: 11, 172, 204; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #3dd5f3; + --bs-btn-active-border-color: #25cff2; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #0dcaf0; + --bs-btn-disabled-border-color: #0dcaf0 +} + +.btn-warning { + --bs-btn-color: #000; + --bs-btn-bg: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffca2c; + --bs-btn-hover-border-color: #ffc720; + --bs-btn-focus-shadow-rgb: 217, 164, 6; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffcd39; + --bs-btn-active-border-color: #ffc720; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #ffc107; + --bs-btn-disabled-border-color: #ffc107 +} + +.btn-danger { + --bs-btn-color: #fff; + --bs-btn-bg: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #bb2d3b; + --bs-btn-hover-border-color: #b02a37; + --bs-btn-focus-shadow-rgb: 225, 83, 97; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #b02a37; + --bs-btn-active-border-color: #a52834; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #dc3545; + --bs-btn-disabled-border-color: #dc3545 +} + +.btn-light { + --bs-btn-color: #000; + --bs-btn-bg: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #d3d4d5; + --bs-btn-hover-border-color: #c6c7c8; + --bs-btn-focus-shadow-rgb: 211, 212, 213; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #c6c7c8; + --bs-btn-active-border-color: #babbbc; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f8f9fa; + --bs-btn-disabled-border-color: #f8f9fa +} + +.btn-dark { + --bs-btn-color: #fff; + --bs-btn-bg: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #424649; + --bs-btn-hover-border-color: #373b3e; + --bs-btn-focus-shadow-rgb: 66, 70, 73; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #4d5154; + --bs-btn-active-border-color: #373b3e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #212529; + --bs-btn-disabled-border-color: #212529 +} + +.btn-outline-primary { + --bs-btn-color: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0d6efd; + --bs-btn-hover-border-color: #0d6efd; + --bs-btn-focus-shadow-rgb: 13, 110, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0d6efd; + --bs-btn-active-border-color: #0d6efd; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0d6efd; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0d6efd; + --bs-gradient: none +} + +.btn-outline-secondary { + --bs-btn-color: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #6c757d; + --bs-btn-hover-border-color: #6c757d; + --bs-btn-focus-shadow-rgb: 108, 117, 125; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #6c757d; + --bs-btn-active-border-color: #6c757d; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #6c757d; + --bs-gradient: none +} + +.btn-outline-success { + --bs-btn-color: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #198754; + --bs-btn-hover-border-color: #198754; + --bs-btn-focus-shadow-rgb: 25, 135, 84; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #198754; + --bs-btn-active-border-color: #198754; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #198754; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #198754; + --bs-gradient: none +} + +.btn-outline-info { + --bs-btn-color: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #0dcaf0; + --bs-btn-hover-border-color: #0dcaf0; + --bs-btn-focus-shadow-rgb: 13, 202, 240; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #0dcaf0; + --bs-btn-active-border-color: #0dcaf0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0dcaf0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0dcaf0; + --bs-gradient: none +} + +.btn-outline-warning { + --bs-btn-color: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffc107; + --bs-btn-hover-border-color: #ffc107; + --bs-btn-focus-shadow-rgb: 255, 193, 7; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffc107; + --bs-btn-active-border-color: #ffc107; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ffc107; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ffc107; + --bs-gradient: none +} + +.btn-outline-danger { + --bs-btn-color: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #dc3545; + --bs-btn-hover-border-color: #dc3545; + --bs-btn-focus-shadow-rgb: 220, 53, 69; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #dc3545; + --bs-btn-active-border-color: #dc3545; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #dc3545; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #dc3545; + --bs-gradient: none +} + +.btn-outline-light { + --bs-btn-color: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f8f9fa; + --bs-btn-hover-border-color: #f8f9fa; + --bs-btn-focus-shadow-rgb: 248, 249, 250; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f8f9fa; + --bs-btn-active-border-color: #f8f9fa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f8f9fa; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f8f9fa; + --bs-gradient: none +} + +.btn-outline-dark { + --bs-btn-color: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #212529; + --bs-btn-hover-border-color: #212529; + --bs-btn-focus-shadow-rgb: 33, 37, 41; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #212529; + --bs-btn-active-border-color: #212529; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #212529; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #212529; + --bs-gradient: none +} + +.btn-link { + --bs-btn-font-weight: 400; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: 0 0 0 #000; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + text-decoration: underline +} + +.btn-link:focus-visible { + color: var(--bs-btn-color) +} + +.btn-link:hover { + color: var(--bs-btn-hover-color) +} + +.btn-group-lg > .btn, .btn-lg { + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 1rem; + --bs-btn-font-size: 1.25rem; + --bs-btn-border-radius: var(--bs-border-radius-lg) +} + +.btn-group-sm > .btn, .btn-sm { + --bs-btn-padding-y: 0.25rem; + --bs-btn-padding-x: 0.5rem; + --bs-btn-font-size: 0.875rem; + --bs-btn-border-radius: var(--bs-border-radius-sm) +} + +.fade { + transition: opacity .15s linear +} + +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none + } +} + +.fade:not(.show) { + opacity: 0 +} + +.collapse:not(.show) { + display: none +} + +.collapsing { + height: 0; + overflow: hidden; + transition: height .35s ease +} + +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none + } +} + +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width .35s ease +} + +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none + } +} + +.dropdown, .dropdown-center, .dropend, .dropstart, .dropup, .dropup-center { + position: relative +} + +.dropdown-toggle { + white-space: nowrap +} + +.dropdown-toggle::after { + display: inline-block; + 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 { + --bs-dropdown-zindex: 1000; + --bs-dropdown-min-width: 10rem; + --bs-dropdown-padding-x: 0; + --bs-dropdown-padding-y: 0.5rem; + --bs-dropdown-spacer: 0.125rem; + --bs-dropdown-font-size: 1rem; + --bs-dropdown-color: var(--bs-body-color); + --bs-dropdown-bg: var(--bs-body-bg); + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-border-radius: var(--bs-border-radius); + --bs-dropdown-border-width: var(--bs-border-width); + --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width)); + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-divider-margin-y: 0.5rem; + --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-dropdown-link-color: var(--bs-body-color); + --bs-dropdown-link-hover-color: var(--bs-body-color); + --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: var(--bs-tertiary-color); + --bs-dropdown-item-padding-x: 1rem; + --bs-dropdown-item-padding-y: 0.25rem; + --bs-dropdown-header-color: #6c757d; + --bs-dropdown-header-padding-x: 1rem; + --bs-dropdown-header-padding-y: 0.5rem; + position: absolute; + z-index: var(--bs-dropdown-zindex); + display: none; + min-width: var(--bs-dropdown-min-width); + padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); + margin: 0; + font-size: var(--bs-dropdown-font-size); + color: var(--bs-dropdown-color); + text-align: left; + list-style: none; + background-color: var(--bs-dropdown-bg); + background-clip: padding-box; + border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); + border-radius: var(--bs-dropdown-border-radius) +} + +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--bs-dropdown-spacer) +} + +.dropdown-menu-start { + --bs-position: start +} + +.dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0 +} + +.dropdown-menu-end { + --bs-position: end +} + +.dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto +} + +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start + } + + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0 + } + + .dropdown-menu-sm-end { + --bs-position: end + } + + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto + } +} + +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start + } + + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0 + } + + .dropdown-menu-md-end { + --bs-position: end + } + + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto + } +} + +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start + } + + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0 + } + + .dropdown-menu-lg-end { + --bs-position: end + } + + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto + } +} + +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start + } + + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0 + } + + .dropdown-menu-xl-end { + --bs-position: end + } + + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto + } +} + +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start + } + + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0 + } + + .dropdown-menu-xxl-end { + --bs-position: end + } + + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto + } +} + +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--bs-dropdown-spacer) +} + +.dropup .dropdown-toggle::after { + display: inline-block; + 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 +} + +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--bs-dropdown-spacer) +} + +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: ""; + border-top: .3em solid transparent; + border-right: 0; + border-bottom: .3em solid transparent; + border-left: .3em solid +} + +.dropend .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropend .dropdown-toggle::after { + vertical-align: 0 +} + +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--bs-dropdown-spacer) +} + +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: "" +} + +.dropstart .dropdown-toggle::after { + display: none +} + +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: .255em; + vertical-align: .255em; + content: ""; + border-top: .3em solid transparent; + border-right: .3em solid; + border-bottom: .3em solid transparent +} + +.dropstart .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropstart .dropdown-toggle::before { + vertical-align: 0 +} + +.dropdown-divider { + height: 0; + margin: var(--bs-dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--bs-dropdown-divider-bg); + opacity: 1 +} + +.dropdown-item { + display: block; + width: 100%; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + clear: both; + font-weight: 400; + color: var(--bs-dropdown-link-color); + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; + border-radius: var(--bs-dropdown-item-border-radius, 0) +} + +.dropdown-item:focus, .dropdown-item:hover { + color: var(--bs-dropdown-link-hover-color); + background-color: var(--bs-dropdown-link-hover-bg) +} + +.dropdown-item.active, .dropdown-item:active { + color: var(--bs-dropdown-link-active-color); + text-decoration: none; + background-color: var(--bs-dropdown-link-active-bg) +} + +.dropdown-item.disabled, .dropdown-item:disabled { + color: var(--bs-dropdown-link-disabled-color); + pointer-events: none; + background-color: transparent +} + +.dropdown-menu.show { + display: block +} + +.dropdown-header { + display: block; + padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); + margin-bottom: 0; + font-size: .875rem; + color: var(--bs-dropdown-header-color); + white-space: nowrap +} + +.dropdown-item-text { + display: block; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + color: var(--bs-dropdown-link-color) +} + +.dropdown-menu-dark { + --bs-dropdown-color: #dee2e6; + --bs-dropdown-bg: #343a40; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-box-shadow: ; + --bs-dropdown-link-color: #dee2e6; + --bs-dropdown-link-hover-color: #fff; + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-header-color: #adb5bd +} + +.btn-group, .btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle +} + +.btn-group-vertical > .btn, .btn-group > .btn { + position: relative; + flex: 1 1 auto +} + +.btn-group-vertical > .btn-check:checked + .btn, .btn-group-vertical > .btn-check:focus + .btn, .btn-group-vertical > .btn.active, .btn-group-vertical > .btn:active, .btn-group-vertical > .btn:focus, .btn-group-vertical > .btn:hover, .btn-group > .btn-check:checked + .btn, .btn-group > .btn-check:focus + .btn, .btn-group > .btn.active, .btn-group > .btn:active, .btn-group > .btn:focus, .btn-group > .btn:hover { + z-index: 1 +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start +} + +.btn-toolbar .input-group { + width: auto +} + +.btn-group { + border-radius: var(--bs-border-radius) +} + +.btn-group > .btn-group:not(:first-child), .btn-group > :not(.btn-check:first-child) + .btn { + margin-left: calc(var(--bs-border-width) * -1) +} + +.btn-group > .btn-group:not(:last-child) > .btn, .btn-group > .btn.dropdown-toggle-split:first-child, .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:nth-child(n+3), .btn-group > :not(.btn-check) + .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.dropdown-toggle-split { + padding-right: .5625rem; + padding-left: .5625rem +} + +.dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after { + margin-left: 0 +} + +.dropstart .dropdown-toggle-split::before { + margin-right: 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 { + flex-direction: column; + align-items: flex-start; + justify-content: center +} + +.btn-group-vertical > .btn, .btn-group-vertical > .btn-group { + width: 100% +} + +.btn-group-vertical > .btn-group:not(:first-child), .btn-group-vertical > .btn:not(:first-child) { + margin-top: calc(var(--bs-border-width) * -1) +} + +.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 ~ .btn { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.nav { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.nav-link { + display: block; + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + color: var(--bs-nav-link-color); + text-decoration: none; + background: 0 0; + border: 0; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none + } +} + +.nav-link:focus, .nav-link:hover { + color: var(--bs-nav-link-hover-color) +} + +.nav-link:focus-visible { + outline: 0; + box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25) +} + +.nav-link.disabled { + color: var(--bs-nav-link-disabled-color); + pointer-events: none; + cursor: default +} + +.nav-tabs { + --bs-nav-tabs-border-width: var(--bs-border-width); + --bs-nav-tabs-border-color: var(--bs-border-color); + --bs-nav-tabs-border-radius: var(--bs-border-radius); + --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color); + --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); + --bs-nav-tabs-link-active-bg: var(--bs-body-bg); + --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg); + border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color) +} + +.nav-tabs .nav-link { + margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); + border: var(--bs-nav-tabs-border-width) solid transparent; + border-top-left-radius: var(--bs-nav-tabs-border-radius); + border-top-right-radius: var(--bs-nav-tabs-border-radius) +} + +.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { + isolation: isolate; + border-color: var(--bs-nav-tabs-link-hover-border-color) +} + +.nav-tabs .nav-link.disabled, .nav-tabs .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + background-color: transparent; + border-color: transparent +} + +.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active { + color: var(--bs-nav-tabs-link-active-color); + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color) +} + +.nav-tabs .dropdown-menu { + margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.nav-pills { + --bs-nav-pills-border-radius: var(--bs-border-radius); + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #0d6efd +} + +.nav-pills .nav-link { + border-radius: var(--bs-nav-pills-border-radius) +} + +.nav-pills .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + background-color: transparent; + border-color: transparent +} + +.nav-pills .nav-link.active, .nav-pills .show > .nav-link { + color: var(--bs-nav-pills-link-active-color); + background-color: var(--bs-nav-pills-link-active-bg) +} + +.nav-underline { + --bs-nav-underline-gap: 1rem; + --bs-nav-underline-border-width: 0.125rem; + --bs-nav-underline-link-active-color: var(--bs-emphasis-color); + gap: var(--bs-nav-underline-gap) +} + +.nav-underline .nav-link { + padding-right: 0; + padding-left: 0; + border-bottom: var(--bs-nav-underline-border-width) solid transparent +} + +.nav-underline .nav-link:focus, .nav-underline .nav-link:hover { + border-bottom-color: currentcolor +} + +.nav-underline .nav-link.active, .nav-underline .show > .nav-link { + font-weight: 700; + color: var(--bs-nav-underline-link-active-color); + border-bottom-color: currentcolor +} + +.nav-fill .nav-item, .nav-fill > .nav-link { + flex: 1 1 auto; + text-align: center +} + +.nav-justified .nav-item, .nav-justified > .nav-link { + flex-basis: 0; + flex-grow: 1; + text-align: center +} + +.nav-fill .nav-item .nav-link, .nav-justified .nav-item .nav-link { + width: 100% +} + +.tab-content > .tab-pane { + display: none +} + +.tab-content > .active { + display: block +} + +.navbar { + --bs-navbar-padding-x: 0; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65); + --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8); + --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3); + --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-padding-y: 0.3125rem; + --bs-navbar-brand-margin-end: 1rem; + --bs-navbar-brand-font-size: 1.25rem; + --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-nav-link-padding-x: 0.5rem; + --bs-navbar-toggler-padding-y: 0.25rem; + --bs-navbar-toggler-padding-x: 0.75rem; + --bs-navbar-toggler-font-size: 1.25rem; + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15); + --bs-navbar-toggler-border-radius: var(--bs-border-radius); + --bs-navbar-toggler-focus-width: 0.25rem; + --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x) +} + +.navbar > .container, .navbar > .container-fluid, .navbar > .container-lg, .navbar > .container-md, .navbar > .container-sm, .navbar > .container-xl, .navbar > .container-xxl { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between +} + +.navbar-brand { + padding-top: var(--bs-navbar-brand-padding-y); + padding-bottom: var(--bs-navbar-brand-padding-y); + margin-right: var(--bs-navbar-brand-margin-end); + font-size: var(--bs-navbar-brand-font-size); + color: var(--bs-navbar-brand-color); + text-decoration: none; + white-space: nowrap +} + +.navbar-brand:focus, .navbar-brand:hover { + color: var(--bs-navbar-brand-hover-color) +} + +.navbar-nav { + --bs-nav-link-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-navbar-color); + --bs-nav-link-hover-color: var(--bs-navbar-hover-color); + --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.navbar-nav .nav-link.active, .navbar-nav .nav-link.show { + color: var(--bs-navbar-active-color) +} + +.navbar-nav .dropdown-menu { + position: static +} + +.navbar-text { + padding-top: .5rem; + padding-bottom: .5rem; + color: var(--bs-navbar-color) +} + +.navbar-text a, .navbar-text a:focus, .navbar-text a:hover { + color: var(--bs-navbar-active-color) +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center +} + +.navbar-toggler { + padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); + font-size: var(--bs-navbar-toggler-font-size); + line-height: 1; + color: var(--bs-navbar-color); + background-color: transparent; + border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); + border-radius: var(--bs-navbar-toggler-border-radius); + transition: var(--bs-navbar-toggler-transition) +} + +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none + } +} + +.navbar-toggler:hover { + text-decoration: none +} + +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width) +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-image: var(--bs-navbar-toggler-icon-bg); + background-repeat: no-repeat; + background-position: center; + background-size: 100% +} + +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start + } + + .navbar-expand-sm .navbar-nav { + flex-direction: row + } + + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x) + } + + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-sm .navbar-toggler { + display: none + } + + .navbar-expand-sm .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none + } + + .navbar-expand-sm .offcanvas .offcanvas-header { + display: none + } + + .navbar-expand-sm .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible + } +} + +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start + } + + .navbar-expand-md .navbar-nav { + flex-direction: row + } + + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-md .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x) + } + + .navbar-expand-md .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-md .navbar-toggler { + display: none + } + + .navbar-expand-md .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none + } + + .navbar-expand-md .offcanvas .offcanvas-header { + display: none + } + + .navbar-expand-md .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible + } +} + +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start + } + + .navbar-expand-lg .navbar-nav { + flex-direction: row + } + + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x) + } + + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-lg .navbar-toggler { + display: none + } + + .navbar-expand-lg .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none + } + + .navbar-expand-lg .offcanvas .offcanvas-header { + display: none + } + + .navbar-expand-lg .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible + } +} + +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start + } + + .navbar-expand-xl .navbar-nav { + flex-direction: row + } + + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x) + } + + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-xl .navbar-toggler { + display: none + } + + .navbar-expand-xl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none + } + + .navbar-expand-xl .offcanvas .offcanvas-header { + display: none + } + + .navbar-expand-xl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible + } +} + +@media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start + } + + .navbar-expand-xxl .navbar-nav { + flex-direction: row + } + + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x) + } + + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-xxl .navbar-toggler { + display: none + } + + .navbar-expand-xxl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none + } + + .navbar-expand-xxl .offcanvas .offcanvas-header { + display: none + } + + .navbar-expand-xxl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible + } +} + +.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start +} + +.navbar-expand .navbar-nav { + flex-direction: row +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x) +} + +.navbar-expand .navbar-nav-scroll { + overflow: visible +} + +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto +} + +.navbar-expand .navbar-toggler { + display: none +} + +.navbar-expand .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none +} + +.navbar-expand .offcanvas .offcanvas-header { + display: none +} + +.navbar-expand .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible +} + +.navbar-dark, .navbar[data-bs-theme=dark] { + --bs-navbar-color: rgba(255, 255, 255, 0.55); + --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); + --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); + --bs-navbar-active-color: #fff; + --bs-navbar-brand-color: #fff; + --bs-navbar-brand-hover-color: #fff; + --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") +} + +[data-bs-theme=dark] .navbar-toggler-icon { + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") +} + +.card { + --bs-card-spacer-y: 1rem; + --bs-card-spacer-x: 1rem; + --bs-card-title-spacer-y: 0.5rem; + --bs-card-title-color: ; + --bs-card-subtitle-color: ; + --bs-card-border-width: var(--bs-border-width); + --bs-card-border-color: var(--bs-border-color-translucent); + --bs-card-border-radius: var(--bs-border-radius); + --bs-card-box-shadow: ; + --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); + --bs-card-cap-padding-y: 0.5rem; + --bs-card-cap-padding-x: 1rem; + --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03); + --bs-card-cap-color: ; + --bs-card-height: ; + --bs-card-color: ; + --bs-card-bg: var(--bs-body-bg); + --bs-card-img-overlay-padding: 1rem; + --bs-card-group-margin: 0.75rem; + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + height: var(--bs-card-height); + color: var(--bs-body-color); + word-wrap: break-word; + background-color: var(--bs-card-bg); + background-clip: border-box; + border: var(--bs-card-border-width) solid var(--bs-card-border-color); + border-radius: var(--bs-card-border-radius) +} + +.card > hr { + margin-right: 0; + margin-left: 0 +} + +.card > .list-group { + border-top: inherit; + border-bottom: inherit +} + +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius) +} + +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius) +} + +.card > .card-header + .list-group, .card > .list-group + .card-footer { + border-top: 0 +} + +.card-body { + flex: 1 1 auto; + padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); + color: var(--bs-card-color) +} + +.card-title { + margin-bottom: var(--bs-card-title-spacer-y); + color: var(--bs-card-title-color) +} + +.card-subtitle { + margin-top: calc(-.5 * var(--bs-card-title-spacer-y)); + margin-bottom: 0; + color: var(--bs-card-subtitle-color) +} + +.card-text:last-child { + margin-bottom: 0 +} + +.card-link + .card-link { + margin-left: var(--bs-card-spacer-x) +} + +.card-header { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + margin-bottom: 0; + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color) +} + +.card-header:first-child { + border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0 +} + +.card-footer { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-top: var(--bs-card-border-width) solid var(--bs-card-border-color) +} + +.card-footer:last-child { + border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) +} + +.card-header-tabs { + margin-right: calc(-.5 * var(--bs-card-cap-padding-x)); + margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); + margin-left: calc(-.5 * var(--bs-card-cap-padding-x)); + border-bottom: 0 +} + +.card-header-tabs .nav-link.active { + background-color: var(--bs-card-bg); + border-bottom-color: var(--bs-card-bg) +} + +.card-header-pills { + margin-right: calc(-.5 * var(--bs-card-cap-padding-x)); + margin-left: calc(-.5 * var(--bs-card-cap-padding-x)) +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--bs-card-img-overlay-padding); + border-radius: var(--bs-card-inner-border-radius) +} + +.card-img, .card-img-bottom, .card-img-top { + width: 100% +} + +.card-img, .card-img-top { + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius) +} + +.card-img, .card-img-bottom { + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius) +} + +.card-group > .card { + margin-bottom: var(--bs-card-group-margin) +} + +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap + } + + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0 + } + + .card-group > .card + .card { + margin-left: 0; + border-left: 0 + } + + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 + } + + .card-group > .card:not(:last-child) .card-header, .card-group > .card:not(:last-child) .card-img-top { + border-top-right-radius: 0 + } + + .card-group > .card:not(:last-child) .card-footer, .card-group > .card:not(:last-child) .card-img-bottom { + border-bottom-right-radius: 0 + } + + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 + } + + .card-group > .card:not(:first-child) .card-header, .card-group > .card:not(:first-child) .card-img-top { + border-top-left-radius: 0 + } + + .card-group > .card:not(:first-child) .card-footer, .card-group > .card:not(:first-child) .card-img-bottom { + border-bottom-left-radius: 0 + } +} + +.accordion { + --bs-accordion-color: var(--bs-body-color); + --bs-accordion-bg: var(--bs-body-bg); + --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; + --bs-accordion-border-color: var(--bs-border-color); + --bs-accordion-border-width: var(--bs-border-width); + --bs-accordion-border-radius: var(--bs-border-radius); + --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); + --bs-accordion-btn-padding-x: 1.25rem; + --bs-accordion-btn-padding-y: 1rem; + --bs-accordion-btn-color: var(--bs-body-color); + --bs-accordion-btn-bg: var(--bs-accordion-bg); + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-icon-width: 1.25rem; + --bs-accordion-btn-icon-transform: rotate(-180deg); + --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-focus-border-color: #86b7fe; + --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-accordion-body-padding-x: 1.25rem; + --bs-accordion-body-padding-y: 1rem; + --bs-accordion-active-color: var(--bs-primary-text-emphasis); + --bs-accordion-active-bg: var(--bs-primary-bg-subtle) +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); + font-size: 1rem; + color: var(--bs-accordion-btn-color); + text-align: left; + background-color: var(--bs-accordion-btn-bg); + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: var(--bs-accordion-transition) +} + +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none + } +} + +.accordion-button:not(.collapsed) { + color: var(--bs-accordion-active-color); + background-color: var(--bs-accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color) +} + +.accordion-button:not(.collapsed)::after { + background-image: var(--bs-accordion-btn-active-icon); + transform: var(--bs-accordion-btn-icon-transform) +} + +.accordion-button::after { + flex-shrink: 0; + width: var(--bs-accordion-btn-icon-width); + height: var(--bs-accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--bs-accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--bs-accordion-btn-icon-width); + transition: var(--bs-accordion-btn-icon-transition) +} + +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none + } +} + +.accordion-button:hover { + z-index: 2 +} + +.accordion-button:focus { + z-index: 3; + border-color: var(--bs-accordion-btn-focus-border-color); + outline: 0; + box-shadow: var(--bs-accordion-btn-focus-box-shadow) +} + +.accordion-header { + margin-bottom: 0 +} + +.accordion-item { + color: var(--bs-accordion-color); + background-color: var(--bs-accordion-bg); + border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color) +} + +.accordion-item:first-of-type { + border-top-left-radius: var(--bs-accordion-border-radius); + border-top-right-radius: var(--bs-accordion-border-radius) +} + +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: var(--bs-accordion-inner-border-radius); + border-top-right-radius: var(--bs-accordion-inner-border-radius) +} + +.accordion-item:not(:first-of-type) { + border-top: 0 +} + +.accordion-item:last-of-type { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius) +} + +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: var(--bs-accordion-inner-border-radius); + border-bottom-left-radius: var(--bs-accordion-inner-border-radius) +} + +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius) +} + +.accordion-body { + padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x) +} + +.accordion-flush .accordion-collapse { + border-width: 0 +} + +.accordion-flush .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0 +} + +.accordion-flush .accordion-item:first-child { + border-top: 0 +} + +.accordion-flush .accordion-item:last-child { + border-bottom: 0 +} + +.accordion-flush .accordion-item .accordion-button, .accordion-flush .accordion-item .accordion-button.collapsed { + border-radius: 0 +} + +[data-bs-theme=dark] .accordion-button::after { + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") +} + +.breadcrumb { + --bs-breadcrumb-padding-x: 0; + --bs-breadcrumb-padding-y: 0; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: ; + --bs-breadcrumb-border-radius: ; + --bs-breadcrumb-divider-color: var(--bs-secondary-color); + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); + margin-bottom: var(--bs-breadcrumb-margin-bottom); + font-size: var(--bs-breadcrumb-font-size); + list-style: none; + background-color: var(--bs-breadcrumb-bg); + border-radius: var(--bs-breadcrumb-border-radius) +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: var(--bs-breadcrumb-item-padding-x) +} + +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: var(--bs-breadcrumb-item-padding-x); + color: var(--bs-breadcrumb-divider-color); + content: var(--bs-breadcrumb-divider, "/") +} + +.breadcrumb-item.active { + color: var(--bs-breadcrumb-item-active-color) +} + +.pagination { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.375rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-color: var(--bs-link-color); + --bs-pagination-bg: var(--bs-body-bg); + --bs-pagination-border-width: var(--bs-border-width); + --bs-pagination-border-color: var(--bs-border-color); + --bs-pagination-border-radius: var(--bs-border-radius); + --bs-pagination-hover-color: var(--bs-link-hover-color); + --bs-pagination-hover-bg: var(--bs-tertiary-bg); + --bs-pagination-hover-border-color: var(--bs-border-color); + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: var(--bs-secondary-bg); + --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #0d6efd; + --bs-pagination-active-border-color: #0d6efd; + --bs-pagination-disabled-color: var(--bs-secondary-color); + --bs-pagination-disabled-bg: var(--bs-secondary-bg); + --bs-pagination-disabled-border-color: var(--bs-border-color); + display: flex; + padding-left: 0; + list-style: none +} + +.page-link { + position: relative; + display: block; + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + font-size: var(--bs-pagination-font-size); + color: var(--bs-pagination-color); + text-decoration: none; + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none + } +} + +.page-link:hover { + z-index: 2; + color: var(--bs-pagination-hover-color); + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color) +} + +.page-link:focus { + z-index: 3; + color: var(--bs-pagination-focus-color); + background-color: var(--bs-pagination-focus-bg); + outline: 0; + box-shadow: var(--bs-pagination-focus-box-shadow) +} + +.active > .page-link, .page-link.active { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color) +} + +.disabled > .page-link, .page-link.disabled { + color: var(--bs-pagination-disabled-color); + pointer-events: none; + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color) +} + +.page-item:not(:first-child) .page-link { + margin-left: calc(var(--bs-border-width) * -1) +} + +.page-item:first-child .page-link { + border-top-left-radius: var(--bs-pagination-border-radius); + border-bottom-left-radius: var(--bs-pagination-border-radius) +} + +.page-item:last-child .page-link { + border-top-right-radius: var(--bs-pagination-border-radius); + border-bottom-right-radius: var(--bs-pagination-border-radius) +} + +.pagination-lg { + --bs-pagination-padding-x: 1.5rem; + --bs-pagination-padding-y: 0.75rem; + --bs-pagination-font-size: 1.25rem; + --bs-pagination-border-radius: var(--bs-border-radius-lg) +} + +.pagination-sm { + --bs-pagination-padding-x: 0.5rem; + --bs-pagination-padding-y: 0.25rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-border-radius: var(--bs-border-radius-sm) +} + +.badge { + --bs-badge-padding-x: 0.65em; + --bs-badge-padding-y: 0.35em; + --bs-badge-font-size: 0.75em; + --bs-badge-font-weight: 700; + --bs-badge-color: #fff; + --bs-badge-border-radius: var(--bs-border-radius); + display: inline-block; + padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); + font-size: var(--bs-badge-font-size); + font-weight: var(--bs-badge-font-weight); + line-height: 1; + color: var(--bs-badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: var(--bs-badge-border-radius) +} + +.badge:empty { + display: none +} + +.btn .badge { + position: relative; + top: -1px +} + +.alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color); + --bs-alert-border-radius: var(--bs-border-radius); + --bs-alert-link-color: inherit; + position: relative; + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + margin-bottom: var(--bs-alert-margin-bottom); + color: var(--bs-alert-color); + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); + border-radius: var(--bs-alert-border-radius) +} + +.alert-heading { + color: inherit +} + +.alert-link { + font-weight: 700; + color: var(--bs-alert-link-color) +} + +.alert-dismissible { + padding-right: 3rem +} + +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem +} + +.alert-primary { + --bs-alert-color: var(--bs-primary-text-emphasis); + --bs-alert-bg: var(--bs-primary-bg-subtle); + --bs-alert-border-color: var(--bs-primary-border-subtle); + --bs-alert-link-color: var(--bs-primary-text-emphasis) +} + +.alert-secondary { + --bs-alert-color: var(--bs-secondary-text-emphasis); + --bs-alert-bg: var(--bs-secondary-bg-subtle); + --bs-alert-border-color: var(--bs-secondary-border-subtle); + --bs-alert-link-color: var(--bs-secondary-text-emphasis) +} + +.alert-success { + --bs-alert-color: var(--bs-success-text-emphasis); + --bs-alert-bg: var(--bs-success-bg-subtle); + --bs-alert-border-color: var(--bs-success-border-subtle); + --bs-alert-link-color: var(--bs-success-text-emphasis) +} + +.alert-info { + --bs-alert-color: var(--bs-info-text-emphasis); + --bs-alert-bg: var(--bs-info-bg-subtle); + --bs-alert-border-color: var(--bs-info-border-subtle); + --bs-alert-link-color: var(--bs-info-text-emphasis) +} + +.alert-warning { + --bs-alert-color: var(--bs-warning-text-emphasis); + --bs-alert-bg: var(--bs-warning-bg-subtle); + --bs-alert-border-color: var(--bs-warning-border-subtle); + --bs-alert-link-color: var(--bs-warning-text-emphasis) +} + +.alert-danger { + --bs-alert-color: var(--bs-danger-text-emphasis); + --bs-alert-bg: var(--bs-danger-bg-subtle); + --bs-alert-border-color: var(--bs-danger-border-subtle); + --bs-alert-link-color: var(--bs-danger-text-emphasis) +} + +.alert-light { + --bs-alert-color: var(--bs-light-text-emphasis); + --bs-alert-bg: var(--bs-light-bg-subtle); + --bs-alert-border-color: var(--bs-light-border-subtle); + --bs-alert-link-color: var(--bs-light-text-emphasis) +} + +.alert-dark { + --bs-alert-color: var(--bs-dark-text-emphasis); + --bs-alert-bg: var(--bs-dark-bg-subtle); + --bs-alert-border-color: var(--bs-dark-border-subtle); + --bs-alert-link-color: var(--bs-dark-text-emphasis) +} + +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem + } +} + +.progress, .progress-stacked { + --bs-progress-height: 1rem; + --bs-progress-font-size: 0.75rem; + --bs-progress-bg: var(--bs-secondary-bg); + --bs-progress-border-radius: var(--bs-border-radius); + --bs-progress-box-shadow: var(--bs-box-shadow-inset); + --bs-progress-bar-color: #fff; + --bs-progress-bar-bg: #0d6efd; + --bs-progress-bar-transition: width 0.6s ease; + display: flex; + height: var(--bs-progress-height); + overflow: hidden; + font-size: var(--bs-progress-font-size); + background-color: var(--bs-progress-bg); + border-radius: var(--bs-progress-border-radius) +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--bs-progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-progress-bar-bg); + transition: var(--bs-progress-bar-transition) +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none + } +} + +.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: var(--bs-progress-height) var(--bs-progress-height) +} + +.progress-stacked > .progress { + overflow: visible +} + +.progress-stacked > .progress > .progress-bar { + width: 100% +} + +.progress-bar-animated { + animation: 1s linear infinite progress-bar-stripes +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none + } +} + +.list-group { + --bs-list-group-color: var(--bs-body-color); + --bs-list-group-bg: var(--bs-body-bg); + --bs-list-group-border-color: var(--bs-border-color); + --bs-list-group-border-width: var(--bs-border-width); + --bs-list-group-border-radius: var(--bs-border-radius); + --bs-list-group-item-padding-x: 1rem; + --bs-list-group-item-padding-y: 0.5rem; + --bs-list-group-action-color: var(--bs-secondary-color); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-tertiary-bg); + --bs-list-group-action-active-color: var(--bs-body-color); + --bs-list-group-action-active-bg: var(--bs-secondary-bg); + --bs-list-group-disabled-color: var(--bs-secondary-color); + --bs-list-group-disabled-bg: var(--bs-body-bg); + --bs-list-group-active-color: #fff; + --bs-list-group-active-bg: #0d6efd; + --bs-list-group-active-border-color: #0d6efd; + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: var(--bs-list-group-border-radius) +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section +} + +.list-group-numbered > .list-group-item::before { + content: counters(section, ".") ". "; + counter-increment: section +} + +.list-group-item-action { + width: 100%; + color: var(--bs-list-group-action-color); + text-align: inherit +} + +.list-group-item-action:focus, .list-group-item-action:hover { + z-index: 1; + color: var(--bs-list-group-action-hover-color); + text-decoration: none; + background-color: var(--bs-list-group-action-hover-bg) +} + +.list-group-item-action:active { + color: var(--bs-list-group-action-active-color); + background-color: var(--bs-list-group-action-active-bg) +} + +.list-group-item { + position: relative; + display: block; + padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); + color: var(--bs-list-group-color); + text-decoration: none; + background-color: var(--bs-list-group-bg); + border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color) +} + +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit +} + +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit +} + +.list-group-item.disabled, .list-group-item:disabled { + color: var(--bs-list-group-disabled-color); + pointer-events: none; + background-color: var(--bs-list-group-disabled-bg) +} + +.list-group-item.active { + z-index: 2; + color: var(--bs-list-group-active-color); + background-color: var(--bs-list-group-active-bg); + border-color: var(--bs-list-group-active-border-color) +} + +.list-group-item + .list-group-item { + border-top-width: 0 +} + +.list-group-item + .list-group-item.active { + margin-top: calc(-1 * var(--bs-list-group-border-width)); + border-top-width: var(--bs-list-group-border-width) +} + +.list-group-horizontal { + flex-direction: row +} + +.list-group-horizontal > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0 +} + +.list-group-horizontal > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0 +} + +.list-group-horizontal > .list-group-item.active { + margin-top: 0 +} + +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0 +} + +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width) +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row + } + + .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0 + } + + .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0 + } + + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0 + } + + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width) + } +} + +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row + } + + .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0 + } + + .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0 + } + + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0 + } + + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width) + } +} + +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row + } + + .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0 + } + + .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0 + } + + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0 + } + + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width) + } +} + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row + } + + .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0 + } + + .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0 + } + + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0 + } + + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width) + } +} + +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row + } + + .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0 + } + + .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0 + } + + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0 + } + + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width) + } +} + +.list-group-flush { + border-radius: 0 +} + +.list-group-flush > .list-group-item { + border-width: 0 0 var(--bs-list-group-border-width) +} + +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0 +} + +.list-group-item-primary { + --bs-list-group-color: var(--bs-primary-text-emphasis); + --bs-list-group-bg: var(--bs-primary-bg-subtle); + --bs-list-group-border-color: var(--bs-primary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-primary-border-subtle); + --bs-list-group-active-color: var(--bs-primary-bg-subtle); + --bs-list-group-active-bg: var(--bs-primary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-primary-text-emphasis) +} + +.list-group-item-secondary { + --bs-list-group-color: var(--bs-secondary-text-emphasis); + --bs-list-group-bg: var(--bs-secondary-bg-subtle); + --bs-list-group-border-color: var(--bs-secondary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle); + --bs-list-group-active-color: var(--bs-secondary-bg-subtle); + --bs-list-group-active-bg: var(--bs-secondary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis) +} + +.list-group-item-success { + --bs-list-group-color: var(--bs-success-text-emphasis); + --bs-list-group-bg: var(--bs-success-bg-subtle); + --bs-list-group-border-color: var(--bs-success-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-success-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-success-border-subtle); + --bs-list-group-active-color: var(--bs-success-bg-subtle); + --bs-list-group-active-bg: var(--bs-success-text-emphasis); + --bs-list-group-active-border-color: var(--bs-success-text-emphasis) +} + +.list-group-item-info { + --bs-list-group-color: var(--bs-info-text-emphasis); + --bs-list-group-bg: var(--bs-info-bg-subtle); + --bs-list-group-border-color: var(--bs-info-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-info-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-info-border-subtle); + --bs-list-group-active-color: var(--bs-info-bg-subtle); + --bs-list-group-active-bg: var(--bs-info-text-emphasis); + --bs-list-group-active-border-color: var(--bs-info-text-emphasis) +} + +.list-group-item-warning { + --bs-list-group-color: var(--bs-warning-text-emphasis); + --bs-list-group-bg: var(--bs-warning-bg-subtle); + --bs-list-group-border-color: var(--bs-warning-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-warning-border-subtle); + --bs-list-group-active-color: var(--bs-warning-bg-subtle); + --bs-list-group-active-bg: var(--bs-warning-text-emphasis); + --bs-list-group-active-border-color: var(--bs-warning-text-emphasis) +} + +.list-group-item-danger { + --bs-list-group-color: var(--bs-danger-text-emphasis); + --bs-list-group-bg: var(--bs-danger-bg-subtle); + --bs-list-group-border-color: var(--bs-danger-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-danger-border-subtle); + --bs-list-group-active-color: var(--bs-danger-bg-subtle); + --bs-list-group-active-bg: var(--bs-danger-text-emphasis); + --bs-list-group-active-border-color: var(--bs-danger-text-emphasis) +} + +.list-group-item-light { + --bs-list-group-color: var(--bs-light-text-emphasis); + --bs-list-group-bg: var(--bs-light-bg-subtle); + --bs-list-group-border-color: var(--bs-light-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-light-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-light-border-subtle); + --bs-list-group-active-color: var(--bs-light-bg-subtle); + --bs-list-group-active-bg: var(--bs-light-text-emphasis); + --bs-list-group-active-border-color: var(--bs-light-text-emphasis) +} + +.list-group-item-dark { + --bs-list-group-color: var(--bs-dark-text-emphasis); + --bs-list-group-bg: var(--bs-dark-bg-subtle); + --bs-list-group-border-color: var(--bs-dark-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-dark-border-subtle); + --bs-list-group-active-color: var(--bs-dark-bg-subtle); + --bs-list-group-active-bg: var(--bs-dark-text-emphasis); + --bs-list-group-active-border-color: var(--bs-dark-text-emphasis) +} + +.btn-close { + --bs-btn-close-color: #000; + --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e"); + --bs-btn-close-opacity: 0.5; + --bs-btn-close-hover-opacity: 0.75; + --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-btn-close-focus-opacity: 1; + --bs-btn-close-disabled-opacity: 0.25; + --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%); + box-sizing: content-box; + width: 1em; + height: 1em; + padding: .25em .25em; + color: var(--bs-btn-close-color); + background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; + border: 0; + border-radius: .375rem; + opacity: var(--bs-btn-close-opacity) +} + +.btn-close:hover { + color: var(--bs-btn-close-color); + text-decoration: none; + opacity: var(--bs-btn-close-hover-opacity) +} + +.btn-close:focus { + outline: 0; + box-shadow: var(--bs-btn-close-focus-shadow); + opacity: var(--bs-btn-close-focus-opacity) +} + +.btn-close.disabled, .btn-close:disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: var(--bs-btn-close-disabled-opacity) +} + +.btn-close-white { + filter: var(--bs-btn-close-white-filter) +} + +[data-bs-theme=dark] .btn-close { + filter: var(--bs-btn-close-white-filter) +} + +.toast { + --bs-toast-zindex: 1090; + --bs-toast-padding-x: 0.75rem; + --bs-toast-padding-y: 0.5rem; + --bs-toast-spacing: 1.5rem; + --bs-toast-max-width: 350px; + --bs-toast-font-size: 0.875rem; + --bs-toast-color: ; + --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-border-width: var(--bs-border-width); + --bs-toast-border-color: var(--bs-border-color-translucent); + --bs-toast-border-radius: var(--bs-border-radius); + --bs-toast-box-shadow: var(--bs-box-shadow); + --bs-toast-header-color: var(--bs-secondary-color); + --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-header-border-color: var(--bs-border-color-translucent); + width: var(--bs-toast-max-width); + max-width: 100%; + font-size: var(--bs-toast-font-size); + color: var(--bs-toast-color); + pointer-events: auto; + background-color: var(--bs-toast-bg); + background-clip: padding-box; + border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); + box-shadow: var(--bs-toast-box-shadow); + border-radius: var(--bs-toast-border-radius) +} + +.toast.showing { + opacity: 0 +} + +.toast:not(.show) { + display: none +} + +.toast-container { + --bs-toast-zindex: 1090; + position: absolute; + z-index: var(--bs-toast-zindex); + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none +} + +.toast-container > :not(:last-child) { + margin-bottom: var(--bs-toast-spacing) +} + +.toast-header { + display: flex; + align-items: center; + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); + color: var(--bs-toast-header-color); + background-color: var(--bs-toast-header-bg); + background-clip: padding-box; + border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); + border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); + border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)) +} + +.toast-header .btn-close { + margin-right: calc(-.5 * var(--bs-toast-padding-x)); + margin-left: var(--bs-toast-padding-x) +} + +.toast-body { + padding: var(--bs-toast-padding-x); + word-wrap: break-word +} + +.modal { + --bs-modal-zindex: 1055; + --bs-modal-width: 500px; + --bs-modal-padding: 1rem; + --bs-modal-margin: 0.5rem; + --bs-modal-color: ; + --bs-modal-bg: var(--bs-body-bg); + --bs-modal-border-color: var(--bs-border-color-translucent); + --bs-modal-border-width: var(--bs-border-width); + --bs-modal-border-radius: var(--bs-border-radius-lg); + --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width))); + --bs-modal-header-padding-x: 1rem; + --bs-modal-header-padding-y: 1rem; + --bs-modal-header-padding: 1rem 1rem; + --bs-modal-header-border-color: var(--bs-border-color); + --bs-modal-header-border-width: var(--bs-border-width); + --bs-modal-title-line-height: 1.5; + --bs-modal-footer-gap: 0.5rem; + --bs-modal-footer-bg: ; + --bs-modal-footer-border-color: var(--bs-border-color); + --bs-modal-footer-border-width: var(--bs-border-width); + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-modal-zindex); + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0 +} + +.modal-dialog { + position: relative; + width: auto; + margin: var(--bs-modal-margin); + pointer-events: none +} + +.modal.fade .modal-dialog { + transition: transform .3s ease-out; + transform: translate(0, -50px) +} + +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none + } +} + +.modal.show .modal-dialog { + transform: none +} + +.modal.modal-static .modal-dialog { + transform: scale(1.02) +} + +.modal-dialog-scrollable { + height: calc(100% - var(--bs-modal-margin) * 2) +} + +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden +} + +.modal-dialog-scrollable .modal-body { + overflow-y: auto +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - var(--bs-modal-margin) * 2) +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + color: var(--bs-modal-color); + pointer-events: auto; + background-color: var(--bs-modal-bg); + background-clip: padding-box; + border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); + border-radius: var(--bs-modal-border-radius); + outline: 0 +} + +.modal-backdrop { + --bs-backdrop-zindex: 1050; + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: 0.5; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-backdrop-zindex); + width: 100vw; + height: 100vh; + background-color: var(--bs-backdrop-bg) +} + +.modal-backdrop.fade { + opacity: 0 +} + +.modal-backdrop.show { + opacity: var(--bs-backdrop-opacity) +} + +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + padding: var(--bs-modal-header-padding); + border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); + border-top-left-radius: var(--bs-modal-inner-border-radius); + border-top-right-radius: var(--bs-modal-inner-border-radius) +} + +.modal-header .btn-close { + padding: calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5); + margin: calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto +} + +.modal-title { + margin-bottom: 0; + line-height: var(--bs-modal-title-line-height) +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: var(--bs-modal-padding) +} + +.modal-footer { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5); + background-color: var(--bs-modal-footer-bg); + border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); + border-bottom-right-radius: var(--bs-modal-inner-border-radius); + border-bottom-left-radius: var(--bs-modal-inner-border-radius) +} + +.modal-footer > * { + margin: calc(var(--bs-modal-footer-gap) * .5) +} + +@media (min-width: 576px) { + .modal { + --bs-modal-margin: 1.75rem; + --bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) + } + + .modal-dialog { + max-width: var(--bs-modal-width); + margin-right: auto; + margin-left: auto + } + + .modal-sm { + --bs-modal-width: 300px + } +} + +@media (min-width: 992px) { + .modal-lg, .modal-xl { + --bs-modal-width: 800px + } +} + +@media (min-width: 1200px) { + .modal-xl { + --bs-modal-width: 1140px + } +} + +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0 +} + +.modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0 +} + +.modal-fullscreen .modal-footer, .modal-fullscreen .modal-header { + border-radius: 0 +} + +.modal-fullscreen .modal-body { + overflow-y: auto +} + +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0 + } + + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0 + } + + .modal-fullscreen-sm-down .modal-footer, .modal-fullscreen-sm-down .modal-header { + border-radius: 0 + } + + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto + } +} + +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0 + } + + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0 + } + + .modal-fullscreen-md-down .modal-footer, .modal-fullscreen-md-down .modal-header { + border-radius: 0 + } + + .modal-fullscreen-md-down .modal-body { + overflow-y: auto + } +} + +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0 + } + + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0 + } + + .modal-fullscreen-lg-down .modal-footer, .modal-fullscreen-lg-down .modal-header { + border-radius: 0 + } + + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto + } +} + +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0 + } + + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0 + } + + .modal-fullscreen-xl-down .modal-footer, .modal-fullscreen-xl-down .modal-header { + border-radius: 0 + } + + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto + } +} + +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0 + } + + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0 + } + + .modal-fullscreen-xxl-down .modal-footer, .modal-fullscreen-xxl-down .modal-header { + border-radius: 0 + } + + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto + } +} + +.tooltip { + --bs-tooltip-zindex: 1080; + --bs-tooltip-max-width: 200px; + --bs-tooltip-padding-x: 0.5rem; + --bs-tooltip-padding-y: 0.25rem; + --bs-tooltip-margin: ; + --bs-tooltip-font-size: 0.875rem; + --bs-tooltip-color: var(--bs-body-bg); + --bs-tooltip-bg: var(--bs-emphasis-color); + --bs-tooltip-border-radius: var(--bs-border-radius); + --bs-tooltip-opacity: 0.9; + --bs-tooltip-arrow-width: 0.8rem; + --bs-tooltip-arrow-height: 0.4rem; + z-index: var(--bs-tooltip-zindex); + display: block; + margin: var(--bs-tooltip-margin); + font-family: var(--bs-font-sans-serif); + 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; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-tooltip-font-size); + word-wrap: break-word; + opacity: 0 +} + +.tooltip.show { + opacity: var(--bs-tooltip-opacity) +} + +.tooltip .tooltip-arrow { + display: block; + width: var(--bs-tooltip-arrow-width); + height: var(--bs-tooltip-arrow-height) +} + +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid +} + +.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow, .bs-tooltip-top .tooltip-arrow { + bottom: calc(-1 * var(--bs-tooltip-arrow-height)) +} + +.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before, .bs-tooltip-top .tooltip-arrow::before { + top: -1px; + border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0; + border-top-color: var(--bs-tooltip-bg) +} + +.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow, .bs-tooltip-end .tooltip-arrow { + left: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width) +} + +.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before, .bs-tooltip-end .tooltip-arrow::before { + right: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0; + border-right-color: var(--bs-tooltip-bg) +} + +.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow, .bs-tooltip-bottom .tooltip-arrow { + top: calc(-1 * var(--bs-tooltip-arrow-height)) +} + +.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before, .bs-tooltip-bottom .tooltip-arrow::before { + bottom: -1px; + border-width: 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height); + border-bottom-color: var(--bs-tooltip-bg) +} + +.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow, .bs-tooltip-start .tooltip-arrow { + right: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width) +} + +.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before, .bs-tooltip-start .tooltip-arrow::before { + left: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height); + border-left-color: var(--bs-tooltip-bg) +} + +.tooltip-inner { + max-width: var(--bs-tooltip-max-width); + padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); + color: var(--bs-tooltip-color); + text-align: center; + background-color: var(--bs-tooltip-bg); + border-radius: var(--bs-tooltip-border-radius) +} + +.popover { + --bs-popover-zindex: 1070; + --bs-popover-max-width: 276px; + --bs-popover-font-size: 0.875rem; + --bs-popover-bg: var(--bs-body-bg); + --bs-popover-border-width: var(--bs-border-width); + --bs-popover-border-color: var(--bs-border-color-translucent); + --bs-popover-border-radius: var(--bs-border-radius-lg); + --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width)); + --bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-popover-header-padding-x: 1rem; + --bs-popover-header-padding-y: 0.5rem; + --bs-popover-header-font-size: 1rem; + --bs-popover-header-color: inherit; + --bs-popover-header-bg: var(--bs-secondary-bg); + --bs-popover-body-padding-x: 1rem; + --bs-popover-body-padding-y: 1rem; + --bs-popover-body-color: var(--bs-body-color); + --bs-popover-arrow-width: 1rem; + --bs-popover-arrow-height: 0.5rem; + --bs-popover-arrow-border: var(--bs-popover-border-color); + z-index: var(--bs-popover-zindex); + display: block; + max-width: var(--bs-popover-max-width); + font-family: var(--bs-font-sans-serif); + 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; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-popover-font-size); + word-wrap: break-word; + background-color: var(--bs-popover-bg); + background-clip: padding-box; + border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-radius: var(--bs-popover-border-radius) +} + +.popover .popover-arrow { + display: block; + width: var(--bs-popover-arrow-width); + height: var(--bs-popover-arrow-height) +} + +.popover .popover-arrow::after, .popover .popover-arrow::before { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; + border-width: 0 +} + +.bs-popover-auto[data-popper-placement^=top] > .popover-arrow, .bs-popover-top > .popover-arrow { + bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)) +} + +.bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-top > .popover-arrow::before { + border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0 +} + +.bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::before { + bottom: 0; + border-top-color: var(--bs-popover-arrow-border) +} + +.bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after, .bs-popover-top > .popover-arrow::after { + bottom: var(--bs-popover-border-width); + border-top-color: var(--bs-popover-bg) +} + +.bs-popover-auto[data-popper-placement^=right] > .popover-arrow, .bs-popover-end > .popover-arrow { + left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width) +} + +.bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-end > .popover-arrow::before { + border-width: calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0 +} + +.bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::before { + left: 0; + border-right-color: var(--bs-popover-arrow-border) +} + +.bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after, .bs-popover-end > .popover-arrow::after { + left: var(--bs-popover-border-width); + border-right-color: var(--bs-popover-bg) +} + +.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow, .bs-popover-bottom > .popover-arrow { + top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)) +} + +.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-bottom > .popover-arrow::before { + border-width: 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) +} + +.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::before { + top: 0; + border-bottom-color: var(--bs-popover-arrow-border) +} + +.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after, .bs-popover-bottom > .popover-arrow::after { + top: var(--bs-popover-border-width); + border-bottom-color: var(--bs-popover-bg) +} + +.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before, .bs-popover-bottom .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: var(--bs-popover-arrow-width); + margin-left: calc(-.5 * var(--bs-popover-arrow-width)); + content: ""; + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg) +} + +.bs-popover-auto[data-popper-placement^=left] > .popover-arrow, .bs-popover-start > .popover-arrow { + right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width) +} + +.bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-start > .popover-arrow::before { + border-width: calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) +} + +.bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::before { + right: 0; + border-left-color: var(--bs-popover-arrow-border) +} + +.bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after, .bs-popover-start > .popover-arrow::after { + right: var(--bs-popover-border-width); + border-left-color: var(--bs-popover-bg) +} + +.popover-header { + padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); + margin-bottom: 0; + font-size: var(--bs-popover-header-font-size); + color: var(--bs-popover-header-color); + background-color: var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-top-left-radius: var(--bs-popover-inner-border-radius); + border-top-right-radius: var(--bs-popover-inner-border-radius) +} + +.popover-header:empty { + display: none +} + +.popover-body { + padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); + color: var(--bs-popover-body-color) +} + +.carousel { + position: relative +} + +.carousel.pointer-event { + touch-action: pan-y +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden +} + +.carousel-inner::after { + display: block; + clear: both; + content: "" +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform .6s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none + } +} + +.carousel-item-next, .carousel-item-prev, .carousel-item.active { + display: block +} + +.active.carousel-item-end, .carousel-item-next:not(.carousel-item-start) { + transform: translateX(100%) +} + +.active.carousel-item-start, .carousel-item-prev:not(.carousel-item-end) { + transform: translateX(-100%) +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none +} + +.carousel-fade .carousel-item-next.carousel-item-start, .carousel-fade .carousel-item-prev.carousel-item-end, .carousel-fade .carousel-item.active { + z-index: 1; + opacity: 1 +} + +.carousel-fade .active.carousel-item-end, .carousel-fade .active.carousel-item-start { + z-index: 0; + opacity: 0; + transition: opacity 0s .6s +} + +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-end, .carousel-fade .active.carousel-item-start { + transition: none + } +} + +.carousel-control-next, .carousel-control-prev { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: 0 0; + border: 0; + opacity: .5; + transition: opacity .15s ease +} + +@media (prefers-reduced-motion: reduce) { + .carousel-control-next, .carousel-control-prev { + transition: none + } +} + +.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: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100% +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e") +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15% +} + +.carousel-indicators [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + transition: opacity .6s ease +} + +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none + } +} + +.carousel-indicators .active { + opacity: 1 +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: #fff; + text-align: center +} + +.carousel-dark .carousel-control-next-icon, .carousel-dark .carousel-control-prev-icon { + filter: invert(1) grayscale(100) +} + +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000 +} + +.carousel-dark .carousel-caption { + color: #000 +} + +[data-bs-theme=dark] .carousel .carousel-control-next-icon, [data-bs-theme=dark] .carousel .carousel-control-prev-icon, [data-bs-theme=dark].carousel .carousel-control-next-icon, [data-bs-theme=dark].carousel .carousel-control-prev-icon { + filter: invert(1) grayscale(100) +} + +[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target], [data-bs-theme=dark].carousel .carousel-indicators [data-bs-target] { + background-color: #000 +} + +[data-bs-theme=dark] .carousel .carousel-caption, [data-bs-theme=dark].carousel .carousel-caption { + color: #000 +} + +.spinner-border, .spinner-grow { + display: inline-block; + width: var(--bs-spinner-width); + height: var(--bs-spinner-height); + vertical-align: var(--bs-spinner-vertical-align); + border-radius: 50%; + animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name) +} + +@keyframes spinner-border { + to { + transform: rotate(360deg) + } +} + +.spinner-border { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-border-width: 0.25em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-border; + border: var(--bs-spinner-border-width) solid currentcolor; + border-right-color: transparent +} + +.spinner-border-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + --bs-spinner-border-width: 0.2em +} + +@keyframes spinner-grow { + 0% { + transform: scale(0) + } + 50% { + opacity: 1; + transform: none + } +} + +.spinner-grow { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-grow; + background-color: currentcolor; + opacity: 0 +} + +.spinner-grow-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, .spinner-grow { + --bs-spinner-animation-speed: 1.5s + } +} + +.offcanvas, .offcanvas-lg, .offcanvas-md, .offcanvas-sm, .offcanvas-xl, .offcanvas-xxl { + --bs-offcanvas-zindex: 1045; + --bs-offcanvas-width: 400px; + --bs-offcanvas-height: 30vh; + --bs-offcanvas-padding-x: 1rem; + --bs-offcanvas-padding-y: 1rem; + --bs-offcanvas-color: var(--bs-body-color); + --bs-offcanvas-bg: var(--bs-body-bg); + --bs-offcanvas-border-width: var(--bs-border-width); + --bs-offcanvas-border-color: var(--bs-border-color-translucent); + --bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-offcanvas-transition: transform 0.3s ease-in-out; + --bs-offcanvas-title-line-height: 1.5 +} + +@media (max-width: 575.98px) { + .offcanvas-sm { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition) + } +} + +@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-sm { + transition: none + } +} + +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%) + } + + .offcanvas-sm.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%) + } + + .offcanvas-sm.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%) + } + + .offcanvas-sm.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%) + } + + .offcanvas-sm.show:not(.hiding), .offcanvas-sm.showing { + transform: none + } + + .offcanvas-sm.hiding, .offcanvas-sm.show, .offcanvas-sm.showing { + visibility: visible + } +} + +@media (min-width: 576px) { + .offcanvas-sm { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important + } + + .offcanvas-sm .offcanvas-header { + display: none + } + + .offcanvas-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important + } +} + +@media (max-width: 767.98px) { + .offcanvas-md { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition) + } +} + +@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-md { + transition: none + } +} + +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%) + } + + .offcanvas-md.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%) + } + + .offcanvas-md.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%) + } + + .offcanvas-md.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%) + } + + .offcanvas-md.show:not(.hiding), .offcanvas-md.showing { + transform: none + } + + .offcanvas-md.hiding, .offcanvas-md.show, .offcanvas-md.showing { + visibility: visible + } +} + +@media (min-width: 768px) { + .offcanvas-md { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important + } + + .offcanvas-md .offcanvas-header { + display: none + } + + .offcanvas-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important + } +} + +@media (max-width: 991.98px) { + .offcanvas-lg { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition) + } +} + +@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-lg { + transition: none + } +} + +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%) + } + + .offcanvas-lg.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%) + } + + .offcanvas-lg.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%) + } + + .offcanvas-lg.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%) + } + + .offcanvas-lg.show:not(.hiding), .offcanvas-lg.showing { + transform: none + } + + .offcanvas-lg.hiding, .offcanvas-lg.show, .offcanvas-lg.showing { + visibility: visible + } +} + +@media (min-width: 992px) { + .offcanvas-lg { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important + } + + .offcanvas-lg .offcanvas-header { + display: none + } + + .offcanvas-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important + } +} + +@media (max-width: 1199.98px) { + .offcanvas-xl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition) + } +} + +@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xl { + transition: none + } +} + +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%) + } + + .offcanvas-xl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%) + } + + .offcanvas-xl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%) + } + + .offcanvas-xl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%) + } + + .offcanvas-xl.show:not(.hiding), .offcanvas-xl.showing { + transform: none + } + + .offcanvas-xl.hiding, .offcanvas-xl.show, .offcanvas-xl.showing { + visibility: visible + } +} + +@media (min-width: 1200px) { + .offcanvas-xl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important + } + + .offcanvas-xl .offcanvas-header { + display: none + } + + .offcanvas-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important + } +} + +@media (max-width: 1399.98px) { + .offcanvas-xxl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition) + } +} + +@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xxl { + transition: none + } +} + +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%) + } + + .offcanvas-xxl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%) + } + + .offcanvas-xxl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%) + } + + .offcanvas-xxl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%) + } + + .offcanvas-xxl.show:not(.hiding), .offcanvas-xxl.showing { + transform: none + } + + .offcanvas-xxl.hiding, .offcanvas-xxl.show, .offcanvas-xxl.showing { + visibility: visible + } +} + +@media (min-width: 1400px) { + .offcanvas-xxl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important + } + + .offcanvas-xxl .offcanvas-header { + display: none + } + + .offcanvas-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important + } +} + +.offcanvas { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition) +} + +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none + } +} + +.offcanvas.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%) +} + +.offcanvas.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%) +} + +.offcanvas.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%) +} + +.offcanvas.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%) +} + +.offcanvas.show:not(.hiding), .offcanvas.showing { + transform: none +} + +.offcanvas.hiding, .offcanvas.show, .offcanvas.showing { + visibility: visible +} + +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000 +} + +.offcanvas-backdrop.fade { + opacity: 0 +} + +.offcanvas-backdrop.show { + opacity: .5 +} + +.offcanvas-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x) +} + +.offcanvas-header .btn-close { + padding: calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5); + margin-top: calc(-.5 * var(--bs-offcanvas-padding-y)); + margin-right: calc(-.5 * var(--bs-offcanvas-padding-x)); + margin-bottom: calc(-.5 * var(--bs-offcanvas-padding-y)) +} + +.offcanvas-title { + margin-bottom: 0; + line-height: var(--bs-offcanvas-title-line-height) +} + +.offcanvas-body { + flex-grow: 1; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); + overflow-y: auto +} + +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentcolor; + opacity: .5 +} + +.placeholder.btn::before { + display: inline-block; + content: "" +} + +.placeholder-xs { + min-height: .6em +} + +.placeholder-sm { + min-height: .8em +} + +.placeholder-lg { + min-height: 1.2em +} + +.placeholder-glow .placeholder { + animation: placeholder-glow 2s ease-in-out infinite +} + +@keyframes placeholder-glow { + 50% { + opacity: .2 + } +} + +.placeholder-wave { + -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + -webkit-mask-size: 200% 100%; + mask-size: 200% 100%; + animation: placeholder-wave 2s linear infinite +} + +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0% + } +} + +.clearfix::after { + display: block; + clear: both; + content: "" +} + +.text-bg-primary { + color: #fff !important; + background-color: RGBA(13, 110, 253, var(--bs-bg-opacity, 1)) !important +} + +.text-bg-secondary { + color: #fff !important; + background-color: RGBA(108, 117, 125, var(--bs-bg-opacity, 1)) !important +} + +.text-bg-success { + color: #fff !important; + background-color: RGBA(25, 135, 84, var(--bs-bg-opacity, 1)) !important +} + +.text-bg-info { + color: #000 !important; + background-color: RGBA(13, 202, 240, var(--bs-bg-opacity, 1)) !important +} + +.text-bg-warning { + color: #000 !important; + background-color: RGBA(255, 193, 7, var(--bs-bg-opacity, 1)) !important +} + +.text-bg-danger { + color: #fff !important; + background-color: RGBA(220, 53, 69, var(--bs-bg-opacity, 1)) !important +} + +.text-bg-light { + color: #000 !important; + background-color: RGBA(248, 249, 250, var(--bs-bg-opacity, 1)) !important +} + +.text-bg-dark { + color: #fff !important; + background-color: RGBA(33, 37, 41, var(--bs-bg-opacity, 1)) !important +} + +.link-primary { + color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important +} + +.link-primary:focus, .link-primary:hover { + color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important +} + +.link-secondary { + color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important +} + +.link-secondary:focus, .link-secondary:hover { + color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important +} + +.link-success { + color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important +} + +.link-success:focus, .link-success:hover { + color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important +} + +.link-info { + color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important +} + +.link-info:focus, .link-info:hover { + color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important +} + +.link-warning { + color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important +} + +.link-warning:focus, .link-warning:hover { + color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important +} + +.link-danger { + color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important +} + +.link-danger:focus, .link-danger:hover { + color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important +} + +.link-light { + color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important +} + +.link-light:focus, .link-light:hover { + color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important +} + +.link-dark { + color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important +} + +.link-dark:focus, .link-dark:hover { + color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important +} + +.link-body-emphasis { + color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important +} + +.link-body-emphasis:focus, .link-body-emphasis:hover { + color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, .75)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important; + text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important +} + +.focus-ring:focus { + outline: 0; + box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color) +} + +.icon-link { + display: inline-flex; + gap: .375rem; + align-items: center; + -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5)); + text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5)); + text-underline-offset: 0.25em; + -webkit-backface-visibility: hidden; + backface-visibility: hidden +} + +.icon-link > .bi { + flex-shrink: 0; + width: 1em; + height: 1em; + fill: currentcolor; + transition: .2s ease-in-out transform +} + +@media (prefers-reduced-motion: reduce) { + .icon-link > .bi { + transition: none + } +} + +.icon-link-hover:focus-visible > .bi, .icon-link-hover:hover > .bi { + transform: var(--bs-icon-link-transform, translate3d(.25em, 0, 0)) +} + +.ratio { + position: relative; + width: 100% +} + +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: "" +} + +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100% +} + +.ratio-1x1 { + --bs-aspect-ratio: 100% +} + +.ratio-4x3 { + --bs-aspect-ratio: 75% +} + +.ratio-16x9 { + --bs-aspect-ratio: 56.25% +} + +.ratio-21x9 { + --bs-aspect-ratio: 42.8571428571% +} + +.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 +} + +.sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 +} + +.sticky-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020 +} + +@media (min-width: 576px) { + .sticky-sm-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } + + .sticky-sm-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020 + } +} + +@media (min-width: 768px) { + .sticky-md-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } + + .sticky-md-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020 + } +} + +@media (min-width: 992px) { + .sticky-lg-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } + + .sticky-lg-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020 + } +} + +@media (min-width: 1200px) { + .sticky-xl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } + + .sticky-xl-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020 + } +} + +@media (min-width: 1400px) { + .sticky-xxl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } + + .sticky-xxl-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020 + } +} + +.hstack { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch +} + +.vstack { + display: flex; + flex: 1 1 auto; + flex-direction: column; + align-self: stretch +} + +.visually-hidden, .visually-hidden-focusable:not(:focus):not(:focus-within) { + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important +} + +.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption), .visually-hidden:not(caption) { + position: absolute !important +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: "" +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.vr { + display: inline-block; + align-self: stretch; + width: 1px; + min-height: 1em; + background-color: currentcolor; + opacity: .25 +} + +.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 +} + +.float-start { + float: left !important +} + +.float-end { + float: right !important +} + +.float-none { + float: none !important +} + +.object-fit-contain { + -o-object-fit: contain !important; + object-fit: contain !important +} + +.object-fit-cover { + -o-object-fit: cover !important; + object-fit: cover !important +} + +.object-fit-fill { + -o-object-fit: fill !important; + object-fit: fill !important +} + +.object-fit-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important +} + +.object-fit-none { + -o-object-fit: none !important; + object-fit: none !important +} + +.opacity-0 { + opacity: 0 !important +} + +.opacity-25 { + opacity: .25 !important +} + +.opacity-50 { + opacity: .5 !important +} + +.opacity-75 { + opacity: .75 !important +} + +.opacity-100 { + opacity: 1 !important +} + +.overflow-auto { + overflow: auto !important +} + +.overflow-hidden { + overflow: hidden !important +} + +.overflow-visible { + overflow: visible !important +} + +.overflow-scroll { + overflow: scroll !important +} + +.overflow-x-auto { + overflow-x: auto !important +} + +.overflow-x-hidden { + overflow-x: hidden !important +} + +.overflow-x-visible { + overflow-x: visible !important +} + +.overflow-x-scroll { + overflow-x: scroll !important +} + +.overflow-y-auto { + overflow-y: auto !important +} + +.overflow-y-hidden { + overflow-y: hidden !important +} + +.overflow-y-visible { + overflow-y: visible !important +} + +.overflow-y-scroll { + overflow-y: scroll !important +} + +.d-inline { + display: inline !important +} + +.d-inline-block { + display: inline-block !important +} + +.d-block { + display: block !important +} + +.d-grid { + display: grid !important +} + +.d-inline-grid { + display: inline-grid !important +} + +.d-table { + display: table !important +} + +.d-table-row { + display: table-row !important +} + +.d-table-cell { + display: table-cell !important +} + +.d-flex { + display: flex !important +} + +.d-inline-flex { + display: inline-flex !important +} + +.d-none { + display: none !important +} + +.shadow { + box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15) !important +} + +.shadow-sm { + box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075) !important +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, .175) !important +} + +.shadow-none { + box-shadow: none !important +} + +.focus-ring-primary { + --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity)) +} + +.focus-ring-secondary { + --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity)) +} + +.focus-ring-success { + --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity)) +} + +.focus-ring-info { + --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity)) +} + +.focus-ring-warning { + --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity)) +} + +.focus-ring-danger { + --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity)) +} + +.focus-ring-light { + --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity)) +} + +.focus-ring-dark { + --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity)) +} + +.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 +} + +.top-0 { + top: 0 !important +} + +.top-50 { + top: 50% !important +} + +.top-100 { + top: 100% !important +} + +.bottom-0 { + bottom: 0 !important +} + +.bottom-50 { + bottom: 50% !important +} + +.bottom-100 { + bottom: 100% !important +} + +.start-0 { + left: 0 !important +} + +.start-50 { + left: 50% !important +} + +.start-100 { + left: 100% !important +} + +.end-0 { + right: 0 !important +} + +.end-50 { + right: 50% !important +} + +.end-100 { + right: 100% !important +} + +.translate-middle { + transform: translate(-50%, -50%) !important +} + +.translate-middle-x { + transform: translateX(-50%) !important +} + +.translate-middle-y { + transform: translateY(-50%) !important +} + +.border { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important +} + +.border-0 { + border: 0 !important +} + +.border-top { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important +} + +.border-top-0 { + border-top: 0 !important +} + +.border-end { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important +} + +.border-end-0 { + border-right: 0 !important +} + +.border-bottom { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important +} + +.border-bottom-0 { + border-bottom: 0 !important +} + +.border-start { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important +} + +.border-start-0 { + border-left: 0 !important +} + +.border-primary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important +} + +.border-secondary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important +} + +.border-success { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important +} + +.border-info { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important +} + +.border-warning { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important +} + +.border-danger { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important +} + +.border-light { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important +} + +.border-dark { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important +} + +.border-black { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important +} + +.border-white { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important +} + +.border-primary-subtle { + border-color: var(--bs-primary-border-subtle) !important +} + +.border-secondary-subtle { + border-color: var(--bs-secondary-border-subtle) !important +} + +.border-success-subtle { + border-color: var(--bs-success-border-subtle) !important +} + +.border-info-subtle { + border-color: var(--bs-info-border-subtle) !important +} + +.border-warning-subtle { + border-color: var(--bs-warning-border-subtle) !important +} + +.border-danger-subtle { + border-color: var(--bs-danger-border-subtle) !important +} + +.border-light-subtle { + border-color: var(--bs-light-border-subtle) !important +} + +.border-dark-subtle { + border-color: var(--bs-dark-border-subtle) !important +} + +.border-1 { + border-width: 1px !important +} + +.border-2 { + border-width: 2px !important +} + +.border-3 { + border-width: 3px !important +} + +.border-4 { + border-width: 4px !important +} + +.border-5 { + border-width: 5px !important +} + +.border-opacity-10 { + --bs-border-opacity: 0.1 +} + +.border-opacity-25 { + --bs-border-opacity: 0.25 +} + +.border-opacity-50 { + --bs-border-opacity: 0.5 +} + +.border-opacity-75 { + --bs-border-opacity: 0.75 +} + +.border-opacity-100 { + --bs-border-opacity: 1 +} + +.w-25 { + width: 25% !important +} + +.w-50 { + width: 50% !important +} + +.w-75 { + width: 75% !important +} + +.w-100 { + width: 100% !important +} + +.w-auto { + width: auto !important +} + +.mw-100 { + max-width: 100% !important +} + +.vw-100 { + width: 100vw !important +} + +.min-vw-100 { + min-width: 100vw !important +} + +.h-25 { + height: 25% !important +} + +.h-50 { + height: 50% !important +} + +.h-75 { + height: 75% !important +} + +.h-100 { + height: 100% !important +} + +.h-auto { + height: auto !important +} + +.mh-100 { + max-height: 100% !important +} + +.vh-100 { + height: 100vh !important +} + +.min-vh-100 { + min-height: 100vh !important +} + +.flex-fill { + flex: 1 1 auto !important +} + +.flex-row { + flex-direction: row !important +} + +.flex-column { + flex-direction: column !important +} + +.flex-row-reverse { + flex-direction: row-reverse !important +} + +.flex-column-reverse { + flex-direction: column-reverse !important +} + +.flex-grow-0 { + flex-grow: 0 !important +} + +.flex-grow-1 { + flex-grow: 1 !important +} + +.flex-shrink-0 { + flex-shrink: 0 !important +} + +.flex-shrink-1 { + flex-shrink: 1 !important +} + +.flex-wrap { + flex-wrap: wrap !important +} + +.flex-nowrap { + flex-wrap: nowrap !important +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important +} + +.justify-content-start { + justify-content: flex-start !important +} + +.justify-content-end { + justify-content: flex-end !important +} + +.justify-content-center { + justify-content: center !important +} + +.justify-content-between { + justify-content: space-between !important +} + +.justify-content-around { + justify-content: space-around !important +} + +.justify-content-evenly { + justify-content: space-evenly !important +} + +.align-items-start { + align-items: flex-start !important +} + +.align-items-end { + align-items: flex-end !important +} + +.align-items-center { + align-items: center !important +} + +.align-items-baseline { + align-items: baseline !important +} + +.align-items-stretch { + align-items: stretch !important +} + +.align-content-start { + align-content: flex-start !important +} + +.align-content-end { + align-content: flex-end !important +} + +.align-content-center { + align-content: center !important +} + +.align-content-between { + align-content: space-between !important +} + +.align-content-around { + align-content: space-around !important +} + +.align-content-stretch { + align-content: stretch !important +} + +.align-self-auto { + align-self: auto !important +} + +.align-self-start { + align-self: flex-start !important +} + +.align-self-end { + align-self: flex-end !important +} + +.align-self-center { + align-self: center !important +} + +.align-self-baseline { + align-self: baseline !important +} + +.align-self-stretch { + align-self: stretch !important +} + +.order-first { + order: -1 !important +} + +.order-0 { + order: 0 !important +} + +.order-1 { + order: 1 !important +} + +.order-2 { + order: 2 !important +} + +.order-3 { + order: 3 !important +} + +.order-4 { + order: 4 !important +} + +.order-5 { + order: 5 !important +} + +.order-last { + order: 6 !important +} + +.m-0 { + margin: 0 !important +} + +.m-1 { + margin: .25rem !important +} + +.m-2 { + margin: .5rem !important +} + +.m-3 { + margin: 1rem !important +} + +.m-4 { + margin: 1.5rem !important +} + +.m-5 { + margin: 3rem !important +} + +.m-auto { + margin: auto !important +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important +} + +.mx-1 { + margin-right: .25rem !important; + margin-left: .25rem !important +} + +.mx-2 { + margin-right: .5rem !important; + margin-left: .5rem !important +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important +} + +.my-1 { + margin-top: .25rem !important; + margin-bottom: .25rem !important +} + +.my-2 { + margin-top: .5rem !important; + margin-bottom: .5rem !important +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important +} + +.mt-0 { + margin-top: 0 !important +} + +.mt-1 { + margin-top: .25rem !important +} + +.mt-2 { + margin-top: .5rem !important +} + +.mt-3 { + margin-top: 1rem !important +} + +.mt-4 { + margin-top: 1.5rem !important +} + +.mt-5 { + margin-top: 3rem !important +} + +.mt-auto { + margin-top: auto !important +} + +.me-0 { + margin-right: 0 !important +} + +.me-1 { + margin-right: .25rem !important +} + +.me-2 { + margin-right: .5rem !important +} + +.me-3 { + margin-right: 1rem !important +} + +.me-4 { + margin-right: 1.5rem !important +} + +.me-5 { + margin-right: 3rem !important +} + +.me-auto { + margin-right: auto !important +} + +.mb-0 { + margin-bottom: 0 !important +} + +.mb-1 { + margin-bottom: .25rem !important +} + +.mb-2 { + margin-bottom: .5rem !important +} + +.mb-3 { + margin-bottom: 1rem !important +} + +.mb-4 { + margin-bottom: 1.5rem !important +} + +.mb-5 { + margin-bottom: 3rem !important +} + +.mb-auto { + margin-bottom: auto !important +} + +.ms-0 { + margin-left: 0 !important +} + +.ms-1 { + margin-left: .25rem !important +} + +.ms-2 { + margin-left: .5rem !important +} + +.ms-3 { + margin-left: 1rem !important +} + +.ms-4 { + margin-left: 1.5rem !important +} + +.ms-5 { + margin-left: 3rem !important +} + +.ms-auto { + margin-left: auto !important +} + +.p-0 { + padding: 0 !important +} + +.p-1 { + padding: .25rem !important +} + +.p-2 { + padding: .5rem !important +} + +.p-3 { + padding: 1rem !important +} + +.p-4 { + padding: 1.5rem !important +} + +.p-5 { + padding: 3rem !important +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important +} + +.px-1 { + padding-right: .25rem !important; + padding-left: .25rem !important +} + +.px-2 { + padding-right: .5rem !important; + padding-left: .5rem !important +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important +} + +.py-1 { + padding-top: .25rem !important; + padding-bottom: .25rem !important +} + +.py-2 { + padding-top: .5rem !important; + padding-bottom: .5rem !important +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important +} + +.pt-0 { + padding-top: 0 !important +} + +.pt-1 { + padding-top: .25rem !important +} + +.pt-2 { + padding-top: .5rem !important +} + +.pt-3 { + padding-top: 1rem !important +} + +.pt-4 { + padding-top: 1.5rem !important +} + +.pt-5 { + padding-top: 3rem !important +} + +.pe-0 { + padding-right: 0 !important +} + +.pe-1 { + padding-right: .25rem !important +} + +.pe-2 { + padding-right: .5rem !important +} + +.pe-3 { + padding-right: 1rem !important +} + +.pe-4 { + padding-right: 1.5rem !important +} + +.pe-5 { + padding-right: 3rem !important +} + +.pb-0 { + padding-bottom: 0 !important +} + +.pb-1 { + padding-bottom: .25rem !important +} + +.pb-2 { + padding-bottom: .5rem !important +} + +.pb-3 { + padding-bottom: 1rem !important +} + +.pb-4 { + padding-bottom: 1.5rem !important +} + +.pb-5 { + padding-bottom: 3rem !important +} + +.ps-0 { + padding-left: 0 !important +} + +.ps-1 { + padding-left: .25rem !important +} + +.ps-2 { + padding-left: .5rem !important +} + +.ps-3 { + padding-left: 1rem !important +} + +.ps-4 { + padding-left: 1.5rem !important +} + +.ps-5 { + padding-left: 3rem !important +} + +.gap-0 { + gap: 0 !important +} + +.gap-1 { + gap: .25rem !important +} + +.gap-2 { + gap: .5rem !important +} + +.gap-3 { + gap: 1rem !important +} + +.gap-4 { + gap: 1.5rem !important +} + +.gap-5 { + gap: 3rem !important +} + +.row-gap-0 { + row-gap: 0 !important +} + +.row-gap-1 { + row-gap: .25rem !important +} + +.row-gap-2 { + row-gap: .5rem !important +} + +.row-gap-3 { + row-gap: 1rem !important +} + +.row-gap-4 { + row-gap: 1.5rem !important +} + +.row-gap-5 { + row-gap: 3rem !important +} + +.column-gap-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important +} + +.column-gap-1 { + -moz-column-gap: 0.25rem !important; + column-gap: .25rem !important +} + +.column-gap-2 { + -moz-column-gap: 0.5rem !important; + column-gap: .5rem !important +} + +.column-gap-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important +} + +.column-gap-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important +} + +.column-gap-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important +} + +.font-monospace { + font-family: var(--bs-font-monospace) !important +} + +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important +} + +.fs-2 { + font-size: calc(1.325rem + .9vw) !important +} + +.fs-3 { + font-size: calc(1.3rem + .6vw) !important +} + +.fs-4 { + font-size: calc(1.275rem + .3vw) !important +} + +.fs-5 { + font-size: 1.25rem !important +} + +.fs-6 { + font-size: 1rem !important +} + +.fst-italic { + font-style: italic !important +} + +.fst-normal { + font-style: normal !important +} + +.fw-lighter { + font-weight: lighter !important +} + +.fw-light { + font-weight: 300 !important +} + +.fw-normal { + font-weight: 400 !important +} + +.fw-medium { + font-weight: 500 !important +} + +.fw-semibold { + font-weight: 600 !important +} + +.fw-bold { + font-weight: 700 !important +} + +.fw-bolder { + font-weight: bolder !important +} + +.lh-1 { + line-height: 1 !important +} + +.lh-sm { + line-height: 1.25 !important +} + +.lh-base { + line-height: 1.5 !important +} + +.lh-lg { + line-height: 2 !important +} + +.text-start { + text-align: left !important +} + +.text-end { + text-align: right !important +} + +.text-center { + text-align: center !important +} + +.text-decoration-none { + text-decoration: none !important +} + +.text-decoration-underline { + text-decoration: underline !important +} + +.text-decoration-line-through { + text-decoration: line-through !important +} + +.text-lowercase { + text-transform: lowercase !important +} + +.text-uppercase { + text-transform: uppercase !important +} + +.text-capitalize { + text-transform: capitalize !important +} + +.text-wrap { + white-space: normal !important +} + +.text-nowrap { + white-space: nowrap !important +} + +.text-break { + word-wrap: break-word !important; + word-break: break-word !important +} + +.text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important +} + +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important +} + +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important +} + +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important +} + +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important +} + +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important +} + +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important +} + +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important +} + +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important +} + +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important +} + +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important +} + +.text-muted { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important +} + +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, .5) !important +} + +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, .5) !important +} + +.text-body-secondary { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important +} + +.text-body-tertiary { + --bs-text-opacity: 1; + color: var(--bs-tertiary-color) !important +} + +.text-body-emphasis { + --bs-text-opacity: 1; + color: var(--bs-emphasis-color) !important +} + +.text-reset { + --bs-text-opacity: 1; + color: inherit !important +} + +.text-opacity-25 { + --bs-text-opacity: 0.25 +} + +.text-opacity-50 { + --bs-text-opacity: 0.5 +} + +.text-opacity-75 { + --bs-text-opacity: 0.75 +} + +.text-opacity-100 { + --bs-text-opacity: 1 +} + +.text-primary-emphasis { + color: var(--bs-primary-text-emphasis) !important +} + +.text-secondary-emphasis { + color: var(--bs-secondary-text-emphasis) !important +} + +.text-success-emphasis { + color: var(--bs-success-text-emphasis) !important +} + +.text-info-emphasis { + color: var(--bs-info-text-emphasis) !important +} + +.text-warning-emphasis { + color: var(--bs-warning-text-emphasis) !important +} + +.text-danger-emphasis { + color: var(--bs-danger-text-emphasis) !important +} + +.text-light-emphasis { + color: var(--bs-light-text-emphasis) !important +} + +.text-dark-emphasis { + color: var(--bs-dark-text-emphasis) !important +} + +.link-opacity-10 { + --bs-link-opacity: 0.1 +} + +.link-opacity-10-hover:hover { + --bs-link-opacity: 0.1 +} + +.link-opacity-25 { + --bs-link-opacity: 0.25 +} + +.link-opacity-25-hover:hover { + --bs-link-opacity: 0.25 +} + +.link-opacity-50 { + --bs-link-opacity: 0.5 +} + +.link-opacity-50-hover:hover { + --bs-link-opacity: 0.5 +} + +.link-opacity-75 { + --bs-link-opacity: 0.75 +} + +.link-opacity-75-hover:hover { + --bs-link-opacity: 0.75 +} + +.link-opacity-100 { + --bs-link-opacity: 1 +} + +.link-opacity-100-hover:hover { + --bs-link-opacity: 1 +} + +.link-offset-1 { + text-underline-offset: 0.125em !important +} + +.link-offset-1-hover:hover { + text-underline-offset: 0.125em !important +} + +.link-offset-2 { + text-underline-offset: 0.25em !important +} + +.link-offset-2-hover:hover { + text-underline-offset: 0.25em !important +} + +.link-offset-3 { + text-underline-offset: 0.375em !important +} + +.link-offset-3-hover:hover { + text-underline-offset: 0.375em !important +} + +.link-underline-primary { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important +} + +.link-underline-secondary { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important +} + +.link-underline-success { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important +} + +.link-underline-info { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important +} + +.link-underline-warning { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important +} + +.link-underline-danger { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important +} + +.link-underline-light { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important +} + +.link-underline-dark { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important +} + +.link-underline { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important +} + +.link-underline-opacity-0 { + --bs-link-underline-opacity: 0 +} + +.link-underline-opacity-0-hover:hover { + --bs-link-underline-opacity: 0 +} + +.link-underline-opacity-10 { + --bs-link-underline-opacity: 0.1 +} + +.link-underline-opacity-10-hover:hover { + --bs-link-underline-opacity: 0.1 +} + +.link-underline-opacity-25 { + --bs-link-underline-opacity: 0.25 +} + +.link-underline-opacity-25-hover:hover { + --bs-link-underline-opacity: 0.25 +} + +.link-underline-opacity-50 { + --bs-link-underline-opacity: 0.5 +} + +.link-underline-opacity-50-hover:hover { + --bs-link-underline-opacity: 0.5 +} + +.link-underline-opacity-75 { + --bs-link-underline-opacity: 0.75 +} + +.link-underline-opacity-75-hover:hover { + --bs-link-underline-opacity: 0.75 +} + +.link-underline-opacity-100 { + --bs-link-underline-opacity: 1 +} + +.link-underline-opacity-100-hover:hover { + --bs-link-underline-opacity: 1 +} + +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important +} + +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important +} + +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important +} + +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important +} + +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important +} + +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important +} + +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important +} + +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important +} + +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important +} + +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important +} + +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important +} + +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important +} + +.bg-body-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important +} + +.bg-body-tertiary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important +} + +.bg-opacity-10 { + --bs-bg-opacity: 0.1 +} + +.bg-opacity-25 { + --bs-bg-opacity: 0.25 +} + +.bg-opacity-50 { + --bs-bg-opacity: 0.5 +} + +.bg-opacity-75 { + --bs-bg-opacity: 0.75 +} + +.bg-opacity-100 { + --bs-bg-opacity: 1 +} + +.bg-primary-subtle { + background-color: var(--bs-primary-bg-subtle) !important +} + +.bg-secondary-subtle { + background-color: var(--bs-secondary-bg-subtle) !important +} + +.bg-success-subtle { + background-color: var(--bs-success-bg-subtle) !important +} + +.bg-info-subtle { + background-color: var(--bs-info-bg-subtle) !important +} + +.bg-warning-subtle { + background-color: var(--bs-warning-bg-subtle) !important +} + +.bg-danger-subtle { + background-color: var(--bs-danger-bg-subtle) !important +} + +.bg-light-subtle { + background-color: var(--bs-light-bg-subtle) !important +} + +.bg-dark-subtle { + background-color: var(--bs-dark-bg-subtle) !important +} + +.bg-gradient { + background-image: var(--bs-gradient) !important +} + +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important +} + +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + user-select: auto !important +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + user-select: none !important +} + +.pe-none { + pointer-events: none !important +} + +.pe-auto { + pointer-events: auto !important +} + +.rounded { + border-radius: var(--bs-border-radius) !important +} + +.rounded-0 { + border-radius: 0 !important +} + +.rounded-1 { + border-radius: var(--bs-border-radius-sm) !important +} + +.rounded-2 { + border-radius: var(--bs-border-radius) !important +} + +.rounded-3 { + border-radius: var(--bs-border-radius-lg) !important +} + +.rounded-4 { + border-radius: var(--bs-border-radius-xl) !important +} + +.rounded-5 { + border-radius: var(--bs-border-radius-xxl) !important +} + +.rounded-circle { + border-radius: 50% !important +} + +.rounded-pill { + border-radius: var(--bs-border-radius-pill) !important +} + +.rounded-top { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important +} + +.rounded-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important +} + +.rounded-top-1 { + border-top-left-radius: var(--bs-border-radius-sm) !important; + border-top-right-radius: var(--bs-border-radius-sm) !important +} + +.rounded-top-2 { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important +} + +.rounded-top-3 { + border-top-left-radius: var(--bs-border-radius-lg) !important; + border-top-right-radius: var(--bs-border-radius-lg) !important +} + +.rounded-top-4 { + border-top-left-radius: var(--bs-border-radius-xl) !important; + border-top-right-radius: var(--bs-border-radius-xl) !important +} + +.rounded-top-5 { + border-top-left-radius: var(--bs-border-radius-xxl) !important; + border-top-right-radius: var(--bs-border-radius-xxl) !important +} + +.rounded-top-circle { + border-top-left-radius: 50% !important; + border-top-right-radius: 50% !important +} + +.rounded-top-pill { + border-top-left-radius: var(--bs-border-radius-pill) !important; + border-top-right-radius: var(--bs-border-radius-pill) !important +} + +.rounded-end { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important +} + +.rounded-end-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important +} + +.rounded-end-1 { + border-top-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-right-radius: var(--bs-border-radius-sm) !important +} + +.rounded-end-2 { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important +} + +.rounded-end-3 { + border-top-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-right-radius: var(--bs-border-radius-lg) !important +} + +.rounded-end-4 { + border-top-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-right-radius: var(--bs-border-radius-xl) !important +} + +.rounded-end-5 { + border-top-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-right-radius: var(--bs-border-radius-xxl) !important +} + +.rounded-end-circle { + border-top-right-radius: 50% !important; + border-bottom-right-radius: 50% !important +} + +.rounded-end-pill { + border-top-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-right-radius: var(--bs-border-radius-pill) !important +} + +.rounded-bottom { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important +} + +.rounded-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius: 0 !important +} + +.rounded-bottom-1 { + border-bottom-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-left-radius: var(--bs-border-radius-sm) !important +} + +.rounded-bottom-2 { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important +} + +.rounded-bottom-3 { + border-bottom-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-left-radius: var(--bs-border-radius-lg) !important +} + +.rounded-bottom-4 { + border-bottom-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-left-radius: var(--bs-border-radius-xl) !important +} + +.rounded-bottom-5 { + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-left-radius: var(--bs-border-radius-xxl) !important +} + +.rounded-bottom-circle { + border-bottom-right-radius: 50% !important; + border-bottom-left-radius: 50% !important +} + +.rounded-bottom-pill { + border-bottom-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-left-radius: var(--bs-border-radius-pill) !important +} + +.rounded-start { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important +} + +.rounded-start-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius: 0 !important +} + +.rounded-start-1 { + border-bottom-left-radius: var(--bs-border-radius-sm) !important; + border-top-left-radius: var(--bs-border-radius-sm) !important +} + +.rounded-start-2 { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important +} + +.rounded-start-3 { + border-bottom-left-radius: var(--bs-border-radius-lg) !important; + border-top-left-radius: var(--bs-border-radius-lg) !important +} + +.rounded-start-4 { + border-bottom-left-radius: var(--bs-border-radius-xl) !important; + border-top-left-radius: var(--bs-border-radius-xl) !important +} + +.rounded-start-5 { + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; + border-top-left-radius: var(--bs-border-radius-xxl) !important +} + +.rounded-start-circle { + border-bottom-left-radius: 50% !important; + border-top-left-radius: 50% !important +} + +.rounded-start-pill { + border-bottom-left-radius: var(--bs-border-radius-pill) !important; + border-top-left-radius: var(--bs-border-radius-pill) !important +} + +.visible { + visibility: visible !important +} + +.invisible { + visibility: hidden !important +} + +.z-n1 { + z-index: -1 !important +} + +.z-0 { + z-index: 0 !important +} + +.z-1 { + z-index: 1 !important +} + +.z-2 { + z-index: 2 !important +} + +.z-3 { + z-index: 3 !important +} + +@media (min-width: 576px) { + .float-sm-start { + float: left !important + } + + .float-sm-end { + float: right !important + } + + .float-sm-none { + float: none !important + } + + .object-fit-sm-contain { + -o-object-fit: contain !important; + object-fit: contain !important + } + + .object-fit-sm-cover { + -o-object-fit: cover !important; + object-fit: cover !important + } + + .object-fit-sm-fill { + -o-object-fit: fill !important; + object-fit: fill !important + } + + .object-fit-sm-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important + } + + .object-fit-sm-none { + -o-object-fit: none !important; + object-fit: none !important + } + + .d-sm-inline { + display: inline !important + } + + .d-sm-inline-block { + display: inline-block !important + } + + .d-sm-block { + display: block !important + } + + .d-sm-grid { + display: grid !important + } + + .d-sm-inline-grid { + display: inline-grid !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: flex !important + } + + .d-sm-inline-flex { + display: inline-flex !important + } + + .d-sm-none { + display: none !important + } + + .flex-sm-fill { + flex: 1 1 auto !important + } + + .flex-sm-row { + flex-direction: row !important + } + + .flex-sm-column { + flex-direction: column !important + } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important + } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important + } + + .flex-sm-grow-0 { + flex-grow: 0 !important + } + + .flex-sm-grow-1 { + flex-grow: 1 !important + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important + } + + .flex-sm-wrap { + flex-wrap: wrap !important + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .justify-content-sm-start { + justify-content: flex-start !important + } + + .justify-content-sm-end { + justify-content: flex-end !important + } + + .justify-content-sm-center { + justify-content: center !important + } + + .justify-content-sm-between { + justify-content: space-between !important + } + + .justify-content-sm-around { + justify-content: space-around !important + } + + .justify-content-sm-evenly { + justify-content: space-evenly !important + } + + .align-items-sm-start { + align-items: flex-start !important + } + + .align-items-sm-end { + align-items: flex-end !important + } + + .align-items-sm-center { + align-items: center !important + } + + .align-items-sm-baseline { + align-items: baseline !important + } + + .align-items-sm-stretch { + align-items: stretch !important + } + + .align-content-sm-start { + align-content: flex-start !important + } + + .align-content-sm-end { + align-content: flex-end !important + } + + .align-content-sm-center { + align-content: center !important + } + + .align-content-sm-between { + align-content: space-between !important + } + + .align-content-sm-around { + align-content: space-around !important + } + + .align-content-sm-stretch { + align-content: stretch !important + } + + .align-self-sm-auto { + align-self: auto !important + } + + .align-self-sm-start { + align-self: flex-start !important + } + + .align-self-sm-end { + align-self: flex-end !important + } + + .align-self-sm-center { + align-self: center !important + } + + .align-self-sm-baseline { + align-self: baseline !important + } + + .align-self-sm-stretch { + align-self: stretch !important + } + + .order-sm-first { + order: -1 !important + } + + .order-sm-0 { + order: 0 !important + } + + .order-sm-1 { + order: 1 !important + } + + .order-sm-2 { + order: 2 !important + } + + .order-sm-3 { + order: 3 !important + } + + .order-sm-4 { + order: 4 !important + } + + .order-sm-5 { + order: 5 !important + } + + .order-sm-last { + order: 6 !important + } + + .m-sm-0 { + margin: 0 !important + } + + .m-sm-1 { + margin: .25rem !important + } + + .m-sm-2 { + margin: .5rem !important + } + + .m-sm-3 { + margin: 1rem !important + } + + .m-sm-4 { + margin: 1.5rem !important + } + + .m-sm-5 { + margin: 3rem !important + } + + .m-sm-auto { + margin: auto !important + } + + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important + } + + .mx-sm-1 { + margin-right: .25rem !important; + margin-left: .25rem !important + } + + .mx-sm-2 { + margin-right: .5rem !important; + margin-left: .5rem !important + } + + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important + } + + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important + } + + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important + } + + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important + } + + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important + } + + .my-sm-1 { + margin-top: .25rem !important; + margin-bottom: .25rem !important + } + + .my-sm-2 { + margin-top: .5rem !important; + margin-bottom: .5rem !important + } + + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important + } + + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important + } + + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important + } + + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important + } + + .mt-sm-0 { + margin-top: 0 !important + } + + .mt-sm-1 { + margin-top: .25rem !important + } + + .mt-sm-2 { + margin-top: .5rem !important + } + + .mt-sm-3 { + margin-top: 1rem !important + } + + .mt-sm-4 { + margin-top: 1.5rem !important + } + + .mt-sm-5 { + margin-top: 3rem !important + } + + .mt-sm-auto { + margin-top: auto !important + } + + .me-sm-0 { + margin-right: 0 !important + } + + .me-sm-1 { + margin-right: .25rem !important + } + + .me-sm-2 { + margin-right: .5rem !important + } + + .me-sm-3 { + margin-right: 1rem !important + } + + .me-sm-4 { + margin-right: 1.5rem !important + } + + .me-sm-5 { + margin-right: 3rem !important + } + + .me-sm-auto { + margin-right: auto !important + } + + .mb-sm-0 { + margin-bottom: 0 !important + } + + .mb-sm-1 { + margin-bottom: .25rem !important + } + + .mb-sm-2 { + margin-bottom: .5rem !important + } + + .mb-sm-3 { + margin-bottom: 1rem !important + } + + .mb-sm-4 { + margin-bottom: 1.5rem !important + } + + .mb-sm-5 { + margin-bottom: 3rem !important + } + + .mb-sm-auto { + margin-bottom: auto !important + } + + .ms-sm-0 { + margin-left: 0 !important + } + + .ms-sm-1 { + margin-left: .25rem !important + } + + .ms-sm-2 { + margin-left: .5rem !important + } + + .ms-sm-3 { + margin-left: 1rem !important + } + + .ms-sm-4 { + margin-left: 1.5rem !important + } + + .ms-sm-5 { + margin-left: 3rem !important + } + + .ms-sm-auto { + margin-left: auto !important + } + + .p-sm-0 { + padding: 0 !important + } + + .p-sm-1 { + padding: .25rem !important + } + + .p-sm-2 { + padding: .5rem !important + } + + .p-sm-3 { + padding: 1rem !important + } + + .p-sm-4 { + padding: 1.5rem !important + } + + .p-sm-5 { + padding: 3rem !important + } + + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important + } + + .px-sm-1 { + padding-right: .25rem !important; + padding-left: .25rem !important + } + + .px-sm-2 { + padding-right: .5rem !important; + padding-left: .5rem !important + } + + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important + } + + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important + } + + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important + } + + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important + } + + .py-sm-1 { + padding-top: .25rem !important; + padding-bottom: .25rem !important + } + + .py-sm-2 { + padding-top: .5rem !important; + padding-bottom: .5rem !important + } + + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important + } + + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important + } + + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important + } + + .pt-sm-0 { + padding-top: 0 !important + } + + .pt-sm-1 { + padding-top: .25rem !important + } + + .pt-sm-2 { + padding-top: .5rem !important + } + + .pt-sm-3 { + padding-top: 1rem !important + } + + .pt-sm-4 { + padding-top: 1.5rem !important + } + + .pt-sm-5 { + padding-top: 3rem !important + } + + .pe-sm-0 { + padding-right: 0 !important + } + + .pe-sm-1 { + padding-right: .25rem !important + } + + .pe-sm-2 { + padding-right: .5rem !important + } + + .pe-sm-3 { + padding-right: 1rem !important + } + + .pe-sm-4 { + padding-right: 1.5rem !important + } + + .pe-sm-5 { + padding-right: 3rem !important + } + + .pb-sm-0 { + padding-bottom: 0 !important + } + + .pb-sm-1 { + padding-bottom: .25rem !important + } + + .pb-sm-2 { + padding-bottom: .5rem !important + } + + .pb-sm-3 { + padding-bottom: 1rem !important + } + + .pb-sm-4 { + padding-bottom: 1.5rem !important + } + + .pb-sm-5 { + padding-bottom: 3rem !important + } + + .ps-sm-0 { + padding-left: 0 !important + } + + .ps-sm-1 { + padding-left: .25rem !important + } + + .ps-sm-2 { + padding-left: .5rem !important + } + + .ps-sm-3 { + padding-left: 1rem !important + } + + .ps-sm-4 { + padding-left: 1.5rem !important + } + + .ps-sm-5 { + padding-left: 3rem !important + } + + .gap-sm-0 { + gap: 0 !important + } + + .gap-sm-1 { + gap: .25rem !important + } + + .gap-sm-2 { + gap: .5rem !important + } + + .gap-sm-3 { + gap: 1rem !important + } + + .gap-sm-4 { + gap: 1.5rem !important + } + + .gap-sm-5 { + gap: 3rem !important + } + + .row-gap-sm-0 { + row-gap: 0 !important + } + + .row-gap-sm-1 { + row-gap: .25rem !important + } + + .row-gap-sm-2 { + row-gap: .5rem !important + } + + .row-gap-sm-3 { + row-gap: 1rem !important + } + + .row-gap-sm-4 { + row-gap: 1.5rem !important + } + + .row-gap-sm-5 { + row-gap: 3rem !important + } + + .column-gap-sm-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important + } + + .column-gap-sm-1 { + -moz-column-gap: 0.25rem !important; + column-gap: .25rem !important + } + + .column-gap-sm-2 { + -moz-column-gap: 0.5rem !important; + column-gap: .5rem !important + } + + .column-gap-sm-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important + } + + .column-gap-sm-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important + } + + .column-gap-sm-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important + } + + .text-sm-start { + text-align: left !important + } + + .text-sm-end { + text-align: right !important + } + + .text-sm-center { + text-align: center !important + } +} + +@media (min-width: 768px) { + .float-md-start { + float: left !important + } + + .float-md-end { + float: right !important + } + + .float-md-none { + float: none !important + } + + .object-fit-md-contain { + -o-object-fit: contain !important; + object-fit: contain !important + } + + .object-fit-md-cover { + -o-object-fit: cover !important; + object-fit: cover !important + } + + .object-fit-md-fill { + -o-object-fit: fill !important; + object-fit: fill !important + } + + .object-fit-md-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important + } + + .object-fit-md-none { + -o-object-fit: none !important; + object-fit: none !important + } + + .d-md-inline { + display: inline !important + } + + .d-md-inline-block { + display: inline-block !important + } + + .d-md-block { + display: block !important + } + + .d-md-grid { + display: grid !important + } + + .d-md-inline-grid { + display: inline-grid !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: flex !important + } + + .d-md-inline-flex { + display: inline-flex !important + } + + .d-md-none { + display: none !important + } + + .flex-md-fill { + flex: 1 1 auto !important + } + + .flex-md-row { + flex-direction: row !important + } + + .flex-md-column { + flex-direction: column !important + } + + .flex-md-row-reverse { + flex-direction: row-reverse !important + } + + .flex-md-column-reverse { + flex-direction: column-reverse !important + } + + .flex-md-grow-0 { + flex-grow: 0 !important + } + + .flex-md-grow-1 { + flex-grow: 1 !important + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important + } + + .flex-md-wrap { + flex-wrap: wrap !important + } + + .flex-md-nowrap { + flex-wrap: nowrap !important + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .justify-content-md-start { + justify-content: flex-start !important + } + + .justify-content-md-end { + justify-content: flex-end !important + } + + .justify-content-md-center { + justify-content: center !important + } + + .justify-content-md-between { + justify-content: space-between !important + } + + .justify-content-md-around { + justify-content: space-around !important + } + + .justify-content-md-evenly { + justify-content: space-evenly !important + } + + .align-items-md-start { + align-items: flex-start !important + } + + .align-items-md-end { + align-items: flex-end !important + } + + .align-items-md-center { + align-items: center !important + } + + .align-items-md-baseline { + align-items: baseline !important + } + + .align-items-md-stretch { + align-items: stretch !important + } + + .align-content-md-start { + align-content: flex-start !important + } + + .align-content-md-end { + align-content: flex-end !important + } + + .align-content-md-center { + align-content: center !important + } + + .align-content-md-between { + align-content: space-between !important + } + + .align-content-md-around { + align-content: space-around !important + } + + .align-content-md-stretch { + align-content: stretch !important + } + + .align-self-md-auto { + align-self: auto !important + } + + .align-self-md-start { + align-self: flex-start !important + } + + .align-self-md-end { + align-self: flex-end !important + } + + .align-self-md-center { + align-self: center !important + } + + .align-self-md-baseline { + align-self: baseline !important + } + + .align-self-md-stretch { + align-self: stretch !important + } + + .order-md-first { + order: -1 !important + } + + .order-md-0 { + order: 0 !important + } + + .order-md-1 { + order: 1 !important + } + + .order-md-2 { + order: 2 !important + } + + .order-md-3 { + order: 3 !important + } + + .order-md-4 { + order: 4 !important + } + + .order-md-5 { + order: 5 !important + } + + .order-md-last { + order: 6 !important + } + + .m-md-0 { + margin: 0 !important + } + + .m-md-1 { + margin: .25rem !important + } + + .m-md-2 { + margin: .5rem !important + } + + .m-md-3 { + margin: 1rem !important + } + + .m-md-4 { + margin: 1.5rem !important + } + + .m-md-5 { + margin: 3rem !important + } + + .m-md-auto { + margin: auto !important + } + + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important + } + + .mx-md-1 { + margin-right: .25rem !important; + margin-left: .25rem !important + } + + .mx-md-2 { + margin-right: .5rem !important; + margin-left: .5rem !important + } + + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important + } + + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important + } + + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important + } + + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important + } + + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important + } + + .my-md-1 { + margin-top: .25rem !important; + margin-bottom: .25rem !important + } + + .my-md-2 { + margin-top: .5rem !important; + margin-bottom: .5rem !important + } + + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important + } + + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important + } + + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important + } + + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important + } + + .mt-md-0 { + margin-top: 0 !important + } + + .mt-md-1 { + margin-top: .25rem !important + } + + .mt-md-2 { + margin-top: .5rem !important + } + + .mt-md-3 { + margin-top: 1rem !important + } + + .mt-md-4 { + margin-top: 1.5rem !important + } + + .mt-md-5 { + margin-top: 3rem !important + } + + .mt-md-auto { + margin-top: auto !important + } + + .me-md-0 { + margin-right: 0 !important + } + + .me-md-1 { + margin-right: .25rem !important + } + + .me-md-2 { + margin-right: .5rem !important + } + + .me-md-3 { + margin-right: 1rem !important + } + + .me-md-4 { + margin-right: 1.5rem !important + } + + .me-md-5 { + margin-right: 3rem !important + } + + .me-md-auto { + margin-right: auto !important + } + + .mb-md-0 { + margin-bottom: 0 !important + } + + .mb-md-1 { + margin-bottom: .25rem !important + } + + .mb-md-2 { + margin-bottom: .5rem !important + } + + .mb-md-3 { + margin-bottom: 1rem !important + } + + .mb-md-4 { + margin-bottom: 1.5rem !important + } + + .mb-md-5 { + margin-bottom: 3rem !important + } + + .mb-md-auto { + margin-bottom: auto !important + } + + .ms-md-0 { + margin-left: 0 !important + } + + .ms-md-1 { + margin-left: .25rem !important + } + + .ms-md-2 { + margin-left: .5rem !important + } + + .ms-md-3 { + margin-left: 1rem !important + } + + .ms-md-4 { + margin-left: 1.5rem !important + } + + .ms-md-5 { + margin-left: 3rem !important + } + + .ms-md-auto { + margin-left: auto !important + } + + .p-md-0 { + padding: 0 !important + } + + .p-md-1 { + padding: .25rem !important + } + + .p-md-2 { + padding: .5rem !important + } + + .p-md-3 { + padding: 1rem !important + } + + .p-md-4 { + padding: 1.5rem !important + } + + .p-md-5 { + padding: 3rem !important + } + + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important + } + + .px-md-1 { + padding-right: .25rem !important; + padding-left: .25rem !important + } + + .px-md-2 { + padding-right: .5rem !important; + padding-left: .5rem !important + } + + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important + } + + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important + } + + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important + } + + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important + } + + .py-md-1 { + padding-top: .25rem !important; + padding-bottom: .25rem !important + } + + .py-md-2 { + padding-top: .5rem !important; + padding-bottom: .5rem !important + } + + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important + } + + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important + } + + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important + } + + .pt-md-0 { + padding-top: 0 !important + } + + .pt-md-1 { + padding-top: .25rem !important + } + + .pt-md-2 { + padding-top: .5rem !important + } + + .pt-md-3 { + padding-top: 1rem !important + } + + .pt-md-4 { + padding-top: 1.5rem !important + } + + .pt-md-5 { + padding-top: 3rem !important + } + + .pe-md-0 { + padding-right: 0 !important + } + + .pe-md-1 { + padding-right: .25rem !important + } + + .pe-md-2 { + padding-right: .5rem !important + } + + .pe-md-3 { + padding-right: 1rem !important + } + + .pe-md-4 { + padding-right: 1.5rem !important + } + + .pe-md-5 { + padding-right: 3rem !important + } + + .pb-md-0 { + padding-bottom: 0 !important + } + + .pb-md-1 { + padding-bottom: .25rem !important + } + + .pb-md-2 { + padding-bottom: .5rem !important + } + + .pb-md-3 { + padding-bottom: 1rem !important + } + + .pb-md-4 { + padding-bottom: 1.5rem !important + } + + .pb-md-5 { + padding-bottom: 3rem !important + } + + .ps-md-0 { + padding-left: 0 !important + } + + .ps-md-1 { + padding-left: .25rem !important + } + + .ps-md-2 { + padding-left: .5rem !important + } + + .ps-md-3 { + padding-left: 1rem !important + } + + .ps-md-4 { + padding-left: 1.5rem !important + } + + .ps-md-5 { + padding-left: 3rem !important + } + + .gap-md-0 { + gap: 0 !important + } + + .gap-md-1 { + gap: .25rem !important + } + + .gap-md-2 { + gap: .5rem !important + } + + .gap-md-3 { + gap: 1rem !important + } + + .gap-md-4 { + gap: 1.5rem !important + } + + .gap-md-5 { + gap: 3rem !important + } + + .row-gap-md-0 { + row-gap: 0 !important + } + + .row-gap-md-1 { + row-gap: .25rem !important + } + + .row-gap-md-2 { + row-gap: .5rem !important + } + + .row-gap-md-3 { + row-gap: 1rem !important + } + + .row-gap-md-4 { + row-gap: 1.5rem !important + } + + .row-gap-md-5 { + row-gap: 3rem !important + } + + .column-gap-md-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important + } + + .column-gap-md-1 { + -moz-column-gap: 0.25rem !important; + column-gap: .25rem !important + } + + .column-gap-md-2 { + -moz-column-gap: 0.5rem !important; + column-gap: .5rem !important + } + + .column-gap-md-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important + } + + .column-gap-md-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important + } + + .column-gap-md-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important + } + + .text-md-start { + text-align: left !important + } + + .text-md-end { + text-align: right !important + } + + .text-md-center { + text-align: center !important + } +} + +@media (min-width: 992px) { + .float-lg-start { + float: left !important + } + + .float-lg-end { + float: right !important + } + + .float-lg-none { + float: none !important + } + + .object-fit-lg-contain { + -o-object-fit: contain !important; + object-fit: contain !important + } + + .object-fit-lg-cover { + -o-object-fit: cover !important; + object-fit: cover !important + } + + .object-fit-lg-fill { + -o-object-fit: fill !important; + object-fit: fill !important + } + + .object-fit-lg-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important + } + + .object-fit-lg-none { + -o-object-fit: none !important; + object-fit: none !important + } + + .d-lg-inline { + display: inline !important + } + + .d-lg-inline-block { + display: inline-block !important + } + + .d-lg-block { + display: block !important + } + + .d-lg-grid { + display: grid !important + } + + .d-lg-inline-grid { + display: inline-grid !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: flex !important + } + + .d-lg-inline-flex { + display: inline-flex !important + } + + .d-lg-none { + display: none !important + } + + .flex-lg-fill { + flex: 1 1 auto !important + } + + .flex-lg-row { + flex-direction: row !important + } + + .flex-lg-column { + flex-direction: column !important + } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important + } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important + } + + .flex-lg-grow-0 { + flex-grow: 0 !important + } + + .flex-lg-grow-1 { + flex-grow: 1 !important + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important + } + + .flex-lg-wrap { + flex-wrap: wrap !important + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .justify-content-lg-start { + justify-content: flex-start !important + } + + .justify-content-lg-end { + justify-content: flex-end !important + } + + .justify-content-lg-center { + justify-content: center !important + } + + .justify-content-lg-between { + justify-content: space-between !important + } + + .justify-content-lg-around { + justify-content: space-around !important + } + + .justify-content-lg-evenly { + justify-content: space-evenly !important + } + + .align-items-lg-start { + align-items: flex-start !important + } + + .align-items-lg-end { + align-items: flex-end !important + } + + .align-items-lg-center { + align-items: center !important + } + + .align-items-lg-baseline { + align-items: baseline !important + } + + .align-items-lg-stretch { + align-items: stretch !important + } + + .align-content-lg-start { + align-content: flex-start !important + } + + .align-content-lg-end { + align-content: flex-end !important + } + + .align-content-lg-center { + align-content: center !important + } + + .align-content-lg-between { + align-content: space-between !important + } + + .align-content-lg-around { + align-content: space-around !important + } + + .align-content-lg-stretch { + align-content: stretch !important + } + + .align-self-lg-auto { + align-self: auto !important + } + + .align-self-lg-start { + align-self: flex-start !important + } + + .align-self-lg-end { + align-self: flex-end !important + } + + .align-self-lg-center { + align-self: center !important + } + + .align-self-lg-baseline { + align-self: baseline !important + } + + .align-self-lg-stretch { + align-self: stretch !important + } + + .order-lg-first { + order: -1 !important + } + + .order-lg-0 { + order: 0 !important + } + + .order-lg-1 { + order: 1 !important + } + + .order-lg-2 { + order: 2 !important + } + + .order-lg-3 { + order: 3 !important + } + + .order-lg-4 { + order: 4 !important + } + + .order-lg-5 { + order: 5 !important + } + + .order-lg-last { + order: 6 !important + } + + .m-lg-0 { + margin: 0 !important + } + + .m-lg-1 { + margin: .25rem !important + } + + .m-lg-2 { + margin: .5rem !important + } + + .m-lg-3 { + margin: 1rem !important + } + + .m-lg-4 { + margin: 1.5rem !important + } + + .m-lg-5 { + margin: 3rem !important + } + + .m-lg-auto { + margin: auto !important + } + + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important + } + + .mx-lg-1 { + margin-right: .25rem !important; + margin-left: .25rem !important + } + + .mx-lg-2 { + margin-right: .5rem !important; + margin-left: .5rem !important + } + + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important + } + + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important + } + + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important + } + + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important + } + + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important + } + + .my-lg-1 { + margin-top: .25rem !important; + margin-bottom: .25rem !important + } + + .my-lg-2 { + margin-top: .5rem !important; + margin-bottom: .5rem !important + } + + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important + } + + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important + } + + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important + } + + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important + } + + .mt-lg-0 { + margin-top: 0 !important + } + + .mt-lg-1 { + margin-top: .25rem !important + } + + .mt-lg-2 { + margin-top: .5rem !important + } + + .mt-lg-3 { + margin-top: 1rem !important + } + + .mt-lg-4 { + margin-top: 1.5rem !important + } + + .mt-lg-5 { + margin-top: 3rem !important + } + + .mt-lg-auto { + margin-top: auto !important + } + + .me-lg-0 { + margin-right: 0 !important + } + + .me-lg-1 { + margin-right: .25rem !important + } + + .me-lg-2 { + margin-right: .5rem !important + } + + .me-lg-3 { + margin-right: 1rem !important + } + + .me-lg-4 { + margin-right: 1.5rem !important + } + + .me-lg-5 { + margin-right: 3rem !important + } + + .me-lg-auto { + margin-right: auto !important + } + + .mb-lg-0 { + margin-bottom: 0 !important + } + + .mb-lg-1 { + margin-bottom: .25rem !important + } + + .mb-lg-2 { + margin-bottom: .5rem !important + } + + .mb-lg-3 { + margin-bottom: 1rem !important + } + + .mb-lg-4 { + margin-bottom: 1.5rem !important + } + + .mb-lg-5 { + margin-bottom: 3rem !important + } + + .mb-lg-auto { + margin-bottom: auto !important + } + + .ms-lg-0 { + margin-left: 0 !important + } + + .ms-lg-1 { + margin-left: .25rem !important + } + + .ms-lg-2 { + margin-left: .5rem !important + } + + .ms-lg-3 { + margin-left: 1rem !important + } + + .ms-lg-4 { + margin-left: 1.5rem !important + } + + .ms-lg-5 { + margin-left: 3rem !important + } + + .ms-lg-auto { + margin-left: auto !important + } + + .p-lg-0 { + padding: 0 !important + } + + .p-lg-1 { + padding: .25rem !important + } + + .p-lg-2 { + padding: .5rem !important + } + + .p-lg-3 { + padding: 1rem !important + } + + .p-lg-4 { + padding: 1.5rem !important + } + + .p-lg-5 { + padding: 3rem !important + } + + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important + } + + .px-lg-1 { + padding-right: .25rem !important; + padding-left: .25rem !important + } + + .px-lg-2 { + padding-right: .5rem !important; + padding-left: .5rem !important + } + + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important + } + + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important + } + + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important + } + + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important + } + + .py-lg-1 { + padding-top: .25rem !important; + padding-bottom: .25rem !important + } + + .py-lg-2 { + padding-top: .5rem !important; + padding-bottom: .5rem !important + } + + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important + } + + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important + } + + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important + } + + .pt-lg-0 { + padding-top: 0 !important + } + + .pt-lg-1 { + padding-top: .25rem !important + } + + .pt-lg-2 { + padding-top: .5rem !important + } + + .pt-lg-3 { + padding-top: 1rem !important + } + + .pt-lg-4 { + padding-top: 1.5rem !important + } + + .pt-lg-5 { + padding-top: 3rem !important + } + + .pe-lg-0 { + padding-right: 0 !important + } + + .pe-lg-1 { + padding-right: .25rem !important + } + + .pe-lg-2 { + padding-right: .5rem !important + } + + .pe-lg-3 { + padding-right: 1rem !important + } + + .pe-lg-4 { + padding-right: 1.5rem !important + } + + .pe-lg-5 { + padding-right: 3rem !important + } + + .pb-lg-0 { + padding-bottom: 0 !important + } + + .pb-lg-1 { + padding-bottom: .25rem !important + } + + .pb-lg-2 { + padding-bottom: .5rem !important + } + + .pb-lg-3 { + padding-bottom: 1rem !important + } + + .pb-lg-4 { + padding-bottom: 1.5rem !important + } + + .pb-lg-5 { + padding-bottom: 3rem !important + } + + .ps-lg-0 { + padding-left: 0 !important + } + + .ps-lg-1 { + padding-left: .25rem !important + } + + .ps-lg-2 { + padding-left: .5rem !important + } + + .ps-lg-3 { + padding-left: 1rem !important + } + + .ps-lg-4 { + padding-left: 1.5rem !important + } + + .ps-lg-5 { + padding-left: 3rem !important + } + + .gap-lg-0 { + gap: 0 !important + } + + .gap-lg-1 { + gap: .25rem !important + } + + .gap-lg-2 { + gap: .5rem !important + } + + .gap-lg-3 { + gap: 1rem !important + } + + .gap-lg-4 { + gap: 1.5rem !important + } + + .gap-lg-5 { + gap: 3rem !important + } + + .row-gap-lg-0 { + row-gap: 0 !important + } + + .row-gap-lg-1 { + row-gap: .25rem !important + } + + .row-gap-lg-2 { + row-gap: .5rem !important + } + + .row-gap-lg-3 { + row-gap: 1rem !important + } + + .row-gap-lg-4 { + row-gap: 1.5rem !important + } + + .row-gap-lg-5 { + row-gap: 3rem !important + } + + .column-gap-lg-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important + } + + .column-gap-lg-1 { + -moz-column-gap: 0.25rem !important; + column-gap: .25rem !important + } + + .column-gap-lg-2 { + -moz-column-gap: 0.5rem !important; + column-gap: .5rem !important + } + + .column-gap-lg-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important + } + + .column-gap-lg-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important + } + + .column-gap-lg-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important + } + + .text-lg-start { + text-align: left !important + } + + .text-lg-end { + text-align: right !important + } + + .text-lg-center { + text-align: center !important + } +} + +@media (min-width: 1200px) { + .float-xl-start { + float: left !important + } + + .float-xl-end { + float: right !important + } + + .float-xl-none { + float: none !important + } + + .object-fit-xl-contain { + -o-object-fit: contain !important; + object-fit: contain !important + } + + .object-fit-xl-cover { + -o-object-fit: cover !important; + object-fit: cover !important + } + + .object-fit-xl-fill { + -o-object-fit: fill !important; + object-fit: fill !important + } + + .object-fit-xl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important + } + + .object-fit-xl-none { + -o-object-fit: none !important; + object-fit: none !important + } + + .d-xl-inline { + display: inline !important + } + + .d-xl-inline-block { + display: inline-block !important + } + + .d-xl-block { + display: block !important + } + + .d-xl-grid { + display: grid !important + } + + .d-xl-inline-grid { + display: inline-grid !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: flex !important + } + + .d-xl-inline-flex { + display: inline-flex !important + } + + .d-xl-none { + display: none !important + } + + .flex-xl-fill { + flex: 1 1 auto !important + } + + .flex-xl-row { + flex-direction: row !important + } + + .flex-xl-column { + flex-direction: column !important + } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important + } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important + } + + .flex-xl-grow-0 { + flex-grow: 0 !important + } + + .flex-xl-grow-1 { + flex-grow: 1 !important + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important + } + + .flex-xl-wrap { + flex-wrap: wrap !important + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .justify-content-xl-start { + justify-content: flex-start !important + } + + .justify-content-xl-end { + justify-content: flex-end !important + } + + .justify-content-xl-center { + justify-content: center !important + } + + .justify-content-xl-between { + justify-content: space-between !important + } + + .justify-content-xl-around { + justify-content: space-around !important + } + + .justify-content-xl-evenly { + justify-content: space-evenly !important + } + + .align-items-xl-start { + align-items: flex-start !important + } + + .align-items-xl-end { + align-items: flex-end !important + } + + .align-items-xl-center { + align-items: center !important + } + + .align-items-xl-baseline { + align-items: baseline !important + } + + .align-items-xl-stretch { + align-items: stretch !important + } + + .align-content-xl-start { + align-content: flex-start !important + } + + .align-content-xl-end { + align-content: flex-end !important + } + + .align-content-xl-center { + align-content: center !important + } + + .align-content-xl-between { + align-content: space-between !important + } + + .align-content-xl-around { + align-content: space-around !important + } + + .align-content-xl-stretch { + align-content: stretch !important + } + + .align-self-xl-auto { + align-self: auto !important + } + + .align-self-xl-start { + align-self: flex-start !important + } + + .align-self-xl-end { + align-self: flex-end !important + } + + .align-self-xl-center { + align-self: center !important + } + + .align-self-xl-baseline { + align-self: baseline !important + } + + .align-self-xl-stretch { + align-self: stretch !important + } + + .order-xl-first { + order: -1 !important + } + + .order-xl-0 { + order: 0 !important + } + + .order-xl-1 { + order: 1 !important + } + + .order-xl-2 { + order: 2 !important + } + + .order-xl-3 { + order: 3 !important + } + + .order-xl-4 { + order: 4 !important + } + + .order-xl-5 { + order: 5 !important + } + + .order-xl-last { + order: 6 !important + } + + .m-xl-0 { + margin: 0 !important + } + + .m-xl-1 { + margin: .25rem !important + } + + .m-xl-2 { + margin: .5rem !important + } + + .m-xl-3 { + margin: 1rem !important + } + + .m-xl-4 { + margin: 1.5rem !important + } + + .m-xl-5 { + margin: 3rem !important + } + + .m-xl-auto { + margin: auto !important + } + + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important + } + + .mx-xl-1 { + margin-right: .25rem !important; + margin-left: .25rem !important + } + + .mx-xl-2 { + margin-right: .5rem !important; + margin-left: .5rem !important + } + + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important + } + + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important + } + + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important + } + + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important + } + + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important + } + + .my-xl-1 { + margin-top: .25rem !important; + margin-bottom: .25rem !important + } + + .my-xl-2 { + margin-top: .5rem !important; + margin-bottom: .5rem !important + } + + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important + } + + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important + } + + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important + } + + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important + } + + .mt-xl-0 { + margin-top: 0 !important + } + + .mt-xl-1 { + margin-top: .25rem !important + } + + .mt-xl-2 { + margin-top: .5rem !important + } + + .mt-xl-3 { + margin-top: 1rem !important + } + + .mt-xl-4 { + margin-top: 1.5rem !important + } + + .mt-xl-5 { + margin-top: 3rem !important + } + + .mt-xl-auto { + margin-top: auto !important + } + + .me-xl-0 { + margin-right: 0 !important + } + + .me-xl-1 { + margin-right: .25rem !important + } + + .me-xl-2 { + margin-right: .5rem !important + } + + .me-xl-3 { + margin-right: 1rem !important + } + + .me-xl-4 { + margin-right: 1.5rem !important + } + + .me-xl-5 { + margin-right: 3rem !important + } + + .me-xl-auto { + margin-right: auto !important + } + + .mb-xl-0 { + margin-bottom: 0 !important + } + + .mb-xl-1 { + margin-bottom: .25rem !important + } + + .mb-xl-2 { + margin-bottom: .5rem !important + } + + .mb-xl-3 { + margin-bottom: 1rem !important + } + + .mb-xl-4 { + margin-bottom: 1.5rem !important + } + + .mb-xl-5 { + margin-bottom: 3rem !important + } + + .mb-xl-auto { + margin-bottom: auto !important + } + + .ms-xl-0 { + margin-left: 0 !important + } + + .ms-xl-1 { + margin-left: .25rem !important + } + + .ms-xl-2 { + margin-left: .5rem !important + } + + .ms-xl-3 { + margin-left: 1rem !important + } + + .ms-xl-4 { + margin-left: 1.5rem !important + } + + .ms-xl-5 { + margin-left: 3rem !important + } + + .ms-xl-auto { + margin-left: auto !important + } + + .p-xl-0 { + padding: 0 !important + } + + .p-xl-1 { + padding: .25rem !important + } + + .p-xl-2 { + padding: .5rem !important + } + + .p-xl-3 { + padding: 1rem !important + } + + .p-xl-4 { + padding: 1.5rem !important + } + + .p-xl-5 { + padding: 3rem !important + } + + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important + } + + .px-xl-1 { + padding-right: .25rem !important; + padding-left: .25rem !important + } + + .px-xl-2 { + padding-right: .5rem !important; + padding-left: .5rem !important + } + + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important + } + + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important + } + + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important + } + + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important + } + + .py-xl-1 { + padding-top: .25rem !important; + padding-bottom: .25rem !important + } + + .py-xl-2 { + padding-top: .5rem !important; + padding-bottom: .5rem !important + } + + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important + } + + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important + } + + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important + } + + .pt-xl-0 { + padding-top: 0 !important + } + + .pt-xl-1 { + padding-top: .25rem !important + } + + .pt-xl-2 { + padding-top: .5rem !important + } + + .pt-xl-3 { + padding-top: 1rem !important + } + + .pt-xl-4 { + padding-top: 1.5rem !important + } + + .pt-xl-5 { + padding-top: 3rem !important + } + + .pe-xl-0 { + padding-right: 0 !important + } + + .pe-xl-1 { + padding-right: .25rem !important + } + + .pe-xl-2 { + padding-right: .5rem !important + } + + .pe-xl-3 { + padding-right: 1rem !important + } + + .pe-xl-4 { + padding-right: 1.5rem !important + } + + .pe-xl-5 { + padding-right: 3rem !important + } + + .pb-xl-0 { + padding-bottom: 0 !important + } + + .pb-xl-1 { + padding-bottom: .25rem !important + } + + .pb-xl-2 { + padding-bottom: .5rem !important + } + + .pb-xl-3 { + padding-bottom: 1rem !important + } + + .pb-xl-4 { + padding-bottom: 1.5rem !important + } + + .pb-xl-5 { + padding-bottom: 3rem !important + } + + .ps-xl-0 { + padding-left: 0 !important + } + + .ps-xl-1 { + padding-left: .25rem !important + } + + .ps-xl-2 { + padding-left: .5rem !important + } + + .ps-xl-3 { + padding-left: 1rem !important + } + + .ps-xl-4 { + padding-left: 1.5rem !important + } + + .ps-xl-5 { + padding-left: 3rem !important + } + + .gap-xl-0 { + gap: 0 !important + } + + .gap-xl-1 { + gap: .25rem !important + } + + .gap-xl-2 { + gap: .5rem !important + } + + .gap-xl-3 { + gap: 1rem !important + } + + .gap-xl-4 { + gap: 1.5rem !important + } + + .gap-xl-5 { + gap: 3rem !important + } + + .row-gap-xl-0 { + row-gap: 0 !important + } + + .row-gap-xl-1 { + row-gap: .25rem !important + } + + .row-gap-xl-2 { + row-gap: .5rem !important + } + + .row-gap-xl-3 { + row-gap: 1rem !important + } + + .row-gap-xl-4 { + row-gap: 1.5rem !important + } + + .row-gap-xl-5 { + row-gap: 3rem !important + } + + .column-gap-xl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important + } + + .column-gap-xl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: .25rem !important + } + + .column-gap-xl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: .5rem !important + } + + .column-gap-xl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important + } + + .column-gap-xl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important + } + + .column-gap-xl-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important + } + + .text-xl-start { + text-align: left !important + } + + .text-xl-end { + text-align: right !important + } + + .text-xl-center { + text-align: center !important + } +} + +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important + } + + .float-xxl-end { + float: right !important + } + + .float-xxl-none { + float: none !important + } + + .object-fit-xxl-contain { + -o-object-fit: contain !important; + object-fit: contain !important + } + + .object-fit-xxl-cover { + -o-object-fit: cover !important; + object-fit: cover !important + } + + .object-fit-xxl-fill { + -o-object-fit: fill !important; + object-fit: fill !important + } + + .object-fit-xxl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important + } + + .object-fit-xxl-none { + -o-object-fit: none !important; + object-fit: none !important + } + + .d-xxl-inline { + display: inline !important + } + + .d-xxl-inline-block { + display: inline-block !important + } + + .d-xxl-block { + display: block !important + } + + .d-xxl-grid { + display: grid !important + } + + .d-xxl-inline-grid { + display: inline-grid !important + } + + .d-xxl-table { + display: table !important + } + + .d-xxl-table-row { + display: table-row !important + } + + .d-xxl-table-cell { + display: table-cell !important + } + + .d-xxl-flex { + display: flex !important + } + + .d-xxl-inline-flex { + display: inline-flex !important + } + + .d-xxl-none { + display: none !important + } + + .flex-xxl-fill { + flex: 1 1 auto !important + } + + .flex-xxl-row { + flex-direction: row !important + } + + .flex-xxl-column { + flex-direction: column !important + } + + .flex-xxl-row-reverse { + flex-direction: row-reverse !important + } + + .flex-xxl-column-reverse { + flex-direction: column-reverse !important + } + + .flex-xxl-grow-0 { + flex-grow: 0 !important + } + + .flex-xxl-grow-1 { + flex-grow: 1 !important + } + + .flex-xxl-shrink-0 { + flex-shrink: 0 !important + } + + .flex-xxl-shrink-1 { + flex-shrink: 1 !important + } + + .flex-xxl-wrap { + flex-wrap: wrap !important + } + + .flex-xxl-nowrap { + flex-wrap: nowrap !important + } + + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .justify-content-xxl-start { + justify-content: flex-start !important + } + + .justify-content-xxl-end { + justify-content: flex-end !important + } + + .justify-content-xxl-center { + justify-content: center !important + } + + .justify-content-xxl-between { + justify-content: space-between !important + } + + .justify-content-xxl-around { + justify-content: space-around !important + } + + .justify-content-xxl-evenly { + justify-content: space-evenly !important + } + + .align-items-xxl-start { + align-items: flex-start !important + } + + .align-items-xxl-end { + align-items: flex-end !important + } + + .align-items-xxl-center { + align-items: center !important + } + + .align-items-xxl-baseline { + align-items: baseline !important + } + + .align-items-xxl-stretch { + align-items: stretch !important + } + + .align-content-xxl-start { + align-content: flex-start !important + } + + .align-content-xxl-end { + align-content: flex-end !important + } + + .align-content-xxl-center { + align-content: center !important + } + + .align-content-xxl-between { + align-content: space-between !important + } + + .align-content-xxl-around { + align-content: space-around !important + } + + .align-content-xxl-stretch { + align-content: stretch !important + } + + .align-self-xxl-auto { + align-self: auto !important + } + + .align-self-xxl-start { + align-self: flex-start !important + } + + .align-self-xxl-end { + align-self: flex-end !important + } + + .align-self-xxl-center { + align-self: center !important + } + + .align-self-xxl-baseline { + align-self: baseline !important + } + + .align-self-xxl-stretch { + align-self: stretch !important + } + + .order-xxl-first { + order: -1 !important + } + + .order-xxl-0 { + order: 0 !important + } + + .order-xxl-1 { + order: 1 !important + } + + .order-xxl-2 { + order: 2 !important + } + + .order-xxl-3 { + order: 3 !important + } + + .order-xxl-4 { + order: 4 !important + } + + .order-xxl-5 { + order: 5 !important + } + + .order-xxl-last { + order: 6 !important + } + + .m-xxl-0 { + margin: 0 !important + } + + .m-xxl-1 { + margin: .25rem !important + } + + .m-xxl-2 { + margin: .5rem !important + } + + .m-xxl-3 { + margin: 1rem !important + } + + .m-xxl-4 { + margin: 1.5rem !important + } + + .m-xxl-5 { + margin: 3rem !important + } + + .m-xxl-auto { + margin: auto !important + } + + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important + } + + .mx-xxl-1 { + margin-right: .25rem !important; + margin-left: .25rem !important + } + + .mx-xxl-2 { + margin-right: .5rem !important; + margin-left: .5rem !important + } + + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important + } + + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important + } + + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important + } + + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important + } + + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important + } + + .my-xxl-1 { + margin-top: .25rem !important; + margin-bottom: .25rem !important + } + + .my-xxl-2 { + margin-top: .5rem !important; + margin-bottom: .5rem !important + } + + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important + } + + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important + } + + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important + } + + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important + } + + .mt-xxl-0 { + margin-top: 0 !important + } + + .mt-xxl-1 { + margin-top: .25rem !important + } + + .mt-xxl-2 { + margin-top: .5rem !important + } + + .mt-xxl-3 { + margin-top: 1rem !important + } + + .mt-xxl-4 { + margin-top: 1.5rem !important + } + + .mt-xxl-5 { + margin-top: 3rem !important + } + + .mt-xxl-auto { + margin-top: auto !important + } + + .me-xxl-0 { + margin-right: 0 !important + } + + .me-xxl-1 { + margin-right: .25rem !important + } + + .me-xxl-2 { + margin-right: .5rem !important + } + + .me-xxl-3 { + margin-right: 1rem !important + } + + .me-xxl-4 { + margin-right: 1.5rem !important + } + + .me-xxl-5 { + margin-right: 3rem !important + } + + .me-xxl-auto { + margin-right: auto !important + } + + .mb-xxl-0 { + margin-bottom: 0 !important + } + + .mb-xxl-1 { + margin-bottom: .25rem !important + } + + .mb-xxl-2 { + margin-bottom: .5rem !important + } + + .mb-xxl-3 { + margin-bottom: 1rem !important + } + + .mb-xxl-4 { + margin-bottom: 1.5rem !important + } + + .mb-xxl-5 { + margin-bottom: 3rem !important + } + + .mb-xxl-auto { + margin-bottom: auto !important + } + + .ms-xxl-0 { + margin-left: 0 !important + } + + .ms-xxl-1 { + margin-left: .25rem !important + } + + .ms-xxl-2 { + margin-left: .5rem !important + } + + .ms-xxl-3 { + margin-left: 1rem !important + } + + .ms-xxl-4 { + margin-left: 1.5rem !important + } + + .ms-xxl-5 { + margin-left: 3rem !important + } + + .ms-xxl-auto { + margin-left: auto !important + } + + .p-xxl-0 { + padding: 0 !important + } + + .p-xxl-1 { + padding: .25rem !important + } + + .p-xxl-2 { + padding: .5rem !important + } + + .p-xxl-3 { + padding: 1rem !important + } + + .p-xxl-4 { + padding: 1.5rem !important + } + + .p-xxl-5 { + padding: 3rem !important + } + + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important + } + + .px-xxl-1 { + padding-right: .25rem !important; + padding-left: .25rem !important + } + + .px-xxl-2 { + padding-right: .5rem !important; + padding-left: .5rem !important + } + + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important + } + + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important + } + + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important + } + + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important + } + + .py-xxl-1 { + padding-top: .25rem !important; + padding-bottom: .25rem !important + } + + .py-xxl-2 { + padding-top: .5rem !important; + padding-bottom: .5rem !important + } + + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important + } + + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important + } + + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important + } + + .pt-xxl-0 { + padding-top: 0 !important + } + + .pt-xxl-1 { + padding-top: .25rem !important + } + + .pt-xxl-2 { + padding-top: .5rem !important + } + + .pt-xxl-3 { + padding-top: 1rem !important + } + + .pt-xxl-4 { + padding-top: 1.5rem !important + } + + .pt-xxl-5 { + padding-top: 3rem !important + } + + .pe-xxl-0 { + padding-right: 0 !important + } + + .pe-xxl-1 { + padding-right: .25rem !important + } + + .pe-xxl-2 { + padding-right: .5rem !important + } + + .pe-xxl-3 { + padding-right: 1rem !important + } + + .pe-xxl-4 { + padding-right: 1.5rem !important + } + + .pe-xxl-5 { + padding-right: 3rem !important + } + + .pb-xxl-0 { + padding-bottom: 0 !important + } + + .pb-xxl-1 { + padding-bottom: .25rem !important + } + + .pb-xxl-2 { + padding-bottom: .5rem !important + } + + .pb-xxl-3 { + padding-bottom: 1rem !important + } + + .pb-xxl-4 { + padding-bottom: 1.5rem !important + } + + .pb-xxl-5 { + padding-bottom: 3rem !important + } + + .ps-xxl-0 { + padding-left: 0 !important + } + + .ps-xxl-1 { + padding-left: .25rem !important + } + + .ps-xxl-2 { + padding-left: .5rem !important + } + + .ps-xxl-3 { + padding-left: 1rem !important + } + + .ps-xxl-4 { + padding-left: 1.5rem !important + } + + .ps-xxl-5 { + padding-left: 3rem !important + } + + .gap-xxl-0 { + gap: 0 !important + } + + .gap-xxl-1 { + gap: .25rem !important + } + + .gap-xxl-2 { + gap: .5rem !important + } + + .gap-xxl-3 { + gap: 1rem !important + } + + .gap-xxl-4 { + gap: 1.5rem !important + } + + .gap-xxl-5 { + gap: 3rem !important + } + + .row-gap-xxl-0 { + row-gap: 0 !important + } + + .row-gap-xxl-1 { + row-gap: .25rem !important + } + + .row-gap-xxl-2 { + row-gap: .5rem !important + } + + .row-gap-xxl-3 { + row-gap: 1rem !important + } + + .row-gap-xxl-4 { + row-gap: 1.5rem !important + } + + .row-gap-xxl-5 { + row-gap: 3rem !important + } + + .column-gap-xxl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important + } + + .column-gap-xxl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: .25rem !important + } + + .column-gap-xxl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: .5rem !important + } + + .column-gap-xxl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important + } + + .column-gap-xxl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important + } + + .column-gap-xxl-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important + } + + .text-xxl-start { + text-align: left !important + } + + .text-xxl-end { + text-align: right !important + } + + .text-xxl-center { + text-align: center !important + } +} + +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important + } + + .fs-2 { + font-size: 2rem !important + } + + .fs-3 { + font-size: 1.75rem !important + } + + .fs-4 { + font-size: 1.5rem !important + } +} + +@media print { + .d-print-inline { + display: inline !important + } + + .d-print-inline-block { + display: inline-block !important + } + + .d-print-block { + display: block !important + } + + .d-print-grid { + display: grid !important + } + + .d-print-inline-grid { + display: inline-grid !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: flex !important + } + + .d-print-inline-flex { + display: inline-flex !important + } + + .d-print-none { + display: none !important + } +} + +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/ruoyi-admin/src/main/resources/templates/ky/files/echarts.min.js b/src/ruoyi-admin/src/main/resources/templates/ky/files/echarts.min.js new file mode 100644 index 0000000..6b76fe0 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/ky/files/echarts.min.js @@ -0,0 +1,35231 @@ +/* +* 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 +* +* http://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. +*/ + +!function (t, e) { + "object" == typeof exports && "undefined" != typeof module ? e(exports) : "function" == typeof define && define.amd ? define(["exports"], e) : e((t = "undefined" != typeof globalThis ? globalThis : t || self).echarts = {}) +}(this, (function (t) { + "use strict"; + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + var e = function (t, n) { + return (e = Object.setPrototypeOf || {__proto__: []} instanceof Array && function (t, e) { + t.__proto__ = e + } || function (t, e) { + for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]) + })(t, n) + }; + + function n(t, n) { + if ("function" != typeof n && null !== n) throw new TypeError("Class extends value " + String(n) + " is not a constructor or null"); + + function i() { + this.constructor = t + } + + e(t, n), t.prototype = null === n ? Object.create(n) : (i.prototype = n.prototype, new i) + } + + var i = function () { + this.firefox = !1, this.ie = !1, this.edge = !1, this.newEdge = !1, this.weChat = !1 + }, r = new function () { + this.browser = new i, this.node = !1, this.wxa = !1, this.worker = !1, this.svgSupported = !1, this.touchEventsSupported = !1, this.pointerEventsSupported = !1, this.domSupported = !1, this.transformSupported = !1, this.transform3dSupported = !1, this.hasGlobalWindow = "undefined" != typeof window + }; + "object" == typeof wx && "function" == typeof wx.getSystemInfoSync ? (r.wxa = !0, r.touchEventsSupported = !0) : "undefined" == typeof document && "undefined" != typeof self ? r.worker = !0 : "undefined" == typeof navigator ? (r.node = !0, r.svgSupported = !0) : function (t, e) { + var n = e.browser, i = t.match(/Firefox\/([\d.]+)/), + r = t.match(/MSIE\s([\d.]+)/) || t.match(/Trident\/.+?rv:(([\d.]+))/), o = t.match(/Edge?\/([\d.]+)/), + a = /micromessenger/i.test(t); + i && (n.firefox = !0, n.version = i[1]); + r && (n.ie = !0, n.version = r[1]); + o && (n.edge = !0, n.version = o[1], n.newEdge = +o[1].split(".")[0] > 18); + a && (n.weChat = !0); + e.svgSupported = "undefined" != typeof SVGRect, e.touchEventsSupported = "ontouchstart" in window && !n.ie && !n.edge, e.pointerEventsSupported = "onpointerdown" in window && (n.edge || n.ie && +n.version >= 11), e.domSupported = "undefined" != typeof document; + var s = document.documentElement.style; + e.transform3dSupported = (n.ie && "transition" in s || n.edge || "WebKitCSSMatrix" in window && "m11" in new WebKitCSSMatrix || "MozPerspective" in s) && !("OTransition" in s), e.transformSupported = e.transform3dSupported || n.ie && +n.version >= 9 + }(navigator.userAgent, r); + var o = "sans-serif", a = "12px sans-serif"; + var s, l, u = function (t) { + var e = {}; + if ("undefined" == typeof JSON) return e; + for (var n = 0; n < t.length; n++) { + var i = String.fromCharCode(n + 32), r = (t.charCodeAt(n) - 20) / 100; + e[i] = r + } + return e + }("007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\WQb\\0FWLg\\bWb\\WQ\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\FFF5.5N"), h = { + createCanvas: function () { + return "undefined" != typeof document && document.createElement("canvas") + }, measureText: function (t, e) { + if (!s) { + var n = h.createCanvas(); + s = n && n.getContext("2d") + } + if (s) return l !== e && (l = s.font = e || a), s.measureText(t); + t = t || ""; + var i = /^([0-9]*?)px$/.exec(e = e || a), r = +(i && i[1]) || 12, o = 0; + if (e.indexOf("mono") >= 0) o = r * t.length; else for (var c = 0; c < t.length; c++) { + var p = u[t[c]]; + o += null == p ? r : p * r + } + return {width: o} + }, loadImage: function (t, e, n) { + var i = new Image; + return i.onload = e, i.onerror = n, i.src = t, i + } + }; + + function c(t) { + for (var e in h) t[e] && (h[e] = t[e]) + } + + var p = V(["Function", "RegExp", "Date", "Error", "CanvasGradient", "CanvasPattern", "Image", "Canvas"], (function (t, e) { + return t["[object " + e + "]"] = !0, t + }), {}), + d = V(["Int8", "Uint8", "Uint8Clamped", "Int16", "Uint16", "Int32", "Uint32", "Float32", "Float64"], (function (t, e) { + return t["[object " + e + "Array]"] = !0, t + }), {}), f = Object.prototype.toString, g = Array.prototype, y = g.forEach, v = g.filter, m = g.slice, + x = g.map, _ = function () { + }.constructor, b = _ ? _.prototype : null, w = "__proto__", S = 2311; + + function M() { + return S++ + } + + function I() { + for (var t = [], e = 0; e < arguments.length; e++) t[e] = arguments[e]; + "undefined" != typeof console && console.error.apply(console, t) + } + + function T(t) { + if (null == t || "object" != typeof t) return t; + var e = t, n = f.call(t); + if ("[object Array]" === n) { + if (!pt(t)) { + e = []; + for (var i = 0, r = t.length; i < r; i++) e[i] = T(t[i]) + } + } else if (d[n]) { + if (!pt(t)) { + var o = t.constructor; + if (o.from) e = o.from(t); else { + e = new o(t.length); + for (i = 0, r = t.length; i < r; i++) e[i] = t[i] + } + } + } else if (!p[n] && !pt(t) && !J(t)) for (var a in e = {}, t) t.hasOwnProperty(a) && a !== w && (e[a] = T(t[a])); + return e + } + + function C(t, e, n) { + if (!q(e) || !q(t)) return n ? T(e) : t; + for (var i in e) if (e.hasOwnProperty(i) && i !== w) { + var r = t[i], o = e[i]; + !q(o) || !q(r) || Y(o) || Y(r) || J(o) || J(r) || K(o) || K(r) || pt(o) || pt(r) ? !n && i in t || (t[i] = T(e[i])) : C(r, o, n) + } + return t + } + + function D(t, e) { + for (var n = t[0], i = 1, r = t.length; i < r; i++) n = C(n, t[i], e); + return n + } + + function A(t, e) { + if (Object.assign) Object.assign(t, e); else for (var n in e) e.hasOwnProperty(n) && n !== w && (t[n] = e[n]); + return t + } + + function k(t, e, n) { + for (var i = G(e), r = 0; r < i.length; r++) { + var o = i[r]; + (n ? null != e[o] : null == t[o]) && (t[o] = e[o]) + } + return t + } + + var L = h.createCanvas; + + function P(t, e) { + if (t) { + if (t.indexOf) return t.indexOf(e); + for (var n = 0, i = t.length; n < i; n++) if (t[n] === e) return n + } + return -1 + } + + function O(t, e) { + var n = t.prototype; + + function i() { + } + + for (var r in i.prototype = e.prototype, t.prototype = new i, n) n.hasOwnProperty(r) && (t.prototype[r] = n[r]); + t.prototype.constructor = t, t.superClass = e + } + + function R(t, e, n) { + if (t = "prototype" in t ? t.prototype : t, e = "prototype" in e ? e.prototype : e, Object.getOwnPropertyNames) for (var i = Object.getOwnPropertyNames(e), r = 0; r < i.length; r++) { + var o = i[r]; + "constructor" !== o && (n ? null != e[o] : null == t[o]) && (t[o] = e[o]) + } else k(t, e, n) + } + + function N(t) { + return !!t && ("string" != typeof t && "number" == typeof t.length) + } + + function E(t, e, n) { + if (t && e) if (t.forEach && t.forEach === y) t.forEach(e, n); else if (t.length === +t.length) for (var i = 0, r = t.length; i < r; i++) e.call(n, t[i], i, t); else for (var o in t) t.hasOwnProperty(o) && e.call(n, t[o], o, t) + } + + function z(t, e, n) { + if (!t) return []; + if (!e) return at(t); + if (t.map && t.map === x) return t.map(e, n); + for (var i = [], r = 0, o = t.length; r < o; r++) i.push(e.call(n, t[r], r, t)); + return i + } + + function V(t, e, n, i) { + if (t && e) { + for (var r = 0, o = t.length; r < o; r++) n = e.call(i, n, t[r], r, t); + return n + } + } + + function B(t, e, n) { + if (!t) return []; + if (!e) return at(t); + if (t.filter && t.filter === v) return t.filter(e, n); + for (var i = [], r = 0, o = t.length; r < o; r++) e.call(n, t[r], r, t) && i.push(t[r]); + return i + } + + function F(t, e, n) { + if (t && e) for (var i = 0, r = t.length; i < r; i++) if (e.call(n, t[i], i, t)) return t[i] + } + + function G(t) { + if (!t) return []; + if (Object.keys) return Object.keys(t); + var e = []; + for (var n in t) t.hasOwnProperty(n) && e.push(n); + return e + } + + var W = b && U(b.bind) ? b.call.bind(b.bind) : function (t, e) { + for (var n = [], i = 2; i < arguments.length; i++) n[i - 2] = arguments[i]; + return function () { + return t.apply(e, n.concat(m.call(arguments))) + } + }; + + function H(t) { + for (var e = [], n = 1; n < arguments.length; n++) e[n - 1] = arguments[n]; + return function () { + return t.apply(this, e.concat(m.call(arguments))) + } + } + + function Y(t) { + return Array.isArray ? Array.isArray(t) : "[object Array]" === f.call(t) + } + + function U(t) { + return "function" == typeof t + } + + function X(t) { + return "string" == typeof t + } + + function Z(t) { + return "[object String]" === f.call(t) + } + + function j(t) { + return "number" == typeof t + } + + function q(t) { + var e = typeof t; + return "function" === e || !!t && "object" === e + } + + function K(t) { + return !!p[f.call(t)] + } + + function $(t) { + return !!d[f.call(t)] + } + + function J(t) { + return "object" == typeof t && "number" == typeof t.nodeType && "object" == typeof t.ownerDocument + } + + function Q(t) { + return null != t.colorStops + } + + function tt(t) { + return null != t.image + } + + function et(t) { + return "[object RegExp]" === f.call(t) + } + + function nt(t) { + return t != t + } + + function it() { + for (var t = [], e = 0; e < arguments.length; e++) t[e] = arguments[e]; + for (var n = 0, i = t.length; n < i; n++) if (null != t[n]) return t[n] + } + + function rt(t, e) { + return null != t ? t : e + } + + function ot(t, e, n) { + return null != t ? t : null != e ? e : n + } + + function at(t) { + for (var e = [], n = 1; n < arguments.length; n++) e[n - 1] = arguments[n]; + return m.apply(t, e) + } + + function st(t) { + if ("number" == typeof t) return [t, t, t, t]; + var e = t.length; + return 2 === e ? [t[0], t[1], t[0], t[1]] : 3 === e ? [t[0], t[1], t[2], t[1]] : t + } + + function lt(t, e) { + if (!t) throw new Error(e) + } + + function ut(t) { + return null == t ? null : "function" == typeof t.trim ? t.trim() : t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "") + } + + var ht = "__ec_primitive__"; + + function ct(t) { + t[ht] = !0 + } + + function pt(t) { + return t[ht] + } + + var dt = function () { + function t(e) { + this.data = {}; + var n = Y(e); + this.data = {}; + var i = this; + + function r(t, e) { + n ? i.set(t, e) : i.set(e, t) + } + + e instanceof t ? e.each(r) : e && E(e, r) + } + + return t.prototype.get = function (t) { + return this.data.hasOwnProperty(t) ? this.data[t] : null + }, t.prototype.set = function (t, e) { + return this.data[t] = e + }, t.prototype.each = function (t, e) { + for (var n in this.data) this.data.hasOwnProperty(n) && t.call(e, this.data[n], n) + }, t.prototype.keys = function () { + return G(this.data) + }, t.prototype.removeKey = function (t) { + delete this.data[t] + }, t + }(); + + function ft(t) { + return new dt(t) + } + + function gt(t, e) { + for (var n = new t.constructor(t.length + e.length), i = 0; i < t.length; i++) n[i] = t[i]; + var r = t.length; + for (i = 0; i < e.length; i++) n[i + r] = e[i]; + return n + } + + function yt(t, e) { + var n; + if (Object.create) n = Object.create(t); else { + var i = function () { + }; + i.prototype = t, n = new i + } + return e && A(n, e), n + } + + function vt(t) { + var e = t.style; + e.webkitUserSelect = "none", e.userSelect = "none", e.webkitTapHighlightColor = "rgba(0,0,0,0)", e["-webkit-touch-callout"] = "none" + } + + function mt(t, e) { + return t.hasOwnProperty(e) + } + + function xt() { + } + + var _t = 180 / Math.PI, bt = Object.freeze({ + __proto__: null, + guid: M, + logError: I, + clone: T, + merge: C, + mergeAll: D, + extend: A, + defaults: k, + createCanvas: L, + indexOf: P, + inherits: O, + mixin: R, + isArrayLike: N, + each: E, + map: z, + reduce: V, + filter: B, + find: F, + keys: G, + bind: W, + curry: H, + isArray: Y, + isFunction: U, + isString: X, + isStringSafe: Z, + isNumber: j, + isObject: q, + isBuiltInObject: K, + isTypedArray: $, + isDom: J, + isGradientObject: Q, + isImagePatternObject: tt, + isRegExp: et, + eqNaN: nt, + retrieve: it, + retrieve2: rt, + retrieve3: ot, + slice: at, + normalizeCssArray: st, + assert: lt, + trim: ut, + setAsPrimitive: ct, + isPrimitive: pt, + HashMap: dt, + createHashMap: ft, + concatArray: gt, + createObject: yt, + disableUserSelect: vt, + hasOwn: mt, + noop: xt, + RADIAN_TO_DEGREE: _t + }); + + function wt(t, e) { + return null == t && (t = 0), null == e && (e = 0), [t, e] + } + + function St(t, e) { + return t[0] = e[0], t[1] = e[1], t + } + + function Mt(t) { + return [t[0], t[1]] + } + + function It(t, e, n) { + return t[0] = e, t[1] = n, t + } + + function Tt(t, e, n) { + return t[0] = e[0] + n[0], t[1] = e[1] + n[1], t + } + + function Ct(t, e, n, i) { + return t[0] = e[0] + n[0] * i, t[1] = e[1] + n[1] * i, t + } + + function Dt(t, e, n) { + return t[0] = e[0] - n[0], t[1] = e[1] - n[1], t + } + + function At(t) { + return Math.sqrt(Lt(t)) + } + + var kt = At; + + function Lt(t) { + return t[0] * t[0] + t[1] * t[1] + } + + var Pt = Lt; + + function Ot(t, e, n) { + return t[0] = e[0] * n, t[1] = e[1] * n, t + } + + function Rt(t, e) { + var n = At(e); + return 0 === n ? (t[0] = 0, t[1] = 0) : (t[0] = e[0] / n, t[1] = e[1] / n), t + } + + function Nt(t, e) { + return Math.sqrt((t[0] - e[0]) * (t[0] - e[0]) + (t[1] - e[1]) * (t[1] - e[1])) + } + + var Et = Nt; + + function zt(t, e) { + return (t[0] - e[0]) * (t[0] - e[0]) + (t[1] - e[1]) * (t[1] - e[1]) + } + + var Vt = zt; + + function Bt(t, e, n, i) { + return t[0] = e[0] + i * (n[0] - e[0]), t[1] = e[1] + i * (n[1] - e[1]), t + } + + function Ft(t, e, n) { + var i = e[0], r = e[1]; + return t[0] = n[0] * i + n[2] * r + n[4], t[1] = n[1] * i + n[3] * r + n[5], t + } + + function Gt(t, e, n) { + return t[0] = Math.min(e[0], n[0]), t[1] = Math.min(e[1], n[1]), t + } + + function Wt(t, e, n) { + return t[0] = Math.max(e[0], n[0]), t[1] = Math.max(e[1], n[1]), t + } + + var Ht = Object.freeze({ + __proto__: null, + create: wt, + copy: St, + clone: Mt, + set: It, + add: Tt, + scaleAndAdd: Ct, + sub: Dt, + len: At, + length: kt, + lenSquare: Lt, + lengthSquare: Pt, + mul: function (t, e, n) { + return t[0] = e[0] * n[0], t[1] = e[1] * n[1], t + }, + div: function (t, e, n) { + return t[0] = e[0] / n[0], t[1] = e[1] / n[1], t + }, + dot: function (t, e) { + return t[0] * e[0] + t[1] * e[1] + }, + scale: Ot, + normalize: Rt, + distance: Nt, + dist: Et, + distanceSquare: zt, + distSquare: Vt, + negate: function (t, e) { + return t[0] = -e[0], t[1] = -e[1], t + }, + lerp: Bt, + applyTransform: Ft, + min: Gt, + max: Wt + }), Yt = function (t, e) { + this.target = t, this.topTarget = e && e.topTarget + }, Ut = function () { + function t(t) { + this.handler = t, t.on("mousedown", this._dragStart, this), t.on("mousemove", this._drag, this), t.on("mouseup", this._dragEnd, this) + } + + return t.prototype._dragStart = function (t) { + for (var e = t.target; e && !e.draggable;) e = e.parent || e.__hostTarget; + e && (this._draggingTarget = e, e.dragging = !0, this._x = t.offsetX, this._y = t.offsetY, this.handler.dispatchToElement(new Yt(e, t), "dragstart", t.event)) + }, t.prototype._drag = function (t) { + var e = this._draggingTarget; + if (e) { + var n = t.offsetX, i = t.offsetY, r = n - this._x, o = i - this._y; + this._x = n, this._y = i, e.drift(r, o, t), this.handler.dispatchToElement(new Yt(e, t), "drag", t.event); + var a = this.handler.findHover(n, i, e).target, s = this._dropTarget; + this._dropTarget = a, e !== a && (s && a !== s && this.handler.dispatchToElement(new Yt(s, t), "dragleave", t.event), a && a !== s && this.handler.dispatchToElement(new Yt(a, t), "dragenter", t.event)) + } + }, t.prototype._dragEnd = function (t) { + var e = this._draggingTarget; + e && (e.dragging = !1), this.handler.dispatchToElement(new Yt(e, t), "dragend", t.event), this._dropTarget && this.handler.dispatchToElement(new Yt(this._dropTarget, t), "drop", t.event), this._draggingTarget = null, this._dropTarget = null + }, t + }(), Xt = function () { + function t(t) { + t && (this._$eventProcessor = t) + } + + return t.prototype.on = function (t, e, n, i) { + this._$handlers || (this._$handlers = {}); + var r = this._$handlers; + if ("function" == typeof e && (i = n, n = e, e = null), !n || !t) return this; + var o = this._$eventProcessor; + null != e && o && o.normalizeQuery && (e = o.normalizeQuery(e)), r[t] || (r[t] = []); + for (var a = 0; a < r[t].length; a++) if (r[t][a].h === n) return this; + var s = {h: n, query: e, ctx: i || this, callAtLast: n.zrEventfulCallAtLast}, l = r[t].length - 1, + u = r[t][l]; + return u && u.callAtLast ? r[t].splice(l, 0, s) : r[t].push(s), this + }, t.prototype.isSilent = function (t) { + var e = this._$handlers; + return !e || !e[t] || !e[t].length + }, t.prototype.off = function (t, e) { + var n = this._$handlers; + if (!n) return this; + if (!t) return this._$handlers = {}, this; + if (e) { + if (n[t]) { + for (var i = [], r = 0, o = n[t].length; r < o; r++) n[t][r].h !== e && i.push(n[t][r]); + n[t] = i + } + n[t] && 0 === n[t].length && delete n[t] + } else delete n[t]; + return this + }, t.prototype.trigger = function (t) { + for (var e = [], n = 1; n < arguments.length; n++) e[n - 1] = arguments[n]; + if (!this._$handlers) return this; + var i = this._$handlers[t], r = this._$eventProcessor; + if (i) for (var o = e.length, a = i.length, s = 0; s < a; s++) { + var l = i[s]; + if (!r || !r.filter || null == l.query || r.filter(t, l.query)) switch (o) { + case 0: + l.h.call(l.ctx); + break; + case 1: + l.h.call(l.ctx, e[0]); + break; + case 2: + l.h.call(l.ctx, e[0], e[1]); + break; + default: + l.h.apply(l.ctx, e) + } + } + return r && r.afterTrigger && r.afterTrigger(t), this + }, t.prototype.triggerWithContext = function (t) { + for (var e = [], n = 1; n < arguments.length; n++) e[n - 1] = arguments[n]; + if (!this._$handlers) return this; + var i = this._$handlers[t], r = this._$eventProcessor; + if (i) for (var o = e.length, a = e[o - 1], s = i.length, l = 0; l < s; l++) { + var u = i[l]; + if (!r || !r.filter || null == u.query || r.filter(t, u.query)) switch (o) { + case 0: + u.h.call(a); + break; + case 1: + u.h.call(a, e[0]); + break; + case 2: + u.h.call(a, e[0], e[1]); + break; + default: + u.h.apply(a, e.slice(1, o - 1)) + } + } + return r && r.afterTrigger && r.afterTrigger(t), this + }, t + }(), Zt = Math.log(2); + + function jt(t, e, n, i, r, o) { + var a = i + "-" + r, s = t.length; + if (o.hasOwnProperty(a)) return o[a]; + if (1 === e) { + var l = Math.round(Math.log((1 << s) - 1 & ~r) / Zt); + return t[n][l] + } + for (var u = i | 1 << n, h = n + 1; i & 1 << h;) h++; + for (var c = 0, p = 0, d = 0; p < s; p++) { + var f = 1 << p; + f & r || (c += (d % 2 ? -1 : 1) * t[n][p] * jt(t, e - 1, h, u, r | f, o), d++) + } + return o[a] = c, c + } + + function qt(t, e) { + var n = [[t[0], t[1], 1, 0, 0, 0, -e[0] * t[0], -e[0] * t[1]], [0, 0, 0, t[0], t[1], 1, -e[1] * t[0], -e[1] * t[1]], [t[2], t[3], 1, 0, 0, 0, -e[2] * t[2], -e[2] * t[3]], [0, 0, 0, t[2], t[3], 1, -e[3] * t[2], -e[3] * t[3]], [t[4], t[5], 1, 0, 0, 0, -e[4] * t[4], -e[4] * t[5]], [0, 0, 0, t[4], t[5], 1, -e[5] * t[4], -e[5] * t[5]], [t[6], t[7], 1, 0, 0, 0, -e[6] * t[6], -e[6] * t[7]], [0, 0, 0, t[6], t[7], 1, -e[7] * t[6], -e[7] * t[7]]], + i = {}, r = jt(n, 8, 0, 0, 0, i); + if (0 !== r) { + for (var o = [], a = 0; a < 8; a++) for (var s = 0; s < 8; s++) null == o[s] && (o[s] = 0), o[s] += ((a + s) % 2 ? -1 : 1) * jt(n, 7, 0 === a ? 1 : 0, 1 << a, 1 << s, i) / r * e[a]; + return function (t, e, n) { + var i = e * o[6] + n * o[7] + 1; + t[0] = (e * o[0] + n * o[1] + o[2]) / i, t[1] = (e * o[3] + n * o[4] + o[5]) / i + } + } + } + + var Kt = []; + + function $t(t, e, n, i, o) { + if (e.getBoundingClientRect && r.domSupported && !Jt(e)) { + var a = e.___zrEVENTSAVED || (e.___zrEVENTSAVED = {}), s = function (t, e, n) { + for (var i = n ? "invTrans" : "trans", r = e[i], o = e.srcCoords, a = [], s = [], l = !0, u = 0; u < 4; u++) { + var h = t[u].getBoundingClientRect(), c = 2 * u, p = h.left, d = h.top; + a.push(p, d), l = l && o && p === o[c] && d === o[c + 1], s.push(t[u].offsetLeft, t[u].offsetTop) + } + return l && r ? r : (e.srcCoords = a, e[i] = n ? qt(s, a) : qt(a, s)) + }(function (t, e) { + var n = e.markers; + if (n) return n; + n = e.markers = []; + for (var i = ["left", "right"], r = ["top", "bottom"], o = 0; o < 4; o++) { + var a = document.createElement("div"), s = o % 2, l = (o >> 1) % 2; + a.style.cssText = ["position: absolute", "visibility: hidden", "padding: 0", "margin: 0", "border-width: 0", "user-select: none", "width:0", "height:0", i[s] + ":0", r[l] + ":0", i[1 - s] + ":auto", r[1 - l] + ":auto", ""].join("!important;"), t.appendChild(a), n.push(a) + } + return n + }(e, a), a, o); + if (s) return s(t, n, i), !0 + } + return !1 + } + + function Jt(t) { + return "CANVAS" === t.nodeName.toUpperCase() + } + + var Qt = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, te = [], + ee = r.browser.firefox && +r.browser.version.split(".")[0] < 39; + + function ne(t, e, n, i) { + return n = n || {}, i ? ie(t, e, n) : ee && null != e.layerX && e.layerX !== e.offsetX ? (n.zrX = e.layerX, n.zrY = e.layerY) : null != e.offsetX ? (n.zrX = e.offsetX, n.zrY = e.offsetY) : ie(t, e, n), n + } + + function ie(t, e, n) { + if (r.domSupported && t.getBoundingClientRect) { + var i = e.clientX, o = e.clientY; + if (Jt(t)) { + var a = t.getBoundingClientRect(); + return n.zrX = i - a.left, void (n.zrY = o - a.top) + } + if ($t(te, t, i, o)) return n.zrX = te[0], void (n.zrY = te[1]) + } + n.zrX = n.zrY = 0 + } + + function re(t) { + return t || window.event + } + + function oe(t, e, n) { + if (null != (e = re(e)).zrX) return e; + var i = e.type; + if (i && i.indexOf("touch") >= 0) { + var r = "touchend" !== i ? e.targetTouches[0] : e.changedTouches[0]; + r && ne(t, r, e, n) + } else { + ne(t, e, e, n); + var o = function (t) { + var e = t.wheelDelta; + if (e) return e; + var n = t.deltaX, i = t.deltaY; + if (null == n || null == i) return e; + return 3 * (0 !== i ? Math.abs(i) : Math.abs(n)) * (i > 0 ? -1 : i < 0 ? 1 : n > 0 ? -1 : 1) + }(e); + e.zrDelta = o ? o / 120 : -(e.detail || 0) / 3 + } + var a = e.button; + return null == e.which && void 0 !== a && Qt.test(e.type) && (e.which = 1 & a ? 1 : 2 & a ? 3 : 4 & a ? 2 : 0), e + } + + function ae(t, e, n, i) { + t.addEventListener(e, n, i) + } + + var se = function (t) { + t.preventDefault(), t.stopPropagation(), t.cancelBubble = !0 + }; + + function le(t) { + return 2 === t.which || 3 === t.which + } + + var ue = function () { + function t() { + this._track = [] + } + + return t.prototype.recognize = function (t, e, n) { + return this._doTrack(t, e, n), this._recognize(t) + }, t.prototype.clear = function () { + return this._track.length = 0, this + }, t.prototype._doTrack = function (t, e, n) { + var i = t.touches; + if (i) { + for (var r = {points: [], touches: [], target: e, event: t}, o = 0, a = i.length; o < a; o++) { + var s = i[o], l = ne(n, s, {}); + r.points.push([l.zrX, l.zrY]), r.touches.push(s) + } + this._track.push(r) + } + }, t.prototype._recognize = function (t) { + for (var e in ce) if (ce.hasOwnProperty(e)) { + var n = ce[e](this._track, t); + if (n) return n + } + }, t + }(); + + function he(t) { + var e = t[1][0] - t[0][0], n = t[1][1] - t[0][1]; + return Math.sqrt(e * e + n * n) + } + + var ce = { + pinch: function (t, e) { + var n = t.length; + if (n) { + var i, r = (t[n - 1] || {}).points, o = (t[n - 2] || {}).points || r; + if (o && o.length > 1 && r && r.length > 1) { + var a = he(r) / he(o); + !isFinite(a) && (a = 1), e.pinchScale = a; + var s = [((i = r)[0][0] + i[1][0]) / 2, (i[0][1] + i[1][1]) / 2]; + return e.pinchX = s[0], e.pinchY = s[1], {type: "pinch", target: t[0].target, event: e} + } + } + } + }, pe = "silent"; + + function de() { + se(this.event) + } + + var fe = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.handler = null, e + } + + return n(e, t), e.prototype.dispose = function () { + }, e.prototype.setCursor = function () { + }, e + }(Xt), ge = function (t, e) { + this.x = t, this.y = e + }, ye = ["click", "dblclick", "mousewheel", "mouseout", "mouseup", "mousedown", "mousemove", "contextmenu"], + ve = function (t) { + function e(e, n, i, r) { + var o = t.call(this) || this; + return o._hovered = new ge(0, 0), o.storage = e, o.painter = n, o.painterRoot = r, i = i || new fe, o.proxy = null, o.setHandlerProxy(i), o._draggingMgr = new Ut(o), o + } + + return n(e, t), e.prototype.setHandlerProxy = function (t) { + this.proxy && this.proxy.dispose(), t && (E(ye, (function (e) { + t.on && t.on(e, this[e], this) + }), this), t.handler = this), this.proxy = t + }, e.prototype.mousemove = function (t) { + var e = t.zrX, n = t.zrY, i = xe(this, e, n), r = this._hovered, o = r.target; + o && !o.__zr && (o = (r = this.findHover(r.x, r.y)).target); + var a = this._hovered = i ? new ge(e, n) : this.findHover(e, n), s = a.target, l = this.proxy; + l.setCursor && l.setCursor(s ? s.cursor : "default"), o && s !== o && this.dispatchToElement(r, "mouseout", t), this.dispatchToElement(a, "mousemove", t), s && s !== o && this.dispatchToElement(a, "mouseover", t) + }, e.prototype.mouseout = function (t) { + var e = t.zrEventControl; + "only_globalout" !== e && this.dispatchToElement(this._hovered, "mouseout", t), "no_globalout" !== e && this.trigger("globalout", { + type: "globalout", + event: t + }) + }, e.prototype.resize = function () { + this._hovered = new ge(0, 0) + }, e.prototype.dispatch = function (t, e) { + var n = this[t]; + n && n.call(this, e) + }, e.prototype.dispose = function () { + this.proxy.dispose(), this.storage = null, this.proxy = null, this.painter = null + }, e.prototype.setCursorStyle = function (t) { + var e = this.proxy; + e.setCursor && e.setCursor(t) + }, e.prototype.dispatchToElement = function (t, e, n) { + var i = (t = t || {}).target; + if (!i || !i.silent) { + for (var r = "on" + e, o = function (t, e, n) { + return { + type: t, + event: n, + target: e.target, + topTarget: e.topTarget, + cancelBubble: !1, + offsetX: n.zrX, + offsetY: n.zrY, + gestureEvent: n.gestureEvent, + pinchX: n.pinchX, + pinchY: n.pinchY, + pinchScale: n.pinchScale, + wheelDelta: n.zrDelta, + zrByTouch: n.zrByTouch, + which: n.which, + stop: de + } + }(e, t, n); i && (i[r] && (o.cancelBubble = !!i[r].call(i, o)), i.trigger(e, o), i = i.__hostTarget ? i.__hostTarget : i.parent, !o.cancelBubble);) ; + o.cancelBubble || (this.trigger(e, o), this.painter && this.painter.eachOtherLayer && this.painter.eachOtherLayer((function (t) { + "function" == typeof t[r] && t[r].call(t, o), t.trigger && t.trigger(e, o) + }))) + } + }, e.prototype.findHover = function (t, e, n) { + for (var i = this.storage.getDisplayList(), r = new ge(t, e), o = i.length - 1; o >= 0; o--) { + var a = void 0; + if (i[o] !== n && !i[o].ignore && (a = me(i[o], t, e)) && (!r.topTarget && (r.topTarget = i[o]), a !== pe)) { + r.target = i[o]; + break + } + } + return r + }, e.prototype.processGesture = function (t, e) { + this._gestureMgr || (this._gestureMgr = new ue); + var n = this._gestureMgr; + "start" === e && n.clear(); + var i = n.recognize(t, this.findHover(t.zrX, t.zrY, null).target, this.proxy.dom); + if ("end" === e && n.clear(), i) { + var r = i.type; + t.gestureEvent = r; + var o = new ge; + o.target = i.target, this.dispatchToElement(o, r, i.event) + } + }, e + }(Xt); + + function me(t, e, n) { + if (t[t.rectHover ? "rectContain" : "contain"](e, n)) { + for (var i = t, r = void 0, o = !1; i;) { + if (i.ignoreClip && (o = !0), !o) { + var a = i.getClipPath(); + if (a && !a.contain(e, n)) return !1; + i.silent && (r = !0) + } + var s = i.__hostTarget; + i = s || i.parent + } + return !r || pe + } + return !1 + } + + function xe(t, e, n) { + var i = t.painter; + return e < 0 || e > i.getWidth() || n < 0 || n > i.getHeight() + } + + E(["click", "mousedown", "mouseup", "mousewheel", "dblclick", "contextmenu"], (function (t) { + ve.prototype[t] = function (e) { + var n, i, r = e.zrX, o = e.zrY, a = xe(this, r, o); + if ("mouseup" === t && a || (i = (n = this.findHover(r, o)).target), "mousedown" === t) this._downEl = i, this._downPoint = [e.zrX, e.zrY], this._upEl = i; else if ("mouseup" === t) this._upEl = i; else if ("click" === t) { + if (this._downEl !== this._upEl || !this._downPoint || Et(this._downPoint, [e.zrX, e.zrY]) > 4) return; + this._downPoint = null + } + this.dispatchToElement(n, t, e) + } + })); + + function _e(t, e, n, i) { + var r = e + 1; + if (r === n) return 1; + if (i(t[r++], t[e]) < 0) { + for (; r < n && i(t[r], t[r - 1]) < 0;) r++; + !function (t, e, n) { + n--; + for (; e < n;) { + var i = t[e]; + t[e++] = t[n], t[n--] = i + } + }(t, e, r) + } else for (; r < n && i(t[r], t[r - 1]) >= 0;) r++; + return r - e + } + + function be(t, e, n, i, r) { + for (i === e && i++; i < n; i++) { + for (var o, a = t[i], s = e, l = i; s < l;) r(a, t[o = s + l >>> 1]) < 0 ? l = o : s = o + 1; + var u = i - s; + switch (u) { + case 3: + t[s + 3] = t[s + 2]; + case 2: + t[s + 2] = t[s + 1]; + case 1: + t[s + 1] = t[s]; + break; + default: + for (; u > 0;) t[s + u] = t[s + u - 1], u-- + } + t[s] = a + } + } + + function we(t, e, n, i, r, o) { + var a = 0, s = 0, l = 1; + if (o(t, e[n + r]) > 0) { + for (s = i - r; l < s && o(t, e[n + r + l]) > 0;) a = l, (l = 1 + (l << 1)) <= 0 && (l = s); + l > s && (l = s), a += r, l += r + } else { + for (s = r + 1; l < s && o(t, e[n + r - l]) <= 0;) a = l, (l = 1 + (l << 1)) <= 0 && (l = s); + l > s && (l = s); + var u = a; + a = r - l, l = r - u + } + for (a++; a < l;) { + var h = a + (l - a >>> 1); + o(t, e[n + h]) > 0 ? a = h + 1 : l = h + } + return l + } + + function Se(t, e, n, i, r, o) { + var a = 0, s = 0, l = 1; + if (o(t, e[n + r]) < 0) { + for (s = r + 1; l < s && o(t, e[n + r - l]) < 0;) a = l, (l = 1 + (l << 1)) <= 0 && (l = s); + l > s && (l = s); + var u = a; + a = r - l, l = r - u + } else { + for (s = i - r; l < s && o(t, e[n + r + l]) >= 0;) a = l, (l = 1 + (l << 1)) <= 0 && (l = s); + l > s && (l = s), a += r, l += r + } + for (a++; a < l;) { + var h = a + (l - a >>> 1); + o(t, e[n + h]) < 0 ? l = h : a = h + 1 + } + return l + } + + function Me(t, e) { + var n, i, r = 7, o = 0; + t.length; + var a = []; + + function s(s) { + var l = n[s], u = i[s], h = n[s + 1], c = i[s + 1]; + i[s] = u + c, s === o - 3 && (n[s + 1] = n[s + 2], i[s + 1] = i[s + 2]), o--; + var p = Se(t[h], t, l, u, 0, e); + l += p, 0 !== (u -= p) && 0 !== (c = we(t[l + u - 1], t, h, c, c - 1, e)) && (u <= c ? function (n, i, o, s) { + var l = 0; + for (l = 0; l < i; l++) a[l] = t[n + l]; + var u = 0, h = o, c = n; + if (t[c++] = t[h++], 0 == --s) { + for (l = 0; l < i; l++) t[c + l] = a[u + l]; + return + } + if (1 === i) { + for (l = 0; l < s; l++) t[c + l] = t[h + l]; + return void (t[c + s] = a[u]) + } + var p, d, f, g = r; + for (; ;) { + p = 0, d = 0, f = !1; + do { + if (e(t[h], a[u]) < 0) { + if (t[c++] = t[h++], d++, p = 0, 0 == --s) { + f = !0; + break + } + } else if (t[c++] = a[u++], p++, d = 0, 1 == --i) { + f = !0; + break + } + } while ((p | d) < g); + if (f) break; + do { + if (0 !== (p = Se(t[h], a, u, i, 0, e))) { + for (l = 0; l < p; l++) t[c + l] = a[u + l]; + if (c += p, u += p, (i -= p) <= 1) { + f = !0; + break + } + } + if (t[c++] = t[h++], 0 == --s) { + f = !0; + break + } + if (0 !== (d = we(a[u], t, h, s, 0, e))) { + for (l = 0; l < d; l++) t[c + l] = t[h + l]; + if (c += d, h += d, 0 === (s -= d)) { + f = !0; + break + } + } + if (t[c++] = a[u++], 1 == --i) { + f = !0; + break + } + g-- + } while (p >= 7 || d >= 7); + if (f) break; + g < 0 && (g = 0), g += 2 + } + if ((r = g) < 1 && (r = 1), 1 === i) { + for (l = 0; l < s; l++) t[c + l] = t[h + l]; + t[c + s] = a[u] + } else { + if (0 === i) throw new Error; + for (l = 0; l < i; l++) t[c + l] = a[u + l] + } + }(l, u, h, c) : function (n, i, o, s) { + var l = 0; + for (l = 0; l < s; l++) a[l] = t[o + l]; + var u = n + i - 1, h = s - 1, c = o + s - 1, p = 0, d = 0; + if (t[c--] = t[u--], 0 == --i) { + for (p = c - (s - 1), l = 0; l < s; l++) t[p + l] = a[l]; + return + } + if (1 === s) { + for (d = (c -= i) + 1, p = (u -= i) + 1, l = i - 1; l >= 0; l--) t[d + l] = t[p + l]; + return void (t[c] = a[h]) + } + var f = r; + for (; ;) { + var g = 0, y = 0, v = !1; + do { + if (e(a[h], t[u]) < 0) { + if (t[c--] = t[u--], g++, y = 0, 0 == --i) { + v = !0; + break + } + } else if (t[c--] = a[h--], y++, g = 0, 1 == --s) { + v = !0; + break + } + } while ((g | y) < f); + if (v) break; + do { + if (0 !== (g = i - Se(a[h], t, n, i, i - 1, e))) { + for (i -= g, d = (c -= g) + 1, p = (u -= g) + 1, l = g - 1; l >= 0; l--) t[d + l] = t[p + l]; + if (0 === i) { + v = !0; + break + } + } + if (t[c--] = a[h--], 1 == --s) { + v = !0; + break + } + if (0 !== (y = s - we(t[u], a, 0, s, s - 1, e))) { + for (s -= y, d = (c -= y) + 1, p = (h -= y) + 1, l = 0; l < y; l++) t[d + l] = a[p + l]; + if (s <= 1) { + v = !0; + break + } + } + if (t[c--] = t[u--], 0 == --i) { + v = !0; + break + } + f-- + } while (g >= 7 || y >= 7); + if (v) break; + f < 0 && (f = 0), f += 2 + } + (r = f) < 1 && (r = 1); + if (1 === s) { + for (d = (c -= i) + 1, p = (u -= i) + 1, l = i - 1; l >= 0; l--) t[d + l] = t[p + l]; + t[c] = a[h] + } else { + if (0 === s) throw new Error; + for (p = c - (s - 1), l = 0; l < s; l++) t[p + l] = a[l] + } + }(l, u, h, c)) + } + + return n = [], i = [], { + mergeRuns: function () { + for (; o > 1;) { + var t = o - 2; + if (t >= 1 && i[t - 1] <= i[t] + i[t + 1] || t >= 2 && i[t - 2] <= i[t] + i[t - 1]) i[t - 1] < i[t + 1] && t--; else if (i[t] > i[t + 1]) break; + s(t) + } + }, forceMergeRuns: function () { + for (; o > 1;) { + var t = o - 2; + t > 0 && i[t - 1] < i[t + 1] && t--, s(t) + } + }, pushRun: function (t, e) { + n[o] = t, i[o] = e, o += 1 + } + } + } + + function Ie(t, e, n, i) { + n || (n = 0), i || (i = t.length); + var r = i - n; + if (!(r < 2)) { + var o = 0; + if (r < 32) be(t, n, i, n + (o = _e(t, n, i, e)), e); else { + var a = Me(t, e), s = function (t) { + for (var e = 0; t >= 32;) e |= 1 & t, t >>= 1; + return t + e + }(r); + do { + if ((o = _e(t, n, i, e)) < s) { + var l = r; + l > s && (l = s), be(t, n, n + l, n + o, e), o = l + } + a.pushRun(n, o), a.mergeRuns(), r -= o, n += o + } while (0 !== r); + a.forceMergeRuns() + } + } + } + + var Te = !1; + + function Ce() { + Te || (Te = !0, console.warn("z / z2 / zlevel of displayable is invalid, which may cause unexpected errors")) + } + + function De(t, e) { + return t.zlevel === e.zlevel ? t.z === e.z ? t.z2 - e.z2 : t.z - e.z : t.zlevel - e.zlevel + } + + var Ae = function () { + function t() { + this._roots = [], this._displayList = [], this._displayListLen = 0, this.displayableSortFunc = De + } + + return t.prototype.traverse = function (t, e) { + for (var n = 0; n < this._roots.length; n++) this._roots[n].traverse(t, e) + }, t.prototype.getDisplayList = function (t, e) { + e = e || !1; + var n = this._displayList; + return !t && n.length || this.updateDisplayList(e), n + }, t.prototype.updateDisplayList = function (t) { + this._displayListLen = 0; + for (var e = this._roots, n = this._displayList, i = 0, r = e.length; i < r; i++) this._updateAndAddDisplayable(e[i], null, t); + n.length = this._displayListLen, Ie(n, De) + }, t.prototype._updateAndAddDisplayable = function (t, e, n) { + if (!t.ignore || n) { + t.beforeUpdate(), t.update(), t.afterUpdate(); + var i = t.getClipPath(); + if (t.ignoreClip) e = null; else if (i) { + e = e ? e.slice() : []; + for (var r = i, o = t; r;) r.parent = o, r.updateTransform(), e.push(r), o = r, r = r.getClipPath() + } + if (t.childrenRef) { + for (var a = t.childrenRef(), s = 0; s < a.length; s++) { + var l = a[s]; + t.__dirty && (l.__dirty |= 1), this._updateAndAddDisplayable(l, e, n) + } + t.__dirty = 0 + } else { + var u = t; + e && e.length ? u.__clipPaths = e : u.__clipPaths && u.__clipPaths.length > 0 && (u.__clipPaths = []), isNaN(u.z) && (Ce(), u.z = 0), isNaN(u.z2) && (Ce(), u.z2 = 0), isNaN(u.zlevel) && (Ce(), u.zlevel = 0), this._displayList[this._displayListLen++] = u + } + var h = t.getDecalElement && t.getDecalElement(); + h && this._updateAndAddDisplayable(h, e, n); + var c = t.getTextGuideLine(); + c && this._updateAndAddDisplayable(c, e, n); + var p = t.getTextContent(); + p && this._updateAndAddDisplayable(p, e, n) + } + }, t.prototype.addRoot = function (t) { + t.__zr && t.__zr.storage === this || this._roots.push(t) + }, t.prototype.delRoot = function (t) { + if (t instanceof Array) for (var e = 0, n = t.length; e < n; e++) this.delRoot(t[e]); else { + var i = P(this._roots, t); + i >= 0 && this._roots.splice(i, 1) + } + }, t.prototype.delAllRoots = function () { + this._roots = [], this._displayList = [], this._displayListLen = 0 + }, t.prototype.getRoots = function () { + return this._roots + }, t.prototype.dispose = function () { + this._displayList = null, this._roots = null + }, t + }(), + ke = r.hasGlobalWindow && (window.requestAnimationFrame && window.requestAnimationFrame.bind(window) || window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window) || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame) || function (t) { + return setTimeout(t, 16) + }, Le = { + linear: function (t) { + return t + }, quadraticIn: function (t) { + return t * t + }, quadraticOut: function (t) { + return t * (2 - t) + }, quadraticInOut: function (t) { + return (t *= 2) < 1 ? .5 * t * t : -.5 * (--t * (t - 2) - 1) + }, cubicIn: function (t) { + return t * t * t + }, cubicOut: function (t) { + return --t * t * t + 1 + }, cubicInOut: function (t) { + return (t *= 2) < 1 ? .5 * t * t * t : .5 * ((t -= 2) * t * t + 2) + }, quarticIn: function (t) { + return t * t * t * t + }, quarticOut: function (t) { + return 1 - --t * t * t * t + }, quarticInOut: function (t) { + return (t *= 2) < 1 ? .5 * t * t * t * t : -.5 * ((t -= 2) * t * t * t - 2) + }, quinticIn: function (t) { + return t * t * t * t * t + }, quinticOut: function (t) { + return --t * t * t * t * t + 1 + }, quinticInOut: function (t) { + return (t *= 2) < 1 ? .5 * t * t * t * t * t : .5 * ((t -= 2) * t * t * t * t + 2) + }, sinusoidalIn: function (t) { + return 1 - Math.cos(t * Math.PI / 2) + }, sinusoidalOut: function (t) { + return Math.sin(t * Math.PI / 2) + }, sinusoidalInOut: function (t) { + return .5 * (1 - Math.cos(Math.PI * t)) + }, exponentialIn: function (t) { + return 0 === t ? 0 : Math.pow(1024, t - 1) + }, exponentialOut: function (t) { + return 1 === t ? 1 : 1 - Math.pow(2, -10 * t) + }, exponentialInOut: function (t) { + return 0 === t ? 0 : 1 === t ? 1 : (t *= 2) < 1 ? .5 * Math.pow(1024, t - 1) : .5 * (2 - Math.pow(2, -10 * (t - 1))) + }, circularIn: function (t) { + return 1 - Math.sqrt(1 - t * t) + }, circularOut: function (t) { + return Math.sqrt(1 - --t * t) + }, circularInOut: function (t) { + return (t *= 2) < 1 ? -.5 * (Math.sqrt(1 - t * t) - 1) : .5 * (Math.sqrt(1 - (t -= 2) * t) + 1) + }, elasticIn: function (t) { + var e, n = .1; + return 0 === t ? 0 : 1 === t ? 1 : (!n || n < 1 ? (n = 1, e = .1) : e = .4 * Math.asin(1 / n) / (2 * Math.PI), -n * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - e) * (2 * Math.PI) / .4)) + }, elasticOut: function (t) { + var e, n = .1; + return 0 === t ? 0 : 1 === t ? 1 : (!n || n < 1 ? (n = 1, e = .1) : e = .4 * Math.asin(1 / n) / (2 * Math.PI), n * Math.pow(2, -10 * t) * Math.sin((t - e) * (2 * Math.PI) / .4) + 1) + }, elasticInOut: function (t) { + var e, n = .1, i = .4; + return 0 === t ? 0 : 1 === t ? 1 : (!n || n < 1 ? (n = 1, e = .1) : e = i * Math.asin(1 / n) / (2 * Math.PI), (t *= 2) < 1 ? n * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - e) * (2 * Math.PI) / i) * -.5 : n * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - e) * (2 * Math.PI) / i) * .5 + 1) + }, backIn: function (t) { + var e = 1.70158; + return t * t * ((e + 1) * t - e) + }, backOut: function (t) { + var e = 1.70158; + return --t * t * ((e + 1) * t + e) + 1 + }, backInOut: function (t) { + var e = 2.5949095; + return (t *= 2) < 1 ? t * t * ((e + 1) * t - e) * .5 : .5 * ((t -= 2) * t * ((e + 1) * t + e) + 2) + }, bounceIn: function (t) { + return 1 - Le.bounceOut(1 - t) + }, bounceOut: 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 + }, bounceInOut: function (t) { + return t < .5 ? .5 * Le.bounceIn(2 * t) : .5 * Le.bounceOut(2 * t - 1) + .5 + } + }, Pe = Math.pow, Oe = Math.sqrt, Re = 1e-8, Ne = 1e-4, Ee = Oe(3), ze = 1 / 3, Ve = wt(), Be = wt(), Fe = wt(); + + function Ge(t) { + return t > -1e-8 && t < Re + } + + function We(t) { + return t > Re || t < -1e-8 + } + + function He(t, e, n, i, r) { + var o = 1 - r; + return o * o * (o * t + 3 * r * e) + r * r * (r * i + 3 * o * n) + } + + function Ye(t, e, n, i, r) { + var o = 1 - r; + return 3 * (((e - t) * o + 2 * (n - e) * r) * o + (i - n) * r * r) + } + + function Ue(t, e, n, i, r, o) { + var a = i + 3 * (e - n) - t, s = 3 * (n - 2 * e + t), l = 3 * (e - t), u = t - r, h = s * s - 3 * a * l, + c = s * l - 9 * a * u, p = l * l - 3 * s * u, d = 0; + if (Ge(h) && Ge(c)) { + if (Ge(s)) o[0] = 0; else (M = -l / s) >= 0 && M <= 1 && (o[d++] = M) + } else { + var f = c * c - 4 * h * p; + if (Ge(f)) { + var g = c / h, y = -g / 2; + (M = -s / a + g) >= 0 && M <= 1 && (o[d++] = M), y >= 0 && y <= 1 && (o[d++] = y) + } else if (f > 0) { + var v = Oe(f), m = h * s + 1.5 * a * (-c + v), x = h * s + 1.5 * a * (-c - v); + (M = (-s - ((m = m < 0 ? -Pe(-m, ze) : Pe(m, ze)) + (x = x < 0 ? -Pe(-x, ze) : Pe(x, ze)))) / (3 * a)) >= 0 && M <= 1 && (o[d++] = M) + } else { + var _ = (2 * h * s - 3 * a * c) / (2 * Oe(h * h * h)), b = Math.acos(_) / 3, w = Oe(h), S = Math.cos(b), + M = (-s - 2 * w * S) / (3 * a), + I = (y = (-s + w * (S + Ee * Math.sin(b))) / (3 * a), (-s + w * (S - Ee * Math.sin(b))) / (3 * a)); + M >= 0 && M <= 1 && (o[d++] = M), y >= 0 && y <= 1 && (o[d++] = y), I >= 0 && I <= 1 && (o[d++] = I) + } + } + return d + } + + function Xe(t, e, n, i, r) { + var o = 6 * n - 12 * e + 6 * t, a = 9 * e + 3 * i - 3 * t - 9 * n, s = 3 * e - 3 * t, l = 0; + if (Ge(a)) { + if (We(o)) (h = -s / o) >= 0 && h <= 1 && (r[l++] = h) + } else { + var u = o * o - 4 * a * s; + if (Ge(u)) r[0] = -o / (2 * a); else if (u > 0) { + var h, c = Oe(u), p = (-o - c) / (2 * a); + (h = (-o + c) / (2 * a)) >= 0 && h <= 1 && (r[l++] = h), p >= 0 && p <= 1 && (r[l++] = p) + } + } + return l + } + + function Ze(t, e, n, i, r, o) { + var a = (e - t) * r + t, s = (n - e) * r + e, l = (i - n) * r + n, u = (s - a) * r + a, h = (l - s) * r + s, + c = (h - u) * r + u; + o[0] = t, o[1] = a, o[2] = u, o[3] = c, o[4] = c, o[5] = h, o[6] = l, o[7] = i + } + + function je(t, e, n, i, r, o, a, s, l, u, h) { + var c, p, d, f, g, y = .005, v = 1 / 0; + Ve[0] = l, Ve[1] = u; + for (var m = 0; m < 1; m += .05) Be[0] = He(t, n, r, a, m), Be[1] = He(e, i, o, s, m), (f = Vt(Ve, Be)) < v && (c = m, v = f); + v = 1 / 0; + for (var x = 0; x < 32 && !(y < Ne); x++) p = c - y, d = c + y, Be[0] = He(t, n, r, a, p), Be[1] = He(e, i, o, s, p), f = Vt(Be, Ve), p >= 0 && f < v ? (c = p, v = f) : (Fe[0] = He(t, n, r, a, d), Fe[1] = He(e, i, o, s, d), g = Vt(Fe, Ve), d <= 1 && g < v ? (c = d, v = g) : y *= .5); + return h && (h[0] = He(t, n, r, a, c), h[1] = He(e, i, o, s, c)), Oe(v) + } + + function qe(t, e, n, i, r, o, a, s, l) { + for (var u = t, h = e, c = 0, p = 1 / l, d = 1; d <= l; d++) { + var f = d * p, g = He(t, n, r, a, f), y = He(e, i, o, s, f), v = g - u, m = y - h; + c += Math.sqrt(v * v + m * m), u = g, h = y + } + return c + } + + function Ke(t, e, n, i) { + var r = 1 - i; + return r * (r * t + 2 * i * e) + i * i * n + } + + function $e(t, e, n, i) { + return 2 * ((1 - i) * (e - t) + i * (n - e)) + } + + function Je(t, e, n) { + var i = t + n - 2 * e; + return 0 === i ? .5 : (t - e) / i + } + + function Qe(t, e, n, i, r) { + var o = (e - t) * i + t, a = (n - e) * i + e, s = (a - o) * i + o; + r[0] = t, r[1] = o, r[2] = s, r[3] = s, r[4] = a, r[5] = n + } + + function tn(t, e, n, i, r, o, a, s, l) { + var u, h = .005, c = 1 / 0; + Ve[0] = a, Ve[1] = s; + for (var p = 0; p < 1; p += .05) { + Be[0] = Ke(t, n, r, p), Be[1] = Ke(e, i, o, p), (y = Vt(Ve, Be)) < c && (u = p, c = y) + } + c = 1 / 0; + for (var d = 0; d < 32 && !(h < Ne); d++) { + var f = u - h, g = u + h; + Be[0] = Ke(t, n, r, f), Be[1] = Ke(e, i, o, f); + var y = Vt(Be, Ve); + if (f >= 0 && y < c) u = f, c = y; else { + Fe[0] = Ke(t, n, r, g), Fe[1] = Ke(e, i, o, g); + var v = Vt(Fe, Ve); + g <= 1 && v < c ? (u = g, c = v) : h *= .5 + } + } + return l && (l[0] = Ke(t, n, r, u), l[1] = Ke(e, i, o, u)), Oe(c) + } + + function en(t, e, n, i, r, o, a) { + for (var s = t, l = e, u = 0, h = 1 / a, c = 1; c <= a; c++) { + var p = c * h, d = Ke(t, n, r, p), f = Ke(e, i, o, p), g = d - s, y = f - l; + u += Math.sqrt(g * g + y * y), s = d, l = f + } + return u + } + + var nn = /cubic-bezier\(([0-9,\.e ]+)\)/; + + function rn(t) { + var e = t && nn.exec(t); + if (e) { + var n = e[1].split(","), i = +ut(n[0]), r = +ut(n[1]), o = +ut(n[2]), a = +ut(n[3]); + if (isNaN(i + r + o + a)) return; + var s = []; + return function (t) { + return t <= 0 ? 0 : t >= 1 ? 1 : Ue(0, i, o, 1, t, s) && He(0, r, a, 1, s[0]) + } + } + } + + var on = function () { + function t(t) { + this._inited = !1, this._startTime = 0, this._pausedTime = 0, this._paused = !1, this._life = t.life || 1e3, this._delay = t.delay || 0, this.loop = t.loop || !1, this.onframe = t.onframe || xt, this.ondestroy = t.ondestroy || xt, this.onrestart = t.onrestart || xt, t.easing && this.setEasing(t.easing) + } + + return t.prototype.step = function (t, e) { + if (this._inited || (this._startTime = t + this._delay, this._inited = !0), !this._paused) { + var n = this._life, i = t - this._startTime - this._pausedTime, r = i / n; + r < 0 && (r = 0), r = Math.min(r, 1); + var o = this.easingFunc, a = o ? o(r) : r; + if (this.onframe(a), 1 === r) { + if (!this.loop) return !0; + var s = i % n; + this._startTime = t - s, this._pausedTime = 0, this.onrestart() + } + return !1 + } + this._pausedTime += e + }, t.prototype.pause = function () { + this._paused = !0 + }, t.prototype.resume = function () { + this._paused = !1 + }, t.prototype.setEasing = function (t) { + this.easing = t, this.easingFunc = U(t) ? t : Le[t] || rn(t) + }, t + }(), an = function (t) { + this.value = t + }, sn = function () { + function t() { + this._len = 0 + } + + return t.prototype.insert = function (t) { + var e = new an(t); + return this.insertEntry(e), e + }, t.prototype.insertEntry = function (t) { + this.head ? (this.tail.next = t, t.prev = this.tail, t.next = null, this.tail = t) : this.head = this.tail = t, this._len++ + }, t.prototype.remove = function (t) { + var e = t.prev, n = t.next; + e ? e.next = n : this.head = n, n ? n.prev = e : this.tail = e, t.next = t.prev = null, this._len-- + }, t.prototype.len = function () { + return this._len + }, t.prototype.clear = function () { + this.head = this.tail = null, this._len = 0 + }, t + }(), ln = function () { + function t(t) { + this._list = new sn, this._maxSize = 10, this._map = {}, this._maxSize = t + } + + return t.prototype.put = function (t, e) { + var n = this._list, i = this._map, r = null; + if (null == i[t]) { + var o = n.len(), a = this._lastRemovedEntry; + if (o >= this._maxSize && o > 0) { + var s = n.head; + n.remove(s), delete i[s.key], r = s.value, this._lastRemovedEntry = s + } + a ? a.value = e : a = new an(e), a.key = t, n.insertEntry(a), i[t] = a + } + return r + }, t.prototype.get = function (t) { + var e = this._map[t], n = this._list; + if (null != e) return e !== n.tail && (n.remove(e), n.insertEntry(e)), e.value + }, t.prototype.clear = function () { + this._list.clear(), this._map = {} + }, t.prototype.len = function () { + return this._list.len() + }, t + }(), un = { + transparent: [0, 0, 0, 0], + aliceblue: [240, 248, 255, 1], + antiquewhite: [250, 235, 215, 1], + aqua: [0, 255, 255, 1], + aquamarine: [127, 255, 212, 1], + azure: [240, 255, 255, 1], + beige: [245, 245, 220, 1], + bisque: [255, 228, 196, 1], + black: [0, 0, 0, 1], + blanchedalmond: [255, 235, 205, 1], + blue: [0, 0, 255, 1], + blueviolet: [138, 43, 226, 1], + brown: [165, 42, 42, 1], + burlywood: [222, 184, 135, 1], + cadetblue: [95, 158, 160, 1], + chartreuse: [127, 255, 0, 1], + chocolate: [210, 105, 30, 1], + coral: [255, 127, 80, 1], + cornflowerblue: [100, 149, 237, 1], + cornsilk: [255, 248, 220, 1], + crimson: [220, 20, 60, 1], + cyan: [0, 255, 255, 1], + darkblue: [0, 0, 139, 1], + darkcyan: [0, 139, 139, 1], + darkgoldenrod: [184, 134, 11, 1], + darkgray: [169, 169, 169, 1], + darkgreen: [0, 100, 0, 1], + darkgrey: [169, 169, 169, 1], + darkkhaki: [189, 183, 107, 1], + darkmagenta: [139, 0, 139, 1], + darkolivegreen: [85, 107, 47, 1], + darkorange: [255, 140, 0, 1], + darkorchid: [153, 50, 204, 1], + darkred: [139, 0, 0, 1], + darksalmon: [233, 150, 122, 1], + darkseagreen: [143, 188, 143, 1], + darkslateblue: [72, 61, 139, 1], + darkslategray: [47, 79, 79, 1], + darkslategrey: [47, 79, 79, 1], + darkturquoise: [0, 206, 209, 1], + darkviolet: [148, 0, 211, 1], + deeppink: [255, 20, 147, 1], + deepskyblue: [0, 191, 255, 1], + dimgray: [105, 105, 105, 1], + dimgrey: [105, 105, 105, 1], + dodgerblue: [30, 144, 255, 1], + firebrick: [178, 34, 34, 1], + floralwhite: [255, 250, 240, 1], + forestgreen: [34, 139, 34, 1], + fuchsia: [255, 0, 255, 1], + gainsboro: [220, 220, 220, 1], + ghostwhite: [248, 248, 255, 1], + gold: [255, 215, 0, 1], + goldenrod: [218, 165, 32, 1], + gray: [128, 128, 128, 1], + green: [0, 128, 0, 1], + greenyellow: [173, 255, 47, 1], + grey: [128, 128, 128, 1], + honeydew: [240, 255, 240, 1], + hotpink: [255, 105, 180, 1], + indianred: [205, 92, 92, 1], + indigo: [75, 0, 130, 1], + ivory: [255, 255, 240, 1], + khaki: [240, 230, 140, 1], + lavender: [230, 230, 250, 1], + lavenderblush: [255, 240, 245, 1], + lawngreen: [124, 252, 0, 1], + lemonchiffon: [255, 250, 205, 1], + lightblue: [173, 216, 230, 1], + lightcoral: [240, 128, 128, 1], + lightcyan: [224, 255, 255, 1], + lightgoldenrodyellow: [250, 250, 210, 1], + lightgray: [211, 211, 211, 1], + lightgreen: [144, 238, 144, 1], + lightgrey: [211, 211, 211, 1], + lightpink: [255, 182, 193, 1], + lightsalmon: [255, 160, 122, 1], + lightseagreen: [32, 178, 170, 1], + lightskyblue: [135, 206, 250, 1], + lightslategray: [119, 136, 153, 1], + lightslategrey: [119, 136, 153, 1], + lightsteelblue: [176, 196, 222, 1], + lightyellow: [255, 255, 224, 1], + lime: [0, 255, 0, 1], + limegreen: [50, 205, 50, 1], + linen: [250, 240, 230, 1], + magenta: [255, 0, 255, 1], + maroon: [128, 0, 0, 1], + mediumaquamarine: [102, 205, 170, 1], + mediumblue: [0, 0, 205, 1], + mediumorchid: [186, 85, 211, 1], + mediumpurple: [147, 112, 219, 1], + mediumseagreen: [60, 179, 113, 1], + mediumslateblue: [123, 104, 238, 1], + mediumspringgreen: [0, 250, 154, 1], + mediumturquoise: [72, 209, 204, 1], + mediumvioletred: [199, 21, 133, 1], + midnightblue: [25, 25, 112, 1], + mintcream: [245, 255, 250, 1], + mistyrose: [255, 228, 225, 1], + moccasin: [255, 228, 181, 1], + navajowhite: [255, 222, 173, 1], + navy: [0, 0, 128, 1], + oldlace: [253, 245, 230, 1], + olive: [128, 128, 0, 1], + olivedrab: [107, 142, 35, 1], + orange: [255, 165, 0, 1], + orangered: [255, 69, 0, 1], + orchid: [218, 112, 214, 1], + palegoldenrod: [238, 232, 170, 1], + palegreen: [152, 251, 152, 1], + paleturquoise: [175, 238, 238, 1], + palevioletred: [219, 112, 147, 1], + papayawhip: [255, 239, 213, 1], + peachpuff: [255, 218, 185, 1], + peru: [205, 133, 63, 1], + pink: [255, 192, 203, 1], + plum: [221, 160, 221, 1], + powderblue: [176, 224, 230, 1], + purple: [128, 0, 128, 1], + red: [255, 0, 0, 1], + rosybrown: [188, 143, 143, 1], + royalblue: [65, 105, 225, 1], + saddlebrown: [139, 69, 19, 1], + salmon: [250, 128, 114, 1], + sandybrown: [244, 164, 96, 1], + seagreen: [46, 139, 87, 1], + seashell: [255, 245, 238, 1], + sienna: [160, 82, 45, 1], + silver: [192, 192, 192, 1], + skyblue: [135, 206, 235, 1], + slateblue: [106, 90, 205, 1], + slategray: [112, 128, 144, 1], + slategrey: [112, 128, 144, 1], + snow: [255, 250, 250, 1], + springgreen: [0, 255, 127, 1], + steelblue: [70, 130, 180, 1], + tan: [210, 180, 140, 1], + teal: [0, 128, 128, 1], + thistle: [216, 191, 216, 1], + tomato: [255, 99, 71, 1], + turquoise: [64, 224, 208, 1], + violet: [238, 130, 238, 1], + wheat: [245, 222, 179, 1], + white: [255, 255, 255, 1], + whitesmoke: [245, 245, 245, 1], + yellow: [255, 255, 0, 1], + yellowgreen: [154, 205, 50, 1] + }; + + function hn(t) { + return (t = Math.round(t)) < 0 ? 0 : t > 255 ? 255 : t + } + + function cn(t) { + return t < 0 ? 0 : t > 1 ? 1 : t + } + + function pn(t) { + var e = t; + return e.length && "%" === e.charAt(e.length - 1) ? hn(parseFloat(e) / 100 * 255) : hn(parseInt(e, 10)) + } + + function dn(t) { + var e = t; + return e.length && "%" === e.charAt(e.length - 1) ? cn(parseFloat(e) / 100) : cn(parseFloat(e)) + } + + function fn(t, e, n) { + return n < 0 ? n += 1 : n > 1 && (n -= 1), 6 * n < 1 ? t + (e - t) * n * 6 : 2 * n < 1 ? e : 3 * n < 2 ? t + (e - t) * (2 / 3 - n) * 6 : t + } + + function gn(t, e, n) { + return t + (e - t) * n + } + + function yn(t, e, n, i, r) { + return t[0] = e, t[1] = n, t[2] = i, t[3] = r, t + } + + function vn(t, e) { + return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t + } + + var mn = new ln(20), xn = null; + + function _n(t, e) { + xn && vn(xn, e), xn = mn.put(t, xn || e.slice()) + } + + function bn(t, e) { + if (t) { + e = e || []; + var n = mn.get(t); + if (n) return vn(e, n); + var i = (t += "").replace(/ /g, "").toLowerCase(); + if (i in un) return vn(e, un[i]), _n(t, e), e; + var r, o = i.length; + if ("#" === i.charAt(0)) return 4 === o || 5 === o ? (r = parseInt(i.slice(1, 4), 16)) >= 0 && r <= 4095 ? (yn(e, (3840 & r) >> 4 | (3840 & r) >> 8, 240 & r | (240 & r) >> 4, 15 & r | (15 & r) << 4, 5 === o ? parseInt(i.slice(4), 16) / 15 : 1), _n(t, e), e) : void yn(e, 0, 0, 0, 1) : 7 === o || 9 === o ? (r = parseInt(i.slice(1, 7), 16)) >= 0 && r <= 16777215 ? (yn(e, (16711680 & r) >> 16, (65280 & r) >> 8, 255 & r, 9 === o ? parseInt(i.slice(7), 16) / 255 : 1), _n(t, e), e) : void yn(e, 0, 0, 0, 1) : void 0; + var a = i.indexOf("("), s = i.indexOf(")"); + if (-1 !== a && s + 1 === o) { + var l = i.substr(0, a), u = i.substr(a + 1, s - (a + 1)).split(","), h = 1; + switch (l) { + case"rgba": + if (4 !== u.length) return 3 === u.length ? yn(e, +u[0], +u[1], +u[2], 1) : yn(e, 0, 0, 0, 1); + h = dn(u.pop()); + case"rgb": + return 3 !== u.length ? void yn(e, 0, 0, 0, 1) : (yn(e, pn(u[0]), pn(u[1]), pn(u[2]), h), _n(t, e), e); + case"hsla": + return 4 !== u.length ? void yn(e, 0, 0, 0, 1) : (u[3] = dn(u[3]), wn(u, e), _n(t, e), e); + case"hsl": + return 3 !== u.length ? void yn(e, 0, 0, 0, 1) : (wn(u, e), _n(t, e), e); + default: + return + } + } + yn(e, 0, 0, 0, 1) + } + } + + function wn(t, e) { + var n = (parseFloat(t[0]) % 360 + 360) % 360 / 360, i = dn(t[1]), r = dn(t[2]), + o = r <= .5 ? r * (i + 1) : r + i - r * i, a = 2 * r - o; + return yn(e = e || [], hn(255 * fn(a, o, n + 1 / 3)), hn(255 * fn(a, o, n)), hn(255 * fn(a, o, n - 1 / 3)), 1), 4 === t.length && (e[3] = t[3]), e + } + + function Sn(t, e) { + var n = bn(t); + if (n) { + for (var i = 0; i < 3; i++) n[i] = e < 0 ? n[i] * (1 - e) | 0 : (255 - n[i]) * e + n[i] | 0, n[i] > 255 ? n[i] = 255 : n[i] < 0 && (n[i] = 0); + return kn(n, 4 === n.length ? "rgba" : "rgb") + } + } + + function Mn(t, e, n) { + if (e && e.length && t >= 0 && t <= 1) { + n = n || []; + var i = t * (e.length - 1), r = Math.floor(i), o = Math.ceil(i), a = e[r], s = e[o], l = i - r; + return n[0] = hn(gn(a[0], s[0], l)), n[1] = hn(gn(a[1], s[1], l)), n[2] = hn(gn(a[2], s[2], l)), n[3] = cn(gn(a[3], s[3], l)), n + } + } + + var In = Mn; + + function Tn(t, e, n) { + if (e && e.length && t >= 0 && t <= 1) { + var i = t * (e.length - 1), r = Math.floor(i), o = Math.ceil(i), a = bn(e[r]), s = bn(e[o]), l = i - r, + u = kn([hn(gn(a[0], s[0], l)), hn(gn(a[1], s[1], l)), hn(gn(a[2], s[2], l)), cn(gn(a[3], s[3], l))], "rgba"); + return n ? {color: u, leftIndex: r, rightIndex: o, value: i} : u + } + } + + var Cn = Tn; + + function Dn(t, e, n, i) { + var r = bn(t); + if (t) return r = function (t) { + if (t) { + var e, n, i = t[0] / 255, r = t[1] / 255, o = t[2] / 255, a = Math.min(i, r, o), s = Math.max(i, r, o), + l = s - a, u = (s + a) / 2; + if (0 === l) e = 0, n = 0; else { + n = u < .5 ? l / (s + a) : l / (2 - s - a); + var h = ((s - i) / 6 + l / 2) / l, c = ((s - r) / 6 + l / 2) / l, p = ((s - o) / 6 + l / 2) / l; + i === s ? e = p - c : r === s ? e = 1 / 3 + h - p : o === s && (e = 2 / 3 + c - h), e < 0 && (e += 1), e > 1 && (e -= 1) + } + var d = [360 * e, n, u]; + return null != t[3] && d.push(t[3]), d + } + }(r), null != e && (r[0] = function (t) { + return (t = Math.round(t)) < 0 ? 0 : t > 360 ? 360 : t + }(e)), null != n && (r[1] = dn(n)), null != i && (r[2] = dn(i)), kn(wn(r), "rgba") + } + + function An(t, e) { + var n = bn(t); + if (n && null != e) return n[3] = cn(e), kn(n, "rgba") + } + + function kn(t, e) { + if (t && t.length) { + var n = t[0] + "," + t[1] + "," + t[2]; + return "rgba" !== e && "hsva" !== e && "hsla" !== e || (n += "," + t[3]), e + "(" + n + ")" + } + } + + function Ln(t, e) { + var n = bn(t); + return n ? (.299 * n[0] + .587 * n[1] + .114 * n[2]) * n[3] / 255 + (1 - n[3]) * e : 0 + } + + var Pn = Object.freeze({ + __proto__: null, + parse: bn, + lift: Sn, + toHex: function (t) { + var e = bn(t); + if (e) return ((1 << 24) + (e[0] << 16) + (e[1] << 8) + +e[2]).toString(16).slice(1) + }, + fastLerp: Mn, + fastMapToColor: In, + lerp: Tn, + mapToColor: Cn, + modifyHSL: Dn, + modifyAlpha: An, + stringify: kn, + lum: Ln, + random: function () { + return kn([Math.round(255 * Math.random()), Math.round(255 * Math.random()), Math.round(255 * Math.random())], "rgb") + } + }), On = Math.round; + + function Rn(t) { + var e; + if (t && "transparent" !== t) { + if ("string" == typeof t && t.indexOf("rgba") > -1) { + var n = bn(t); + n && (t = "rgb(" + n[0] + "," + n[1] + "," + n[2] + ")", e = n[3]) + } + } else t = "none"; + return {color: t, opacity: null == e ? 1 : e} + } + + var Nn = 1e-4; + + function En(t) { + return t < Nn && t > -1e-4 + } + + function zn(t) { + return On(1e3 * t) / 1e3 + } + + function Vn(t) { + return On(1e4 * t) / 1e4 + } + + var Bn = {left: "start", right: "end", center: "middle", middle: "middle"}; + + function Fn(t) { + return t && !!t.image + } + + function Gn(t) { + return "linear" === t.type + } + + function Wn(t) { + return "radial" === t.type + } + + function Hn(t) { + return "url(#" + t + ")" + } + + function Yn(t) { + var e = t.getGlobalScale(), n = Math.max(e[0], e[1]); + return Math.max(Math.ceil(Math.log(n) / Math.log(10)), 1) + } + + function Un(t) { + var e = t.x || 0, n = t.y || 0, i = (t.rotation || 0) * _t, r = rt(t.scaleX, 1), o = rt(t.scaleY, 1), + a = t.skewX || 0, s = t.skewY || 0, l = []; + return (e || n) && l.push("translate(" + e + "px," + n + "px)"), i && l.push("rotate(" + i + ")"), 1 === r && 1 === o || l.push("scale(" + r + "," + o + ")"), (a || s) && l.push("skew(" + On(a * _t) + "deg, " + On(s * _t) + "deg)"), l.join(" ") + } + + var Xn = r.hasGlobalWindow && U(window.btoa) ? function (t) { + return window.btoa(unescape(t)) + } : "undefined" != typeof Buffer ? function (t) { + return Buffer.from(t).toString("base64") + } : function (t) { + return null + }, Zn = Array.prototype.slice; + + function jn(t, e, n) { + return (e - t) * n + t + } + + function qn(t, e, n, i) { + for (var r = e.length, o = 0; o < r; o++) t[o] = jn(e[o], n[o], i); + return t + } + + function Kn(t, e, n, i) { + for (var r = e.length, o = 0; o < r; o++) t[o] = e[o] + n[o] * i; + return t + } + + function $n(t, e, n, i) { + for (var r = e.length, o = r && e[0].length, a = 0; a < r; a++) { + t[a] || (t[a] = []); + for (var s = 0; s < o; s++) t[a][s] = e[a][s] + n[a][s] * i + } + return t + } + + function Jn(t, e) { + for (var n = t.length, i = e.length, r = n > i ? e : t, o = Math.min(n, i), a = r[o - 1] || { + color: [0, 0, 0, 0], + offset: 0 + }, s = o; s < Math.max(n, i); s++) r.push({offset: a.offset, color: a.color.slice()}) + } + + function Qn(t, e, n) { + var i = t, r = e; + if (i.push && r.push) { + var o = i.length, a = r.length; + if (o !== a) if (o > a) i.length = a; else for (var s = o; s < a; s++) i.push(1 === n ? r[s] : Zn.call(r[s])); + var l = i[0] && i[0].length; + for (s = 0; s < i.length; s++) if (1 === n) isNaN(i[s]) && (i[s] = r[s]); else for (var u = 0; u < l; u++) isNaN(i[s][u]) && (i[s][u] = r[s][u]) + } + } + + function ti(t) { + if (N(t)) { + var e = t.length; + if (N(t[0])) { + for (var n = [], i = 0; i < e; i++) n.push(Zn.call(t[i])); + return n + } + return Zn.call(t) + } + return t + } + + function ei(t) { + return t[0] = Math.floor(t[0]) || 0, t[1] = Math.floor(t[1]) || 0, t[2] = Math.floor(t[2]) || 0, t[3] = null == t[3] ? 1 : t[3], "rgba(" + t.join(",") + ")" + } + + function ni(t) { + return 4 === t || 5 === t + } + + function ii(t) { + return 1 === t || 2 === t + } + + var ri = [0, 0, 0, 0], oi = function () { + function t(t) { + this.keyframes = [], this.discrete = !1, this._invalid = !1, this._needsSort = !1, this._lastFr = 0, this._lastFrP = 0, this.propName = t + } + + return t.prototype.isFinished = function () { + return this._finished + }, t.prototype.setFinished = function () { + this._finished = !0, this._additiveTrack && this._additiveTrack.setFinished() + }, t.prototype.needsAnimate = function () { + return this.keyframes.length >= 1 + }, t.prototype.getAdditiveTrack = function () { + return this._additiveTrack + }, t.prototype.addKeyframe = function (t, e, n) { + this._needsSort = !0; + var i = this.keyframes, r = i.length, o = !1, a = 6, s = e; + if (N(e)) { + var l = function (t) { + return N(t && t[0]) ? 2 : 1 + }(e); + a = l, (1 === l && !j(e[0]) || 2 === l && !j(e[0][0])) && (o = !0) + } else if (j(e) && !nt(e)) a = 0; else if (X(e)) if (isNaN(+e)) { + var u = bn(e); + u && (s = u, a = 3) + } else a = 0; else if (Q(e)) { + var h = A({}, s); + h.colorStops = z(e.colorStops, (function (t) { + return {offset: t.offset, color: bn(t.color)} + })), Gn(e) ? a = 4 : Wn(e) && (a = 5), s = h + } + 0 === r ? this.valType = a : a === this.valType && 6 !== a || (o = !0), this.discrete = this.discrete || o; + var c = {time: t, value: s, rawValue: e, percent: 0}; + return n && (c.easing = n, c.easingFunc = U(n) ? n : Le[n] || rn(n)), i.push(c), c + }, t.prototype.prepare = function (t, e) { + var n = this.keyframes; + this._needsSort && n.sort((function (t, e) { + return t.time - e.time + })); + for (var i = this.valType, r = n.length, o = n[r - 1], a = this.discrete, s = ii(i), l = ni(i), u = 0; u < r; u++) { + var h = n[u], c = h.value, p = o.value; + h.percent = h.time / t, a || (s && u !== r - 1 ? Qn(c, p, i) : l && Jn(c.colorStops, p.colorStops)) + } + if (!a && 5 !== i && e && this.needsAnimate() && e.needsAnimate() && i === e.valType && !e._finished) { + this._additiveTrack = e; + var d = n[0].value; + for (u = 0; u < r; u++) 0 === i ? n[u].additiveValue = n[u].value - d : 3 === i ? n[u].additiveValue = Kn([], n[u].value, d, -1) : ii(i) && (n[u].additiveValue = 1 === i ? Kn([], n[u].value, d, -1) : $n([], n[u].value, d, -1)) + } + }, t.prototype.step = function (t, e) { + if (!this._finished) { + this._additiveTrack && this._additiveTrack._finished && (this._additiveTrack = null); + var n, i, r, o = null != this._additiveTrack, a = o ? "additiveValue" : "value", s = this.valType, + l = this.keyframes, u = l.length, h = this.propName, c = 3 === s, p = this._lastFr, d = Math.min; + if (1 === u) i = r = l[0]; else { + if (e < 0) n = 0; else if (e < this._lastFrP) { + for (n = d(p + 1, u - 1); n >= 0 && !(l[n].percent <= e); n--) ; + n = d(n, u - 2) + } else { + for (n = p; n < u && !(l[n].percent > e); n++) ; + n = d(n - 1, u - 2) + } + r = l[n + 1], i = l[n] + } + if (i && r) { + this._lastFr = n, this._lastFrP = e; + var f = r.percent - i.percent, g = 0 === f ? 1 : d((e - i.percent) / f, 1); + r.easingFunc && (g = r.easingFunc(g)); + var y = o ? this._additiveValue : c ? ri : t[h]; + if (!ii(s) && !c || y || (y = this._additiveValue = []), this.discrete) t[h] = g < 1 ? i.rawValue : r.rawValue; else if (ii(s)) 1 === s ? qn(y, i[a], r[a], g) : function (t, e, n, i) { + for (var r = e.length, o = r && e[0].length, a = 0; a < r; a++) { + t[a] || (t[a] = []); + for (var s = 0; s < o; s++) t[a][s] = jn(e[a][s], n[a][s], i) + } + }(y, i[a], r[a], g); else if (ni(s)) { + var v = i[a], m = r[a], x = 4 === s; + t[h] = { + type: x ? "linear" : "radial", + x: jn(v.x, m.x, g), + y: jn(v.y, m.y, g), + colorStops: z(v.colorStops, (function (t, e) { + var n = m.colorStops[e]; + return {offset: jn(t.offset, n.offset, g), color: ei(qn([], t.color, n.color, g))} + })), + global: m.global + }, x ? (t[h].x2 = jn(v.x2, m.x2, g), t[h].y2 = jn(v.y2, m.y2, g)) : t[h].r = jn(v.r, m.r, g) + } else if (c) qn(y, i[a], r[a], g), o || (t[h] = ei(y)); else { + var _ = jn(i[a], r[a], g); + o ? this._additiveValue = _ : t[h] = _ + } + o && this._addToTarget(t) + } + } + }, t.prototype._addToTarget = function (t) { + var e = this.valType, n = this.propName, i = this._additiveValue; + 0 === e ? t[n] = t[n] + i : 3 === e ? (bn(t[n], ri), Kn(ri, ri, i, 1), t[n] = ei(ri)) : 1 === e ? Kn(t[n], t[n], i, 1) : 2 === e && $n(t[n], t[n], i, 1) + }, t + }(), ai = function () { + function t(t, e, n, i) { + this._tracks = {}, this._trackKeys = [], this._maxTime = 0, this._started = 0, this._clip = null, this._target = t, this._loop = e, e && i ? I("Can' use additive animation on looped animation.") : (this._additiveAnimators = i, this._allowDiscrete = n) + } + + return t.prototype.getMaxTime = function () { + return this._maxTime + }, t.prototype.getDelay = function () { + return this._delay + }, t.prototype.getLoop = function () { + return this._loop + }, t.prototype.getTarget = function () { + return this._target + }, t.prototype.changeTarget = function (t) { + this._target = t + }, t.prototype.when = function (t, e, n) { + return this.whenWithKeys(t, e, G(e), n) + }, t.prototype.whenWithKeys = function (t, e, n, i) { + for (var r = this._tracks, o = 0; o < n.length; o++) { + var a = n[o], s = r[a]; + if (!s) { + s = r[a] = new oi(a); + var l = void 0, u = this._getAdditiveTrack(a); + if (u) { + var h = u.keyframes, c = h[h.length - 1]; + l = c && c.value, 3 === u.valType && l && (l = ei(l)) + } else l = this._target[a]; + if (null == l) continue; + t > 0 && s.addKeyframe(0, ti(l), i), this._trackKeys.push(a) + } + s.addKeyframe(t, ti(e[a]), i) + } + return this._maxTime = Math.max(this._maxTime, t), this + }, t.prototype.pause = function () { + this._clip.pause(), this._paused = !0 + }, t.prototype.resume = function () { + this._clip.resume(), this._paused = !1 + }, t.prototype.isPaused = function () { + return !!this._paused + }, t.prototype.duration = function (t) { + return this._maxTime = t, this._force = !0, this + }, t.prototype._doneCallback = function () { + this._setTracksFinished(), this._clip = null; + var t = this._doneCbs; + if (t) for (var e = t.length, n = 0; n < e; n++) t[n].call(this) + }, t.prototype._abortedCallback = function () { + this._setTracksFinished(); + var t = this.animation, e = this._abortedCbs; + if (t && t.removeClip(this._clip), this._clip = null, e) for (var n = 0; n < e.length; n++) e[n].call(this) + }, t.prototype._setTracksFinished = function () { + for (var t = this._tracks, e = this._trackKeys, n = 0; n < e.length; n++) t[e[n]].setFinished() + }, t.prototype._getAdditiveTrack = function (t) { + var e, n = this._additiveAnimators; + if (n) for (var i = 0; i < n.length; i++) { + var r = n[i].getTrack(t); + r && (e = r) + } + return e + }, t.prototype.start = function (t) { + if (!(this._started > 0)) { + this._started = 1; + for (var e = this, n = [], i = this._maxTime || 0, r = 0; r < this._trackKeys.length; r++) { + var o = this._trackKeys[r], a = this._tracks[o], s = this._getAdditiveTrack(o), l = a.keyframes, + u = l.length; + if (a.prepare(i, s), a.needsAnimate()) if (!this._allowDiscrete && a.discrete) { + var h = l[u - 1]; + h && (e._target[a.propName] = h.rawValue), a.setFinished() + } else n.push(a) + } + if (n.length || this._force) { + var c = new on({ + life: i, loop: this._loop, delay: this._delay || 0, onframe: function (t) { + e._started = 2; + var i = e._additiveAnimators; + if (i) { + for (var r = !1, o = 0; o < i.length; o++) if (i[o]._clip) { + r = !0; + break + } + r || (e._additiveAnimators = null) + } + for (o = 0; o < n.length; o++) n[o].step(e._target, t); + var a = e._onframeCbs; + if (a) for (o = 0; o < a.length; o++) a[o](e._target, t) + }, ondestroy: function () { + e._doneCallback() + } + }); + this._clip = c, this.animation && this.animation.addClip(c), t && c.setEasing(t) + } else this._doneCallback(); + return this + } + }, t.prototype.stop = function (t) { + if (this._clip) { + var e = this._clip; + t && e.onframe(1), this._abortedCallback() + } + }, t.prototype.delay = function (t) { + return this._delay = t, this + }, t.prototype.during = function (t) { + return t && (this._onframeCbs || (this._onframeCbs = []), this._onframeCbs.push(t)), this + }, t.prototype.done = function (t) { + return t && (this._doneCbs || (this._doneCbs = []), this._doneCbs.push(t)), this + }, t.prototype.aborted = function (t) { + return t && (this._abortedCbs || (this._abortedCbs = []), this._abortedCbs.push(t)), this + }, t.prototype.getClip = function () { + return this._clip + }, t.prototype.getTrack = function (t) { + return this._tracks[t] + }, t.prototype.getTracks = function () { + var t = this; + return z(this._trackKeys, (function (e) { + return t._tracks[e] + })) + }, t.prototype.stopTracks = function (t, e) { + if (!t.length || !this._clip) return !0; + for (var n = this._tracks, i = this._trackKeys, r = 0; r < t.length; r++) { + var o = n[t[r]]; + o && !o.isFinished() && (e ? o.step(this._target, 1) : 1 === this._started && o.step(this._target, 0), o.setFinished()) + } + var a = !0; + for (r = 0; r < i.length; r++) if (!n[i[r]].isFinished()) { + a = !1; + break + } + return a && this._abortedCallback(), a + }, t.prototype.saveTo = function (t, e, n) { + if (t) { + e = e || this._trackKeys; + for (var i = 0; i < e.length; i++) { + var r = e[i], o = this._tracks[r]; + if (o && !o.isFinished()) { + var a = o.keyframes, s = a[n ? 0 : a.length - 1]; + s && (t[r] = ti(s.rawValue)) + } + } + } + }, t.prototype.__changeFinalValue = function (t, e) { + e = e || G(t); + for (var n = 0; n < e.length; n++) { + var i = e[n], r = this._tracks[i]; + if (r) { + var o = r.keyframes; + if (o.length > 1) { + var a = o.pop(); + r.addKeyframe(a.time, t[i]), r.prepare(this._maxTime, r.getAdditiveTrack()) + } + } + } + }, t + }(); + + function si() { + return (new Date).getTime() + } + + var li, ui, hi = function (t) { + function e(e) { + var n = t.call(this) || this; + return n._running = !1, n._time = 0, n._pausedTime = 0, n._pauseStart = 0, n._paused = !1, e = e || {}, n.stage = e.stage || {}, n + } + + return n(e, t), e.prototype.addClip = function (t) { + t.animation && this.removeClip(t), this._head ? (this._tail.next = t, t.prev = this._tail, t.next = null, this._tail = t) : this._head = this._tail = t, t.animation = this + }, e.prototype.addAnimator = function (t) { + t.animation = this; + var e = t.getClip(); + e && this.addClip(e) + }, e.prototype.removeClip = function (t) { + if (t.animation) { + var e = t.prev, n = t.next; + e ? e.next = n : this._head = n, n ? n.prev = e : this._tail = e, t.next = t.prev = t.animation = null + } + }, e.prototype.removeAnimator = function (t) { + var e = t.getClip(); + e && this.removeClip(e), t.animation = null + }, e.prototype.update = function (t) { + for (var e = si() - this._pausedTime, n = e - this._time, i = this._head; i;) { + var r = i.next; + i.step(e, n) ? (i.ondestroy(), this.removeClip(i), i = r) : i = r + } + this._time = e, t || (this.trigger("frame", n), this.stage.update && this.stage.update()) + }, e.prototype._startLoop = function () { + var t = this; + this._running = !0, ke((function e() { + t._running && (ke(e), !t._paused && t.update()) + })) + }, e.prototype.start = function () { + this._running || (this._time = si(), this._pausedTime = 0, this._startLoop()) + }, e.prototype.stop = function () { + this._running = !1 + }, e.prototype.pause = function () { + this._paused || (this._pauseStart = si(), this._paused = !0) + }, e.prototype.resume = function () { + this._paused && (this._pausedTime += si() - this._pauseStart, this._paused = !1) + }, e.prototype.clear = function () { + for (var t = this._head; t;) { + var e = t.next; + t.prev = t.next = t.animation = null, t = e + } + this._head = this._tail = null + }, e.prototype.isFinished = function () { + return null == this._head + }, e.prototype.animate = function (t, e) { + e = e || {}, this.start(); + var n = new ai(t, e.loop); + return this.addAnimator(n), n + }, e + }(Xt), ci = r.domSupported, pi = (ui = { + pointerdown: 1, + pointerup: 1, + pointermove: 1, + pointerout: 1 + }, { + mouse: li = ["click", "dblclick", "mousewheel", "wheel", "mouseout", "mouseup", "mousedown", "mousemove", "contextmenu"], + touch: ["touchstart", "touchend", "touchmove"], + pointer: z(li, (function (t) { + var e = t.replace("mouse", "pointer"); + return ui.hasOwnProperty(e) ? e : t + })) + }), di = ["mousemove", "mouseup"], fi = ["pointermove", "pointerup"], gi = !1; + + function yi(t) { + var e = t.pointerType; + return "pen" === e || "touch" === e + } + + function vi(t) { + t && (t.zrByTouch = !0) + } + + function mi(t, e) { + for (var n = e, i = !1; n && 9 !== n.nodeType && !(i = n.domBelongToZr || n !== e && n === t.painterRoot);) n = n.parentNode; + return i + } + + var xi = function (t, e) { + this.stopPropagation = xt, this.stopImmediatePropagation = xt, this.preventDefault = xt, this.type = e.type, this.target = this.currentTarget = t.dom, this.pointerType = e.pointerType, this.clientX = e.clientX, this.clientY = e.clientY + }, _i = { + mousedown: function (t) { + t = oe(this.dom, t), this.__mayPointerCapture = [t.zrX, t.zrY], this.trigger("mousedown", t) + }, mousemove: function (t) { + t = oe(this.dom, t); + var e = this.__mayPointerCapture; + !e || t.zrX === e[0] && t.zrY === e[1] || this.__togglePointerCapture(!0), this.trigger("mousemove", t) + }, mouseup: function (t) { + t = oe(this.dom, t), this.__togglePointerCapture(!1), this.trigger("mouseup", t) + }, mouseout: function (t) { + mi(this, (t = oe(this.dom, t)).toElement || t.relatedTarget) || (this.__pointerCapturing && (t.zrEventControl = "no_globalout"), this.trigger("mouseout", t)) + }, wheel: function (t) { + gi = !0, t = oe(this.dom, t), this.trigger("mousewheel", t) + }, mousewheel: function (t) { + gi || (t = oe(this.dom, t), this.trigger("mousewheel", t)) + }, touchstart: function (t) { + vi(t = oe(this.dom, t)), this.__lastTouchMoment = new Date, this.handler.processGesture(t, "start"), _i.mousemove.call(this, t), _i.mousedown.call(this, t) + }, touchmove: function (t) { + vi(t = oe(this.dom, t)), this.handler.processGesture(t, "change"), _i.mousemove.call(this, t) + }, touchend: function (t) { + vi(t = oe(this.dom, t)), this.handler.processGesture(t, "end"), _i.mouseup.call(this, t), +new Date - +this.__lastTouchMoment < 300 && _i.click.call(this, t) + }, pointerdown: function (t) { + _i.mousedown.call(this, t) + }, pointermove: function (t) { + yi(t) || _i.mousemove.call(this, t) + }, pointerup: function (t) { + _i.mouseup.call(this, t) + }, pointerout: function (t) { + yi(t) || _i.mouseout.call(this, t) + } + }; + E(["click", "dblclick", "contextmenu"], (function (t) { + _i[t] = function (e) { + e = oe(this.dom, e), this.trigger(t, e) + } + })); + var bi = { + pointermove: function (t) { + yi(t) || bi.mousemove.call(this, t) + }, pointerup: function (t) { + bi.mouseup.call(this, t) + }, mousemove: function (t) { + this.trigger("mousemove", t) + }, mouseup: function (t) { + var e = this.__pointerCapturing; + this.__togglePointerCapture(!1), this.trigger("mouseup", t), e && (t.zrEventControl = "only_globalout", this.trigger("mouseout", t)) + } + }; + + function wi(t, e) { + var n = e.domHandlers; + r.pointerEventsSupported ? E(pi.pointer, (function (i) { + Mi(e, i, (function (e) { + n[i].call(t, e) + })) + })) : (r.touchEventsSupported && E(pi.touch, (function (i) { + Mi(e, i, (function (r) { + n[i].call(t, r), function (t) { + t.touching = !0, null != t.touchTimer && (clearTimeout(t.touchTimer), t.touchTimer = null), t.touchTimer = setTimeout((function () { + t.touching = !1, t.touchTimer = null + }), 700) + }(e) + })) + })), E(pi.mouse, (function (i) { + Mi(e, i, (function (r) { + r = re(r), e.touching || n[i].call(t, r) + })) + }))) + } + + function Si(t, e) { + function n(n) { + Mi(e, n, (function (i) { + i = re(i), mi(t, i.target) || (i = function (t, e) { + return oe(t.dom, new xi(t, e), !0) + }(t, i), e.domHandlers[n].call(t, i)) + }), {capture: !0}) + } + + r.pointerEventsSupported ? E(fi, n) : r.touchEventsSupported || E(di, n) + } + + function Mi(t, e, n, i) { + t.mounted[e] = n, t.listenerOpts[e] = i, ae(t.domTarget, e, n, i) + } + + function Ii(t) { + var e, n, i, r, o = t.mounted; + for (var a in o) o.hasOwnProperty(a) && (e = t.domTarget, n = a, i = o[a], r = t.listenerOpts[a], e.removeEventListener(n, i, r)); + t.mounted = {} + } + + var Ti = function (t, e) { + this.mounted = {}, this.listenerOpts = {}, this.touching = !1, this.domTarget = t, this.domHandlers = e + }, Ci = function (t) { + function e(e, n) { + var i = t.call(this) || this; + return i.__pointerCapturing = !1, i.dom = e, i.painterRoot = n, i._localHandlerScope = new Ti(e, _i), ci && (i._globalHandlerScope = new Ti(document, bi)), wi(i, i._localHandlerScope), i + } + + return n(e, t), e.prototype.dispose = function () { + Ii(this._localHandlerScope), ci && Ii(this._globalHandlerScope) + }, e.prototype.setCursor = function (t) { + this.dom.style && (this.dom.style.cursor = t || "default") + }, e.prototype.__togglePointerCapture = function (t) { + if (this.__mayPointerCapture = null, ci && +this.__pointerCapturing ^ +t) { + this.__pointerCapturing = t; + var e = this._globalHandlerScope; + t ? Si(this, e) : Ii(e) + } + }, e + }(Xt), Di = 1; + r.hasGlobalWindow && (Di = Math.max(window.devicePixelRatio || window.screen && window.screen.deviceXDPI / window.screen.logicalXDPI || 1, 1)); + var Ai = Di, ki = "#333", Li = "#ccc"; + + function Pi() { + return [1, 0, 0, 1, 0, 0] + } + + function Oi(t) { + return t[0] = 1, t[1] = 0, t[2] = 0, t[3] = 1, t[4] = 0, t[5] = 0, t + } + + function Ri(t, e) { + return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4], t[5] = e[5], t + } + + function Ni(t, e, n) { + var i = e[0] * n[0] + e[2] * n[1], r = e[1] * n[0] + e[3] * n[1], o = e[0] * n[2] + e[2] * n[3], + a = e[1] * n[2] + e[3] * n[3], s = e[0] * n[4] + e[2] * n[5] + e[4], l = e[1] * n[4] + e[3] * n[5] + e[5]; + return t[0] = i, t[1] = r, t[2] = o, t[3] = a, t[4] = s, t[5] = l, t + } + + function Ei(t, e, n) { + return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4] + n[0], t[5] = e[5] + n[1], t + } + + function zi(t, e, n) { + var i = e[0], r = e[2], o = e[4], a = e[1], s = e[3], l = e[5], u = Math.sin(n), h = Math.cos(n); + return t[0] = i * h + a * u, t[1] = -i * u + a * h, t[2] = r * h + s * u, t[3] = -r * u + h * s, t[4] = h * o + u * l, t[5] = h * l - u * o, t + } + + function Vi(t, e, n) { + var i = n[0], r = n[1]; + return t[0] = e[0] * i, t[1] = e[1] * r, t[2] = e[2] * i, t[3] = e[3] * r, t[4] = e[4] * i, t[5] = e[5] * r, t + } + + function Bi(t, e) { + var n = e[0], i = e[2], r = e[4], o = e[1], a = e[3], s = e[5], l = n * a - o * i; + return l ? (l = 1 / l, t[0] = a * l, t[1] = -o * l, t[2] = -i * l, t[3] = n * l, t[4] = (i * s - a * r) * l, t[5] = (o * r - n * s) * l, t) : null + } + + function Fi(t) { + var e = [1, 0, 0, 1, 0, 0]; + return Ri(e, t), e + } + + var Gi = Object.freeze({ + __proto__: null, + create: Pi, + identity: Oi, + copy: Ri, + mul: Ni, + translate: Ei, + rotate: zi, + scale: Vi, + invert: Bi, + clone: Fi + }), Wi = Oi, Hi = 5e-5; + + function Yi(t) { + return t > Hi || t < -5e-5 + } + + var Ui = [], Xi = [], Zi = [1, 0, 0, 1, 0, 0], ji = Math.abs, qi = function () { + function t() { + } + + return t.prototype.getLocalTransform = function (e) { + return t.getLocalTransform(this, e) + }, t.prototype.setPosition = function (t) { + this.x = t[0], this.y = t[1] + }, t.prototype.setScale = function (t) { + this.scaleX = t[0], this.scaleY = t[1] + }, t.prototype.setSkew = function (t) { + this.skewX = t[0], this.skewY = t[1] + }, t.prototype.setOrigin = function (t) { + this.originX = t[0], this.originY = t[1] + }, t.prototype.needLocalTransform = function () { + return Yi(this.rotation) || Yi(this.x) || Yi(this.y) || Yi(this.scaleX - 1) || Yi(this.scaleY - 1) || Yi(this.skewX) || Yi(this.skewY) + }, t.prototype.updateTransform = function () { + var t = this.parent && this.parent.transform, e = this.needLocalTransform(), n = this.transform; + e || t ? (n = n || [1, 0, 0, 1, 0, 0], e ? this.getLocalTransform(n) : Wi(n), t && (e ? Ni(n, t, n) : Ri(n, t)), this.transform = n, this._resolveGlobalScaleRatio(n)) : n && Wi(n) + }, t.prototype._resolveGlobalScaleRatio = function (t) { + var e = this.globalScaleRatio; + if (null != e && 1 !== e) { + this.getGlobalScale(Ui); + var n = Ui[0] < 0 ? -1 : 1, i = Ui[1] < 0 ? -1 : 1, r = ((Ui[0] - n) * e + n) / Ui[0] || 0, + o = ((Ui[1] - i) * e + i) / Ui[1] || 0; + t[0] *= r, t[1] *= r, t[2] *= o, t[3] *= o + } + this.invTransform = this.invTransform || [1, 0, 0, 1, 0, 0], Bi(this.invTransform, t) + }, t.prototype.getComputedTransform = function () { + for (var t = this, e = []; t;) e.push(t), t = t.parent; + for (; t = e.pop();) t.updateTransform(); + return this.transform + }, t.prototype.setLocalTransform = function (t) { + if (t) { + var e = t[0] * t[0] + t[1] * t[1], n = t[2] * t[2] + t[3] * t[3], i = Math.atan2(t[1], t[0]), + r = Math.PI / 2 + i - Math.atan2(t[3], t[2]); + n = Math.sqrt(n) * Math.cos(r), e = Math.sqrt(e), this.skewX = r, this.skewY = 0, this.rotation = -i, this.x = +t[4], this.y = +t[5], this.scaleX = e, this.scaleY = n, this.originX = 0, this.originY = 0 + } + }, t.prototype.decomposeTransform = function () { + if (this.transform) { + var t = this.parent, e = this.transform; + t && t.transform && (Ni(Xi, t.invTransform, e), e = Xi); + var n = this.originX, i = this.originY; + (n || i) && (Zi[4] = n, Zi[5] = i, Ni(Xi, e, Zi), Xi[4] -= n, Xi[5] -= i, e = Xi), this.setLocalTransform(e) + } + }, t.prototype.getGlobalScale = function (t) { + var e = this.transform; + return t = t || [], e ? (t[0] = Math.sqrt(e[0] * e[0] + e[1] * e[1]), t[1] = Math.sqrt(e[2] * e[2] + e[3] * e[3]), e[0] < 0 && (t[0] = -t[0]), e[3] < 0 && (t[1] = -t[1]), t) : (t[0] = 1, t[1] = 1, t) + }, t.prototype.transformCoordToLocal = function (t, e) { + var n = [t, e], i = this.invTransform; + return i && Ft(n, n, i), n + }, t.prototype.transformCoordToGlobal = function (t, e) { + var n = [t, e], i = this.transform; + return i && Ft(n, n, i), n + }, t.prototype.getLineScale = function () { + var t = this.transform; + return t && ji(t[0] - 1) > 1e-10 && ji(t[3] - 1) > 1e-10 ? Math.sqrt(ji(t[0] * t[3] - t[2] * t[1])) : 1 + }, t.prototype.copyTransform = function (t) { + $i(this, t) + }, t.getLocalTransform = function (t, e) { + e = e || []; + var n = t.originX || 0, i = t.originY || 0, r = t.scaleX, o = t.scaleY, a = t.anchorX, s = t.anchorY, + l = t.rotation || 0, u = t.x, h = t.y, c = t.skewX ? Math.tan(t.skewX) : 0, + p = t.skewY ? Math.tan(-t.skewY) : 0; + if (n || i || a || s) { + var d = n + a, f = i + s; + e[4] = -d * r - c * f * o, e[5] = -f * o - p * d * r + } else e[4] = e[5] = 0; + return e[0] = r, e[3] = o, e[1] = p * r, e[2] = c * o, l && zi(e, e, l), e[4] += n + u, e[5] += i + h, e + }, t.initDefaultProps = function () { + var e = t.prototype; + e.scaleX = e.scaleY = e.globalScaleRatio = 1, e.x = e.y = e.originX = e.originY = e.skewX = e.skewY = e.rotation = e.anchorX = e.anchorY = 0 + }(), t + }(), Ki = ["x", "y", "originX", "originY", "anchorX", "anchorY", "rotation", "scaleX", "scaleY", "skewX", "skewY"]; + + function $i(t, e) { + for (var n = 0; n < Ki.length; n++) { + var i = Ki[n]; + t[i] = e[i] + } + } + + var Ji = function () { + function t(t, e) { + this.x = t || 0, this.y = e || 0 + } + + return t.prototype.copy = function (t) { + return this.x = t.x, this.y = t.y, this + }, t.prototype.clone = function () { + return new t(this.x, this.y) + }, t.prototype.set = function (t, e) { + return this.x = t, this.y = e, this + }, t.prototype.equal = function (t) { + return t.x === this.x && t.y === this.y + }, t.prototype.add = function (t) { + return this.x += t.x, this.y += t.y, this + }, t.prototype.scale = function (t) { + this.x *= t, this.y *= t + }, t.prototype.scaleAndAdd = function (t, e) { + this.x += t.x * e, this.y += t.y * e + }, t.prototype.sub = function (t) { + return this.x -= t.x, this.y -= t.y, this + }, t.prototype.dot = function (t) { + return this.x * t.x + this.y * t.y + }, t.prototype.len = function () { + return Math.sqrt(this.x * this.x + this.y * this.y) + }, t.prototype.lenSquare = function () { + return this.x * this.x + this.y * this.y + }, t.prototype.normalize = function () { + var t = this.len(); + return this.x /= t, this.y /= t, this + }, t.prototype.distance = function (t) { + var e = this.x - t.x, n = this.y - t.y; + return Math.sqrt(e * e + n * n) + }, t.prototype.distanceSquare = function (t) { + var e = this.x - t.x, n = this.y - t.y; + return e * e + n * n + }, t.prototype.negate = function () { + return this.x = -this.x, this.y = -this.y, this + }, t.prototype.transform = function (t) { + if (t) { + var e = this.x, n = this.y; + return this.x = t[0] * e + t[2] * n + t[4], this.y = t[1] * e + t[3] * n + t[5], this + } + }, t.prototype.toArray = function (t) { + return t[0] = this.x, t[1] = this.y, t + }, t.prototype.fromArray = function (t) { + this.x = t[0], this.y = t[1] + }, t.set = function (t, e, n) { + t.x = e, t.y = n + }, t.copy = function (t, e) { + t.x = e.x, t.y = e.y + }, t.len = function (t) { + return Math.sqrt(t.x * t.x + t.y * t.y) + }, t.lenSquare = function (t) { + return t.x * t.x + t.y * t.y + }, t.dot = function (t, e) { + return t.x * e.x + t.y * e.y + }, t.add = function (t, e, n) { + t.x = e.x + n.x, t.y = e.y + n.y + }, t.sub = function (t, e, n) { + t.x = e.x - n.x, t.y = e.y - n.y + }, t.scale = function (t, e, n) { + t.x = e.x * n, t.y = e.y * n + }, t.scaleAndAdd = function (t, e, n, i) { + t.x = e.x + n.x * i, t.y = e.y + n.y * i + }, t.lerp = function (t, e, n, i) { + var r = 1 - i; + t.x = r * e.x + i * n.x, t.y = r * e.y + i * n.y + }, t + }(), Qi = Math.min, tr = Math.max, er = new Ji, nr = new Ji, ir = new Ji, rr = new Ji, or = new Ji, ar = new Ji, + sr = function () { + function t(t, e, n, i) { + n < 0 && (t += n, n = -n), i < 0 && (e += i, i = -i), this.x = t, this.y = e, this.width = n, this.height = i + } + + return t.prototype.union = function (t) { + var e = Qi(t.x, this.x), n = Qi(t.y, this.y); + isFinite(this.x) && isFinite(this.width) ? this.width = tr(t.x + t.width, this.x + this.width) - e : this.width = t.width, isFinite(this.y) && isFinite(this.height) ? this.height = tr(t.y + t.height, this.y + this.height) - n : this.height = t.height, this.x = e, this.y = n + }, t.prototype.applyTransform = function (e) { + t.applyTransform(this, this, e) + }, t.prototype.calculateTransform = function (t) { + var e = this, n = t.width / e.width, i = t.height / e.height, r = [1, 0, 0, 1, 0, 0]; + return Ei(r, r, [-e.x, -e.y]), Vi(r, r, [n, i]), Ei(r, r, [t.x, t.y]), r + }, t.prototype.intersect = function (e, n) { + if (!e) return !1; + e instanceof t || (e = t.create(e)); + var i = this, r = i.x, o = i.x + i.width, a = i.y, s = i.y + i.height, l = e.x, u = e.x + e.width, + h = e.y, c = e.y + e.height, p = !(o < l || u < r || s < h || c < a); + if (n) { + var d = 1 / 0, f = 0, g = Math.abs(o - l), y = Math.abs(u - r), v = Math.abs(s - h), + m = Math.abs(c - a), x = Math.min(g, y), _ = Math.min(v, m); + o < l || u < r ? x > f && (f = x, g < y ? Ji.set(ar, -g, 0) : Ji.set(ar, y, 0)) : x < d && (d = x, g < y ? Ji.set(or, g, 0) : Ji.set(or, -y, 0)), s < h || c < a ? _ > f && (f = _, v < m ? Ji.set(ar, 0, -v) : Ji.set(ar, 0, m)) : x < d && (d = x, v < m ? Ji.set(or, 0, v) : Ji.set(or, 0, -m)) + } + return n && Ji.copy(n, p ? or : ar), p + }, t.prototype.contain = function (t, e) { + var n = this; + return t >= n.x && t <= n.x + n.width && e >= n.y && e <= n.y + n.height + }, t.prototype.clone = function () { + return new t(this.x, this.y, this.width, this.height) + }, t.prototype.copy = function (e) { + t.copy(this, e) + }, t.prototype.plain = function () { + return {x: this.x, y: this.y, width: this.width, height: this.height} + }, t.prototype.isFinite = function () { + return isFinite(this.x) && isFinite(this.y) && isFinite(this.width) && isFinite(this.height) + }, t.prototype.isZero = function () { + return 0 === this.width || 0 === this.height + }, t.create = function (e) { + return new t(e.x, e.y, e.width, e.height) + }, t.copy = function (t, e) { + t.x = e.x, t.y = e.y, t.width = e.width, t.height = e.height + }, t.applyTransform = function (e, n, i) { + if (i) { + if (i[1] < 1e-5 && i[1] > -1e-5 && i[2] < 1e-5 && i[2] > -1e-5) { + var r = i[0], o = i[3], a = i[4], s = i[5]; + return e.x = n.x * r + a, e.y = n.y * o + s, e.width = n.width * r, e.height = n.height * o, e.width < 0 && (e.x += e.width, e.width = -e.width), void (e.height < 0 && (e.y += e.height, e.height = -e.height)) + } + er.x = ir.x = n.x, er.y = rr.y = n.y, nr.x = rr.x = n.x + n.width, nr.y = ir.y = n.y + n.height, er.transform(i), rr.transform(i), nr.transform(i), ir.transform(i), e.x = Qi(er.x, nr.x, ir.x, rr.x), e.y = Qi(er.y, nr.y, ir.y, rr.y); + var l = tr(er.x, nr.x, ir.x, rr.x), u = tr(er.y, nr.y, ir.y, rr.y); + e.width = l - e.x, e.height = u - e.y + } else e !== n && t.copy(e, n) + }, t + }(), lr = {}; + + function ur(t, e) { + var n = lr[e = e || a]; + n || (n = lr[e] = new ln(500)); + var i = n.get(t); + return null == i && (i = h.measureText(t, e).width, n.put(t, i)), i + } + + function hr(t, e, n, i) { + var r = ur(t, e), o = fr(e), a = pr(0, r, n), s = dr(0, o, i); + return new sr(a, s, r, o) + } + + function cr(t, e, n, i) { + var r = ((t || "") + "").split("\n"); + if (1 === r.length) return hr(r[0], e, n, i); + for (var o = new sr(0, 0, 0, 0), a = 0; a < r.length; a++) { + var s = hr(r[a], e, n, i); + 0 === a ? o.copy(s) : o.union(s) + } + return o + } + + function pr(t, e, n) { + return "right" === n ? t -= e : "center" === n && (t -= e / 2), t + } + + function dr(t, e, n) { + return "middle" === n ? t -= e / 2 : "bottom" === n && (t -= e), t + } + + function fr(t) { + return ur("国", t) + } + + function gr(t, e) { + return "string" == typeof t ? t.lastIndexOf("%") >= 0 ? parseFloat(t) / 100 * e : parseFloat(t) : t + } + + function yr(t, e, n) { + var i = e.position || "inside", r = null != e.distance ? e.distance : 5, o = n.height, a = n.width, s = o / 2, + l = n.x, u = n.y, h = "left", c = "top"; + if (i instanceof Array) l += gr(i[0], n.width), u += gr(i[1], n.height), h = null, c = null; else switch (i) { + case"left": + l -= r, u += s, h = "right", c = "middle"; + break; + case"right": + l += r + a, u += s, c = "middle"; + break; + case"top": + l += a / 2, u -= r, h = "center", c = "bottom"; + break; + case"bottom": + l += a / 2, u += o + r, h = "center"; + break; + case"inside": + l += a / 2, u += s, h = "center", c = "middle"; + break; + case"insideLeft": + l += r, u += s, c = "middle"; + break; + case"insideRight": + l += a - r, u += s, h = "right", c = "middle"; + break; + case"insideTop": + l += a / 2, u += r, h = "center"; + break; + case"insideBottom": + l += a / 2, u += o - r, h = "center", c = "bottom"; + break; + case"insideTopLeft": + l += r, u += r; + break; + case"insideTopRight": + l += a - r, u += r, h = "right"; + break; + case"insideBottomLeft": + l += r, u += o - r, c = "bottom"; + break; + case"insideBottomRight": + l += a - r, u += o - r, h = "right", c = "bottom" + } + return (t = t || {}).x = l, t.y = u, t.align = h, t.verticalAlign = c, t + } + + var vr = "__zr_normal__", mr = Ki.concat(["ignore"]), xr = V(Ki, (function (t, e) { + return t[e] = !0, t + }), {ignore: !1}), _r = {}, br = new sr(0, 0, 0, 0), wr = function () { + function t(t) { + this.id = M(), this.animators = [], this.currentStates = [], this.states = {}, this._init(t) + } + + return t.prototype._init = function (t) { + this.attr(t) + }, t.prototype.drift = function (t, e, n) { + switch (this.draggable) { + case"horizontal": + e = 0; + break; + case"vertical": + t = 0 + } + var i = this.transform; + i || (i = this.transform = [1, 0, 0, 1, 0, 0]), i[4] += t, i[5] += e, this.decomposeTransform(), this.markRedraw() + }, t.prototype.beforeUpdate = function () { + }, t.prototype.afterUpdate = function () { + }, t.prototype.update = function () { + this.updateTransform(), this.__dirty && this.updateInnerText() + }, t.prototype.updateInnerText = function (t) { + var e = this._textContent; + if (e && (!e.ignore || t)) { + this.textConfig || (this.textConfig = {}); + var n = this.textConfig, i = n.local, r = e.innerTransformable, o = void 0, a = void 0, s = !1; + r.parent = i ? this : null; + var l = !1; + if (r.copyTransform(e), null != n.position) { + var u = br; + n.layoutRect ? u.copy(n.layoutRect) : u.copy(this.getBoundingRect()), i || u.applyTransform(this.transform), this.calculateTextPosition ? this.calculateTextPosition(_r, n, u) : yr(_r, n, u), r.x = _r.x, r.y = _r.y, o = _r.align, a = _r.verticalAlign; + var h = n.origin; + if (h && null != n.rotation) { + var c = void 0, p = void 0; + "center" === h ? (c = .5 * u.width, p = .5 * u.height) : (c = gr(h[0], u.width), p = gr(h[1], u.height)), l = !0, r.originX = -r.x + c + (i ? 0 : u.x), r.originY = -r.y + p + (i ? 0 : u.y) + } + } + null != n.rotation && (r.rotation = n.rotation); + var d = n.offset; + d && (r.x += d[0], r.y += d[1], l || (r.originX = -d[0], r.originY = -d[1])); + var f = null == n.inside ? "string" == typeof n.position && n.position.indexOf("inside") >= 0 : n.inside, + g = this._innerTextDefaultStyle || (this._innerTextDefaultStyle = {}), y = void 0, v = void 0, + m = void 0; + f && this.canBeInsideText() ? (y = n.insideFill, v = n.insideStroke, null != y && "auto" !== y || (y = this.getInsideTextFill()), null != v && "auto" !== v || (v = this.getInsideTextStroke(y), m = !0)) : (y = n.outsideFill, v = n.outsideStroke, null != y && "auto" !== y || (y = this.getOutsideFill()), null != v && "auto" !== v || (v = this.getOutsideStroke(y), m = !0)), (y = y || "#000") === g.fill && v === g.stroke && m === g.autoStroke && o === g.align && a === g.verticalAlign || (s = !0, g.fill = y, g.stroke = v, g.autoStroke = m, g.align = o, g.verticalAlign = a, e.setDefaultTextStyle(g)), e.__dirty |= 1, s && e.dirtyStyle(!0) + } + }, t.prototype.canBeInsideText = function () { + return !0 + }, t.prototype.getInsideTextFill = function () { + return "#fff" + }, t.prototype.getInsideTextStroke = function (t) { + return "#000" + }, t.prototype.getOutsideFill = function () { + return this.__zr && this.__zr.isDarkMode() ? Li : ki + }, t.prototype.getOutsideStroke = function (t) { + var e = this.__zr && this.__zr.getBackgroundColor(), n = "string" == typeof e && bn(e); + n || (n = [255, 255, 255, 1]); + for (var i = n[3], r = this.__zr.isDarkMode(), o = 0; o < 3; o++) n[o] = n[o] * i + (r ? 0 : 255) * (1 - i); + return n[3] = 1, kn(n, "rgba") + }, t.prototype.traverse = function (t, e) { + }, t.prototype.attrKV = function (t, e) { + "textConfig" === t ? this.setTextConfig(e) : "textContent" === t ? this.setTextContent(e) : "clipPath" === t ? this.setClipPath(e) : "extra" === t ? (this.extra = this.extra || {}, A(this.extra, e)) : this[t] = e + }, t.prototype.hide = function () { + this.ignore = !0, this.markRedraw() + }, t.prototype.show = function () { + this.ignore = !1, this.markRedraw() + }, t.prototype.attr = function (t, e) { + if ("string" == typeof t) this.attrKV(t, e); else if (q(t)) for (var n = G(t), i = 0; i < n.length; i++) { + var r = n[i]; + this.attrKV(r, t[r]) + } + return this.markRedraw(), this + }, t.prototype.saveCurrentToNormalState = function (t) { + this._innerSaveToNormal(t); + for (var e = this._normalState, n = 0; n < this.animators.length; n++) { + var i = this.animators[n], r = i.__fromStateTransition; + if (!(i.getLoop() || r && r !== vr)) { + var o = i.targetName, a = o ? e[o] : e; + i.saveTo(a) + } + } + }, t.prototype._innerSaveToNormal = function (t) { + var e = this._normalState; + e || (e = this._normalState = {}), t.textConfig && !e.textConfig && (e.textConfig = this.textConfig), this._savePrimaryToNormal(t, e, mr) + }, t.prototype._savePrimaryToNormal = function (t, e, n) { + for (var i = 0; i < n.length; i++) { + var r = n[i]; + null == t[r] || r in e || (e[r] = this[r]) + } + }, t.prototype.hasState = function () { + return this.currentStates.length > 0 + }, t.prototype.getState = function (t) { + return this.states[t] + }, t.prototype.ensureState = function (t) { + var e = this.states; + return e[t] || (e[t] = {}), e[t] + }, t.prototype.clearStates = function (t) { + this.useState(vr, !1, t) + }, t.prototype.useState = function (t, e, n, i) { + var r = t === vr; + if (this.hasState() || !r) { + var o = this.currentStates, a = this.stateTransition; + if (!(P(o, t) >= 0) || !e && 1 !== o.length) { + var s; + if (this.stateProxy && !r && (s = this.stateProxy(t)), s || (s = this.states && this.states[t]), s || r) { + r || this.saveCurrentToNormalState(s); + var l = !!(s && s.hoverLayer || i); + l && this._toggleHoverLayerFlag(!0), this._applyStateObj(t, s, this._normalState, e, !n && !this.__inHover && a && a.duration > 0, a); + var u = this._textContent, h = this._textGuide; + return u && u.useState(t, e, n, l), h && h.useState(t, e, n, l), r ? (this.currentStates = [], this._normalState = {}) : e ? this.currentStates.push(t) : this.currentStates = [t], this._updateAnimationTargets(), this.markRedraw(), !l && this.__inHover && (this._toggleHoverLayerFlag(!1), this.__dirty &= -2), s + } + I("State " + t + " not exists.") + } + } + }, t.prototype.useStates = function (t, e, n) { + if (t.length) { + var i = [], r = this.currentStates, o = t.length, a = o === r.length; + if (a) for (var s = 0; s < o; s++) if (t[s] !== r[s]) { + a = !1; + break + } + if (a) return; + for (s = 0; s < o; s++) { + var l = t[s], u = void 0; + this.stateProxy && (u = this.stateProxy(l, t)), u || (u = this.states[l]), u && i.push(u) + } + var h = i[o - 1], c = !!(h && h.hoverLayer || n); + c && this._toggleHoverLayerFlag(!0); + var p = this._mergeStates(i), d = this.stateTransition; + this.saveCurrentToNormalState(p), this._applyStateObj(t.join(","), p, this._normalState, !1, !e && !this.__inHover && d && d.duration > 0, d); + var f = this._textContent, g = this._textGuide; + f && f.useStates(t, e, c), g && g.useStates(t, e, c), this._updateAnimationTargets(), this.currentStates = t.slice(), this.markRedraw(), !c && this.__inHover && (this._toggleHoverLayerFlag(!1), this.__dirty &= -2) + } else this.clearStates() + }, t.prototype._updateAnimationTargets = function () { + for (var t = 0; t < this.animators.length; t++) { + var e = this.animators[t]; + e.targetName && e.changeTarget(this[e.targetName]) + } + }, t.prototype.removeState = function (t) { + var e = P(this.currentStates, t); + if (e >= 0) { + var n = this.currentStates.slice(); + n.splice(e, 1), this.useStates(n) + } + }, t.prototype.replaceState = function (t, e, n) { + var i = this.currentStates.slice(), r = P(i, t), o = P(i, e) >= 0; + r >= 0 ? o ? i.splice(r, 1) : i[r] = e : n && !o && i.push(e), this.useStates(i) + }, t.prototype.toggleState = function (t, e) { + e ? this.useState(t, !0) : this.removeState(t) + }, t.prototype._mergeStates = function (t) { + for (var e, n = {}, i = 0; i < t.length; i++) { + var r = t[i]; + A(n, r), r.textConfig && A(e = e || {}, r.textConfig) + } + return e && (n.textConfig = e), n + }, t.prototype._applyStateObj = function (t, e, n, i, r, o) { + var a = !(e && i); + e && e.textConfig ? (this.textConfig = A({}, i ? this.textConfig : n.textConfig), A(this.textConfig, e.textConfig)) : a && n.textConfig && (this.textConfig = n.textConfig); + for (var s = {}, l = !1, u = 0; u < mr.length; u++) { + var h = mr[u], c = r && xr[h]; + e && null != e[h] ? c ? (l = !0, s[h] = e[h]) : this[h] = e[h] : a && null != n[h] && (c ? (l = !0, s[h] = n[h]) : this[h] = n[h]) + } + if (!r) for (u = 0; u < this.animators.length; u++) { + var p = this.animators[u], d = p.targetName; + p.getLoop() || p.__changeFinalValue(d ? (e || n)[d] : e || n) + } + l && this._transitionState(t, s, o) + }, t.prototype._attachComponent = function (t) { + if ((!t.__zr || t.__hostTarget) && t !== this) { + var e = this.__zr; + e && t.addSelfToZr(e), t.__zr = e, t.__hostTarget = this + } + }, t.prototype._detachComponent = function (t) { + t.__zr && t.removeSelfFromZr(t.__zr), t.__zr = null, t.__hostTarget = null + }, t.prototype.getClipPath = function () { + return this._clipPath + }, t.prototype.setClipPath = function (t) { + this._clipPath && this._clipPath !== t && this.removeClipPath(), this._attachComponent(t), this._clipPath = t, this.markRedraw() + }, t.prototype.removeClipPath = function () { + var t = this._clipPath; + t && (this._detachComponent(t), this._clipPath = null, this.markRedraw()) + }, t.prototype.getTextContent = function () { + return this._textContent + }, t.prototype.setTextContent = function (t) { + var e = this._textContent; + e !== t && (e && e !== t && this.removeTextContent(), t.innerTransformable = new qi, this._attachComponent(t), this._textContent = t, this.markRedraw()) + }, t.prototype.setTextConfig = function (t) { + this.textConfig || (this.textConfig = {}), A(this.textConfig, t), this.markRedraw() + }, t.prototype.removeTextConfig = function () { + this.textConfig = null, this.markRedraw() + }, t.prototype.removeTextContent = function () { + var t = this._textContent; + t && (t.innerTransformable = null, this._detachComponent(t), this._textContent = null, this._innerTextDefaultStyle = null, this.markRedraw()) + }, t.prototype.getTextGuideLine = function () { + return this._textGuide + }, t.prototype.setTextGuideLine = function (t) { + this._textGuide && this._textGuide !== t && this.removeTextGuideLine(), this._attachComponent(t), this._textGuide = t, this.markRedraw() + }, t.prototype.removeTextGuideLine = function () { + var t = this._textGuide; + t && (this._detachComponent(t), this._textGuide = null, this.markRedraw()) + }, t.prototype.markRedraw = function () { + this.__dirty |= 1; + var t = this.__zr; + t && (this.__inHover ? t.refreshHover() : t.refresh()), this.__hostTarget && this.__hostTarget.markRedraw() + }, t.prototype.dirty = function () { + this.markRedraw() + }, t.prototype._toggleHoverLayerFlag = function (t) { + this.__inHover = t; + var e = this._textContent, n = this._textGuide; + e && (e.__inHover = t), n && (n.__inHover = t) + }, t.prototype.addSelfToZr = function (t) { + if (this.__zr !== t) { + this.__zr = t; + var e = this.animators; + if (e) for (var n = 0; n < e.length; n++) t.animation.addAnimator(e[n]); + this._clipPath && this._clipPath.addSelfToZr(t), this._textContent && this._textContent.addSelfToZr(t), this._textGuide && this._textGuide.addSelfToZr(t) + } + }, t.prototype.removeSelfFromZr = function (t) { + if (this.__zr) { + this.__zr = null; + var e = this.animators; + if (e) for (var n = 0; n < e.length; n++) t.animation.removeAnimator(e[n]); + this._clipPath && this._clipPath.removeSelfFromZr(t), this._textContent && this._textContent.removeSelfFromZr(t), this._textGuide && this._textGuide.removeSelfFromZr(t) + } + }, t.prototype.animate = function (t, e, n) { + var i = t ? this[t] : this; + var r = new ai(i, e, n); + return t && (r.targetName = t), this.addAnimator(r, t), r + }, t.prototype.addAnimator = function (t, e) { + var n = this.__zr, i = this; + t.during((function () { + i.updateDuringAnimation(e) + })).done((function () { + var e = i.animators, n = P(e, t); + n >= 0 && e.splice(n, 1) + })), this.animators.push(t), n && n.animation.addAnimator(t), n && n.wakeUp() + }, t.prototype.updateDuringAnimation = function (t) { + this.markRedraw() + }, t.prototype.stopAnimation = function (t, e) { + for (var n = this.animators, i = n.length, r = [], o = 0; o < i; o++) { + var a = n[o]; + t && t !== a.scope ? r.push(a) : a.stop(e) + } + return this.animators = r, this + }, t.prototype.animateTo = function (t, e, n) { + Sr(this, t, e, n) + }, t.prototype.animateFrom = function (t, e, n) { + Sr(this, t, e, n, !0) + }, t.prototype._transitionState = function (t, e, n, i) { + for (var r = Sr(this, e, n, i), o = 0; o < r.length; o++) r[o].__fromStateTransition = t + }, t.prototype.getBoundingRect = function () { + return null + }, t.prototype.getPaintRect = function () { + return null + }, t.initDefaultProps = function () { + var e = t.prototype; + e.type = "element", e.name = "", e.ignore = e.silent = e.isGroup = e.draggable = e.dragging = e.ignoreClip = e.__inHover = !1, e.__dirty = 1; + + function n(t, n, i, r) { + function o(t, e) { + Object.defineProperty(e, 0, { + get: function () { + return t[i] + }, set: function (e) { + t[i] = e + } + }), Object.defineProperty(e, 1, { + get: function () { + return t[r] + }, set: function (e) { + t[r] = e + } + }) + } + + Object.defineProperty(e, t, { + get: function () { + this[n] || o(this, this[n] = []); + return this[n] + }, set: function (t) { + this[i] = t[0], this[r] = t[1], this[n] = t, o(this, t) + } + }) + } + + Object.defineProperty && (n("position", "_legacyPos", "x", "y"), n("scale", "_legacyScale", "scaleX", "scaleY"), n("origin", "_legacyOrigin", "originX", "originY")) + }(), t + }(); + + function Sr(t, e, n, i, r) { + var o = []; + Tr(t, "", t, e, n = n || {}, i, o, r); + var a = o.length, s = !1, l = n.done, u = n.aborted, h = function () { + s = !0, --a <= 0 && (s ? l && l() : u && u()) + }, c = function () { + --a <= 0 && (s ? l && l() : u && u()) + }; + a || l && l(), o.length > 0 && n.during && o[0].during((function (t, e) { + n.during(e) + })); + for (var p = 0; p < o.length; p++) { + var d = o[p]; + h && d.done(h), c && d.aborted(c), n.force && d.duration(n.duration), d.start(n.easing) + } + return o + } + + function Mr(t, e, n) { + for (var i = 0; i < n; i++) t[i] = e[i] + } + + function Ir(t, e, n) { + if (N(e[n])) if (N(t[n]) || (t[n] = []), $(e[n])) { + var i = e[n].length; + t[n].length !== i && (t[n] = new e[n].constructor(i), Mr(t[n], e[n], i)) + } else { + var r = e[n], o = t[n], a = r.length; + if (N(r[0])) for (var s = r[0].length, l = 0; l < a; l++) o[l] ? Mr(o[l], r[l], s) : o[l] = Array.prototype.slice.call(r[l]); else Mr(o, r, a); + o.length = r.length + } else t[n] = e[n] + } + + function Tr(t, e, n, i, r, o, a, s) { + for (var l = G(i), u = r.duration, h = r.delay, c = r.additive, p = r.setToFinal, d = !q(o), f = t.animators, g = [], y = 0; y < l.length; y++) { + var v = l[y], m = i[v]; + if (null != m && null != n[v] && (d || o[v])) if (!q(m) || N(m) || Q(m)) g.push(v); else { + if (e) { + s || (n[v] = m, t.updateDuringAnimation(e)); + continue + } + Tr(t, v, n[v], m, r, o && o[v], a, s) + } else s || (n[v] = m, t.updateDuringAnimation(e), g.push(v)) + } + var x = g.length; + if (!c && x) for (var _ = 0; _ < f.length; _++) { + if ((w = f[_]).targetName === e) if (w.stopTracks(g)) { + var b = P(f, w); + f.splice(b, 1) + } + } + if (r.force || (x = (g = B(g, (function (t) { + return e = i[t], r = n[t], !(e === r || N(e) && N(r) && function (t, e) { + var n = t.length; + if (n !== e.length) return !1; + for (var i = 0; i < n; i++) if (t[i] !== e[i]) return !1; + return !0 + }(e, r)); + var e, r + }))).length), x > 0 || r.force && !a.length) { + var w, S = void 0, M = void 0, I = void 0; + if (s) { + M = {}, p && (S = {}); + for (_ = 0; _ < x; _++) { + M[v = g[_]] = n[v], p ? S[v] = i[v] : n[v] = i[v] + } + } else if (p) { + I = {}; + for (_ = 0; _ < x; _++) { + I[v = g[_]] = ti(n[v]), Ir(n, i, v) + } + } + (w = new ai(n, !1, !1, c ? B(f, (function (t) { + return t.targetName === e + })) : null)).targetName = e, r.scope && (w.scope = r.scope), p && S && w.whenWithKeys(0, S, g), I && w.whenWithKeys(0, I, g), w.whenWithKeys(null == u ? 500 : u, s ? M : i, g).delay(h || 0), t.addAnimator(w, e), a.push(w) + } + } + + R(wr, Xt), R(wr, qi); + var Cr = function (t) { + function e(e) { + var n = t.call(this) || this; + return n.isGroup = !0, n._children = [], n.attr(e), n + } + + return n(e, t), e.prototype.childrenRef = function () { + return this._children + }, e.prototype.children = function () { + return this._children.slice() + }, e.prototype.childAt = function (t) { + return this._children[t] + }, e.prototype.childOfName = function (t) { + for (var e = this._children, n = 0; n < e.length; n++) if (e[n].name === t) return e[n] + }, e.prototype.childCount = function () { + return this._children.length + }, e.prototype.add = function (t) { + return t && t !== this && t.parent !== this && (this._children.push(t), this._doAdd(t)), this + }, e.prototype.addBefore = function (t, e) { + if (t && t !== this && t.parent !== this && e && e.parent === this) { + var n = this._children, i = n.indexOf(e); + i >= 0 && (n.splice(i, 0, t), this._doAdd(t)) + } + return this + }, e.prototype.replace = function (t, e) { + var n = P(this._children, t); + return n >= 0 && this.replaceAt(e, n), this + }, e.prototype.replaceAt = function (t, e) { + var n = this._children, i = n[e]; + if (t && t !== this && t.parent !== this && t !== i) { + n[e] = t, i.parent = null; + var r = this.__zr; + r && i.removeSelfFromZr(r), this._doAdd(t) + } + return this + }, e.prototype._doAdd = function (t) { + t.parent && t.parent.remove(t), t.parent = this; + var e = this.__zr; + e && e !== t.__zr && t.addSelfToZr(e), e && e.refresh() + }, e.prototype.remove = function (t) { + var e = this.__zr, n = this._children, i = P(n, t); + return i < 0 || (n.splice(i, 1), t.parent = null, e && t.removeSelfFromZr(e), e && e.refresh()), this + }, e.prototype.removeAll = function () { + for (var t = this._children, e = this.__zr, n = 0; n < t.length; n++) { + var i = t[n]; + e && i.removeSelfFromZr(e), i.parent = null + } + return t.length = 0, this + }, e.prototype.eachChild = function (t, e) { + for (var n = this._children, i = 0; i < n.length; i++) { + var r = n[i]; + t.call(e, r, i) + } + return this + }, e.prototype.traverse = function (t, e) { + for (var n = 0; n < this._children.length; n++) { + var i = this._children[n], r = t.call(e, i); + i.isGroup && !r && i.traverse(t, e) + } + return this + }, e.prototype.addSelfToZr = function (e) { + t.prototype.addSelfToZr.call(this, e); + for (var n = 0; n < this._children.length; n++) { + this._children[n].addSelfToZr(e) + } + }, e.prototype.removeSelfFromZr = function (e) { + t.prototype.removeSelfFromZr.call(this, e); + for (var n = 0; n < this._children.length; n++) { + this._children[n].removeSelfFromZr(e) + } + }, e.prototype.getBoundingRect = function (t) { + for (var e = new sr(0, 0, 0, 0), n = t || this._children, i = [], r = null, o = 0; o < n.length; o++) { + var a = n[o]; + if (!a.ignore && !a.invisible) { + var s = a.getBoundingRect(), l = a.getLocalTransform(i); + l ? (sr.applyTransform(e, s, l), (r = r || e.clone()).union(e)) : (r = r || s.clone()).union(s) + } + } + return r || e + }, e + }(wr); + Cr.prototype.type = "group"; + /*! + * ZRender, a high performance 2d drawing library. + * + * Copyright (c) 2013, Baidu Inc. + * All rights reserved. + * + * LICENSE + * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt + */ + var Dr = {}, Ar = {}; + var kr = function () { + function t(t, e, n) { + var i = this; + this._sleepAfterStill = 10, this._stillFrameAccum = 0, this._needsRefresh = !0, this._needsRefreshHover = !0, this._darkMode = !1, n = n || {}, this.dom = e, this.id = t; + var o = new Ae, a = n.renderer || "canvas"; + Dr[a] || (a = G(Dr)[0]), n.useDirtyRect = null != n.useDirtyRect && n.useDirtyRect; + var s = new Dr[a](e, o, n, t), l = n.ssr || s.ssrOnly; + this.storage = o, this.painter = s; + var u = r.node || r.worker || l ? null : new Ci(s.getViewportRoot(), s.root); + this.handler = new ve(o, s, u, s.root), this.animation = new hi({ + stage: { + update: l ? null : function () { + return i._flush(!0) + } + } + }), l || this.animation.start() + } + + return t.prototype.add = function (t) { + t && (this.storage.addRoot(t), t.addSelfToZr(this), this.refresh()) + }, t.prototype.remove = function (t) { + t && (this.storage.delRoot(t), t.removeSelfFromZr(this), this.refresh()) + }, t.prototype.configLayer = function (t, e) { + this.painter.configLayer && this.painter.configLayer(t, e), this.refresh() + }, t.prototype.setBackgroundColor = function (t) { + this.painter.setBackgroundColor && this.painter.setBackgroundColor(t), this.refresh(), this._backgroundColor = t, this._darkMode = function (t) { + if (!t) return !1; + if ("string" == typeof t) return Ln(t, 1) < .4; + if (t.colorStops) { + for (var e = t.colorStops, n = 0, i = e.length, r = 0; r < i; r++) n += Ln(e[r].color, 1); + return (n /= i) < .4 + } + return !1 + }(t) + }, t.prototype.getBackgroundColor = function () { + return this._backgroundColor + }, t.prototype.setDarkMode = function (t) { + this._darkMode = t + }, t.prototype.isDarkMode = function () { + return this._darkMode + }, t.prototype.refreshImmediately = function (t) { + t || this.animation.update(!0), this._needsRefresh = !1, this.painter.refresh(), this._needsRefresh = !1 + }, t.prototype.refresh = function () { + this._needsRefresh = !0, this.animation.start() + }, t.prototype.flush = function () { + this._flush(!1) + }, t.prototype._flush = function (t) { + var e, n = si(); + this._needsRefresh && (e = !0, this.refreshImmediately(t)), this._needsRefreshHover && (e = !0, this.refreshHoverImmediately()); + var i = si(); + e ? (this._stillFrameAccum = 0, this.trigger("rendered", {elapsedTime: i - n})) : this._sleepAfterStill > 0 && (this._stillFrameAccum++, this._stillFrameAccum > this._sleepAfterStill && this.animation.stop()) + }, t.prototype.setSleepAfterStill = function (t) { + this._sleepAfterStill = t + }, t.prototype.wakeUp = function () { + this.animation.start(), this._stillFrameAccum = 0 + }, t.prototype.refreshHover = function () { + this._needsRefreshHover = !0 + }, t.prototype.refreshHoverImmediately = function () { + this._needsRefreshHover = !1, this.painter.refreshHover && "canvas" === this.painter.getType() && this.painter.refreshHover() + }, t.prototype.resize = function (t) { + t = t || {}, this.painter.resize(t.width, t.height), this.handler.resize() + }, t.prototype.clearAnimation = function () { + this.animation.clear() + }, t.prototype.getWidth = function () { + return this.painter.getWidth() + }, t.prototype.getHeight = function () { + return this.painter.getHeight() + }, t.prototype.setCursorStyle = function (t) { + this.handler.setCursorStyle(t) + }, t.prototype.findHover = function (t, e) { + return this.handler.findHover(t, e) + }, t.prototype.on = function (t, e, n) { + return this.handler.on(t, e, n), this + }, t.prototype.off = function (t, e) { + this.handler.off(t, e) + }, t.prototype.trigger = function (t, e) { + this.handler.trigger(t, e) + }, t.prototype.clear = function () { + for (var t = this.storage.getRoots(), e = 0; e < t.length; e++) t[e] instanceof Cr && t[e].removeSelfFromZr(this); + this.storage.delAllRoots(), this.painter.clear() + }, t.prototype.dispose = function () { + var t; + this.animation.stop(), this.clear(), this.storage.dispose(), this.painter.dispose(), this.handler.dispose(), this.animation = this.storage = this.painter = this.handler = null, t = this.id, delete Ar[t] + }, t + }(); + + function Lr(t, e) { + var n = new kr(M(), t, e); + return Ar[n.id] = n, n + } + + function Pr(t, e) { + Dr[t] = e + } + + var Or = Object.freeze({ + __proto__: null, init: Lr, dispose: function (t) { + t.dispose() + }, disposeAll: function () { + for (var t in Ar) Ar.hasOwnProperty(t) && Ar[t].dispose(); + Ar = {} + }, getInstance: function (t) { + return Ar[t] + }, registerPainter: Pr, version: "5.3.0" + }), Rr = 1e-4; + + function Nr(t, e, n, i) { + var r = e[0], o = e[1], a = n[0], s = n[1], l = o - r, u = s - a; + if (0 === l) return 0 === u ? a : (a + s) / 2; + if (i) if (l > 0) { + if (t <= r) return a; + if (t >= o) return s + } else { + if (t >= r) return a; + if (t <= o) return s + } else { + if (t === r) return a; + if (t === o) return s + } + return (t - r) / l * u + a + } + + function Er(t, e) { + switch (t) { + case"center": + case"middle": + t = "50%"; + break; + case"left": + case"top": + t = "0%"; + break; + case"right": + case"bottom": + t = "100%" + } + return X(t) ? (n = t, n.replace(/^\s+|\s+$/g, "")).match(/%$/) ? parseFloat(t) / 100 * e : parseFloat(t) : null == t ? NaN : +t; + var n + } + + function zr(t, e, n) { + return null == e && (e = 10), e = Math.min(Math.max(0, e), 20), t = (+t).toFixed(e), n ? t : +t + } + + function Vr(t) { + return t.sort((function (t, e) { + return t - e + })), t + } + + function Br(t) { + if (t = +t, isNaN(t)) return 0; + if (t > 1e-14) for (var e = 1, n = 0; n < 15; n++, e *= 10) if (Math.round(t * e) / e === t) return n; + return Fr(t) + } + + function Fr(t) { + var e = t.toString().toLowerCase(), n = e.indexOf("e"), i = n > 0 ? +e.slice(n + 1) : 0, + r = n > 0 ? n : e.length, o = e.indexOf("."), a = o < 0 ? 0 : r - 1 - o; + return Math.max(0, a - i) + } + + function Gr(t, e) { + var n = Math.log, i = Math.LN10, r = Math.floor(n(t[1] - t[0]) / i), + o = Math.round(n(Math.abs(e[1] - e[0])) / i), a = Math.min(Math.max(-r + o, 0), 20); + return isFinite(a) ? a : 20 + } + + function Wr(t, e, n) { + if (!t[e]) return 0; + var i = V(t, (function (t, e) { + return t + (isNaN(e) ? 0 : e) + }), 0); + if (0 === i) return 0; + for (var r = Math.pow(10, n), o = z(t, (function (t) { + return (isNaN(t) ? 0 : t) / i * r * 100 + })), a = 100 * r, s = z(o, (function (t) { + return Math.floor(t) + })), l = V(s, (function (t, e) { + return t + e + }), 0), u = z(o, (function (t, e) { + return t - s[e] + })); l < a;) { + for (var h = Number.NEGATIVE_INFINITY, c = null, p = 0, d = u.length; p < d; ++p) u[p] > h && (h = u[p], c = p); + ++s[c], u[c] = 0, ++l + } + return s[e] / r + } + + function Hr(t, e) { + var n = Math.max(Br(t), Br(e)), i = t + e; + return n > 20 ? i : zr(i, n) + } + + var Yr = 9007199254740991; + + function Ur(t) { + var e = 2 * Math.PI; + return (t % e + e) % e + } + + function Xr(t) { + return t > -1e-4 && t < Rr + } + + var Zr = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; + + function jr(t) { + if (t instanceof Date) return t; + if (X(t)) { + var e = Zr.exec(t); + if (!e) return new Date(NaN); + if (e[8]) { + var n = +e[4] || 0; + return "Z" !== e[8].toUpperCase() && (n -= +e[8].slice(0, 3)), new Date(Date.UTC(+e[1], +(e[2] || 1) - 1, +e[3] || 1, n, +(e[5] || 0), +e[6] || 0, e[7] ? +e[7].substring(0, 3) : 0)) + } + return new Date(+e[1], +(e[2] || 1) - 1, +e[3] || 1, +e[4] || 0, +(e[5] || 0), +e[6] || 0, e[7] ? +e[7].substring(0, 3) : 0) + } + return null == t ? new Date(NaN) : new Date(Math.round(t)) + } + + function qr(t) { + return Math.pow(10, Kr(t)) + } + + function Kr(t) { + if (0 === t) return 0; + var e = Math.floor(Math.log(t) / Math.LN10); + return t / Math.pow(10, e) >= 10 && e++, e + } + + function $r(t, e) { + var n = Kr(t), i = Math.pow(10, n), r = t / i; + return t = (e ? r < 1.5 ? 1 : r < 2.5 ? 2 : r < 4 ? 3 : r < 7 ? 5 : 10 : r < 1 ? 1 : r < 2 ? 2 : r < 3 ? 3 : r < 5 ? 5 : 10) * i, n >= -20 ? +t.toFixed(n < 0 ? -n : 0) : t + } + + function Jr(t, e) { + var n = (t.length - 1) * e + 1, i = Math.floor(n), r = +t[i - 1], o = n - i; + return o ? r + o * (t[i] - r) : r + } + + function Qr(t) { + t.sort((function (t, e) { + return s(t, e, 0) ? -1 : 1 + })); + for (var e = -1 / 0, n = 1, i = 0; i < t.length;) { + for (var r = t[i].interval, o = t[i].close, a = 0; a < 2; a++) r[a] <= e && (r[a] = e, o[a] = a ? 1 : 1 - n), e = r[a], n = o[a]; + r[0] === r[1] && o[0] * o[1] != 1 ? t.splice(i, 1) : i++ + } + return t; + + function s(t, e, n) { + return t.interval[n] < e.interval[n] || t.interval[n] === e.interval[n] && (t.close[n] - e.close[n] == (n ? -1 : 1) || !n && s(t, e, 1)) + } + } + + function to(t) { + var e = parseFloat(t); + return e == t && (0 !== e || !X(t) || t.indexOf("x") <= 0) ? e : NaN + } + + function eo(t) { + return !isNaN(to(t)) + } + + function no() { + return Math.round(9 * Math.random()) + } + + function io(t, e) { + return 0 === e ? t : io(e, t % e) + } + + function ro(t, e) { + return null == t ? e : null == e ? t : t * e / io(t, e) + } + + "undefined" != typeof console && console.warn && console.log; + + function oo(t) { + 0 + } + + function ao(t) { + throw new Error(t) + } + + function so(t, e, n) { + return (e - t) * n + t + } + + var lo = "series\0", uo = "\0_ec_\0"; + + function ho(t) { + return t instanceof Array ? t : null == t ? [] : [t] + } + + function co(t, e, n) { + if (t) { + t[e] = t[e] || {}, t.emphasis = t.emphasis || {}, t.emphasis[e] = t.emphasis[e] || {}; + for (var i = 0, r = n.length; i < r; i++) { + var o = n[i]; + !t.emphasis[e].hasOwnProperty(o) && t[e].hasOwnProperty(o) && (t.emphasis[e][o] = t[e][o]) + } + } + } + + var po = ["fontStyle", "fontWeight", "fontSize", "fontFamily", "rich", "tag", "color", "textBorderColor", "textBorderWidth", "width", "height", "lineHeight", "align", "verticalAlign", "baseline", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY", "textShadowColor", "textShadowBlur", "textShadowOffsetX", "textShadowOffsetY", "backgroundColor", "borderColor", "borderWidth", "borderRadius", "padding"]; + + function fo(t) { + return !q(t) || Y(t) || t instanceof Date ? t : t.value + } + + function go(t) { + return q(t) && !(t instanceof Array) + } + + function yo(t, e, n) { + var i = "normalMerge" === n, r = "replaceMerge" === n, o = "replaceAll" === n; + t = t || [], e = (e || []).slice(); + var a = ft(); + E(e, (function (t, n) { + q(t) || (e[n] = null) + })); + var s, l, u = function (t, e, n) { + var i = []; + if ("replaceAll" === n) return i; + for (var r = 0; r < t.length; r++) { + var o = t[r]; + o && null != o.id && e.set(o.id, r), i.push({ + existing: "replaceMerge" === n || bo(o) ? null : o, + newOption: null, + keyInfo: null, + brandNew: null + }) + } + return i + }(t, a, n); + return (i || r) && function (t, e, n, i) { + E(i, (function (r, o) { + if (r && null != r.id) { + var a = mo(r.id), s = n.get(a); + if (null != s) { + var l = t[s]; + lt(!l.newOption, 'Duplicated option on id "' + a + '".'), l.newOption = r, l.existing = e[s], i[o] = null + } + } + })) + }(u, t, a, e), i && function (t, e) { + E(e, (function (n, i) { + if (n && null != n.name) for (var r = 0; r < t.length; r++) { + var o = t[r].existing; + if (!t[r].newOption && o && (null == o.id || null == n.id) && !bo(n) && !bo(o) && vo("name", o, n)) return t[r].newOption = n, void (e[i] = null) + } + })) + }(u, e), i || r ? function (t, e, n) { + E(e, (function (e) { + if (e) { + for (var i, r = 0; (i = t[r]) && (i.newOption || bo(i.existing) || i.existing && null != e.id && !vo("id", e, i.existing));) r++; + i ? (i.newOption = e, i.brandNew = n) : t.push({ + newOption: e, + brandNew: n, + existing: null, + keyInfo: null + }), r++ + } + })) + }(u, e, r) : o && function (t, e) { + E(e, (function (e) { + t.push({newOption: e, brandNew: !0, existing: null, keyInfo: null}) + })) + }(u, e), s = u, l = ft(), E(s, (function (t) { + var e = t.existing; + e && l.set(e.id, t) + })), E(s, (function (t) { + var e = t.newOption; + lt(!e || null == e.id || !l.get(e.id) || l.get(e.id) === t, "id duplicates: " + (e && e.id)), e && null != e.id && l.set(e.id, t), !t.keyInfo && (t.keyInfo = {}) + })), E(s, (function (t, e) { + var n = t.existing, i = t.newOption, r = t.keyInfo; + if (q(i)) { + if (r.name = null != i.name ? mo(i.name) : n ? n.name : lo + e, n) r.id = mo(n.id); else if (null != i.id) r.id = mo(i.id); else { + var o = 0; + do { + r.id = "\0" + r.name + "\0" + o++ + } while (l.get(r.id)) + } + l.set(r.id, t) + } + })), u + } + + function vo(t, e, n) { + var i = xo(e[t], null), r = xo(n[t], null); + return null != i && null != r && i === r + } + + function mo(t) { + return xo(t, "") + } + + function xo(t, e) { + return null == t ? e : X(t) ? t : j(t) || Z(t) ? t + "" : e + } + + function _o(t) { + var e = t.name; + return !(!e || !e.indexOf(lo)) + } + + function bo(t) { + return t && null != t.id && 0 === mo(t.id).indexOf(uo) + } + + function wo(t, e) { + return null != e.dataIndexInside ? e.dataIndexInside : null != e.dataIndex ? Y(e.dataIndex) ? z(e.dataIndex, (function (e) { + return t.indexOfRawIndex(e) + })) : t.indexOfRawIndex(e.dataIndex) : null != e.name ? Y(e.name) ? z(e.name, (function (e) { + return t.indexOfName(e) + })) : t.indexOfName(e.name) : void 0 + } + + function So() { + var t = "__ec_inner_" + Mo++; + return function (e) { + return e[t] || (e[t] = {}) + } + } + + var Mo = no(); + + function Io(t, e, n) { + var i = To(e, n), r = i.mainTypeSpecified, o = i.queryOptionMap, a = i.others, s = n ? n.defaultMainType : null; + return !r && s && o.set(s, {}), o.each((function (e, i) { + var r = Ao(t, i, e, { + useDefault: s === i, + enableAll: !n || null == n.enableAll || n.enableAll, + enableNone: !n || null == n.enableNone || n.enableNone + }); + a[i + "Models"] = r.models, a[i + "Model"] = r.models[0] + })), a + } + + function To(t, e) { + var n; + if (X(t)) { + var i = {}; + i[t + "Index"] = 0, n = i + } else n = t; + var r = ft(), o = {}, a = !1; + return E(n, (function (t, n) { + if ("dataIndex" !== n && "dataIndexInside" !== n) { + var i = n.match(/^(\w+)(Index|Id|Name)$/) || [], s = i[1], l = (i[2] || "").toLowerCase(); + if (s && l && !(e && e.includeMainTypes && P(e.includeMainTypes, s) < 0)) a = a || !!s, (r.get(s) || r.set(s, {}))[l] = t + } else o[n] = t + })), {mainTypeSpecified: a, queryOptionMap: r, others: o} + } + + var Co = {useDefault: !0, enableAll: !1, enableNone: !1}, Do = {useDefault: !1, enableAll: !0, enableNone: !0}; + + function Ao(t, e, n, i) { + i = i || Co; + var r = n.index, o = n.id, a = n.name, s = {models: null, specified: null != r || null != o || null != a}; + if (!s.specified) { + var l = void 0; + return s.models = i.useDefault && (l = t.getComponent(e)) ? [l] : [], s + } + return "none" === r || !1 === r ? (lt(i.enableNone, '`"none"` or `false` is not a valid value on index option.'), s.models = [], s) : ("all" === r && (lt(i.enableAll, '`"all"` is not a valid value on index option.'), r = o = a = null), s.models = t.queryComponents({ + mainType: e, + index: r, + id: o, + name: a + }), s) + } + + function ko(t, e, n) { + t.setAttribute ? t.setAttribute(e, n) : t[e] = n + } + + function Lo(t, e) { + var n = ft(), i = []; + return E(t, (function (t) { + var r = e(t); + (n.get(r) || (i.push(r), n.set(r, []))).push(t) + })), {keys: i, buckets: n} + } + + function Po(t, e, n, i, r) { + var o = null == e || "auto" === e; + if (null == i) return i; + if (j(i)) return zr(f = so(n || 0, i, r), o ? Math.max(Br(n || 0), Br(i)) : e); + if (X(i)) return r < 1 ? n : i; + for (var a = [], s = n, l = i, u = Math.max(s ? s.length : 0, l.length), h = 0; h < u; ++h) { + var c = t.getDimensionInfo(h); + if (c && "ordinal" === c.type) a[h] = (r < 1 && s ? s : l)[h]; else { + var p = s && s[h] ? s[h] : 0, d = l[h], f = so(p, d, r); + a[h] = zr(f, o ? Math.max(Br(p), Br(d)) : e) + } + } + return a + } + + var Oo = "___EC__COMPONENT__CONTAINER___", Ro = "___EC__EXTENDED_CLASS___"; + + function No(t) { + var e = {main: "", sub: ""}; + if (t) { + var n = t.split("."); + e.main = n[0] || "", e.sub = n[1] || "" + } + return e + } + + function Eo(t, e) { + t.$constructor = t, t.extend = function (t) { + var e, i, r = this; + return U(i = r) && /^class\s/.test(Function.prototype.toString.call(i)) ? e = function (t) { + function e() { + return t.apply(this, arguments) || this + } + + return n(e, t), e + }(r) : O(e = function () { + (t.$constructor || r).apply(this, arguments) + }, this), A(e.prototype, t), e[Ro] = !0, e.extend = this.extend, e.superCall = Bo, e.superApply = Fo, e.superClass = r, e + } + } + + function zo(t, e) { + t.extend = e.extend + } + + var Vo = Math.round(10 * Math.random()); + + function Bo(t, e) { + for (var n = [], i = 2; i < arguments.length; i++) n[i - 2] = arguments[i]; + return this.superClass.prototype[e].apply(t, n) + } + + function Fo(t, e, n) { + return this.superClass.prototype[e].apply(t, n) + } + + function Go(t) { + var e = {}; + t.registerClass = function (t) { + var n, i = t.type || t.prototype.type; + if (i) { + lt(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(n = i), 'componentType "' + n + '" illegal'), t.prototype.type = i; + var r = No(i); + if (r.sub) { + if (r.sub !== Oo) { + (function (t) { + var n = e[t.main]; + n && n[Oo] || ((n = e[t.main] = {})[Oo] = !0); + return n + }(r))[r.sub] = t + } + } else e[r.main] = t + } + return t + }, t.getClass = function (t, n, i) { + var r = e[t]; + if (r && r[Oo] && (r = n ? r[n] : null), i && !r) throw new Error(n ? "Component " + t + "." + (n || "") + " is used but not imported." : t + ".type should be specified."); + return r + }, t.getClassesByMainType = function (t) { + var n = No(t), i = [], r = e[n.main]; + return r && r[Oo] ? E(r, (function (t, e) { + e !== Oo && i.push(t) + })) : i.push(r), i + }, t.hasClass = function (t) { + var n = No(t); + return !!e[n.main] + }, t.getAllClassMainTypes = function () { + var t = []; + return E(e, (function (e, n) { + t.push(n) + })), t + }, t.hasSubTypes = function (t) { + var n = No(t), i = e[n.main]; + return i && i[Oo] + } + } + + function Wo(t, e) { + for (var n = 0; n < t.length; n++) t[n][1] || (t[n][1] = t[n][0]); + return e = e || !1, function (n, i, r) { + for (var o = {}, a = 0; a < t.length; a++) { + var s = t[a][1]; + if (!(i && P(i, s) >= 0 || r && P(r, s) < 0)) { + var l = n.getShallow(s, e); + null != l && (o[t[a][0]] = l) + } + } + return o + } + } + + var Ho = Wo([["fill", "color"], ["shadowBlur"], ["shadowOffsetX"], ["shadowOffsetY"], ["opacity"], ["shadowColor"]]), + Yo = function () { + function t() { + } + + return t.prototype.getAreaStyle = function (t, e) { + return Ho(this, t, e) + }, t + }(), Uo = new ln(50); + + function Xo(t) { + if ("string" == typeof t) { + var e = Uo.get(t); + return e && e.image + } + return t + } + + function Zo(t, e, n, i, r) { + if (t) { + if ("string" == typeof t) { + if (e && e.__zrImageSrc === t || !n) return e; + var o = Uo.get(t), a = {hostEl: n, cb: i, cbPayload: r}; + if (o) !qo(e = o.image) && o.pending.push(a); else { + var s = h.loadImage(t, jo, jo); + s.__zrImageSrc = t, Uo.put(t, s.__cachedImgObj = {image: s, pending: [a]}) + } + return e + } + return t + } + return e + } + + function jo() { + var t = this.__cachedImgObj; + this.onload = this.onerror = this.__cachedImgObj = null; + for (var e = 0; e < t.pending.length; e++) { + var n = t.pending[e], i = n.cb; + i && i(this, n.cbPayload), n.hostEl.dirty() + } + t.pending.length = 0 + } + + function qo(t) { + return t && t.width && t.height + } + + var Ko = /\{([a-zA-Z0-9_]+)\|([^}]*)\}/g; + + function $o(t, e, n, i, r) { + if (!e) return ""; + var o = (t + "").split("\n"); + r = Jo(e, n, i, r); + for (var a = 0, s = o.length; a < s; a++) o[a] = Qo(o[a], r); + return o.join("\n") + } + + function Jo(t, e, n, i) { + var r = A({}, i = i || {}); + r.font = e, n = rt(n, "..."), r.maxIterations = rt(i.maxIterations, 2); + var o = r.minChar = rt(i.minChar, 0); + r.cnCharWidth = ur("国", e); + var a = r.ascCharWidth = ur("a", e); + r.placeholder = rt(i.placeholder, ""); + for (var s = t = Math.max(0, t - 1), l = 0; l < o && s >= a; l++) s -= a; + var u = ur(n, e); + return u > s && (n = "", u = 0), s = t - u, r.ellipsis = n, r.ellipsisWidth = u, r.contentWidth = s, r.containerWidth = t, r + } + + function Qo(t, e) { + var n = e.containerWidth, i = e.font, r = e.contentWidth; + if (!n) return ""; + var o = ur(t, i); + if (o <= n) return t; + for (var a = 0; ; a++) { + if (o <= r || a >= e.maxIterations) { + t += e.ellipsis; + break + } + var s = 0 === a ? ta(t, r, e.ascCharWidth, e.cnCharWidth) : o > 0 ? Math.floor(t.length * r / o) : 0; + o = ur(t = t.substr(0, s), i) + } + return "" === t && (t = e.placeholder), t + } + + function ta(t, e, n, i) { + for (var r = 0, o = 0, a = t.length; o < a && r < e; o++) { + var s = t.charCodeAt(o); + r += 0 <= s && s <= 127 ? n : i + } + return o + } + + var ea = function () { + }, na = function (t) { + this.tokens = [], t && (this.tokens = t) + }, ia = function () { + this.width = 0, this.height = 0, this.contentWidth = 0, this.contentHeight = 0, this.outerWidth = 0, this.outerHeight = 0, this.lines = [] + }; + + function ra(t, e, n, i, r) { + var o, a, s = "" === e, l = r && n.rich[r] || {}, u = t.lines, h = l.font || n.font, c = !1; + if (i) { + var p = l.padding, d = p ? p[1] + p[3] : 0; + if (null != l.width && "auto" !== l.width) { + var f = gr(l.width, i.width) + d; + u.length > 0 && f + i.accumWidth > i.width && (o = e.split("\n"), c = !0), i.accumWidth = f + } else { + var g = sa(e, h, i.width, i.breakAll, i.accumWidth); + i.accumWidth = g.accumWidth + d, a = g.linesWidths, o = g.lines + } + } else o = e.split("\n"); + for (var y = 0; y < o.length; y++) { + var v = o[y], m = new ea; + if (m.styleName = r, m.text = v, m.isLineHolder = !v && !s, "number" == typeof l.width ? m.width = l.width : m.width = a ? a[y] : ur(v, h), y || c) u.push(new na([m])); else { + var x = (u[u.length - 1] || (u[0] = new na)).tokens, _ = x.length; + 1 === _ && x[0].isLineHolder ? x[0] = m : (v || !_ || s) && x.push(m) + } + } + } + + var oa = V(",&?/;] ".split(""), (function (t, e) { + return t[e] = !0, t + }), {}); + + function aa(t) { + return !function (t) { + var e = t.charCodeAt(0); + return e >= 33 && e <= 383 + }(t) || !!oa[t] + } + + function sa(t, e, n, i, r) { + for (var o = [], a = [], s = "", l = "", u = 0, h = 0, c = 0; c < t.length; c++) { + var p = t.charAt(c); + if ("\n" !== p) { + var d = ur(p, e), f = !i && !aa(p); + (o.length ? h + d > n : r + h + d > n) ? h ? (s || l) && (f ? (s || (s = l, l = "", h = u = 0), o.push(s), a.push(h - u), l += p, s = "", h = u += d) : (l && (s += l, l = "", u = 0), o.push(s), a.push(h), s = p, h = d)) : f ? (o.push(l), a.push(u), l = p, u = d) : (o.push(p), a.push(d)) : (h += d, f ? (l += p, u += d) : (l && (s += l, l = "", u = 0), s += p)) + } else l && (s += l, h += u), o.push(s), a.push(h), s = "", l = "", u = 0, h = 0 + } + return o.length || s || (s = t, l = "", u = 0), l && (s += l), s && (o.push(s), a.push(h)), 1 === o.length && (h += r), { + accumWidth: h, + lines: o, + linesWidths: a + } + } + + var la = "__zr_style_" + Math.round(10 * Math.random()), + ua = {shadowBlur: 0, shadowOffsetX: 0, shadowOffsetY: 0, shadowColor: "#000", opacity: 1, blend: "source-over"}, + ha = {style: {shadowBlur: !0, shadowOffsetX: !0, shadowOffsetY: !0, shadowColor: !0, opacity: !0}}; + ua[la] = !0; + var ca = ["z", "z2", "invisible"], pa = ["invisible"], da = function (t) { + function e(e) { + return t.call(this, e) || this + } + + var i; + return n(e, t), e.prototype._init = function (e) { + for (var n = G(e), i = 0; i < n.length; i++) { + var r = n[i]; + "style" === r ? this.useStyle(e[r]) : t.prototype.attrKV.call(this, r, e[r]) + } + this.style || this.useStyle({}) + }, e.prototype.beforeBrush = function () { + }, e.prototype.afterBrush = function () { + }, e.prototype.innerBeforeBrush = function () { + }, e.prototype.innerAfterBrush = function () { + }, e.prototype.shouldBePainted = function (t, e, n, i) { + var r = this.transform; + if (this.ignore || this.invisible || 0 === this.style.opacity || this.culling && function (t, e, n) { + fa.copy(t.getBoundingRect()), t.transform && fa.applyTransform(t.transform); + return ga.width = e, ga.height = n, !fa.intersect(ga) + }(this, t, e) || r && !r[0] && !r[3]) return !1; + if (n && this.__clipPaths) for (var o = 0; o < this.__clipPaths.length; ++o) if (this.__clipPaths[o].isZeroArea()) return !1; + if (i && this.parent) for (var a = this.parent; a;) { + if (a.ignore) return !1; + a = a.parent + } + return !0 + }, e.prototype.contain = function (t, e) { + return this.rectContain(t, e) + }, e.prototype.traverse = function (t, e) { + t.call(e, this) + }, e.prototype.rectContain = function (t, e) { + var n = this.transformCoordToLocal(t, e); + return this.getBoundingRect().contain(n[0], n[1]) + }, e.prototype.getPaintRect = function () { + var t = this._paintRect; + if (!this._paintRect || this.__dirty) { + var e = this.transform, n = this.getBoundingRect(), i = this.style, r = i.shadowBlur || 0, + o = i.shadowOffsetX || 0, a = i.shadowOffsetY || 0; + t = this._paintRect || (this._paintRect = new sr(0, 0, 0, 0)), e ? sr.applyTransform(t, n, e) : t.copy(n), (r || o || a) && (t.width += 2 * r + Math.abs(o), t.height += 2 * r + Math.abs(a), t.x = Math.min(t.x, t.x + o - r), t.y = Math.min(t.y, t.y + a - r)); + var s = this.dirtyRectTolerance; + t.isZero() || (t.x = Math.floor(t.x - s), t.y = Math.floor(t.y - s), t.width = Math.ceil(t.width + 1 + 2 * s), t.height = Math.ceil(t.height + 1 + 2 * s)) + } + return t + }, e.prototype.setPrevPaintRect = function (t) { + t ? (this._prevPaintRect = this._prevPaintRect || new sr(0, 0, 0, 0), this._prevPaintRect.copy(t)) : this._prevPaintRect = null + }, e.prototype.getPrevPaintRect = function () { + return this._prevPaintRect + }, e.prototype.animateStyle = function (t) { + return this.animate("style", t) + }, e.prototype.updateDuringAnimation = function (t) { + "style" === t ? this.dirtyStyle() : this.markRedraw() + }, e.prototype.attrKV = function (e, n) { + "style" !== e ? t.prototype.attrKV.call(this, e, n) : this.style ? this.setStyle(n) : this.useStyle(n) + }, e.prototype.setStyle = function (t, e) { + return "string" == typeof t ? this.style[t] = e : A(this.style, t), this.dirtyStyle(), this + }, e.prototype.dirtyStyle = function (t) { + t || this.markRedraw(), this.__dirty |= 2, this._rect && (this._rect = null) + }, e.prototype.dirty = function () { + this.dirtyStyle() + }, e.prototype.styleChanged = function () { + return !!(2 & this.__dirty) + }, e.prototype.styleUpdated = function () { + this.__dirty &= -3 + }, e.prototype.createStyle = function (t) { + return yt(ua, t) + }, e.prototype.useStyle = function (t) { + t[la] || (t = this.createStyle(t)), this.__inHover ? this.__hoverStyle = t : this.style = t, this.dirtyStyle() + }, e.prototype.isStyleObject = function (t) { + return t[la] + }, e.prototype._innerSaveToNormal = function (e) { + t.prototype._innerSaveToNormal.call(this, e); + var n = this._normalState; + e.style && !n.style && (n.style = this._mergeStyle(this.createStyle(), this.style)), this._savePrimaryToNormal(e, n, ca) + }, e.prototype._applyStateObj = function (e, n, i, r, o, a) { + t.prototype._applyStateObj.call(this, e, n, i, r, o, a); + var s, l = !(n && r); + if (n && n.style ? o ? r ? s = n.style : (s = this._mergeStyle(this.createStyle(), i.style), this._mergeStyle(s, n.style)) : (s = this._mergeStyle(this.createStyle(), r ? this.style : i.style), this._mergeStyle(s, n.style)) : l && (s = i.style), s) if (o) { + var u = this.style; + if (this.style = this.createStyle(l ? {} : u), l) for (var h = G(u), c = 0; c < h.length; c++) { + (d = h[c]) in s && (s[d] = s[d], this.style[d] = u[d]) + } + var p = G(s); + for (c = 0; c < p.length; c++) { + var d = p[c]; + this.style[d] = this.style[d] + } + this._transitionState(e, {style: s}, a, this.getAnimationStyleProps()) + } else this.useStyle(s); + var f = this.__inHover ? pa : ca; + for (c = 0; c < f.length; c++) { + d = f[c]; + n && null != n[d] ? this[d] = n[d] : l && null != i[d] && (this[d] = i[d]) + } + }, e.prototype._mergeStates = function (e) { + for (var n, i = t.prototype._mergeStates.call(this, e), r = 0; r < e.length; r++) { + var o = e[r]; + o.style && (n = n || {}, this._mergeStyle(n, o.style)) + } + return n && (i.style = n), i + }, e.prototype._mergeStyle = function (t, e) { + return A(t, e), t + }, e.prototype.getAnimationStyleProps = function () { + return ha + }, e.initDefaultProps = ((i = e.prototype).type = "displayable", i.invisible = !1, i.z = 0, i.z2 = 0, i.zlevel = 0, i.culling = !1, i.cursor = "pointer", i.rectHover = !1, i.incremental = !1, i._rect = null, i.dirtyRectTolerance = 0, void (i.__dirty = 3)), e + }(wr), fa = new sr(0, 0, 0, 0), ga = new sr(0, 0, 0, 0); + var ya = Math.min, va = Math.max, ma = Math.sin, xa = Math.cos, _a = 2 * Math.PI, ba = wt(), wa = wt(), Sa = wt(); + + function Ma(t, e, n) { + if (0 !== t.length) { + for (var i = t[0], r = i[0], o = i[0], a = i[1], s = i[1], l = 1; l < t.length; l++) i = t[l], r = ya(r, i[0]), o = va(o, i[0]), a = ya(a, i[1]), s = va(s, i[1]); + e[0] = r, e[1] = a, n[0] = o, n[1] = s + } + } + + function Ia(t, e, n, i, r, o) { + r[0] = ya(t, n), r[1] = ya(e, i), o[0] = va(t, n), o[1] = va(e, i) + } + + var Ta = [], Ca = []; + + function Da(t, e, n, i, r, o, a, s, l, u) { + var h = Xe, c = He, p = h(t, n, r, a, Ta); + l[0] = 1 / 0, l[1] = 1 / 0, u[0] = -1 / 0, u[1] = -1 / 0; + for (var d = 0; d < p; d++) { + var f = c(t, n, r, a, Ta[d]); + l[0] = ya(f, l[0]), u[0] = va(f, u[0]) + } + p = h(e, i, o, s, Ca); + for (d = 0; d < p; d++) { + var g = c(e, i, o, s, Ca[d]); + l[1] = ya(g, l[1]), u[1] = va(g, u[1]) + } + l[0] = ya(t, l[0]), u[0] = va(t, u[0]), l[0] = ya(a, l[0]), u[0] = va(a, u[0]), l[1] = ya(e, l[1]), u[1] = va(e, u[1]), l[1] = ya(s, l[1]), u[1] = va(s, u[1]) + } + + function Aa(t, e, n, i, r, o, a, s) { + var l = Je, u = Ke, h = va(ya(l(t, n, r), 1), 0), c = va(ya(l(e, i, o), 1), 0), p = u(t, n, r, h), + d = u(e, i, o, c); + a[0] = ya(t, r, p), a[1] = ya(e, o, d), s[0] = va(t, r, p), s[1] = va(e, o, d) + } + + function ka(t, e, n, i, r, o, a, s, l) { + var u = Gt, h = Wt, c = Math.abs(r - o); + if (c % _a < 1e-4 && c > 1e-4) return s[0] = t - n, s[1] = e - i, l[0] = t + n, void (l[1] = e + i); + if (ba[0] = xa(r) * n + t, ba[1] = ma(r) * i + e, wa[0] = xa(o) * n + t, wa[1] = ma(o) * i + e, u(s, ba, wa), h(l, ba, wa), (r %= _a) < 0 && (r += _a), (o %= _a) < 0 && (o += _a), r > o && !a ? o += _a : r < o && a && (r += _a), a) { + var p = o; + o = r, r = p + } + for (var d = 0; d < o; d += Math.PI / 2) d > r && (Sa[0] = xa(d) * n + t, Sa[1] = ma(d) * i + e, u(s, Sa, s), h(l, Sa, l)) + } + + var La = {M: 1, L: 2, C: 3, Q: 4, A: 5, Z: 6, R: 7}, Pa = [], Oa = [], Ra = [], Na = [], Ea = [], za = [], + Va = Math.min, Ba = Math.max, Fa = Math.cos, Ga = Math.sin, Wa = Math.abs, Ha = Math.PI, Ya = 2 * Ha, + Ua = "undefined" != typeof Float32Array, Xa = []; + + function Za(t) { + return Math.round(t / Ha * 1e8) / 1e8 % 2 * Ha + } + + var ja = function () { + function t(t) { + this.dpr = 1, this._xi = 0, this._yi = 0, this._x0 = 0, this._y0 = 0, this._len = 0, t && (this._saveData = !1), this._saveData && (this.data = []) + } + + return t.prototype.increaseVersion = function () { + this._version++ + }, t.prototype.getVersion = function () { + return this._version + }, t.prototype.setScale = function (t, e, n) { + (n = n || 0) > 0 && (this._ux = Wa(n / Ai / t) || 0, this._uy = Wa(n / Ai / e) || 0) + }, t.prototype.setDPR = function (t) { + this.dpr = t + }, t.prototype.setContext = function (t) { + this._ctx = t + }, t.prototype.getContext = function () { + return this._ctx + }, t.prototype.beginPath = function () { + return this._ctx && this._ctx.beginPath(), this.reset(), this + }, t.prototype.reset = function () { + this._saveData && (this._len = 0), this._pathSegLen && (this._pathSegLen = null, this._pathLen = 0), this._version++ + }, t.prototype.moveTo = function (t, e) { + return this._drawPendingPt(), this.addData(La.M, t, e), this._ctx && this._ctx.moveTo(t, e), this._x0 = t, this._y0 = e, this._xi = t, this._yi = e, this + }, t.prototype.lineTo = function (t, e) { + var n = Wa(t - this._xi), i = Wa(e - this._yi), r = n > this._ux || i > this._uy; + if (this.addData(La.L, t, e), this._ctx && r && this._ctx.lineTo(t, e), r) this._xi = t, this._yi = e, this._pendingPtDist = 0; else { + var o = n * n + i * i; + o > this._pendingPtDist && (this._pendingPtX = t, this._pendingPtY = e, this._pendingPtDist = o) + } + return this + }, t.prototype.bezierCurveTo = function (t, e, n, i, r, o) { + return this._drawPendingPt(), this.addData(La.C, t, e, n, i, r, o), this._ctx && this._ctx.bezierCurveTo(t, e, n, i, r, o), this._xi = r, this._yi = o, this + }, t.prototype.quadraticCurveTo = function (t, e, n, i) { + return this._drawPendingPt(), this.addData(La.Q, t, e, n, i), this._ctx && this._ctx.quadraticCurveTo(t, e, n, i), this._xi = n, this._yi = i, this + }, t.prototype.arc = function (t, e, n, i, r, o) { + this._drawPendingPt(), Xa[0] = i, Xa[1] = r, function (t, e) { + var n = Za(t[0]); + n < 0 && (n += Ya); + var i = n - t[0], r = t[1]; + r += i, !e && r - n >= Ya ? r = n + Ya : e && n - r >= Ya ? r = n - Ya : !e && n > r ? r = n + (Ya - Za(n - r)) : e && n < r && (r = n - (Ya - Za(r - n))), t[0] = n, t[1] = r + }(Xa, o), i = Xa[0]; + var a = (r = Xa[1]) - i; + return this.addData(La.A, t, e, n, n, i, a, 0, o ? 0 : 1), this._ctx && this._ctx.arc(t, e, n, i, r, o), this._xi = Fa(r) * n + t, this._yi = Ga(r) * n + e, this + }, t.prototype.arcTo = function (t, e, n, i, r) { + return this._drawPendingPt(), this._ctx && this._ctx.arcTo(t, e, n, i, r), this + }, t.prototype.rect = function (t, e, n, i) { + return this._drawPendingPt(), this._ctx && this._ctx.rect(t, e, n, i), this.addData(La.R, t, e, n, i), this + }, t.prototype.closePath = function () { + this._drawPendingPt(), this.addData(La.Z); + var t = this._ctx, e = this._x0, n = this._y0; + return t && t.closePath(), this._xi = e, this._yi = n, this + }, t.prototype.fill = function (t) { + t && t.fill(), this.toStatic() + }, t.prototype.stroke = function (t) { + t && t.stroke(), this.toStatic() + }, t.prototype.len = function () { + return this._len + }, t.prototype.setData = function (t) { + var e = t.length; + this.data && this.data.length === e || !Ua || (this.data = new Float32Array(e)); + for (var n = 0; n < e; n++) this.data[n] = t[n]; + this._len = e + }, t.prototype.appendPath = function (t) { + t instanceof Array || (t = [t]); + for (var e = t.length, n = 0, i = this._len, r = 0; r < e; r++) n += t[r].len(); + Ua && this.data instanceof Float32Array && (this.data = new Float32Array(i + n)); + for (r = 0; r < e; r++) for (var o = t[r].data, a = 0; a < o.length; a++) this.data[i++] = o[a]; + this._len = i + }, t.prototype.addData = function (t, e, n, i, r, o, a, s, l) { + if (this._saveData) { + var u = this.data; + this._len + arguments.length > u.length && (this._expandData(), u = this.data); + for (var h = 0; h < arguments.length; h++) u[this._len++] = arguments[h] + } + }, t.prototype._drawPendingPt = function () { + this._pendingPtDist > 0 && (this._ctx && this._ctx.lineTo(this._pendingPtX, this._pendingPtY), this._pendingPtDist = 0) + }, t.prototype._expandData = function () { + if (!(this.data instanceof Array)) { + for (var t = [], e = 0; e < this._len; e++) t[e] = this.data[e]; + this.data = t + } + }, t.prototype.toStatic = function () { + if (this._saveData) { + this._drawPendingPt(); + var t = this.data; + t instanceof Array && (t.length = this._len, Ua && this._len > 11 && (this.data = new Float32Array(t))) + } + }, t.prototype.getBoundingRect = function () { + Ra[0] = Ra[1] = Ea[0] = Ea[1] = Number.MAX_VALUE, Na[0] = Na[1] = za[0] = za[1] = -Number.MAX_VALUE; + var t, e = this.data, n = 0, i = 0, r = 0, o = 0; + for (t = 0; t < this._len;) { + var a = e[t++], s = 1 === t; + switch (s && (r = n = e[t], o = i = e[t + 1]), a) { + case La.M: + n = r = e[t++], i = o = e[t++], Ea[0] = r, Ea[1] = o, za[0] = r, za[1] = o; + break; + case La.L: + Ia(n, i, e[t], e[t + 1], Ea, za), n = e[t++], i = e[t++]; + break; + case La.C: + Da(n, i, e[t++], e[t++], e[t++], e[t++], e[t], e[t + 1], Ea, za), n = e[t++], i = e[t++]; + break; + case La.Q: + Aa(n, i, e[t++], e[t++], e[t], e[t + 1], Ea, za), n = e[t++], i = e[t++]; + break; + case La.A: + var l = e[t++], u = e[t++], h = e[t++], c = e[t++], p = e[t++], d = e[t++] + p; + t += 1; + var f = !e[t++]; + s && (r = Fa(p) * h + l, o = Ga(p) * c + u), ka(l, u, h, c, p, d, f, Ea, za), n = Fa(d) * h + l, i = Ga(d) * c + u; + break; + case La.R: + Ia(r = n = e[t++], o = i = e[t++], r + e[t++], o + e[t++], Ea, za); + break; + case La.Z: + n = r, i = o + } + Gt(Ra, Ra, Ea), Wt(Na, Na, za) + } + return 0 === t && (Ra[0] = Ra[1] = Na[0] = Na[1] = 0), new sr(Ra[0], Ra[1], Na[0] - Ra[0], Na[1] - Ra[1]) + }, t.prototype._calculateLength = function () { + var t = this.data, e = this._len, n = this._ux, i = this._uy, r = 0, o = 0, a = 0, s = 0; + this._pathSegLen || (this._pathSegLen = []); + for (var l = this._pathSegLen, u = 0, h = 0, c = 0; c < e;) { + var p = t[c++], d = 1 === c; + d && (a = r = t[c], s = o = t[c + 1]); + var f = -1; + switch (p) { + case La.M: + r = a = t[c++], o = s = t[c++]; + break; + case La.L: + var g = t[c++], y = (x = t[c++]) - o; + (Wa(A = g - r) > n || Wa(y) > i || c === e - 1) && (f = Math.sqrt(A * A + y * y), r = g, o = x); + break; + case La.C: + var v = t[c++], m = t[c++], x = (g = t[c++], t[c++]), _ = t[c++], b = t[c++]; + f = qe(r, o, v, m, g, x, _, b, 10), r = _, o = b; + break; + case La.Q: + f = en(r, o, v = t[c++], m = t[c++], g = t[c++], x = t[c++], 10), r = g, o = x; + break; + case La.A: + var w = t[c++], S = t[c++], M = t[c++], I = t[c++], T = t[c++], C = t[c++], D = C + T; + c += 1; + t[c++]; + d && (a = Fa(T) * M + w, s = Ga(T) * I + S), f = Ba(M, I) * Va(Ya, Math.abs(C)), r = Fa(D) * M + w, o = Ga(D) * I + S; + break; + case La.R: + a = r = t[c++], s = o = t[c++], f = 2 * t[c++] + 2 * t[c++]; + break; + case La.Z: + var A = a - r; + y = s - o; + f = Math.sqrt(A * A + y * y), r = a, o = s + } + f >= 0 && (l[h++] = f, u += f) + } + return this._pathLen = u, u + }, t.prototype.rebuildPath = function (t, e) { + var n, i, r, o, a, s, l, u, h, c, p = this.data, d = this._ux, f = this._uy, g = this._len, y = e < 1, + v = 0, m = 0, x = 0; + if (!y || (this._pathSegLen || this._calculateLength(), l = this._pathSegLen, u = e * this._pathLen)) t:for (var _ = 0; _ < g;) { + var b = p[_++], w = 1 === _; + switch (w && (n = r = p[_], i = o = p[_ + 1]), b !== La.L && x > 0 && (t.lineTo(h, c), x = 0), b) { + case La.M: + n = r = p[_++], i = o = p[_++], t.moveTo(r, o); + break; + case La.L: + a = p[_++], s = p[_++]; + var S = Wa(a - r), M = Wa(s - o); + if (S > d || M > f) { + if (y) { + if (v + (j = l[m++]) > u) { + var I = (u - v) / j; + t.lineTo(r * (1 - I) + a * I, o * (1 - I) + s * I); + break t + } + v += j + } + t.lineTo(a, s), r = a, o = s, x = 0 + } else { + var T = S * S + M * M; + T > x && (h = a, c = s, x = T) + } + break; + case La.C: + var C = p[_++], D = p[_++], A = p[_++], k = p[_++], L = p[_++], P = p[_++]; + if (y) { + if (v + (j = l[m++]) > u) { + Ze(r, C, A, L, I = (u - v) / j, Pa), Ze(o, D, k, P, I, Oa), t.bezierCurveTo(Pa[1], Oa[1], Pa[2], Oa[2], Pa[3], Oa[3]); + break t + } + v += j + } + t.bezierCurveTo(C, D, A, k, L, P), r = L, o = P; + break; + case La.Q: + C = p[_++], D = p[_++], A = p[_++], k = p[_++]; + if (y) { + if (v + (j = l[m++]) > u) { + Qe(r, C, A, I = (u - v) / j, Pa), Qe(o, D, k, I, Oa), t.quadraticCurveTo(Pa[1], Oa[1], Pa[2], Oa[2]); + break t + } + v += j + } + t.quadraticCurveTo(C, D, A, k), r = A, o = k; + break; + case La.A: + var O = p[_++], R = p[_++], N = p[_++], E = p[_++], z = p[_++], V = p[_++], B = p[_++], + F = !p[_++], G = N > E ? N : E, W = Wa(N - E) > .001, H = z + V, Y = !1; + if (y) v + (j = l[m++]) > u && (H = z + V * (u - v) / j, Y = !0), v += j; + if (W && t.ellipse ? t.ellipse(O, R, N, E, B, z, H, F) : t.arc(O, R, G, z, H, F), Y) break t; + w && (n = Fa(z) * N + O, i = Ga(z) * E + R), r = Fa(H) * N + O, o = Ga(H) * E + R; + break; + case La.R: + n = r = p[_], i = o = p[_ + 1], a = p[_++], s = p[_++]; + var U = p[_++], X = p[_++]; + if (y) { + if (v + (j = l[m++]) > u) { + var Z = u - v; + t.moveTo(a, s), t.lineTo(a + Va(Z, U), s), (Z -= U) > 0 && t.lineTo(a + U, s + Va(Z, X)), (Z -= X) > 0 && t.lineTo(a + Ba(U - Z, 0), s + X), (Z -= U) > 0 && t.lineTo(a, s + Ba(X - Z, 0)); + break t + } + v += j + } + t.rect(a, s, U, X); + break; + case La.Z: + if (y) { + var j; + if (v + (j = l[m++]) > u) { + I = (u - v) / j; + t.lineTo(r * (1 - I) + n * I, o * (1 - I) + i * I); + break t + } + v += j + } + t.closePath(), r = n, o = i + } + } + }, t.prototype.clone = function () { + var e = new t, n = this.data; + return e.data = n.slice ? n.slice() : Array.prototype.slice.call(n), e._len = this._len, e + }, t.CMD = La, t.initDefaultProps = function () { + var e = t.prototype; + e._saveData = !0, e._ux = 0, e._uy = 0, e._pendingPtDist = 0, e._version = 0 + }(), t + }(); + + function qa(t, e, n, i, r, o, a) { + if (0 === r) return !1; + var s = r, l = 0; + if (a > e + s && a > i + s || a < e - s && a < i - s || o > t + s && o > n + s || o < t - s && o < n - s) return !1; + if (t === n) return Math.abs(o - t) <= s / 2; + var u = (l = (e - i) / (t - n)) * o - a + (t * i - n * e) / (t - n); + return u * u / (l * l + 1) <= s / 2 * s / 2 + } + + function Ka(t, e, n, i, r, o, a, s, l, u, h) { + if (0 === l) return !1; + var c = l; + return !(h > e + c && h > i + c && h > o + c && h > s + c || h < e - c && h < i - c && h < o - c && h < s - c || u > t + c && u > n + c && u > r + c && u > a + c || u < t - c && u < n - c && u < r - c && u < a - c) && je(t, e, n, i, r, o, a, s, u, h, null) <= c / 2 + } + + function $a(t, e, n, i, r, o, a, s, l) { + if (0 === a) return !1; + var u = a; + return !(l > e + u && l > i + u && l > o + u || l < e - u && l < i - u && l < o - u || s > t + u && s > n + u && s > r + u || s < t - u && s < n - u && s < r - u) && tn(t, e, n, i, r, o, s, l, null) <= u / 2 + } + + var Ja = 2 * Math.PI; + + function Qa(t) { + return (t %= Ja) < 0 && (t += Ja), t + } + + var ts = 2 * Math.PI; + + function es(t, e, n, i, r, o, a, s, l) { + if (0 === a) return !1; + var u = a; + s -= t, l -= e; + var h = Math.sqrt(s * s + l * l); + if (h - u > n || h + u < n) return !1; + if (Math.abs(i - r) % ts < 1e-4) return !0; + if (o) { + var c = i; + i = Qa(r), r = Qa(c) + } else i = Qa(i), r = Qa(r); + i > r && (r += ts); + var p = Math.atan2(l, s); + return p < 0 && (p += ts), p >= i && p <= r || p + ts >= i && p + ts <= r + } + + function ns(t, e, n, i, r, o) { + if (o > e && o > i || o < e && o < i) return 0; + if (i === e) return 0; + var a = (o - e) / (i - e), s = i < e ? 1 : -1; + 1 !== a && 0 !== a || (s = i < e ? .5 : -.5); + var l = a * (n - t) + t; + return l === r ? 1 / 0 : l > r ? s : 0 + } + + var is = ja.CMD, rs = 2 * Math.PI; + var os = [-1, -1, -1], as = [-1, -1]; + + function ss(t, e, n, i, r, o, a, s, l, u) { + if (u > e && u > i && u > o && u > s || u < e && u < i && u < o && u < s) return 0; + var h, c = Ue(e, i, o, s, u, os); + if (0 === c) return 0; + for (var p = 0, d = -1, f = void 0, g = void 0, y = 0; y < c; y++) { + var v = os[y], m = 0 === v || 1 === v ? .5 : 1; + He(t, n, r, a, v) < l || (d < 0 && (d = Xe(e, i, o, s, as), as[1] < as[0] && d > 1 && (h = void 0, h = as[0], as[0] = as[1], as[1] = h), f = He(e, i, o, s, as[0]), d > 1 && (g = He(e, i, o, s, as[1]))), 2 === d ? v < as[0] ? p += f < e ? m : -m : v < as[1] ? p += g < f ? m : -m : p += s < g ? m : -m : v < as[0] ? p += f < e ? m : -m : p += s < f ? m : -m) + } + return p + } + + function ls(t, e, n, i, r, o, a, s) { + if (s > e && s > i && s > o || s < e && s < i && s < o) return 0; + var l = function (t, e, n, i, r) { + var o = t - 2 * e + n, a = 2 * (e - t), s = t - i, l = 0; + if (Ge(o)) We(a) && (h = -s / a) >= 0 && h <= 1 && (r[l++] = h); else { + var u = a * a - 4 * o * s; + if (Ge(u)) (h = -a / (2 * o)) >= 0 && h <= 1 && (r[l++] = h); else if (u > 0) { + var h, c = Oe(u), p = (-a - c) / (2 * o); + (h = (-a + c) / (2 * o)) >= 0 && h <= 1 && (r[l++] = h), p >= 0 && p <= 1 && (r[l++] = p) + } + } + return l + }(e, i, o, s, os); + if (0 === l) return 0; + var u = Je(e, i, o); + if (u >= 0 && u <= 1) { + for (var h = 0, c = Ke(e, i, o, u), p = 0; p < l; p++) { + var d = 0 === os[p] || 1 === os[p] ? .5 : 1; + Ke(t, n, r, os[p]) < a || (os[p] < u ? h += c < e ? d : -d : h += o < c ? d : -d) + } + return h + } + d = 0 === os[0] || 1 === os[0] ? .5 : 1; + return Ke(t, n, r, os[0]) < a ? 0 : o < e ? d : -d + } + + function us(t, e, n, i, r, o, a, s) { + if ((s -= e) > n || s < -n) return 0; + var l = Math.sqrt(n * n - s * s); + os[0] = -l, os[1] = l; + var u = Math.abs(i - r); + if (u < 1e-4) return 0; + if (u >= rs - 1e-4) { + i = 0, r = rs; + var h = o ? 1 : -1; + return a >= os[0] + t && a <= os[1] + t ? h : 0 + } + if (i > r) { + var c = i; + i = r, r = c + } + i < 0 && (i += rs, r += rs); + for (var p = 0, d = 0; d < 2; d++) { + var f = os[d]; + if (f + t > a) { + var g = Math.atan2(s, f); + h = o ? 1 : -1; + g < 0 && (g = rs + g), (g >= i && g <= r || g + rs >= i && g + rs <= r) && (g > Math.PI / 2 && g < 1.5 * Math.PI && (h = -h), p += h) + } + } + return p + } + + function hs(t, e, n, i, r) { + for (var o, a, s, l, u = t.data, h = t.len(), c = 0, p = 0, d = 0, f = 0, g = 0, y = 0; y < h;) { + var v = u[y++], m = 1 === y; + switch (v === is.M && y > 1 && (n || (c += ns(p, d, f, g, i, r))), m && (f = p = u[y], g = d = u[y + 1]), v) { + case is.M: + p = f = u[y++], d = g = u[y++]; + break; + case is.L: + if (n) { + if (qa(p, d, u[y], u[y + 1], e, i, r)) return !0 + } else c += ns(p, d, u[y], u[y + 1], i, r) || 0; + p = u[y++], d = u[y++]; + break; + case is.C: + if (n) { + if (Ka(p, d, u[y++], u[y++], u[y++], u[y++], u[y], u[y + 1], e, i, r)) return !0 + } else c += ss(p, d, u[y++], u[y++], u[y++], u[y++], u[y], u[y + 1], i, r) || 0; + p = u[y++], d = u[y++]; + break; + case is.Q: + if (n) { + if ($a(p, d, u[y++], u[y++], u[y], u[y + 1], e, i, r)) return !0 + } else c += ls(p, d, u[y++], u[y++], u[y], u[y + 1], i, r) || 0; + p = u[y++], d = u[y++]; + break; + case is.A: + var x = u[y++], _ = u[y++], b = u[y++], w = u[y++], S = u[y++], M = u[y++]; + y += 1; + var I = !!(1 - u[y++]); + o = Math.cos(S) * b + x, a = Math.sin(S) * w + _, m ? (f = o, g = a) : c += ns(p, d, o, a, i, r); + var T = (i - x) * w / b + x; + if (n) { + if (es(x, _, w, S, S + M, I, e, T, r)) return !0 + } else c += us(x, _, w, S, S + M, I, T, r); + p = Math.cos(S + M) * b + x, d = Math.sin(S + M) * w + _; + break; + case is.R: + if (f = p = u[y++], g = d = u[y++], o = f + u[y++], a = g + u[y++], n) { + if (qa(f, g, o, g, e, i, r) || qa(o, g, o, a, e, i, r) || qa(o, a, f, a, e, i, r) || qa(f, a, f, g, e, i, r)) return !0 + } else c += ns(o, g, o, a, i, r), c += ns(f, a, f, g, i, r); + break; + case is.Z: + if (n) { + if (qa(p, d, f, g, e, i, r)) return !0 + } else c += ns(p, d, f, g, i, r); + p = f, d = g + } + } + return n || (s = d, l = g, Math.abs(s - l) < 1e-4) || (c += ns(p, d, f, g, i, r) || 0), 0 !== c + } + + var cs = k({ + fill: "#000", + stroke: null, + strokePercent: 1, + fillOpacity: 1, + strokeOpacity: 1, + lineDashOffset: 0, + lineWidth: 1, + lineCap: "butt", + miterLimit: 10, + strokeNoScale: !1, + strokeFirst: !1 + }, ua), ps = { + style: k({ + fill: !0, + stroke: !0, + strokePercent: !0, + fillOpacity: !0, + strokeOpacity: !0, + lineDashOffset: !0, + lineWidth: !0, + miterLimit: !0 + }, ha.style) + }, ds = Ki.concat(["invisible", "culling", "z", "z2", "zlevel", "parent"]), fs = function (t) { + function e(e) { + return t.call(this, e) || this + } + + var i; + return n(e, t), e.prototype.update = function () { + var n = this; + t.prototype.update.call(this); + var i = this.style; + if (i.decal) { + var r = this._decalEl = this._decalEl || new e; + r.buildPath === e.prototype.buildPath && (r.buildPath = function (t) { + n.buildPath(t, n.shape) + }), r.silent = !0; + var o = r.style; + for (var a in i) o[a] !== i[a] && (o[a] = i[a]); + o.fill = i.fill ? i.decal : null, o.decal = null, o.shadowColor = null, i.strokeFirst && (o.stroke = null); + for (var s = 0; s < ds.length; ++s) r[ds[s]] = this[ds[s]]; + r.__dirty |= 1 + } else this._decalEl && (this._decalEl = null) + }, e.prototype.getDecalElement = function () { + return this._decalEl + }, e.prototype._init = function (e) { + var n = G(e); + this.shape = this.getDefaultShape(); + var i = this.getDefaultStyle(); + i && this.useStyle(i); + for (var r = 0; r < n.length; r++) { + var o = n[r], a = e[o]; + "style" === o ? this.style ? A(this.style, a) : this.useStyle(a) : "shape" === o ? A(this.shape, a) : t.prototype.attrKV.call(this, o, a) + } + this.style || this.useStyle({}) + }, e.prototype.getDefaultStyle = function () { + return null + }, e.prototype.getDefaultShape = function () { + return {} + }, e.prototype.canBeInsideText = function () { + return this.hasFill() + }, e.prototype.getInsideTextFill = function () { + var t = this.style.fill; + if ("none" !== t) { + if (X(t)) { + var e = Ln(t, 0); + return e > .5 ? ki : e > .2 ? "#eee" : Li + } + if (t) return Li + } + return ki + }, e.prototype.getInsideTextStroke = function (t) { + var e = this.style.fill; + if (X(e)) { + var n = this.__zr; + if (!(!n || !n.isDarkMode()) === Ln(t, 0) < .4) return e + } + }, e.prototype.buildPath = function (t, e, n) { + }, e.prototype.pathUpdated = function () { + this.__dirty &= -5 + }, e.prototype.getUpdatedPathProxy = function (t) { + return !this.path && this.createPathProxy(), this.path.beginPath(), this.buildPath(this.path, this.shape, t), this.path + }, e.prototype.createPathProxy = function () { + this.path = new ja(!1) + }, e.prototype.hasStroke = function () { + var t = this.style, e = t.stroke; + return !(null == e || "none" === e || !(t.lineWidth > 0)) + }, e.prototype.hasFill = function () { + var t = this.style.fill; + return null != t && "none" !== t + }, e.prototype.getBoundingRect = function () { + var t = this._rect, e = this.style, n = !t; + if (n) { + var i = !1; + this.path || (i = !0, this.createPathProxy()); + var r = this.path; + (i || 4 & this.__dirty) && (r.beginPath(), this.buildPath(r, this.shape, !1), this.pathUpdated()), t = r.getBoundingRect() + } + if (this._rect = t, this.hasStroke() && this.path && this.path.len() > 0) { + var o = this._rectStroke || (this._rectStroke = t.clone()); + if (this.__dirty || n) { + o.copy(t); + var a = e.strokeNoScale ? this.getLineScale() : 1, s = e.lineWidth; + if (!this.hasFill()) { + var l = this.strokeContainThreshold; + s = Math.max(s, null == l ? 4 : l) + } + a > 1e-10 && (o.width += s / a, o.height += s / a, o.x -= s / a / 2, o.y -= s / a / 2) + } + return o + } + return t + }, e.prototype.contain = function (t, e) { + var n = this.transformCoordToLocal(t, e), i = this.getBoundingRect(), r = this.style; + if (t = n[0], e = n[1], i.contain(t, e)) { + var o = this.path; + if (this.hasStroke()) { + var a = r.lineWidth, s = r.strokeNoScale ? this.getLineScale() : 1; + if (s > 1e-10 && (this.hasFill() || (a = Math.max(a, this.strokeContainThreshold)), function (t, e, n, i) { + return hs(t, e, !0, n, i) + }(o, a / s, t, e))) return !0 + } + if (this.hasFill()) return function (t, e, n) { + return hs(t, 0, !1, e, n) + }(o, t, e) + } + return !1 + }, e.prototype.dirtyShape = function () { + this.__dirty |= 4, this._rect && (this._rect = null), this._decalEl && this._decalEl.dirtyShape(), this.markRedraw() + }, e.prototype.dirty = function () { + this.dirtyStyle(), this.dirtyShape() + }, e.prototype.animateShape = function (t) { + return this.animate("shape", t) + }, e.prototype.updateDuringAnimation = function (t) { + "style" === t ? this.dirtyStyle() : "shape" === t ? this.dirtyShape() : this.markRedraw() + }, e.prototype.attrKV = function (e, n) { + "shape" === e ? this.setShape(n) : t.prototype.attrKV.call(this, e, n) + }, e.prototype.setShape = function (t, e) { + var n = this.shape; + return n || (n = this.shape = {}), "string" == typeof t ? n[t] = e : A(n, t), this.dirtyShape(), this + }, e.prototype.shapeChanged = function () { + return !!(4 & this.__dirty) + }, e.prototype.createStyle = function (t) { + return yt(cs, t) + }, e.prototype._innerSaveToNormal = function (e) { + t.prototype._innerSaveToNormal.call(this, e); + var n = this._normalState; + e.shape && !n.shape && (n.shape = A({}, this.shape)) + }, e.prototype._applyStateObj = function (e, n, i, r, o, a) { + t.prototype._applyStateObj.call(this, e, n, i, r, o, a); + var s, l = !(n && r); + if (n && n.shape ? o ? r ? s = n.shape : (s = A({}, i.shape), A(s, n.shape)) : (s = A({}, r ? this.shape : i.shape), A(s, n.shape)) : l && (s = i.shape), s) if (o) { + this.shape = A({}, this.shape); + for (var u = {}, h = G(s), c = 0; c < h.length; c++) { + var p = h[c]; + "object" == typeof s[p] ? this.shape[p] = s[p] : u[p] = s[p] + } + this._transitionState(e, {shape: u}, a) + } else this.shape = s, this.dirtyShape() + }, e.prototype._mergeStates = function (e) { + for (var n, i = t.prototype._mergeStates.call(this, e), r = 0; r < e.length; r++) { + var o = e[r]; + o.shape && (n = n || {}, this._mergeStyle(n, o.shape)) + } + return n && (i.shape = n), i + }, e.prototype.getAnimationStyleProps = function () { + return ps + }, e.prototype.isZeroArea = function () { + return !1 + }, e.extend = function (t) { + var i = function (e) { + function i(n) { + var i = e.call(this, n) || this; + return t.init && t.init.call(i, n), i + } + + return n(i, e), i.prototype.getDefaultStyle = function () { + return T(t.style) + }, i.prototype.getDefaultShape = function () { + return T(t.shape) + }, i + }(e); + for (var r in t) "function" == typeof t[r] && (i.prototype[r] = t[r]); + return i + }, e.initDefaultProps = ((i = e.prototype).type = "path", i.strokeContainThreshold = 5, i.segmentIgnoreThreshold = 0, i.subPixelOptimize = !1, i.autoBatch = !1, void (i.__dirty = 7)), e + }(da), gs = k({strokeFirst: !0, font: a, x: 0, y: 0, textAlign: "left", textBaseline: "top", miterLimit: 2}, cs), + ys = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.hasStroke = function () { + var t = this.style, e = t.stroke; + return null != e && "none" !== e && t.lineWidth > 0 + }, e.prototype.hasFill = function () { + var t = this.style.fill; + return null != t && "none" !== t + }, e.prototype.createStyle = function (t) { + return yt(gs, t) + }, e.prototype.setBoundingRect = function (t) { + this._rect = t + }, e.prototype.getBoundingRect = function () { + var t = this.style; + if (!this._rect) { + var e = t.text; + null != e ? e += "" : e = ""; + var n = cr(e, t.font, t.textAlign, t.textBaseline); + if (n.x += t.x || 0, n.y += t.y || 0, this.hasStroke()) { + var i = t.lineWidth; + n.x -= i / 2, n.y -= i / 2, n.width += i, n.height += i + } + this._rect = n + } + return this._rect + }, e.initDefaultProps = void (e.prototype.dirtyRectTolerance = 10), e + }(da); + ys.prototype.type = "tspan"; + var vs = k({x: 0, y: 0}, ua), + ms = {style: k({x: !0, y: !0, width: !0, height: !0, sx: !0, sy: !0, sWidth: !0, sHeight: !0}, ha.style)}; + var xs = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.createStyle = function (t) { + return yt(vs, t) + }, e.prototype._getSize = function (t) { + var e = this.style, n = e[t]; + if (null != n) return n; + var i, r = (i = e.image) && "string" != typeof i && i.width && i.height ? e.image : this.__image; + if (!r) return 0; + var o = "width" === t ? "height" : "width", a = e[o]; + return null == a ? r[t] : r[t] / r[o] * a + }, e.prototype.getWidth = function () { + return this._getSize("width") + }, e.prototype.getHeight = function () { + return this._getSize("height") + }, e.prototype.getAnimationStyleProps = function () { + return ms + }, e.prototype.getBoundingRect = function () { + var t = this.style; + return this._rect || (this._rect = new sr(t.x || 0, t.y || 0, this.getWidth(), this.getHeight())), this._rect + }, e + }(da); + xs.prototype.type = "image"; + var _s = Math.round; + + function bs(t, e, n) { + if (e) { + var i = e.x1, r = e.x2, o = e.y1, a = e.y2; + t.x1 = i, t.x2 = r, t.y1 = o, t.y2 = a; + var s = n && n.lineWidth; + return s ? (_s(2 * i) === _s(2 * r) && (t.x1 = t.x2 = Ss(i, s, !0)), _s(2 * o) === _s(2 * a) && (t.y1 = t.y2 = Ss(o, s, !0)), t) : t + } + } + + function ws(t, e, n) { + if (e) { + var i = e.x, r = e.y, o = e.width, a = e.height; + t.x = i, t.y = r, t.width = o, t.height = a; + var s = n && n.lineWidth; + return s ? (t.x = Ss(i, s, !0), t.y = Ss(r, s, !0), t.width = Math.max(Ss(i + o, s, !1) - t.x, 0 === o ? 0 : 1), t.height = Math.max(Ss(r + a, s, !1) - t.y, 0 === a ? 0 : 1), t) : t + } + } + + function Ss(t, e, n) { + if (!e) return t; + var i = _s(2 * t); + return (i + _s(e)) % 2 == 0 ? i / 2 : (i + (n ? 1 : -1)) / 2 + } + + var Ms = function () { + this.x = 0, this.y = 0, this.width = 0, this.height = 0 + }, Is = {}, Ts = function (t) { + function e(e) { + return t.call(this, e) || this + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new Ms + }, e.prototype.buildPath = function (t, e) { + var n, i, r, o; + if (this.subPixelOptimize) { + var a = ws(Is, e, this.style); + n = a.x, i = a.y, r = a.width, o = a.height, a.r = e.r, e = a + } else n = e.x, i = e.y, r = e.width, o = e.height; + e.r ? function (t, e) { + var n, i, r, o, a, s = e.x, l = e.y, u = e.width, h = e.height, c = e.r; + u < 0 && (s += u, u = -u), h < 0 && (l += h, h = -h), "number" == typeof c ? n = i = r = o = c : c instanceof Array ? 1 === c.length ? n = i = r = o = c[0] : 2 === c.length ? (n = r = c[0], i = o = c[1]) : 3 === c.length ? (n = c[0], i = o = c[1], r = c[2]) : (n = c[0], i = c[1], r = c[2], o = c[3]) : n = i = r = o = 0, n + i > u && (n *= u / (a = n + i), i *= u / a), r + o > u && (r *= u / (a = r + o), o *= u / a), i + r > h && (i *= h / (a = i + r), r *= h / a), n + o > h && (n *= h / (a = n + o), o *= h / a), t.moveTo(s + n, l), t.lineTo(s + u - i, l), 0 !== i && t.arc(s + u - i, l + i, i, -Math.PI / 2, 0), t.lineTo(s + u, l + h - r), 0 !== r && t.arc(s + u - r, l + h - r, r, 0, Math.PI / 2), t.lineTo(s + o, l + h), 0 !== o && t.arc(s + o, l + h - o, o, Math.PI / 2, Math.PI), t.lineTo(s, l + n), 0 !== n && t.arc(s + n, l + n, n, Math.PI, 1.5 * Math.PI) + }(t, e) : t.rect(n, i, r, o) + }, e.prototype.isZeroArea = function () { + return !this.shape.width || !this.shape.height + }, e + }(fs); + Ts.prototype.type = "rect"; + var Cs = {fill: "#000"}, Ds = { + style: k({ + fill: !0, + stroke: !0, + fillOpacity: !0, + strokeOpacity: !0, + lineWidth: !0, + fontSize: !0, + lineHeight: !0, + width: !0, + height: !0, + textShadowColor: !0, + textShadowBlur: !0, + textShadowOffsetX: !0, + textShadowOffsetY: !0, + backgroundColor: !0, + padding: !0, + borderColor: !0, + borderWidth: !0, + borderRadius: !0 + }, ha.style) + }, As = function (t) { + function e(e) { + var n = t.call(this) || this; + return n.type = "text", n._children = [], n._defaultStyle = Cs, n.attr(e), n + } + + return n(e, t), e.prototype.childrenRef = function () { + return this._children + }, e.prototype.update = function () { + t.prototype.update.call(this), this.styleChanged() && this._updateSubTexts(); + for (var e = 0; e < this._children.length; e++) { + var n = this._children[e]; + n.zlevel = this.zlevel, n.z = this.z, n.z2 = this.z2, n.culling = this.culling, n.cursor = this.cursor, n.invisible = this.invisible + } + }, e.prototype.updateTransform = function () { + var e = this.innerTransformable; + e ? (e.updateTransform(), e.transform && (this.transform = e.transform)) : t.prototype.updateTransform.call(this) + }, e.prototype.getLocalTransform = function (e) { + var n = this.innerTransformable; + return n ? n.getLocalTransform(e) : t.prototype.getLocalTransform.call(this, e) + }, e.prototype.getComputedTransform = function () { + return this.__hostTarget && (this.__hostTarget.getComputedTransform(), this.__hostTarget.updateInnerText(!0)), t.prototype.getComputedTransform.call(this) + }, e.prototype._updateSubTexts = function () { + var t; + this._childCursor = 0, Es(t = this.style), E(t.rich, Es), this.style.rich ? this._updateRichTexts() : this._updatePlainTexts(), this._children.length = this._childCursor, this.styleUpdated() + }, e.prototype.addSelfToZr = function (e) { + t.prototype.addSelfToZr.call(this, e); + for (var n = 0; n < this._children.length; n++) this._children[n].__zr = e + }, e.prototype.removeSelfFromZr = function (e) { + t.prototype.removeSelfFromZr.call(this, e); + for (var n = 0; n < this._children.length; n++) this._children[n].__zr = null + }, e.prototype.getBoundingRect = function () { + if (this.styleChanged() && this._updateSubTexts(), !this._rect) { + for (var t = new sr(0, 0, 0, 0), e = this._children, n = [], i = null, r = 0; r < e.length; r++) { + var o = e[r], a = o.getBoundingRect(), s = o.getLocalTransform(n); + s ? (t.copy(a), t.applyTransform(s), (i = i || t.clone()).union(t)) : (i = i || a.clone()).union(a) + } + this._rect = i || t + } + return this._rect + }, e.prototype.setDefaultTextStyle = function (t) { + this._defaultStyle = t || Cs + }, e.prototype.setTextContent = function (t) { + 0 + }, e.prototype._mergeStyle = function (t, e) { + if (!e) return t; + var n = e.rich, i = t.rich || n && {}; + return A(t, e), n && i ? (this._mergeRich(i, n), t.rich = i) : i && (t.rich = i), t + }, e.prototype._mergeRich = function (t, e) { + for (var n = G(e), i = 0; i < n.length; i++) { + var r = n[i]; + t[r] = t[r] || {}, A(t[r], e[r]) + } + }, e.prototype.getAnimationStyleProps = function () { + return Ds + }, e.prototype._getOrCreateChild = function (t) { + var e = this._children[this._childCursor]; + return e && e instanceof t || (e = new t), this._children[this._childCursor++] = e, e.__zr = this.__zr, e.parent = this, e + }, e.prototype._updatePlainTexts = function () { + var t = this.style, e = t.font || a, n = t.padding, i = function (t, e) { + null != t && (t += ""); + var n, i = e.overflow, r = e.padding, o = e.font, a = "truncate" === i, s = fr(o), + l = rt(e.lineHeight, s), u = !!e.backgroundColor, h = "truncate" === e.lineOverflow, c = e.width, + p = (n = null == c || "break" !== i && "breakAll" !== i ? t ? t.split("\n") : [] : t ? sa(t, e.font, c, "breakAll" === i, 0).lines : []).length * l, + d = rt(e.height, p); + if (p > d && h) { + var f = Math.floor(d / l); + n = n.slice(0, f) + } + if (t && a && null != c) for (var g = Jo(c, o, e.ellipsis, { + minChar: e.truncateMinChar, + placeholder: e.placeholder + }), y = 0; y < n.length; y++) n[y] = Qo(n[y], g); + var v = d, m = 0; + for (y = 0; y < n.length; y++) m = Math.max(ur(n[y], o), m); + null == c && (c = m); + var x = m; + return r && (v += r[0] + r[2], x += r[1] + r[3], c += r[1] + r[3]), u && (x = c), { + lines: n, + height: d, + outerWidth: x, + outerHeight: v, + lineHeight: l, + calculatedLineHeight: s, + contentWidth: m, + contentHeight: p, + width: c + } + }(Fs(t), t), r = Gs(t), o = !!t.backgroundColor, s = i.outerHeight, l = i.outerWidth, u = i.contentWidth, + h = i.lines, c = i.lineHeight, p = this._defaultStyle, d = t.x || 0, f = t.y || 0, + g = t.align || p.align || "left", y = t.verticalAlign || p.verticalAlign || "top", v = d, + m = dr(f, i.contentHeight, y); + if (r || n) { + var x = pr(d, l, g), _ = dr(f, s, y); + r && this._renderBackground(t, t, x, _, l, s) + } + m += c / 2, n && (v = Bs(d, g, n), "top" === y ? m += n[0] : "bottom" === y && (m -= n[2])); + for (var b = 0, w = !1, S = (Vs("fill" in t ? t.fill : (w = !0, p.fill))), M = (zs("stroke" in t ? t.stroke : o || p.autoStroke && !w ? null : (b = 2, p.stroke))), I = t.textShadowBlur > 0, T = null != t.width && ("truncate" === t.overflow || "break" === t.overflow || "breakAll" === t.overflow), C = i.calculatedLineHeight, D = 0; D < h.length; D++) { + var A = this._getOrCreateChild(ys), k = A.createStyle(); + A.useStyle(k), k.text = h[D], k.x = v, k.y = m, g && (k.textAlign = g), k.textBaseline = "middle", k.opacity = t.opacity, k.strokeFirst = !0, I && (k.shadowBlur = t.textShadowBlur || 0, k.shadowColor = t.textShadowColor || "transparent", k.shadowOffsetX = t.textShadowOffsetX || 0, k.shadowOffsetY = t.textShadowOffsetY || 0), k.stroke = M, k.fill = S, M && (k.lineWidth = t.lineWidth || b, k.lineDash = t.lineDash, k.lineDashOffset = t.lineDashOffset || 0), k.font = e, Rs(k, t), m += c, T && A.setBoundingRect(new sr(pr(k.x, t.width, k.textAlign), dr(k.y, C, k.textBaseline), u, C)) + } + }, e.prototype._updateRichTexts = function () { + var t = this.style, e = function (t, e) { + var n = new ia; + if (null != t && (t += ""), !t) return n; + for (var i, r = e.width, o = e.height, a = e.overflow, s = "break" !== a && "breakAll" !== a || null == r ? null : { + width: r, + accumWidth: 0, + breakAll: "breakAll" === a + }, l = Ko.lastIndex = 0; null != (i = Ko.exec(t));) { + var u = i.index; + u > l && ra(n, t.substring(l, u), e, s), ra(n, i[2], e, s, i[1]), l = Ko.lastIndex + } + l < t.length && ra(n, t.substring(l, t.length), e, s); + var h = [], c = 0, p = 0, d = e.padding, f = "truncate" === a, g = "truncate" === e.lineOverflow; + + function y(t, e, n) { + t.width = e, t.lineHeight = n, c += n, p = Math.max(p, e) + } + + t:for (var v = 0; v < n.lines.length; v++) { + for (var m = n.lines[v], x = 0, _ = 0, b = 0; b < m.tokens.length; b++) { + var w = (P = m.tokens[b]).styleName && e.rich[P.styleName] || {}, S = P.textPadding = w.padding, + M = S ? S[1] + S[3] : 0, I = P.font = w.font || e.font; + P.contentHeight = fr(I); + var T = rt(w.height, P.contentHeight); + if (P.innerHeight = T, S && (T += S[0] + S[2]), P.height = T, P.lineHeight = ot(w.lineHeight, e.lineHeight, T), P.align = w && w.align || e.align, P.verticalAlign = w && w.verticalAlign || "middle", g && null != o && c + P.lineHeight > o) { + b > 0 ? (m.tokens = m.tokens.slice(0, b), y(m, _, x), n.lines = n.lines.slice(0, v + 1)) : n.lines = n.lines.slice(0, v); + break t + } + var C = w.width, D = null == C || "auto" === C; + if ("string" == typeof C && "%" === C.charAt(C.length - 1)) P.percentWidth = C, h.push(P), P.contentWidth = ur(P.text, I); else { + if (D) { + var A = w.backgroundColor, k = A && A.image; + k && qo(k = Xo(k)) && (P.width = Math.max(P.width, k.width * T / k.height)) + } + var L = f && null != r ? r - _ : null; + null != L && L < P.width ? !D || L < M ? (P.text = "", P.width = P.contentWidth = 0) : (P.text = $o(P.text, L - M, I, e.ellipsis, {minChar: e.truncateMinChar}), P.width = P.contentWidth = ur(P.text, I)) : P.contentWidth = ur(P.text, I) + } + P.width += M, _ += P.width, w && (x = Math.max(x, P.lineHeight)) + } + y(m, _, x) + } + for (n.outerWidth = n.width = rt(r, p), n.outerHeight = n.height = rt(o, c), n.contentHeight = c, n.contentWidth = p, d && (n.outerWidth += d[1] + d[3], n.outerHeight += d[0] + d[2]), v = 0; v < h.length; v++) { + var P, O = (P = h[v]).percentWidth; + P.width = parseInt(O, 10) / 100 * n.width + } + return n + }(Fs(t), t), n = e.width, i = e.outerWidth, r = e.outerHeight, o = t.padding, a = t.x || 0, s = t.y || 0, + l = this._defaultStyle, u = t.align || l.align, h = t.verticalAlign || l.verticalAlign, c = pr(a, i, u), + p = dr(s, r, h), d = c, f = p; + o && (d += o[3], f += o[0]); + var g = d + n; + Gs(t) && this._renderBackground(t, t, c, p, i, r); + for (var y = !!t.backgroundColor, v = 0; v < e.lines.length; v++) { + for (var m = e.lines[v], x = m.tokens, _ = x.length, b = m.lineHeight, w = m.width, S = 0, M = d, I = g, T = _ - 1, C = void 0; S < _ && (!(C = x[S]).align || "left" === C.align);) this._placeToken(C, t, b, f, M, "left", y), w -= C.width, M += C.width, S++; + for (; T >= 0 && "right" === (C = x[T]).align;) this._placeToken(C, t, b, f, I, "right", y), w -= C.width, I -= C.width, T--; + for (M += (n - (M - d) - (g - I) - w) / 2; S <= T;) C = x[S], this._placeToken(C, t, b, f, M + C.width / 2, "center", y), M += C.width, S++; + f += b + } + }, e.prototype._placeToken = function (t, e, n, i, r, o, s) { + var l = e.rich[t.styleName] || {}; + l.text = t.text; + var u = t.verticalAlign, h = i + n / 2; + "top" === u ? h = i + t.height / 2 : "bottom" === u && (h = i + n - t.height / 2), !t.isLineHolder && Gs(l) && this._renderBackground(l, e, "right" === o ? r - t.width : "center" === o ? r - t.width / 2 : r, h - t.height / 2, t.width, t.height); + var c = !!l.backgroundColor, p = t.textPadding; + p && (r = Bs(r, o, p), h -= t.height / 2 - p[0] - t.innerHeight / 2); + var d = this._getOrCreateChild(ys), f = d.createStyle(); + d.useStyle(f); + var g = this._defaultStyle, y = !1, v = 0, + m = Vs("fill" in l ? l.fill : "fill" in e ? e.fill : (y = !0, g.fill)), + x = zs("stroke" in l ? l.stroke : "stroke" in e ? e.stroke : c || s || g.autoStroke && !y ? null : (v = 2, g.stroke)), + _ = l.textShadowBlur > 0 || e.textShadowBlur > 0; + f.text = t.text, f.x = r, f.y = h, _ && (f.shadowBlur = l.textShadowBlur || e.textShadowBlur || 0, f.shadowColor = l.textShadowColor || e.textShadowColor || "transparent", f.shadowOffsetX = l.textShadowOffsetX || e.textShadowOffsetX || 0, f.shadowOffsetY = l.textShadowOffsetY || e.textShadowOffsetY || 0), f.textAlign = o, f.textBaseline = "middle", f.font = t.font || a, f.opacity = ot(l.opacity, e.opacity, 1), Rs(f, l), x && (f.lineWidth = ot(l.lineWidth, e.lineWidth, v), f.lineDash = rt(l.lineDash, e.lineDash), f.lineDashOffset = e.lineDashOffset || 0, f.stroke = x), m && (f.fill = m); + var b = t.contentWidth, w = t.contentHeight; + d.setBoundingRect(new sr(pr(f.x, b, f.textAlign), dr(f.y, w, f.textBaseline), b, w)) + }, e.prototype._renderBackground = function (t, e, n, i, r, o) { + var a, s, l, u = t.backgroundColor, h = t.borderWidth, c = t.borderColor, p = u && u.image, d = u && !p, + f = t.borderRadius, g = this; + if (d || t.lineHeight || h && c) { + (a = this._getOrCreateChild(Ts)).useStyle(a.createStyle()), a.style.fill = null; + var y = a.shape; + y.x = n, y.y = i, y.width = r, y.height = o, y.r = f, a.dirtyShape() + } + if (d) (l = a.style).fill = u || null, l.fillOpacity = rt(t.fillOpacity, 1); else if (p) { + (s = this._getOrCreateChild(xs)).onload = function () { + g.dirtyStyle() + }; + var v = s.style; + v.image = u.image, v.x = n, v.y = i, v.width = r, v.height = o + } + h && c && ((l = a.style).lineWidth = h, l.stroke = c, l.strokeOpacity = rt(t.strokeOpacity, 1), l.lineDash = t.borderDash, l.lineDashOffset = t.borderDashOffset || 0, a.strokeContainThreshold = 0, a.hasFill() && a.hasStroke() && (l.strokeFirst = !0, l.lineWidth *= 2)); + var m = (a || s).style; + m.shadowBlur = t.shadowBlur || 0, m.shadowColor = t.shadowColor || "transparent", m.shadowOffsetX = t.shadowOffsetX || 0, m.shadowOffsetY = t.shadowOffsetY || 0, m.opacity = ot(t.opacity, e.opacity, 1) + }, e.makeFont = function (t) { + var e = ""; + return Ns(t) && (e = [t.fontStyle, t.fontWeight, Os(t.fontSize), t.fontFamily || "sans-serif"].join(" ")), e && ut(e) || t.textFont || t.font + }, e + }(da), ks = {left: !0, right: 1, center: 1}, Ls = {top: 1, bottom: 1, middle: 1}, + Ps = ["fontStyle", "fontWeight", "fontSize", "fontFamily"]; + + function Os(t) { + return "string" != typeof t || -1 === t.indexOf("px") && -1 === t.indexOf("rem") && -1 === t.indexOf("em") ? isNaN(+t) ? "12px" : t + "px" : t + } + + function Rs(t, e) { + for (var n = 0; n < Ps.length; n++) { + var i = Ps[n], r = e[i]; + null != r && (t[i] = r) + } + } + + function Ns(t) { + return null != t.fontSize || t.fontFamily || t.fontWeight + } + + function Es(t) { + if (t) { + t.font = As.makeFont(t); + var e = t.align; + "middle" === e && (e = "center"), t.align = null == e || ks[e] ? e : "left"; + var n = t.verticalAlign; + "center" === n && (n = "middle"), t.verticalAlign = null == n || Ls[n] ? n : "top", t.padding && (t.padding = st(t.padding)) + } + } + + function zs(t, e) { + return null == t || e <= 0 || "transparent" === t || "none" === t ? null : t.image || t.colorStops ? "#000" : t + } + + function Vs(t) { + return null == t || "none" === t ? null : t.image || t.colorStops ? "#000" : t + } + + function Bs(t, e, n) { + return "right" === e ? t - n[1] : "center" === e ? t + n[3] / 2 - n[1] / 2 : t + n[3] + } + + function Fs(t) { + var e = t.text; + return null != e && (e += ""), e + } + + function Gs(t) { + return !!(t.backgroundColor || t.lineHeight || t.borderWidth && t.borderColor) + } + + var Ws = So(), Hs = function (t, e, n, i) { + if (i) { + var r = Ws(i); + r.dataIndex = n, r.dataType = e, r.seriesIndex = t, "group" === i.type && i.traverse((function (i) { + var r = Ws(i); + r.seriesIndex = t, r.dataIndex = n, r.dataType = e + })) + } + }, Ys = 1, Us = {}, Xs = So(), Zs = So(), js = ["emphasis", "blur", "select"], + qs = ["normal", "emphasis", "blur", "select"], Ks = 10, $s = "highlight", Js = "downplay", Qs = "select", + tl = "unselect", el = "toggleSelect"; + + function nl(t) { + return null != t && "none" !== t + } + + var il = new ln(100); + + function rl(t) { + if (X(t)) { + var e = il.get(t); + return e || (e = Sn(t, -.1), il.put(t, e)), e + } + if (Q(t)) { + var n = A({}, t); + return n.colorStops = z(t.colorStops, (function (t) { + return {offset: t.offset, color: Sn(t.color, -.1)} + })), n + } + return t + } + + function ol(t, e, n) { + t.onHoverStateChange && (t.hoverState || 0) !== n && t.onHoverStateChange(e), t.hoverState = n + } + + function al(t) { + ol(t, "emphasis", 2) + } + + function sl(t) { + 2 === t.hoverState && ol(t, "normal", 0) + } + + function ll(t) { + ol(t, "blur", 1) + } + + function ul(t) { + 1 === t.hoverState && ol(t, "normal", 0) + } + + function hl(t) { + t.selected = !0 + } + + function cl(t) { + t.selected = !1 + } + + function pl(t, e, n) { + e(t, n) + } + + function dl(t, e, n) { + pl(t, e, n), t.isGroup && t.traverse((function (t) { + pl(t, e, n) + })) + } + + function fl(t, e) { + switch (e) { + case"emphasis": + t.hoverState = 2; + break; + case"normal": + t.hoverState = 0; + break; + case"blur": + t.hoverState = 1; + break; + case"select": + t.selected = !0 + } + } + + function gl(t, e) { + var n = this.states[t]; + if (this.style) { + if ("emphasis" === t) return function (t, e, n, i) { + var r = n && P(n, "select") >= 0, o = !1; + if (t instanceof fs) { + var a = Xs(t), s = r && a.selectFill || a.normalFill, l = r && a.selectStroke || a.normalStroke; + if (nl(s) || nl(l)) { + var u = (i = i || {}).style || {}; + "inherit" === u.fill ? (o = !0, i = A({}, i), (u = A({}, u)).fill = s) : !nl(u.fill) && nl(s) ? (o = !0, i = A({}, i), (u = A({}, u)).fill = rl(s)) : !nl(u.stroke) && nl(l) && (o || (i = A({}, i), u = A({}, u)), u.stroke = rl(l)), i.style = u + } + } + if (i && null == i.z2) { + o || (i = A({}, i)); + var h = t.z2EmphasisLift; + i.z2 = t.z2 + (null != h ? h : Ks) + } + return i + }(this, 0, e, n); + if ("blur" === t) return function (t, e, n) { + var i = P(t.currentStates, e) >= 0, r = t.style.opacity, o = i ? null : function (t, e, n, i) { + for (var r = t.style, o = {}, a = 0; a < e.length; a++) { + var s = e[a], l = r[s]; + o[s] = null == l ? i && i[s] : l + } + for (a = 0; a < t.animators.length; a++) { + var u = t.animators[a]; + u.__fromStateTransition && u.__fromStateTransition.indexOf(n) < 0 && "style" === u.targetName && u.saveTo(o, e) + } + return o + }(t, ["opacity"], e, {opacity: 1}), a = (n = n || {}).style || {}; + return null == a.opacity && (n = A({}, n), a = A({opacity: i ? r : .1 * o.opacity}, a), n.style = a), n + }(this, t, n); + if ("select" === t) return function (t, e, n) { + if (n && null == n.z2) { + n = A({}, n); + var i = t.z2SelectLift; + n.z2 = t.z2 + (null != i ? i : 9) + } + return n + }(this, 0, n) + } + return n + } + + function yl(t) { + t.stateProxy = gl; + var e = t.getTextContent(), n = t.getTextGuideLine(); + e && (e.stateProxy = gl), n && (n.stateProxy = gl) + } + + function vl(t, e) { + !Il(t, e) && !t.__highByOuter && dl(t, al) + } + + function ml(t, e) { + !Il(t, e) && !t.__highByOuter && dl(t, sl) + } + + function xl(t, e) { + t.__highByOuter |= 1 << (e || 0), dl(t, al) + } + + function _l(t, e) { + !(t.__highByOuter &= ~(1 << (e || 0))) && dl(t, sl) + } + + function bl(t) { + dl(t, ll) + } + + function wl(t) { + dl(t, ul) + } + + function Sl(t) { + dl(t, hl) + } + + function Ml(t) { + dl(t, cl) + } + + function Il(t, e) { + return t.__highDownSilentOnTouch && e.zrByTouch + } + + function Tl(t) { + t.getModel().eachComponent((function (e, n) { + var i = Zs(n); + i.isBlured && ("series" === e ? t.getViewOfSeriesModel(n) : t.getViewOfComponentModel(n)).group.traverse((function (t) { + ul(t) + })); + i.isBlured = !1 + })) + } + + function Cl(t, e, n, i) { + var r = i.getModel(); + + function o(t, e) { + for (var n = 0; n < e.length; n++) { + var i = t.getItemGraphicEl(e[n]); + i && wl(i) + } + } + + if (n = n || "coordinateSystem", null != t && e && "none" !== e) { + var a = r.getSeriesByIndex(t), s = a.coordinateSystem; + s && s.master && (s = s.master); + var l = []; + r.eachSeries((function (t) { + var r = a === t, u = t.coordinateSystem; + if (u && u.master && (u = u.master), !("series" === n && !r || "coordinateSystem" === n && !(u && s ? u === s : r) || "series" === e && r)) { + if (i.getViewOfSeriesModel(t).group.traverse((function (t) { + ll(t) + })), N(e)) o(t.getData(), e); else if (q(e)) for (var h = G(e), c = 0; c < h.length; c++) o(t.getData(h[c]), e[h[c]]); + l.push(t), Zs(t).isBlured = !0 + } + })), r.eachComponent((function (t, e) { + if ("series" !== t) { + var n = i.getViewOfComponentModel(e); + n && n.blurSeries && n.blurSeries(l, r) + } + })) + } + } + + function Dl(t, e, n) { + if (null != t && null != e) { + var i = n.getModel().getComponent(t, e); + if (i) { + Zs(i).isBlured = !0; + var r = n.getViewOfComponentModel(i); + r && r.focusBlurEnabled && r.group.traverse((function (t) { + ll(t) + })) + } + } + } + + function Al(t, e, n, i) { + var r = {focusSelf: !1, dispatchers: null}; + if (null == t || "series" === t || null == e || null == n) return r; + var o = i.getModel().getComponent(t, e); + if (!o) return r; + var a = i.getViewOfComponentModel(o); + if (!a || !a.findHighDownDispatchers) return r; + for (var s, l = a.findHighDownDispatchers(n), u = 0; u < l.length; u++) if ("self" === Ws(l[u]).focus) { + s = !0; + break + } + return {focusSelf: s, dispatchers: l} + } + + function kl(t) { + E(t.getAllData(), (function (e) { + var n = e.data, i = e.type; + n.eachItemGraphicEl((function (e, n) { + t.isSelected(n, i) ? Sl(e) : Ml(e) + })) + })) + } + + function Ll(t) { + var e = []; + return t.eachSeries((function (t) { + E(t.getAllData(), (function (n) { + n.data; + var i = n.type, r = t.getSelectedDataIndices(); + if (r.length > 0) { + var o = {dataIndex: r, seriesIndex: t.seriesIndex}; + null != i && (o.dataType = i), e.push(o) + } + })) + })), e + } + + function Pl(t, e, n) { + Vl(t, !0), dl(t, yl), Rl(t, e, n) + } + + function Ol(t, e, n, i) { + i ? function (t) { + Vl(t, !1) + }(t) : Pl(t, e, n) + } + + function Rl(t, e, n) { + var i = Ws(t); + null != e ? (i.focus = e, i.blurScope = n) : i.focus && (i.focus = null) + } + + var Nl = ["emphasis", "blur", "select"], + El = {itemStyle: "getItemStyle", lineStyle: "getLineStyle", areaStyle: "getAreaStyle"}; + + function zl(t, e, n, i) { + n = n || "itemStyle"; + for (var r = 0; r < Nl.length; r++) { + var o = Nl[r], a = e.getModel([o, n]); + t.ensureState(o).style = i ? i(a) : a[El[n]]() + } + } + + function Vl(t, e) { + var n = !1 === e, i = t; + t.highDownSilentOnTouch && (i.__highDownSilentOnTouch = t.highDownSilentOnTouch), n && !i.__highDownDispatcher || (i.__highByOuter = i.__highByOuter || 0, i.__highDownDispatcher = !n) + } + + function Bl(t) { + return !(!t || !t.__highDownDispatcher) + } + + function Fl(t) { + var e = t.type; + return e === Qs || e === tl || e === el + } + + function Gl(t) { + var e = t.type; + return e === $s || e === Js + } + + var Wl = ja.CMD, Hl = [[], [], []], Yl = Math.sqrt, Ul = Math.atan2; + + function Xl(t, e) { + if (e) { + var n, i, r, o, a, s, l = t.data, u = t.len(), h = Wl.M, c = Wl.C, p = Wl.L, d = Wl.R, f = Wl.A, g = Wl.Q; + for (r = 0, o = 0; r < u;) { + switch (n = l[r++], o = r, i = 0, n) { + case h: + case p: + i = 1; + break; + case c: + i = 3; + break; + case g: + i = 2; + break; + case f: + var y = e[4], v = e[5], m = Yl(e[0] * e[0] + e[1] * e[1]), x = Yl(e[2] * e[2] + e[3] * e[3]), + _ = Ul(-e[1] / x, e[0] / m); + l[r] *= m, l[r++] += y, l[r] *= x, l[r++] += v, l[r++] *= m, l[r++] *= x, l[r++] += _, l[r++] += _, o = r += 2; + break; + case d: + s[0] = l[r++], s[1] = l[r++], Ft(s, s, e), l[o++] = s[0], l[o++] = s[1], s[0] += l[r++], s[1] += l[r++], Ft(s, s, e), l[o++] = s[0], l[o++] = s[1] + } + for (a = 0; a < i; a++) { + var b = Hl[a]; + b[0] = l[r++], b[1] = l[r++], Ft(b, b, e), l[o++] = b[0], l[o++] = b[1] + } + } + t.increaseVersion() + } + } + + var Zl = Math.sqrt, jl = Math.sin, ql = Math.cos, Kl = Math.PI; + + function $l(t) { + return Math.sqrt(t[0] * t[0] + t[1] * t[1]) + } + + function Jl(t, e) { + return (t[0] * e[0] + t[1] * e[1]) / ($l(t) * $l(e)) + } + + function Ql(t, e) { + return (t[0] * e[1] < t[1] * e[0] ? -1 : 1) * Math.acos(Jl(t, e)) + } + + function tu(t, e, n, i, r, o, a, s, l, u, h) { + var c = l * (Kl / 180), p = ql(c) * (t - n) / 2 + jl(c) * (e - i) / 2, + d = -1 * jl(c) * (t - n) / 2 + ql(c) * (e - i) / 2, f = p * p / (a * a) + d * d / (s * s); + f > 1 && (a *= Zl(f), s *= Zl(f)); + var g = (r === o ? -1 : 1) * Zl((a * a * (s * s) - a * a * (d * d) - s * s * (p * p)) / (a * a * (d * d) + s * s * (p * p))) || 0, + y = g * a * d / s, v = g * -s * p / a, m = (t + n) / 2 + ql(c) * y - jl(c) * v, + x = (e + i) / 2 + jl(c) * y + ql(c) * v, _ = Ql([1, 0], [(p - y) / a, (d - v) / s]), + b = [(p - y) / a, (d - v) / s], w = [(-1 * p - y) / a, (-1 * d - v) / s], S = Ql(b, w); + if (Jl(b, w) <= -1 && (S = Kl), Jl(b, w) >= 1 && (S = 0), S < 0) { + var M = Math.round(S / Kl * 1e6) / 1e6; + S = 2 * Kl + M % 2 * Kl + } + h.addData(u, m, x, a, s, _, S, c, o) + } + + var eu = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi, nu = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g; + var iu = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.applyTransform = function (t) { + }, e + }(fs); + + function ru(t) { + return null != t.setData + } + + function ou(t, e) { + var n = function (t) { + var e = new ja; + if (!t) return e; + var n, i = 0, r = 0, o = i, a = r, s = ja.CMD, l = t.match(eu); + if (!l) return e; + for (var u = 0; u < l.length; u++) { + for (var h = l[u], c = h.charAt(0), p = void 0, d = h.match(nu) || [], f = d.length, g = 0; g < f; g++) d[g] = parseFloat(d[g]); + for (var y = 0; y < f;) { + var v = void 0, m = void 0, x = void 0, _ = void 0, b = void 0, w = void 0, S = void 0, M = i, + I = r, T = void 0, C = void 0; + switch (c) { + case"l": + i += d[y++], r += d[y++], p = s.L, e.addData(p, i, r); + break; + case"L": + i = d[y++], r = d[y++], p = s.L, e.addData(p, i, r); + break; + case"m": + i += d[y++], r += d[y++], p = s.M, e.addData(p, i, r), o = i, a = r, c = "l"; + break; + case"M": + i = d[y++], r = d[y++], p = s.M, e.addData(p, i, r), o = i, a = r, c = "L"; + break; + case"h": + i += d[y++], p = s.L, e.addData(p, i, r); + break; + case"H": + i = d[y++], p = s.L, e.addData(p, i, r); + break; + case"v": + r += d[y++], p = s.L, e.addData(p, i, r); + break; + case"V": + r = d[y++], p = s.L, e.addData(p, i, r); + break; + case"C": + p = s.C, e.addData(p, d[y++], d[y++], d[y++], d[y++], d[y++], d[y++]), i = d[y - 2], r = d[y - 1]; + break; + case"c": + p = s.C, e.addData(p, d[y++] + i, d[y++] + r, d[y++] + i, d[y++] + r, d[y++] + i, d[y++] + r), i += d[y - 2], r += d[y - 1]; + break; + case"S": + v = i, m = r, T = e.len(), C = e.data, n === s.C && (v += i - C[T - 4], m += r - C[T - 3]), p = s.C, M = d[y++], I = d[y++], i = d[y++], r = d[y++], e.addData(p, v, m, M, I, i, r); + break; + case"s": + v = i, m = r, T = e.len(), C = e.data, n === s.C && (v += i - C[T - 4], m += r - C[T - 3]), p = s.C, M = i + d[y++], I = r + d[y++], i += d[y++], r += d[y++], e.addData(p, v, m, M, I, i, r); + break; + case"Q": + M = d[y++], I = d[y++], i = d[y++], r = d[y++], p = s.Q, e.addData(p, M, I, i, r); + break; + case"q": + M = d[y++] + i, I = d[y++] + r, i += d[y++], r += d[y++], p = s.Q, e.addData(p, M, I, i, r); + break; + case"T": + v = i, m = r, T = e.len(), C = e.data, n === s.Q && (v += i - C[T - 4], m += r - C[T - 3]), i = d[y++], r = d[y++], p = s.Q, e.addData(p, v, m, i, r); + break; + case"t": + v = i, m = r, T = e.len(), C = e.data, n === s.Q && (v += i - C[T - 4], m += r - C[T - 3]), i += d[y++], r += d[y++], p = s.Q, e.addData(p, v, m, i, r); + break; + case"A": + x = d[y++], _ = d[y++], b = d[y++], w = d[y++], S = d[y++], tu(M = i, I = r, i = d[y++], r = d[y++], w, S, x, _, b, p = s.A, e); + break; + case"a": + x = d[y++], _ = d[y++], b = d[y++], w = d[y++], S = d[y++], tu(M = i, I = r, i += d[y++], r += d[y++], w, S, x, _, b, p = s.A, e) + } + } + "z" !== c && "Z" !== c || (p = s.Z, e.addData(p), i = o, r = a), n = p + } + return e.toStatic(), e + }(t), i = A({}, e); + return i.buildPath = function (t) { + if (ru(t)) { + t.setData(n.data), (e = t.getContext()) && t.rebuildPath(e, 1) + } else { + var e = t; + n.rebuildPath(e, 1) + } + }, i.applyTransform = function (t) { + Xl(n, t), this.dirtyShape() + }, i + } + + function au(t, e) { + return new iu(ou(t, e)) + } + + function su(t, e) { + e = e || {}; + var n = new fs; + return t.shape && n.setShape(t.shape), n.setStyle(t.style), e.bakeTransform ? Xl(n.path, t.getComputedTransform()) : e.toLocal ? n.setLocalTransform(t.getComputedTransform()) : n.copyTransform(t), n.buildPath = t.buildPath, n.applyTransform = n.applyTransform, n.z = t.z, n.z2 = t.z2, n.zlevel = t.zlevel, n + } + + var lu = function () { + this.cx = 0, this.cy = 0, this.r = 0 + }, uu = function (t) { + function e(e) { + return t.call(this, e) || this + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new lu + }, e.prototype.buildPath = function (t, e) { + t.moveTo(e.cx + e.r, e.cy), t.arc(e.cx, e.cy, e.r, 0, 2 * Math.PI) + }, e + }(fs); + uu.prototype.type = "circle"; + var hu = function () { + this.cx = 0, this.cy = 0, this.rx = 0, this.ry = 0 + }, cu = function (t) { + function e(e) { + return t.call(this, e) || this + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new hu + }, e.prototype.buildPath = function (t, e) { + var n = .5522848, i = e.cx, r = e.cy, o = e.rx, a = e.ry, s = o * n, l = a * n; + t.moveTo(i - o, r), t.bezierCurveTo(i - o, r - l, i - s, r - a, i, r - a), t.bezierCurveTo(i + s, r - a, i + o, r - l, i + o, r), t.bezierCurveTo(i + o, r + l, i + s, r + a, i, r + a), t.bezierCurveTo(i - s, r + a, i - o, r + l, i - o, r), t.closePath() + }, e + }(fs); + cu.prototype.type = "ellipse"; + var pu = Math.PI, du = 2 * pu, fu = Math.sin, gu = Math.cos, yu = Math.acos, vu = Math.atan2, mu = Math.abs, + xu = Math.sqrt, _u = Math.max, bu = Math.min, wu = 1e-4; + + function Su(t, e, n, i, r, o, a) { + var s = t - n, l = e - i, u = (a ? o : -o) / xu(s * s + l * l), h = u * l, c = -u * s, p = t + h, d = e + c, + f = n + h, g = i + c, y = (p + f) / 2, v = (d + g) / 2, m = f - p, x = g - d, _ = m * m + x * x, b = r - o, + w = p * g - f * d, S = (x < 0 ? -1 : 1) * xu(_u(0, b * b * _ - w * w)), M = (w * x - m * S) / _, + I = (-w * m - x * S) / _, T = (w * x + m * S) / _, C = (-w * m + x * S) / _, D = M - y, A = I - v, + k = T - y, L = C - v; + return D * D + A * A > k * k + L * L && (M = T, I = C), { + cx: M, + cy: I, + x0: -h, + y0: -c, + x1: M * (r / b - 1), + y1: I * (r / b - 1) + } + } + + function Mu(t, e) { + var n, i = _u(e.r, 0), r = _u(e.r0 || 0, 0), o = i > 0; + if (o || r > 0) { + if (o || (i = r, r = 0), r > i) { + var a = i; + i = r, r = a + } + var s = e.startAngle, l = e.endAngle; + if (!isNaN(s) && !isNaN(l)) { + var u = e.cx, h = e.cy, c = !!e.clockwise, p = mu(l - s), d = p > du && p % du; + if (d > wu && (p = d), i > wu) if (p > du - wu) t.moveTo(u + i * gu(s), h + i * fu(s)), t.arc(u, h, i, s, l, !c), r > wu && (t.moveTo(u + r * gu(l), h + r * fu(l)), t.arc(u, h, r, l, s, c)); else { + var f = void 0, g = void 0, y = void 0, v = void 0, m = void 0, x = void 0, _ = void 0, b = void 0, + w = void 0, S = void 0, M = void 0, I = void 0, T = void 0, C = void 0, D = void 0, A = void 0, + k = i * gu(s), L = i * fu(s), P = r * gu(l), O = r * fu(l), R = p > wu; + if (R) { + var N = e.cornerRadius; + N && (f = (n = function (t) { + var e; + if (Y(t)) { + var n = t.length; + if (!n) return t; + e = 1 === n ? [t[0], t[0], 0, 0] : 2 === n ? [t[0], t[0], t[1], t[1]] : 3 === n ? t.concat(t[2]) : t + } else e = [t, t, t, t]; + return e + }(N))[0], g = n[1], y = n[2], v = n[3]); + var E = mu(i - r) / 2; + if (m = bu(E, y), x = bu(E, v), _ = bu(E, f), b = bu(E, g), M = w = _u(m, x), I = S = _u(_, b), (w > wu || S > wu) && (T = i * gu(l), C = i * fu(l), D = r * gu(s), A = r * fu(s), p < pu)) { + var z = function (t, e, n, i, r, o, a, s) { + var l = n - t, u = i - e, h = a - r, c = s - o, p = c * l - h * u; + if (!(p * p < wu)) return [t + (p = (h * (e - o) - c * (t - r)) / p) * l, e + p * u] + }(k, L, D, A, T, C, P, O); + if (z) { + var V = k - z[0], B = L - z[1], F = T - z[0], G = C - z[1], + W = 1 / fu(yu((V * F + B * G) / (xu(V * V + B * B) * xu(F * F + G * G))) / 2), + H = xu(z[0] * z[0] + z[1] * z[1]); + M = bu(w, (i - H) / (W + 1)), I = bu(S, (r - H) / (W - 1)) + } + } + } + if (R) if (M > wu) { + var U = bu(y, M), X = bu(v, M), Z = Su(D, A, k, L, i, U, c), j = Su(T, C, P, O, i, X, c); + t.moveTo(u + Z.cx + Z.x0, h + Z.cy + Z.y0), M < w && U === X ? t.arc(u + Z.cx, h + Z.cy, M, vu(Z.y0, Z.x0), vu(j.y0, j.x0), !c) : (U > 0 && t.arc(u + Z.cx, h + Z.cy, U, vu(Z.y0, Z.x0), vu(Z.y1, Z.x1), !c), t.arc(u, h, i, vu(Z.cy + Z.y1, Z.cx + Z.x1), vu(j.cy + j.y1, j.cx + j.x1), !c), X > 0 && t.arc(u + j.cx, h + j.cy, X, vu(j.y1, j.x1), vu(j.y0, j.x0), !c)) + } else t.moveTo(u + k, h + L), t.arc(u, h, i, s, l, !c); else t.moveTo(u + k, h + L); + if (r > wu && R) if (I > wu) { + U = bu(f, I), Z = Su(P, O, T, C, r, -(X = bu(g, I)), c), j = Su(k, L, D, A, r, -U, c); + t.lineTo(u + Z.cx + Z.x0, h + Z.cy + Z.y0), I < S && U === X ? t.arc(u + Z.cx, h + Z.cy, I, vu(Z.y0, Z.x0), vu(j.y0, j.x0), !c) : (X > 0 && t.arc(u + Z.cx, h + Z.cy, X, vu(Z.y0, Z.x0), vu(Z.y1, Z.x1), !c), t.arc(u, h, r, vu(Z.cy + Z.y1, Z.cx + Z.x1), vu(j.cy + j.y1, j.cx + j.x1), c), U > 0 && t.arc(u + j.cx, h + j.cy, U, vu(j.y1, j.x1), vu(j.y0, j.x0), !c)) + } else t.lineTo(u + P, h + O), t.arc(u, h, r, l, s, c); else t.lineTo(u + P, h + O) + } else t.moveTo(u, h); + t.closePath() + } + } + } + + var Iu = function () { + this.cx = 0, this.cy = 0, this.r0 = 0, this.r = 0, this.startAngle = 0, this.endAngle = 2 * Math.PI, this.clockwise = !0, this.cornerRadius = 0 + }, Tu = function (t) { + function e(e) { + return t.call(this, e) || this + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new Iu + }, e.prototype.buildPath = function (t, e) { + Mu(t, e) + }, e.prototype.isZeroArea = function () { + return this.shape.startAngle === this.shape.endAngle || this.shape.r === this.shape.r0 + }, e + }(fs); + Tu.prototype.type = "sector"; + var Cu = function () { + this.cx = 0, this.cy = 0, this.r = 0, this.r0 = 0 + }, Du = function (t) { + function e(e) { + return t.call(this, e) || this + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new Cu + }, e.prototype.buildPath = function (t, e) { + var n = e.cx, i = e.cy, r = 2 * Math.PI; + t.moveTo(n + e.r, i), t.arc(n, i, e.r, 0, r, !1), t.moveTo(n + e.r0, i), t.arc(n, i, e.r0, 0, r, !0) + }, e + }(fs); + + function Au(t, e, n) { + var i = e.smooth, r = e.points; + if (r && r.length >= 2) { + if (i) { + var o = function (t, e, n, i) { + var r, o, a, s, l = [], u = [], h = [], c = []; + if (i) { + a = [1 / 0, 1 / 0], s = [-1 / 0, -1 / 0]; + for (var p = 0, d = t.length; p < d; p++) Gt(a, a, t[p]), Wt(s, s, t[p]); + Gt(a, a, i[0]), Wt(s, s, i[1]) + } + for (p = 0, d = t.length; p < d; p++) { + var f = t[p]; + if (n) r = t[p ? p - 1 : d - 1], o = t[(p + 1) % d]; else { + if (0 === p || p === d - 1) { + l.push(Mt(t[p])); + continue + } + r = t[p - 1], o = t[p + 1] + } + Dt(u, o, r), Ot(u, u, e); + var g = Nt(f, r), y = Nt(f, o), v = g + y; + 0 !== v && (g /= v, y /= v), Ot(h, u, -g), Ot(c, u, y); + var m = Tt([], f, h), x = Tt([], f, c); + i && (Wt(m, m, a), Gt(m, m, s), Wt(x, x, a), Gt(x, x, s)), l.push(m), l.push(x) + } + return n && l.push(l.shift()), l + }(r, i, n, e.smoothConstraint); + t.moveTo(r[0][0], r[0][1]); + for (var a = r.length, s = 0; s < (n ? a : a - 1); s++) { + var l = o[2 * s], u = o[2 * s + 1], h = r[(s + 1) % a]; + t.bezierCurveTo(l[0], l[1], u[0], u[1], h[0], h[1]) + } + } else { + t.moveTo(r[0][0], r[0][1]); + s = 1; + for (var c = r.length; s < c; s++) t.lineTo(r[s][0], r[s][1]) + } + n && t.closePath() + } + } + + Du.prototype.type = "ring"; + var ku = function () { + this.points = null, this.smooth = 0, this.smoothConstraint = null + }, Lu = function (t) { + function e(e) { + return t.call(this, e) || this + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new ku + }, e.prototype.buildPath = function (t, e) { + Au(t, e, !0) + }, e + }(fs); + Lu.prototype.type = "polygon"; + var Pu = function () { + this.points = null, this.percent = 1, this.smooth = 0, this.smoothConstraint = null + }, Ou = function (t) { + function e(e) { + return t.call(this, e) || this + } + + return n(e, t), e.prototype.getDefaultStyle = function () { + return {stroke: "#000", fill: null} + }, e.prototype.getDefaultShape = function () { + return new Pu + }, e.prototype.buildPath = function (t, e) { + Au(t, e, !1) + }, e + }(fs); + Ou.prototype.type = "polyline"; + var Ru = {}, Nu = function () { + this.x1 = 0, this.y1 = 0, this.x2 = 0, this.y2 = 0, this.percent = 1 + }, Eu = function (t) { + function e(e) { + return t.call(this, e) || this + } + + return n(e, t), e.prototype.getDefaultStyle = function () { + return {stroke: "#000", fill: null} + }, e.prototype.getDefaultShape = function () { + return new Nu + }, e.prototype.buildPath = function (t, e) { + var n, i, r, o; + if (this.subPixelOptimize) { + var a = bs(Ru, e, this.style); + n = a.x1, i = a.y1, r = a.x2, o = a.y2 + } else n = e.x1, i = e.y1, r = e.x2, o = e.y2; + var s = e.percent; + 0 !== s && (t.moveTo(n, i), s < 1 && (r = n * (1 - s) + r * s, o = i * (1 - s) + o * s), t.lineTo(r, o)) + }, e.prototype.pointAt = function (t) { + var e = this.shape; + return [e.x1 * (1 - t) + e.x2 * t, e.y1 * (1 - t) + e.y2 * t] + }, e + }(fs); + Eu.prototype.type = "line"; + var zu = [], Vu = function () { + this.x1 = 0, this.y1 = 0, this.x2 = 0, this.y2 = 0, this.cpx1 = 0, this.cpy1 = 0, this.percent = 1 + }; + + function Bu(t, e, n) { + var i = t.cpx2, r = t.cpy2; + return null != i || null != r ? [(n ? Ye : He)(t.x1, t.cpx1, t.cpx2, t.x2, e), (n ? Ye : He)(t.y1, t.cpy1, t.cpy2, t.y2, e)] : [(n ? $e : Ke)(t.x1, t.cpx1, t.x2, e), (n ? $e : Ke)(t.y1, t.cpy1, t.y2, e)] + } + + var Fu = function (t) { + function e(e) { + return t.call(this, e) || this + } + + return n(e, t), e.prototype.getDefaultStyle = function () { + return {stroke: "#000", fill: null} + }, e.prototype.getDefaultShape = function () { + return new Vu + }, e.prototype.buildPath = function (t, e) { + var n = e.x1, i = e.y1, r = e.x2, o = e.y2, a = e.cpx1, s = e.cpy1, l = e.cpx2, u = e.cpy2, h = e.percent; + 0 !== h && (t.moveTo(n, i), null == l || null == u ? (h < 1 && (Qe(n, a, r, h, zu), a = zu[1], r = zu[2], Qe(i, s, o, h, zu), s = zu[1], o = zu[2]), t.quadraticCurveTo(a, s, r, o)) : (h < 1 && (Ze(n, a, l, r, h, zu), a = zu[1], l = zu[2], r = zu[3], Ze(i, s, u, o, h, zu), s = zu[1], u = zu[2], o = zu[3]), t.bezierCurveTo(a, s, l, u, r, o))) + }, e.prototype.pointAt = function (t) { + return Bu(this.shape, t, !1) + }, e.prototype.tangentAt = function (t) { + var e = Bu(this.shape, t, !0); + return Rt(e, e) + }, e + }(fs); + Fu.prototype.type = "bezier-curve"; + var Gu = function () { + this.cx = 0, this.cy = 0, this.r = 0, this.startAngle = 0, this.endAngle = 2 * Math.PI, this.clockwise = !0 + }, Wu = function (t) { + function e(e) { + return t.call(this, e) || this + } + + return n(e, t), e.prototype.getDefaultStyle = function () { + return {stroke: "#000", fill: null} + }, e.prototype.getDefaultShape = function () { + return new Gu + }, e.prototype.buildPath = function (t, e) { + var n = e.cx, i = e.cy, r = Math.max(e.r, 0), o = e.startAngle, a = e.endAngle, s = e.clockwise, + l = Math.cos(o), u = Math.sin(o); + t.moveTo(l * r + n, u * r + i), t.arc(n, i, r, o, a, !s) + }, e + }(fs); + Wu.prototype.type = "arc"; + var Hu = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.type = "compound", e + } + + return n(e, t), e.prototype._updatePathDirty = function () { + for (var t = this.shape.paths, e = this.shapeChanged(), n = 0; n < t.length; n++) e = e || t[n].shapeChanged(); + e && this.dirtyShape() + }, e.prototype.beforeBrush = function () { + this._updatePathDirty(); + for (var t = this.shape.paths || [], e = this.getGlobalScale(), n = 0; n < t.length; n++) t[n].path || t[n].createPathProxy(), t[n].path.setScale(e[0], e[1], t[n].segmentIgnoreThreshold) + }, e.prototype.buildPath = function (t, e) { + for (var n = e.paths || [], i = 0; i < n.length; i++) n[i].buildPath(t, n[i].shape, !0) + }, e.prototype.afterBrush = function () { + for (var t = this.shape.paths || [], e = 0; e < t.length; e++) t[e].pathUpdated() + }, e.prototype.getBoundingRect = function () { + return this._updatePathDirty.call(this), fs.prototype.getBoundingRect.call(this) + }, e + }(fs), Yu = function () { + function t(t) { + this.colorStops = t || [] + } + + return t.prototype.addColorStop = function (t, e) { + this.colorStops.push({offset: t, color: e}) + }, t + }(), Uu = function (t) { + function e(e, n, i, r, o, a) { + var s = t.call(this, o) || this; + return s.x = null == e ? 0 : e, s.y = null == n ? 0 : n, s.x2 = null == i ? 1 : i, s.y2 = null == r ? 0 : r, s.type = "linear", s.global = a || !1, s + } + + return n(e, t), e + }(Yu), Xu = function (t) { + function e(e, n, i, r, o) { + var a = t.call(this, r) || this; + return a.x = null == e ? .5 : e, a.y = null == n ? .5 : n, a.r = null == i ? .5 : i, a.type = "radial", a.global = o || !1, a + } + + return n(e, t), e + }(Yu), Zu = [0, 0], ju = [0, 0], qu = new Ji, Ku = new Ji, $u = function () { + function t(t, e) { + this._corners = [], this._axes = [], this._origin = [0, 0]; + for (var n = 0; n < 4; n++) this._corners[n] = new Ji; + for (n = 0; n < 2; n++) this._axes[n] = new Ji; + t && this.fromBoundingRect(t, e) + } + + return t.prototype.fromBoundingRect = function (t, e) { + var n = this._corners, i = this._axes, r = t.x, o = t.y, a = r + t.width, s = o + t.height; + if (n[0].set(r, o), n[1].set(a, o), n[2].set(a, s), n[3].set(r, s), e) for (var l = 0; l < 4; l++) n[l].transform(e); + Ji.sub(i[0], n[1], n[0]), Ji.sub(i[1], n[3], n[0]), i[0].normalize(), i[1].normalize(); + for (l = 0; l < 2; l++) this._origin[l] = i[l].dot(n[0]) + }, t.prototype.intersect = function (t, e) { + var n = !0, i = !e; + return qu.set(1 / 0, 1 / 0), Ku.set(0, 0), !this._intersectCheckOneSide(this, t, qu, Ku, i, 1) && (n = !1, i) || !this._intersectCheckOneSide(t, this, qu, Ku, i, -1) && (n = !1, i) || i || Ji.copy(e, n ? qu : Ku), n + }, t.prototype._intersectCheckOneSide = function (t, e, n, i, r, o) { + for (var a = !0, s = 0; s < 2; s++) { + var l = this._axes[s]; + if (this._getProjMinMaxOnAxis(s, t._corners, Zu), this._getProjMinMaxOnAxis(s, e._corners, ju), Zu[1] < ju[0] || Zu[0] > ju[1]) { + if (a = !1, r) return a; + var u = Math.abs(ju[0] - Zu[1]), h = Math.abs(Zu[0] - ju[1]); + Math.min(u, h) > i.len() && (u < h ? Ji.scale(i, l, -u * o) : Ji.scale(i, l, h * o)) + } else if (n) { + u = Math.abs(ju[0] - Zu[1]), h = Math.abs(Zu[0] - ju[1]); + Math.min(u, h) < n.len() && (u < h ? Ji.scale(n, l, u * o) : Ji.scale(n, l, -h * o)) + } + } + return a + }, t.prototype._getProjMinMaxOnAxis = function (t, e, n) { + for (var i = this._axes[t], r = this._origin, o = e[0].dot(i) + r[t], a = o, s = o, l = 1; l < e.length; l++) { + var u = e[l].dot(i) + r[t]; + a = Math.min(u, a), s = Math.max(u, s) + } + n[0] = a, n[1] = s + }, t + }(), Ju = [], Qu = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.notClear = !0, e.incremental = !0, e._displayables = [], e._temporaryDisplayables = [], e._cursor = 0, e + } + + return n(e, t), e.prototype.traverse = function (t, e) { + t.call(e, this) + }, e.prototype.useStyle = function () { + this.style = {} + }, e.prototype.getCursor = function () { + return this._cursor + }, e.prototype.innerAfterBrush = function () { + this._cursor = this._displayables.length + }, e.prototype.clearDisplaybles = function () { + this._displayables = [], this._temporaryDisplayables = [], this._cursor = 0, this.markRedraw(), this.notClear = !1 + }, e.prototype.clearTemporalDisplayables = function () { + this._temporaryDisplayables = [] + }, e.prototype.addDisplayable = function (t, e) { + e ? this._temporaryDisplayables.push(t) : this._displayables.push(t), this.markRedraw() + }, e.prototype.addDisplayables = function (t, e) { + e = e || !1; + for (var n = 0; n < t.length; n++) this.addDisplayable(t[n], e) + }, e.prototype.getDisplayables = function () { + return this._displayables + }, e.prototype.getTemporalDisplayables = function () { + return this._temporaryDisplayables + }, e.prototype.eachPendingDisplayable = function (t) { + for (var e = this._cursor; e < this._displayables.length; e++) t && t(this._displayables[e]); + for (e = 0; e < this._temporaryDisplayables.length; e++) t && t(this._temporaryDisplayables[e]) + }, e.prototype.update = function () { + this.updateTransform(); + for (var t = this._cursor; t < this._displayables.length; t++) { + (e = this._displayables[t]).parent = this, e.update(), e.parent = null + } + for (t = 0; t < this._temporaryDisplayables.length; t++) { + var e; + (e = this._temporaryDisplayables[t]).parent = this, e.update(), e.parent = null + } + }, e.prototype.getBoundingRect = function () { + if (!this._rect) { + for (var t = new sr(1 / 0, 1 / 0, -1 / 0, -1 / 0), e = 0; e < this._displayables.length; e++) { + var n = this._displayables[e], i = n.getBoundingRect().clone(); + n.needLocalTransform() && i.applyTransform(n.getLocalTransform(Ju)), t.union(i) + } + this._rect = t + } + return this._rect + }, e.prototype.contain = function (t, e) { + var n = this.transformCoordToLocal(t, e); + if (this.getBoundingRect().contain(n[0], n[1])) for (var i = 0; i < this._displayables.length; i++) { + if (this._displayables[i].contain(t, e)) return !0 + } + return !1 + }, e + }(da), th = So(); + + function eh(t, e, n, i, r) { + var o; + if (e && e.ecModel) { + var a = e.ecModel.getUpdatePayload(); + o = a && a.animation + } + var s = "update" === t; + if (e && e.isAnimationEnabled()) { + var l = void 0, u = void 0, h = void 0; + return i ? (l = rt(i.duration, 200), u = rt(i.easing, "cubicOut"), h = 0) : (l = e.getShallow(s ? "animationDurationUpdate" : "animationDuration"), u = e.getShallow(s ? "animationEasingUpdate" : "animationEasing"), h = e.getShallow(s ? "animationDelayUpdate" : "animationDelay")), o && (null != o.duration && (l = o.duration), null != o.easing && (u = o.easing), null != o.delay && (h = o.delay)), U(h) && (h = h(n, r)), U(l) && (l = l(n)), { + duration: l || 0, + delay: h, + easing: u + } + } + return null + } + + function nh(t, e, n, i, r, o, a) { + var s, l = !1; + U(r) ? (a = o, o = r, r = null) : q(r) && (o = r.cb, a = r.during, l = r.isFrom, s = r.removeOpt, r = r.dataIndex); + var u = "leave" === t; + u || e.stopAnimation("leave"); + var h = eh(t, i, r, u ? s || {} : null, i && i.getAnimationDelayParams ? i.getAnimationDelayParams(e, r) : null); + if (h && h.duration > 0) { + var c = { + duration: h.duration, + delay: h.delay || 0, + easing: h.easing, + done: o, + force: !!o || !!a, + setToFinal: !u, + scope: t, + during: a + }; + l ? e.animateFrom(n, c) : e.animateTo(n, c) + } else e.stopAnimation(), !l && e.attr(n), a && a(1), o && o() + } + + function ih(t, e, n, i, r, o) { + nh("update", t, e, n, i, r, o) + } + + function rh(t, e, n, i, r, o) { + nh("enter", t, e, n, i, r, o) + } + + function oh(t) { + if (!t.__zr) return !0; + for (var e = 0; e < t.animators.length; e++) { + if ("leave" === t.animators[e].scope) return !0 + } + return !1 + } + + function ah(t, e, n, i, r, o) { + oh(t) || nh("leave", t, e, n, i, r, o) + } + + function sh(t, e, n, i) { + t.removeTextContent(), t.removeTextGuideLine(), ah(t, {style: {opacity: 0}}, e, n, i) + } + + function lh(t, e, n) { + function i() { + t.parent && t.parent.remove(t) + } + + t.isGroup ? t.traverse((function (t) { + t.isGroup || sh(t, e, n, i) + })) : sh(t, e, n, i) + } + + function uh(t) { + th(t).oldStyle = t.style + } + + var hh = Math.max, ch = Math.min, ph = {}; + + function dh(t) { + return fs.extend(t) + } + + var fh = function (t, e) { + var i = ou(t, e); + return function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n.applyTransform = i.applyTransform, n.buildPath = i.buildPath, n + } + + return n(e, t), e + }(iu) + }; + + function gh(t, e) { + return fh(t, e) + } + + function yh(t, e) { + ph[t] = e + } + + function vh(t) { + if (ph.hasOwnProperty(t)) return ph[t] + } + + function mh(t, e, n, i) { + var r = au(t, e); + return n && ("center" === i && (n = _h(n, r.getBoundingRect())), wh(r, n)), r + } + + function xh(t, e, n) { + var i = new xs({ + style: {image: t, x: e.x, y: e.y, width: e.width, height: e.height}, onload: function (t) { + if ("center" === n) { + var r = {width: t.width, height: t.height}; + i.setStyle(_h(e, r)) + } + } + }); + return i + } + + function _h(t, e) { + var n, i = e.width / e.height, r = t.height * i; + return n = r <= t.width ? t.height : (r = t.width) / i, { + x: t.x + t.width / 2 - r / 2, + y: t.y + t.height / 2 - n / 2, + width: r, + height: n + } + } + + var bh = function (t, e) { + for (var n = [], i = t.length, r = 0; r < i; r++) { + var o = t[r]; + n.push(o.getUpdatedPathProxy(!0)) + } + var a = new fs(e); + return a.createPathProxy(), a.buildPath = function (t) { + if (ru(t)) { + t.appendPath(n); + var e = t.getContext(); + e && t.rebuildPath(e, 1) + } + }, a + }; + + function wh(t, e) { + if (t.applyTransform) { + var n = t.getBoundingRect().calculateTransform(e); + t.applyTransform(n) + } + } + + var Sh = Ss; + + function Mh(t, e) { + for (var n = Oi([]); t && t !== e;) Ni(n, t.getLocalTransform(), n), t = t.parent; + return n + } + + function Ih(t, e, n) { + return e && !N(e) && (e = qi.getLocalTransform(e)), n && (e = Bi([], e)), Ft([], t, e) + } + + function Th(t, e, n) { + var i = 0 === e[4] || 0 === e[5] || 0 === e[0] ? 1 : Math.abs(2 * e[4] / e[0]), + r = 0 === e[4] || 0 === e[5] || 0 === e[2] ? 1 : Math.abs(2 * e[4] / e[2]), + o = ["left" === t ? -i : "right" === t ? i : 0, "top" === t ? -r : "bottom" === t ? r : 0]; + return o = Ih(o, e, n), Math.abs(o[0]) > Math.abs(o[1]) ? o[0] > 0 ? "right" : "left" : o[1] > 0 ? "bottom" : "top" + } + + function Ch(t) { + return !t.isGroup + } + + function Dh(t, e, n) { + if (t && e) { + var i, r = (i = {}, t.traverse((function (t) { + Ch(t) && t.anid && (i[t.anid] = t) + })), i); + e.traverse((function (t) { + if (Ch(t) && t.anid) { + var e = r[t.anid]; + if (e) { + var i = o(t); + t.attr(o(e)), ih(t, i, n, Ws(t).dataIndex) + } + } + })) + } + + function o(t) { + var e = {x: t.x, y: t.y, rotation: t.rotation}; + return function (t) { + return null != t.shape + }(t) && (e.shape = A({}, t.shape)), e + } + } + + function Ah(t, e) { + return z(t, (function (t) { + var n = t[0]; + n = hh(n, e.x), n = ch(n, e.x + e.width); + var i = t[1]; + return i = hh(i, e.y), [n, i = ch(i, e.y + e.height)] + })) + } + + function kh(t, e) { + var n = hh(t.x, e.x), i = ch(t.x + t.width, e.x + e.width), r = hh(t.y, e.y), + o = ch(t.y + t.height, e.y + e.height); + if (i >= n && o >= r) return {x: n, y: r, width: i - n, height: o - r} + } + + function Lh(t, e, n) { + var i = A({rectHover: !0}, e), r = i.style = {strokeNoScale: !0}; + if (n = n || { + x: -1, + y: -1, + width: 2, + height: 2 + }, t) return 0 === t.indexOf("image://") ? (r.image = t.slice(8), k(r, n), new xs(i)) : mh(t.replace("path://", ""), i, n, "center") + } + + function Ph(t, e, n, i, r) { + for (var o = 0, a = r[r.length - 1]; o < r.length; o++) { + var s = r[o]; + if (Oh(t, e, n, i, s[0], s[1], a[0], a[1])) return !0; + a = s + } + } + + function Oh(t, e, n, i, r, o, a, s) { + var l, u = n - t, h = i - e, c = a - r, p = s - o, d = Rh(c, p, u, h); + if ((l = d) <= 1e-6 && l >= -1e-6) return !1; + var f = t - r, g = e - o, y = Rh(f, g, u, h) / d; + if (y < 0 || y > 1) return !1; + var v = Rh(f, g, c, p) / d; + return !(v < 0 || v > 1) + } + + function Rh(t, e, n, i) { + return t * i - n * e + } + + function Nh(t) { + var e = t.itemTooltipOption, n = t.componentModel, i = t.itemName, r = X(e) ? {formatter: e} : e, + o = n.mainType, a = n.componentIndex, s = {componentType: o, name: i, $vars: ["name"]}; + s[o + "Index"] = a; + var l = t.formatterParamsExtra; + l && E(G(l), (function (t) { + mt(s, t) || (s[t] = l[t], s.$vars.push(t)) + })); + var u = Ws(t.el); + u.componentMainType = o, u.componentIndex = a, u.tooltipConfig = { + name: i, + option: k({content: i, formatterParams: s}, r) + } + } + + function Eh(t, e) { + var n; + t.isGroup && (n = e(t)), n || t.traverse(e) + } + + function zh(t, e) { + if (t) if (Y(t)) for (var n = 0; n < t.length; n++) Eh(t[n], e); else Eh(t, e) + } + + yh("circle", uu), yh("ellipse", cu), yh("sector", Tu), yh("ring", Du), yh("polygon", Lu), yh("polyline", Ou), yh("rect", Ts), yh("line", Eu), yh("bezierCurve", Fu), yh("arc", Wu); + var Vh = Object.freeze({ + __proto__: null, + updateProps: ih, + initProps: rh, + removeElement: ah, + removeElementWithFadeOut: lh, + isElementRemoved: oh, + extendShape: dh, + extendPath: gh, + registerShape: yh, + getShapeClass: vh, + makePath: mh, + makeImage: xh, + mergePath: bh, + resizePath: wh, + subPixelOptimizeLine: function (t) { + return bs(t.shape, t.shape, t.style), t + }, + subPixelOptimizeRect: function (t) { + return ws(t.shape, t.shape, t.style), t + }, + subPixelOptimize: Sh, + getTransform: Mh, + applyTransform: Ih, + transformDirection: Th, + groupTransition: Dh, + clipPointsByRect: Ah, + clipRectByRect: kh, + createIcon: Lh, + linePolygonIntersect: Ph, + lineLineIntersect: Oh, + setTooltipConfig: Nh, + traverseElements: zh, + Group: Cr, + Image: xs, + Text: As, + Circle: uu, + Ellipse: cu, + Sector: Tu, + Ring: Du, + Polygon: Lu, + Polyline: Ou, + Rect: Ts, + Line: Eu, + BezierCurve: Fu, + Arc: Wu, + IncrementalDisplayable: Qu, + CompoundPath: Hu, + LinearGradient: Uu, + RadialGradient: Xu, + BoundingRect: sr, + OrientedBoundingRect: $u, + Point: Ji, + Path: fs + }), Bh = {}; + + function Fh(t, e) { + for (var n = 0; n < js.length; n++) { + var i = js[n], r = e[i], o = t.ensureState(i); + o.style = o.style || {}, o.style.text = r + } + var a = t.currentStates.slice(); + t.clearStates(!0), t.setStyle({text: e.normal}), t.useStates(a, !0) + } + + function Gh(t, e, n) { + var i, r = t.labelFetcher, o = t.labelDataIndex, a = t.labelDimIndex, s = e.normal; + r && (i = r.getFormattedLabel(o, "normal", null, a, s && s.get("formatter"), null != n ? {interpolatedValue: n} : null)), null == i && (i = U(t.defaultText) ? t.defaultText(o, t, n) : t.defaultText); + for (var l = {normal: i}, u = 0; u < js.length; u++) { + var h = js[u], c = e[h]; + l[h] = rt(r ? r.getFormattedLabel(o, h, null, a, c && c.get("formatter")) : null, i) + } + return l + } + + function Wh(t, e, n, i) { + n = n || Bh; + for (var r = t instanceof As, o = !1, a = 0; a < qs.length; a++) { + if ((p = e[qs[a]]) && p.getShallow("show")) { + o = !0; + break + } + } + var s = r ? t : t.getTextContent(); + if (o) { + r || (s || (s = new As, t.setTextContent(s)), t.stateProxy && (s.stateProxy = t.stateProxy)); + var l = Gh(n, e), u = e.normal, h = !!u.getShallow("show"), c = Yh(u, i && i.normal, n, !1, !r); + c.text = l.normal, r || t.setTextConfig(Uh(u, n, !1)); + for (a = 0; a < js.length; a++) { + var p, d = js[a]; + if (p = e[d]) { + var f = s.ensureState(d), g = !!rt(p.getShallow("show"), h); + if (g !== h && (f.ignore = !g), f.style = Yh(p, i && i[d], n, !0, !r), f.style.text = l[d], !r) t.ensureState(d).textConfig = Uh(p, n, !0) + } + } + s.silent = !!u.getShallow("silent"), null != s.style.x && (c.x = s.style.x), null != s.style.y && (c.y = s.style.y), s.ignore = !h, s.useStyle(c), s.dirty(), n.enableTextSetter && ($h(s).setLabelText = function (t) { + var i = Gh(n, e, t); + Fh(s, i) + }) + } else s && (s.ignore = !0); + t.dirty() + } + + function Hh(t, e) { + e = e || "label"; + for (var n = {normal: t.getModel(e)}, i = 0; i < js.length; i++) { + var r = js[i]; + n[r] = t.getModel([r, e]) + } + return n + } + + function Yh(t, e, n, i, r) { + var o = {}; + return function (t, e, n, i, r) { + n = n || Bh; + var o, a = e.ecModel, s = a && a.option.textStyle, l = function (t) { + var e; + for (; t && t !== t.ecModel;) { + var n = (t.option || Bh).rich; + if (n) { + e = e || {}; + for (var i = G(n), r = 0; r < i.length; r++) { + e[i[r]] = 1 + } + } + t = t.parentModel + } + return e + }(e); + if (l) for (var u in o = {}, l) if (l.hasOwnProperty(u)) { + var h = e.getModel(["rich", u]); + qh(o[u] = {}, h, s, n, i, r, !1, !0) + } + o && (t.rich = o); + var c = e.get("overflow"); + c && (t.overflow = c); + var p = e.get("minMargin"); + null != p && (t.margin = p); + qh(t, e, s, n, i, r, !0, !1) + }(o, t, n, i, r), e && A(o, e), o + } + + function Uh(t, e, n) { + e = e || {}; + var i, r = {}, o = t.getShallow("rotate"), a = rt(t.getShallow("distance"), n ? null : 5), + s = t.getShallow("offset"); + return "outside" === (i = t.getShallow("position") || (n ? null : "inside")) && (i = e.defaultOutsidePosition || "top"), null != i && (r.position = i), null != s && (r.offset = s), null != o && (o *= Math.PI / 180, r.rotation = o), null != a && (r.distance = a), r.outsideFill = "inherit" === t.get("color") ? e.inheritColor || null : "auto", r + } + + var Xh = ["fontStyle", "fontWeight", "fontSize", "fontFamily", "textShadowColor", "textShadowBlur", "textShadowOffsetX", "textShadowOffsetY"], + Zh = ["align", "lineHeight", "width", "height", "tag", "verticalAlign"], + jh = ["padding", "borderWidth", "borderRadius", "borderDashOffset", "backgroundColor", "borderColor", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY"]; + + function qh(t, e, n, i, r, o, a, s) { + n = !r && n || Bh; + var l = i && i.inheritColor, u = e.getShallow("color"), h = e.getShallow("textBorderColor"), + c = rt(e.getShallow("opacity"), n.opacity); + "inherit" !== u && "auto" !== u || (u = l || null), "inherit" !== h && "auto" !== h || (h = l || null), o || (u = u || n.color, h = h || n.textBorderColor), null != u && (t.fill = u), null != h && (t.stroke = h); + var p = rt(e.getShallow("textBorderWidth"), n.textBorderWidth); + null != p && (t.lineWidth = p); + var d = rt(e.getShallow("textBorderType"), n.textBorderType); + null != d && (t.lineDash = d); + var f = rt(e.getShallow("textBorderDashOffset"), n.textBorderDashOffset); + null != f && (t.lineDashOffset = f), r || null != c || s || (c = i && i.defaultOpacity), null != c && (t.opacity = c), r || o || null == t.fill && i.inheritColor && (t.fill = i.inheritColor); + for (var g = 0; g < Xh.length; g++) { + var y = Xh[g]; + null != (m = rt(e.getShallow(y), n[y])) && (t[y] = m) + } + for (g = 0; g < Zh.length; g++) { + y = Zh[g]; + null != (m = e.getShallow(y)) && (t[y] = m) + } + if (null == t.verticalAlign) { + var v = e.getShallow("baseline"); + null != v && (t.verticalAlign = v) + } + if (!a || !i.disableBox) { + for (g = 0; g < jh.length; g++) { + var m; + y = jh[g]; + null != (m = e.getShallow(y)) && (t[y] = m) + } + var x = e.getShallow("borderType"); + null != x && (t.borderDash = x), "auto" !== t.backgroundColor && "inherit" !== t.backgroundColor || !l || (t.backgroundColor = l), "auto" !== t.borderColor && "inherit" !== t.borderColor || !l || (t.borderColor = l) + } + } + + function Kh(t, e) { + var n = e && e.getModel("textStyle"); + return ut([t.fontStyle || n && n.getShallow("fontStyle") || "", t.fontWeight || n && n.getShallow("fontWeight") || "", (t.fontSize || n && n.getShallow("fontSize") || 12) + "px", t.fontFamily || n && n.getShallow("fontFamily") || "sans-serif"].join(" ")) + } + + var $h = So(); + + function Jh(t, e, n, i) { + if (t) { + var r = $h(t); + r.prevValue = r.value, r.value = n; + var o = e.normal; + r.valueAnimation = o.get("valueAnimation"), r.valueAnimation && (r.precision = o.get("precision"), r.defaultInterpolatedText = i, r.statesModels = e) + } + } + + function Qh(t, e, n, i, r) { + var o = $h(t); + if (o.valueAnimation && o.prevValue !== o.value) { + var a = o.defaultInterpolatedText, s = rt(o.interpolatedValue, o.prevValue), l = o.value; + t.percent = 0, (null == o.prevValue ? rh : ih)(t, {percent: 1}, i, e, null, (function (i) { + var u = Po(n, o.precision, s, l, i); + o.interpolatedValue = 1 === i ? null : u; + var h = Gh({labelDataIndex: e, labelFetcher: r, defaultText: a ? a(u) : u + ""}, o.statesModels, u); + Fh(t, h) + })) + } + } + + var tc, ec, nc = ["textStyle", "color"], + ic = ["fontStyle", "fontWeight", "fontSize", "fontFamily", "padding", "lineHeight", "rich", "width", "height", "overflow"], + rc = new As, oc = function () { + function t() { + } + + return t.prototype.getTextColor = function (t) { + var e = this.ecModel; + return this.getShallow("color") || (!t && e ? e.get(nc) : null) + }, t.prototype.getFont = function () { + return Kh({ + fontStyle: this.getShallow("fontStyle"), + fontWeight: this.getShallow("fontWeight"), + fontSize: this.getShallow("fontSize"), + fontFamily: this.getShallow("fontFamily") + }, this.ecModel) + }, t.prototype.getTextRect = function (t) { + for (var e = { + text: t, + verticalAlign: this.getShallow("verticalAlign") || this.getShallow("baseline") + }, n = 0; n < ic.length; n++) e[ic[n]] = this.getShallow(ic[n]); + return rc.useStyle(e), rc.update(), rc.getBoundingRect() + }, t + }(), + ac = [["lineWidth", "width"], ["stroke", "color"], ["opacity"], ["shadowBlur"], ["shadowOffsetX"], ["shadowOffsetY"], ["shadowColor"], ["lineDash", "type"], ["lineDashOffset", "dashOffset"], ["lineCap", "cap"], ["lineJoin", "join"], ["miterLimit"]], + sc = Wo(ac), lc = function () { + function t() { + } + + return t.prototype.getLineStyle = function (t) { + return sc(this, t) + }, t + }(), + uc = [["fill", "color"], ["stroke", "borderColor"], ["lineWidth", "borderWidth"], ["opacity"], ["shadowBlur"], ["shadowOffsetX"], ["shadowOffsetY"], ["shadowColor"], ["lineDash", "borderType"], ["lineDashOffset", "borderDashOffset"], ["lineCap", "borderCap"], ["lineJoin", "borderJoin"], ["miterLimit", "borderMiterLimit"]], + hc = Wo(uc), cc = function () { + function t() { + } + + return t.prototype.getItemStyle = function (t, e) { + return hc(this, t, e) + }, t + }(), pc = function () { + function t(t, e, n) { + this.parentModel = e, this.ecModel = n, this.option = t + } + + return t.prototype.init = function (t, e, n) { + for (var i = [], r = 3; r < arguments.length; r++) i[r - 3] = arguments[r] + }, t.prototype.mergeOption = function (t, e) { + C(this.option, t, !0) + }, t.prototype.get = function (t, e) { + return null == t ? this.option : this._doGet(this.parsePath(t), !e && this.parentModel) + }, t.prototype.getShallow = function (t, e) { + var n = this.option, i = null == n ? n : n[t]; + if (null == i && !e) { + var r = this.parentModel; + r && (i = r.getShallow(t)) + } + return i + }, t.prototype.getModel = function (e, n) { + var i = null != e, r = i ? this.parsePath(e) : null; + return new t(i ? this._doGet(r) : this.option, n = n || this.parentModel && this.parentModel.getModel(this.resolveParentPath(r)), this.ecModel) + }, t.prototype.isEmpty = function () { + return null == this.option + }, t.prototype.restoreData = function () { + }, t.prototype.clone = function () { + return new (0, this.constructor)(T(this.option)) + }, t.prototype.parsePath = function (t) { + return "string" == typeof t ? t.split(".") : t + }, t.prototype.resolveParentPath = function (t) { + return t + }, t.prototype.isAnimationEnabled = function () { + if (!r.node && this.option) { + if (null != this.option.animation) return !!this.option.animation; + if (this.parentModel) return this.parentModel.isAnimationEnabled() + } + }, t.prototype._doGet = function (t, e) { + var n = this.option; + if (!t) return n; + for (var i = 0; i < t.length && (!t[i] || null != (n = n && "object" == typeof n ? n[t[i]] : null)); i++) ; + return null == n && e && (n = e._doGet(this.resolveParentPath(t), e.parentModel)), n + }, t + }(); + Eo(pc), tc = pc, ec = ["__\0is_clz", Vo++].join("_"), tc.prototype[ec] = !0, tc.isInstance = function (t) { + return !(!t || !t[ec]) + }, R(pc, lc), R(pc, cc), R(pc, Yo), R(pc, oc); + var dc = Math.round(10 * Math.random()); + + function fc(t) { + return [t || "", dc++].join("_") + } + + function gc(t, e) { + return C(C({}, t, !0), e, !0) + } + + var yc = "ZH", vc = "EN", mc = vc, xc = {}, _c = {}, + bc = r.domSupported && (document.documentElement.lang || navigator.language || navigator.browserLanguage).toUpperCase().indexOf(yc) > -1 ? yc : mc; + + function wc(t, e) { + t = t.toUpperCase(), _c[t] = new pc(e), xc[t] = e + } + + function Sc(t) { + return _c[t] + } + + wc(vc, { + time: { + month: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + monthAbbr: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + dayOfWeek: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + dayOfWeekAbbr: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] + }, + legend: {selector: {all: "All", inverse: "Inv"}}, + toolbox: { + brush: { + title: { + rect: "Box Select", + polygon: "Lasso Select", + lineX: "Horizontally Select", + lineY: "Vertically Select", + keep: "Keep Selections", + clear: "Clear Selections" + } + }, + dataView: {title: "Data View", lang: ["Data View", "Close", "Refresh"]}, + dataZoom: {title: {zoom: "Zoom", back: "Zoom Reset"}}, + magicType: { + title: { + line: "Switch to Line Chart", + bar: "Switch to Bar Chart", + stack: "Stack", + tiled: "Tile" + } + }, + restore: {title: "Restore"}, + saveAsImage: {title: "Save as Image", lang: ["Right Click to Save Image"]} + }, + series: { + typeNames: { + pie: "Pie chart", + bar: "Bar chart", + line: "Line chart", + scatter: "Scatter plot", + effectScatter: "Ripple scatter plot", + radar: "Radar chart", + tree: "Tree", + treemap: "Treemap", + boxplot: "Boxplot", + candlestick: "Candlestick", + k: "K line chart", + heatmap: "Heat map", + map: "Map", + parallel: "Parallel coordinate map", + lines: "Line graph", + graph: "Relationship graph", + sankey: "Sankey diagram", + funnel: "Funnel chart", + gauge: "Gauge", + pictorialBar: "Pictorial bar", + themeRiver: "Theme River Map", + sunburst: "Sunburst" + } + }, + aria: { + general: {withTitle: 'This is a chart about "{title}"', withoutTitle: "This is a chart"}, + series: { + single: { + prefix: "", + withName: " with type {seriesType} named {seriesName}.", + withoutName: " with type {seriesType}." + }, + multiple: { + prefix: ". It consists of {seriesCount} series count.", + withName: " The {seriesId} series is a {seriesType} representing {seriesName}.", + withoutName: " The {seriesId} series is a {seriesType}.", + separator: {middle: "", end: ""} + } + }, + data: { + allData: "The data is as follows: ", + partialData: "The first {displayCnt} items are: ", + withName: "the data for {name} is {value}", + withoutName: "{value}", + separator: {middle: ", ", end: ". "} + } + } + }), wc(yc, { + time: { + month: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + monthAbbr: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], + dayOfWeek: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], + dayOfWeekAbbr: ["日", "一", "二", "三", "四", "五", "六"] + }, + legend: {selector: {all: "全选", inverse: "反选"}}, + toolbox: { + brush: { + title: { + rect: "矩形选择", + polygon: "圈选", + lineX: "横向选择", + lineY: "纵向选择", + keep: "保持选择", + clear: "清除选择" + } + }, + dataView: {title: "数据视图", lang: ["数据视图", "关闭", "刷新"]}, + dataZoom: {title: {zoom: "区域缩放", back: "区域缩放还原"}}, + magicType: {title: {line: "切换为折线图", bar: "切换为柱状图", stack: "切换为堆叠", tiled: "切换为平铺"}}, + restore: {title: "还原"}, + saveAsImage: {title: "保存为图片", lang: ["右键另存为图片"]} + }, + series: { + typeNames: { + pie: "饼图", + bar: "柱状图", + line: "折线图", + scatter: "散点图", + effectScatter: "涟漪散点图", + radar: "雷达图", + tree: "树图", + treemap: "矩形树图", + boxplot: "箱型图", + candlestick: "K线图", + k: "K线图", + heatmap: "热力图", + map: "地图", + parallel: "平行坐标图", + lines: "线图", + graph: "关系图", + sankey: "桑基图", + funnel: "漏斗图", + gauge: "仪表盘图", + pictorialBar: "象形柱图", + themeRiver: "主题河流图", + sunburst: "旭日图" + } + }, + aria: { + general: {withTitle: "这是一个关于“{title}”的图表。", withoutTitle: "这是一个图表,"}, + series: { + single: { + prefix: "", + withName: "图表类型是{seriesType},表示{seriesName}。", + withoutName: "图表类型是{seriesType}。" + }, + multiple: { + prefix: "它由{seriesCount}个图表系列组成。", + withName: "第{seriesId}个系列是一个表示{seriesName}的{seriesType},", + withoutName: "第{seriesId}个系列是一个{seriesType},", + separator: {middle: ";", end: "。"} + } + }, + data: { + allData: "其数据是——", + partialData: "其中,前{displayCnt}项是——", + withName: "{name}的数据是{value}", + withoutName: "{value}", + separator: {middle: ",", end: ""} + } + } + }); + var Mc = 1e3, Ic = 6e4, Tc = 36e5, Cc = 864e5, Dc = 31536e6, Ac = { + year: "{yyyy}", + month: "{MMM}", + day: "{d}", + hour: "{HH}:{mm}", + minute: "{HH}:{mm}", + second: "{HH}:{mm}:{ss}", + millisecond: "{HH}:{mm}:{ss} {SSS}", + none: "{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}" + }, kc = "{yyyy}-{MM}-{dd}", Lc = { + year: "{yyyy}", + month: "{yyyy}-{MM}", + day: kc, + hour: "{yyyy}-{MM}-{dd} " + Ac.hour, + minute: "{yyyy}-{MM}-{dd} " + Ac.minute, + second: "{yyyy}-{MM}-{dd} " + Ac.second, + millisecond: Ac.none + }, Pc = ["year", "month", "day", "hour", "minute", "second", "millisecond"], + Oc = ["year", "half-year", "quarter", "month", "week", "half-week", "day", "half-day", "quarter-day", "hour", "minute", "second", "millisecond"]; + + function Rc(t, e) { + return "0000".substr(0, e - (t += "").length) + t + } + + function Nc(t) { + switch (t) { + case"half-year": + case"quarter": + return "month"; + case"week": + case"half-week": + return "day"; + case"half-day": + case"quarter-day": + return "hour"; + default: + return t + } + } + + function Ec(t) { + return t === Nc(t) + } + + function zc(t, e, n, i) { + var r = jr(t), o = r[Fc(n)](), a = r[Gc(n)]() + 1, s = Math.floor((a - 1) / 4) + 1, l = r[Wc(n)](), + u = r["get" + (n ? "UTC" : "") + "Day"](), h = r[Hc(n)](), c = (h - 1) % 12 + 1, p = r[Yc(n)](), + d = r[Uc(n)](), f = r[Xc(n)](), g = (i instanceof pc ? i : Sc(i || bc) || _c.EN).getModel("time"), + y = g.get("month"), v = g.get("monthAbbr"), m = g.get("dayOfWeek"), x = g.get("dayOfWeekAbbr"); + return (e || "").replace(/{yyyy}/g, o + "").replace(/{yy}/g, o % 100 + "").replace(/{Q}/g, s + "").replace(/{MMMM}/g, y[a - 1]).replace(/{MMM}/g, v[a - 1]).replace(/{MM}/g, Rc(a, 2)).replace(/{M}/g, a + "").replace(/{dd}/g, Rc(l, 2)).replace(/{d}/g, l + "").replace(/{eeee}/g, m[u]).replace(/{ee}/g, x[u]).replace(/{e}/g, u + "").replace(/{HH}/g, Rc(h, 2)).replace(/{H}/g, h + "").replace(/{hh}/g, Rc(c + "", 2)).replace(/{h}/g, c + "").replace(/{mm}/g, Rc(p, 2)).replace(/{m}/g, p + "").replace(/{ss}/g, Rc(d, 2)).replace(/{s}/g, d + "").replace(/{SSS}/g, Rc(f, 3)).replace(/{S}/g, f + "") + } + + function Vc(t, e) { + var n = jr(t), i = n[Gc(e)]() + 1, r = n[Wc(e)](), o = n[Hc(e)](), a = n[Yc(e)](), s = n[Uc(e)](), + l = 0 === n[Xc(e)](), u = l && 0 === s, h = u && 0 === a, c = h && 0 === o, p = c && 1 === r; + return p && 1 === i ? "year" : p ? "month" : c ? "day" : h ? "hour" : u ? "minute" : l ? "second" : "millisecond" + } + + function Bc(t, e, n) { + var i = j(t) ? jr(t) : t; + switch (e = e || Vc(t, n)) { + case"year": + return i[Fc(n)](); + case"half-year": + return i[Gc(n)]() >= 6 ? 1 : 0; + case"quarter": + return Math.floor((i[Gc(n)]() + 1) / 4); + case"month": + return i[Gc(n)](); + case"day": + return i[Wc(n)](); + case"half-day": + return i[Hc(n)]() / 24; + case"hour": + return i[Hc(n)](); + case"minute": + return i[Yc(n)](); + case"second": + return i[Uc(n)](); + case"millisecond": + return i[Xc(n)]() + } + } + + function Fc(t) { + return t ? "getUTCFullYear" : "getFullYear" + } + + function Gc(t) { + return t ? "getUTCMonth" : "getMonth" + } + + function Wc(t) { + return t ? "getUTCDate" : "getDate" + } + + function Hc(t) { + return t ? "getUTCHours" : "getHours" + } + + function Yc(t) { + return t ? "getUTCMinutes" : "getMinutes" + } + + function Uc(t) { + return t ? "getUTCSeconds" : "getSeconds" + } + + function Xc(t) { + return t ? "getUTCMilliseconds" : "getMilliseconds" + } + + function Zc(t) { + return t ? "setUTCFullYear" : "setFullYear" + } + + function jc(t) { + return t ? "setUTCMonth" : "setMonth" + } + + function qc(t) { + return t ? "setUTCDate" : "setDate" + } + + function Kc(t) { + return t ? "setUTCHours" : "setHours" + } + + function $c(t) { + return t ? "setUTCMinutes" : "setMinutes" + } + + function Jc(t) { + return t ? "setUTCSeconds" : "setSeconds" + } + + function Qc(t) { + return t ? "setUTCMilliseconds" : "setMilliseconds" + } + + function tp(t) { + if (!eo(t)) return X(t) ? t : "-"; + var e = (t + "").split("."); + return e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, "$1,") + (e.length > 1 ? "." + e[1] : "") + } + + function ep(t, e) { + return t = (t || "").toLowerCase().replace(/-(.)/g, (function (t, e) { + return e.toUpperCase() + })), e && t && (t = t.charAt(0).toUpperCase() + t.slice(1)), t + } + + var np = st, ip = /([&<>"'])/g, rp = {"&": "&", "<": "<", ">": ">", '"': """, "'": "'"}; + + function op(t) { + return null == t ? "" : (t + "").replace(ip, (function (t, e) { + return rp[e] + })) + } + + function ap(t, e, n) { + function i(t) { + return t && ut(t) ? t : "-" + } + + function r(t) { + return !(null == t || isNaN(t) || !isFinite(t)) + } + + var o = "time" === e, a = t instanceof Date; + if (o || a) { + var s = o ? jr(t) : t; + if (!isNaN(+s)) return zc(s, "{yyyy}-{MM}-{dd} {hh}:{mm}:{ss}", n); + if (a) return "-" + } + if ("ordinal" === e) return Z(t) ? i(t) : j(t) && r(t) ? t + "" : "-"; + var l = to(t); + return r(l) ? tp(l) : Z(t) ? i(t) : "boolean" == typeof t ? t + "" : "-" + } + + var sp = ["a", "b", "c", "d", "e", "f", "g"], lp = function (t, e) { + return "{" + t + (null == e ? "" : e) + "}" + }; + + function up(t, e, n) { + Y(e) || (e = [e]); + var i = e.length; + if (!i) return ""; + for (var r = e[0].$vars || [], o = 0; o < r.length; o++) { + var a = sp[o]; + t = t.replace(lp(a), lp(a, 0)) + } + for (var s = 0; s < i; s++) for (var l = 0; l < r.length; l++) { + var u = e[s][r[l]]; + t = t.replace(lp(sp[l], s), n ? op(u) : u) + } + return t + } + + function hp(t, e) { + var n = X(t) ? {color: t, extraCssText: e} : t || {}, i = n.color, r = n.type; + e = n.extraCssText; + var o = n.renderMode || "html"; + return i ? "html" === o ? "subItem" === r ? '' : '' : { + renderMode: o, + content: "{" + (n.markerId || "markerX") + "|} ", + style: "subItem" === r ? {width: 4, height: 4, borderRadius: 2, backgroundColor: i} : { + width: 10, + height: 10, + borderRadius: 5, + backgroundColor: i + } + } : "" + } + + function cp(t, e) { + return e = e || "transparent", X(t) ? t : q(t) && t.colorStops && (t.colorStops[0] || {}).color || e + } + + function pp(t, e) { + if ("_blank" === e || "blank" === e) { + var n = window.open(); + n.opener = null, n.location.href = t + } else window.open(t, e) + } + + var dp = E, fp = ["left", "right", "top", "bottom", "width", "height"], + gp = [["width", "left", "right"], ["height", "top", "bottom"]]; + + function yp(t, e, n, i, r) { + var o = 0, a = 0; + null == i && (i = 1 / 0), null == r && (r = 1 / 0); + var s = 0; + e.eachChild((function (l, u) { + var h, c, p = l.getBoundingRect(), d = e.childAt(u + 1), f = d && d.getBoundingRect(); + if ("horizontal" === t) { + var g = p.width + (f ? -f.x + p.x : 0); + (h = o + g) > i || l.newline ? (o = 0, h = g, a += s + n, s = p.height) : s = Math.max(s, p.height) + } else { + var y = p.height + (f ? -f.y + p.y : 0); + (c = a + y) > r || l.newline ? (o += s + n, a = 0, c = y, s = p.width) : s = Math.max(s, p.width) + } + l.newline || (l.x = o, l.y = a, l.markRedraw(), "horizontal" === t ? o = h + n : a = c + n) + })) + } + + var vp = yp; + H(yp, "vertical"), H(yp, "horizontal"); + + function mp(t, e, n) { + n = np(n || 0); + var i = e.width, r = e.height, o = Er(t.left, i), a = Er(t.top, r), s = Er(t.right, i), l = Er(t.bottom, r), + u = Er(t.width, i), h = Er(t.height, r), c = n[2] + n[0], p = n[1] + n[3], d = t.aspect; + switch (isNaN(u) && (u = i - s - p - o), isNaN(h) && (h = r - l - c - a), null != d && (isNaN(u) && isNaN(h) && (d > i / r ? u = .8 * i : h = .8 * r), isNaN(u) && (u = d * h), isNaN(h) && (h = u / d)), isNaN(o) && (o = i - s - u - p), isNaN(a) && (a = r - l - h - c), t.left || t.right) { + case"center": + o = i / 2 - u / 2 - n[3]; + break; + case"right": + o = i - u - p + } + switch (t.top || t.bottom) { + case"middle": + case"center": + a = r / 2 - h / 2 - n[0]; + break; + case"bottom": + a = r - h - c + } + o = o || 0, a = a || 0, isNaN(u) && (u = i - p - o - (s || 0)), isNaN(h) && (h = r - c - a - (l || 0)); + var f = new sr(o + n[3], a + n[0], u, h); + return f.margin = n, f + } + + function xp(t, e, n, i, r, o) { + var a, s = !r || !r.hv || r.hv[0], l = !r || !r.hv || r.hv[1], u = r && r.boundingMode || "all"; + if ((o = o || t).x = t.x, o.y = t.y, !s && !l) return !1; + if ("raw" === u) a = "group" === t.type ? new sr(0, 0, +e.width || 0, +e.height || 0) : t.getBoundingRect(); else if (a = t.getBoundingRect(), t.needLocalTransform()) { + var h = t.getLocalTransform(); + (a = a.clone()).applyTransform(h) + } + var c = mp(k({width: a.width, height: a.height}, e), n, i), p = s ? c.x - a.x : 0, d = l ? c.y - a.y : 0; + return "raw" === u ? (o.x = p, o.y = d) : (o.x += p, o.y += d), o === t && t.markRedraw(), !0 + } + + function _p(t) { + var e = t.layoutMode || t.constructor.layoutMode; + return q(e) ? e : e ? {type: e} : null + } + + function bp(t, e, n) { + var i = n && n.ignoreSize; + !Y(i) && (i = [i, i]); + var r = a(gp[0], 0), o = a(gp[1], 1); + + function a(n, r) { + var o = {}, a = 0, u = {}, h = 0; + if (dp(n, (function (e) { + u[e] = t[e] + })), dp(n, (function (t) { + s(e, t) && (o[t] = u[t] = e[t]), l(o, t) && a++, l(u, t) && h++ + })), i[r]) return l(e, n[1]) ? u[n[2]] = null : l(e, n[2]) && (u[n[1]] = null), u; + if (2 !== h && a) { + if (a >= 2) return o; + for (var c = 0; c < n.length; c++) { + var p = n[c]; + if (!s(o, p) && s(t, p)) { + o[p] = t[p]; + break + } + } + return o + } + return u + } + + function s(t, e) { + return t.hasOwnProperty(e) + } + + function l(t, e) { + return null != t[e] && "auto" !== t[e] + } + + function u(t, e, n) { + dp(t, (function (t) { + e[t] = n[t] + })) + } + + u(gp[0], t, r), u(gp[1], t, o) + } + + function wp(t) { + return Sp({}, t) + } + + function Sp(t, e) { + return e && t && dp(fp, (function (n) { + e.hasOwnProperty(n) && (t[n] = e[n]) + })), t + } + + var Mp = So(), Ip = function (t) { + function e(e, n, i) { + var r = t.call(this, e, n, i) || this; + return r.uid = fc("ec_cpt_model"), r + } + + return n(e, t), e.prototype.init = function (t, e, n) { + this.mergeDefaultAndTheme(t, n) + }, e.prototype.mergeDefaultAndTheme = function (t, e) { + var n = _p(this), i = n ? wp(t) : {}; + C(t, e.getTheme().get(this.mainType)), C(t, this.getDefaultOption()), n && bp(t, i, n) + }, e.prototype.mergeOption = function (t, e) { + C(this.option, t, !0); + var n = _p(this); + n && bp(this.option, t, n) + }, e.prototype.optionUpdated = function (t, e) { + }, e.prototype.getDefaultOption = function () { + var t = this.constructor; + if (!function (t) { + return !(!t || !t[Ro]) + }(t)) return t.defaultOption; + var e = Mp(this); + if (!e.defaultOption) { + for (var n = [], i = t; i;) { + var r = i.prototype.defaultOption; + r && n.push(r), i = i.superClass + } + for (var o = {}, a = n.length - 1; a >= 0; a--) o = C(o, n[a], !0); + e.defaultOption = o + } + return e.defaultOption + }, e.prototype.getReferringComponents = function (t, e) { + var n = t + "Index", i = t + "Id"; + return Ao(this.ecModel, t, {index: this.get(n, !0), id: this.get(i, !0)}, e) + }, e.prototype.getBoxLayoutParams = function () { + var t = this; + return { + left: t.get("left"), + top: t.get("top"), + right: t.get("right"), + bottom: t.get("bottom"), + width: t.get("width"), + height: t.get("height") + } + }, e.prototype.getZLevelKey = function () { + return "" + }, e.prototype.setZLevel = function (t) { + this.option.zlevel = t + }, e.protoInitialize = function () { + var t = e.prototype; + t.type = "component", t.id = "", t.name = "", t.mainType = "", t.subType = "", t.componentIndex = 0 + }(), e + }(pc); + zo(Ip, pc), Go(Ip), function (t) { + var e = {}; + t.registerSubTypeDefaulter = function (t, n) { + var i = No(t); + e[i.main] = n + }, t.determineSubType = function (n, i) { + var r = i.type; + if (!r) { + var o = No(n).main; + t.hasSubTypes(n) && e[o] && (r = e[o](i)) + } + return r + } + }(Ip), function (t, e) { + function n(t, e) { + return t[e] || (t[e] = {predecessor: [], successor: []}), t[e] + } + + t.topologicalTravel = function (t, i, r, o) { + if (t.length) { + var a = function (t) { + var i = {}, r = []; + return E(t, (function (o) { + var a = n(i, o), s = function (t, e) { + var n = []; + return E(t, (function (t) { + P(e, t) >= 0 && n.push(t) + })), n + }(a.originalDeps = e(o), t); + a.entryCount = s.length, 0 === a.entryCount && r.push(o), E(s, (function (t) { + P(a.predecessor, t) < 0 && a.predecessor.push(t); + var e = n(i, t); + P(e.successor, t) < 0 && e.successor.push(o) + })) + })), {graph: i, noEntryList: r} + }(i), s = a.graph, l = a.noEntryList, u = {}; + for (E(t, (function (t) { + u[t] = !0 + })); l.length;) { + var h = l.pop(), c = s[h], p = !!u[h]; + p && (r.call(o, h, c.originalDeps.slice()), delete u[h]), E(c.successor, p ? f : d) + } + E(u, (function () { + var t = ""; + throw new Error(t) + })) + } + + function d(t) { + s[t].entryCount--, 0 === s[t].entryCount && l.push(t) + } + + function f(t) { + u[t] = !0, d(t) + } + } + }(Ip, (function (t) { + var e = []; + E(Ip.getClassesByMainType(t), (function (t) { + e = e.concat(t.dependencies || t.prototype.dependencies || []) + })), e = z(e, (function (t) { + return No(t).main + })), "dataset" !== t && P(e, "dataset") <= 0 && e.unshift("dataset"); + return e + })); + var Tp = ""; + "undefined" != typeof navigator && (Tp = navigator.platform || ""); + var Cp = "rgba(0, 0, 0, 0.2)", Dp = { + darkMode: "auto", + colorBy: "series", + color: ["#5470c6", "#91cc75", "#fac858", "#ee6666", "#73c0de", "#3ba272", "#fc8452", "#9a60b4", "#ea7ccc"], + gradientColor: ["#f6efa6", "#d88273", "#bf444c"], + aria: { + decal: { + decals: [{ + color: Cp, + dashArrayX: [1, 0], + dashArrayY: [2, 5], + symbolSize: 1, + rotation: Math.PI / 6 + }, { + color: Cp, + symbol: "circle", + dashArrayX: [[8, 8], [0, 8, 8, 0]], + dashArrayY: [6, 0], + symbolSize: .8 + }, {color: Cp, dashArrayX: [1, 0], dashArrayY: [4, 3], rotation: -Math.PI / 4}, { + color: Cp, + dashArrayX: [[6, 6], [0, 6, 6, 0]], + dashArrayY: [6, 0] + }, { + color: Cp, + dashArrayX: [[1, 0], [1, 6]], + dashArrayY: [1, 0, 6, 0], + rotation: Math.PI / 4 + }, { + color: Cp, + symbol: "triangle", + dashArrayX: [[9, 9], [0, 9, 9, 0]], + dashArrayY: [7, 2], + symbolSize: .75 + }] + } + }, + textStyle: { + fontFamily: Tp.match(/^Win/) ? "Microsoft YaHei" : "sans-serif", + fontSize: 12, + fontStyle: "normal", + fontWeight: "normal" + }, + blendMode: null, + stateAnimation: {duration: 300, easing: "cubicOut"}, + animation: "auto", + animationDuration: 1e3, + animationDurationUpdate: 500, + animationEasing: "cubicInOut", + animationEasingUpdate: "cubicInOut", + animationThreshold: 2e3, + progressiveThreshold: 3e3, + progressive: 400, + hoverLayerThreshold: 3e3, + useUTC: !1 + }, Ap = ft(["tooltip", "label", "itemName", "itemId", "itemGroupId", "seriesName"]), kp = "original", + Lp = "arrayRows", Pp = "objectRows", Op = "keyedColumns", Rp = "typedArray", Np = "unknown", Ep = "column", + zp = "row", Vp = 1, Bp = 2, Fp = 3, Gp = So(); + + function Wp(t, e, n) { + var i = {}, r = Yp(e); + if (!r || !t) return i; + var o, a, s = [], l = [], u = e.ecModel, h = Gp(u).datasetMap, c = r.uid + "_" + n.seriesLayoutBy; + E(t = t.slice(), (function (e, n) { + var r = q(e) ? e : t[n] = {name: e}; + "ordinal" === r.type && null == o && (o = n, a = f(r)), i[r.name] = [] + })); + var p = h.get(c) || h.set(c, {categoryWayDim: a, valueWayDim: 0}); + + function d(t, e, n) { + for (var i = 0; i < n; i++) t.push(e + i) + } + + function f(t) { + var e = t.dimsDef; + return e ? e.length : 1 + } + + return E(t, (function (t, e) { + var n = t.name, r = f(t); + if (null == o) { + var a = p.valueWayDim; + d(i[n], a, r), d(l, a, r), p.valueWayDim += r + } else if (o === e) d(i[n], 0, r), d(s, 0, r); else { + a = p.categoryWayDim; + d(i[n], a, r), d(l, a, r), p.categoryWayDim += r + } + })), s.length && (i.itemName = s), l.length && (i.seriesName = l), i + } + + function Hp(t, e, n) { + var i = {}; + if (!Yp(t)) return i; + var r, o = e.sourceFormat, a = e.dimensionsDefine; + o !== Pp && o !== Op || E(a, (function (t, e) { + "name" === (q(t) ? t.name : t) && (r = e) + })); + var s = function () { + for (var t = {}, i = {}, s = [], l = 0, u = Math.min(5, n); l < u; l++) { + var h = Xp(e.data, o, e.seriesLayoutBy, a, e.startIndex, l); + s.push(h); + var c = h === Fp; + if (c && null == t.v && l !== r && (t.v = l), (null == t.n || t.n === t.v || !c && s[t.n] === Fp) && (t.n = l), p(t) && s[t.n] !== Fp) return t; + c || (h === Bp && null == i.v && l !== r && (i.v = l), null != i.n && i.n !== i.v || (i.n = l)) + } + + function p(t) { + return null != t.v && null != t.n + } + + return p(t) ? t : p(i) ? i : null + }(); + if (s) { + i.value = [s.v]; + var l = null != r ? r : s.n; + i.itemName = [l], i.seriesName = [l] + } + return i + } + + function Yp(t) { + if (!t.get("data", !0)) return Ao(t.ecModel, "dataset", { + index: t.get("datasetIndex", !0), + id: t.get("datasetId", !0) + }, Co).models[0] + } + + function Up(t, e) { + return Xp(t.data, t.sourceFormat, t.seriesLayoutBy, t.dimensionsDefine, t.startIndex, e) + } + + function Xp(t, e, n, i, r, o) { + var a, s, l; + if ($(t)) return Fp; + if (i) { + var u = i[o]; + q(u) ? (s = u.name, l = u.type) : X(u) && (s = u) + } + if (null != l) return "ordinal" === l ? Vp : Fp; + if (e === Lp) { + var h = t; + if (n === zp) { + for (var c = h[o], p = 0; p < (c || []).length && p < 5; p++) if (null != (a = m(c[r + p]))) return a + } else for (p = 0; p < h.length && p < 5; p++) { + var d = h[r + p]; + if (d && null != (a = m(d[o]))) return a + } + } else if (e === Pp) { + var f = t; + if (!s) return Fp; + for (p = 0; p < f.length && p < 5; p++) { + if ((y = f[p]) && null != (a = m(y[s]))) return a + } + } else if (e === Op) { + if (!s) return Fp; + if (!(c = t[s]) || $(c)) return Fp; + for (p = 0; p < c.length && p < 5; p++) if (null != (a = m(c[p]))) return a + } else if (e === kp) { + var g = t; + for (p = 0; p < g.length && p < 5; p++) { + var y, v = fo(y = g[p]); + if (!Y(v)) return Fp; + if (null != (a = m(v[o]))) return a + } + } + + function m(t) { + var e = X(t); + return null != t && isFinite(t) && "" !== t ? e ? Bp : Fp : e && "-" !== t ? Vp : void 0 + } + + return Fp + } + + var Zp = ft(); + var jp, qp, Kp, $p = So(), Jp = So(), Qp = function () { + function t() { + } + + return t.prototype.getColorFromPalette = function (t, e, n) { + var i = ho(this.get("color", !0)), r = this.get("colorLayer", !0); + return ed(this, $p, i, r, t, e, n) + }, t.prototype.clearColorPalette = function () { + !function (t, e) { + e(t).paletteIdx = 0, e(t).paletteNameMap = {} + }(this, $p) + }, t + }(); + + function td(t, e, n, i) { + var r = ho(t.get(["aria", "decal", "decals"])); + return ed(t, Jp, r, null, e, n, i) + } + + function ed(t, e, n, i, r, o, a) { + var s = e(o = o || t), l = s.paletteIdx || 0, u = s.paletteNameMap = s.paletteNameMap || {}; + if (u.hasOwnProperty(r)) return u[r]; + var h = null != a && i ? function (t, e) { + for (var n = t.length, i = 0; i < n; i++) if (t[i].length > e) return t[i]; + return t[n - 1] + }(i, a) : n; + if ((h = h || n) && h.length) { + var c = h[l]; + return r && (u[r] = c), s.paletteIdx = (l + 1) % h.length, c + } + } + + var nd = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.init = function (t, e, n, i, r, o) { + i = i || {}, this.option = null, this._theme = new pc(i), this._locale = new pc(r), this._optionManager = o + }, e.prototype.setOption = function (t, e, n) { + var i = od(e); + this._optionManager.setOption(t, n, i), this._resetOption(null, i) + }, e.prototype.resetOption = function (t, e) { + return this._resetOption(t, od(e)) + }, e.prototype._resetOption = function (t, e) { + var n = !1, i = this._optionManager; + if (!t || "recreate" === t) { + var r = i.mountOption("recreate" === t); + 0, this.option && "recreate" !== t ? (this.restoreData(), this._mergeOption(r, e)) : Kp(this, r), n = !0 + } + if ("timeline" !== t && "media" !== t || this.restoreData(), !t || "recreate" === t || "timeline" === t) { + var o = i.getTimelineOption(this); + o && (n = !0, this._mergeOption(o, e)) + } + if (!t || "recreate" === t || "media" === t) { + var a = i.getMediaOption(this); + a.length && E(a, (function (t) { + n = !0, this._mergeOption(t, e) + }), this) + } + return n + }, e.prototype.mergeOption = function (t) { + this._mergeOption(t, null) + }, e.prototype._mergeOption = function (t, e) { + var n = this.option, i = this._componentsMap, r = this._componentsCount, o = [], a = ft(), + s = e && e.replaceMergeMainTypeMap; + Gp(this).datasetMap = ft(), E(t, (function (t, e) { + null != t && (Ip.hasClass(e) ? e && (o.push(e), a.set(e, !0)) : n[e] = null == n[e] ? T(t) : C(n[e], t, !0)) + })), s && s.each((function (t, e) { + Ip.hasClass(e) && !a.get(e) && (o.push(e), a.set(e, !0)) + })), Ip.topologicalTravel(o, Ip.getAllClassMainTypes(), (function (e) { + var o = function (t, e, n) { + var i = Zp.get(e); + if (!i) return n; + var r = i(t); + return r ? n.concat(r) : n + }(this, e, ho(t[e])), a = i.get(e), + l = a ? s && s.get(e) ? "replaceMerge" : "normalMerge" : "replaceAll", u = yo(a, o, l); + (function (t, e, n) { + E(t, (function (t) { + var i = t.newOption; + q(i) && (t.keyInfo.mainType = e, t.keyInfo.subType = function (t, e, n, i) { + return e.type ? e.type : n ? n.subType : i.determineSubType(t, e) + }(e, i, t.existing, n)) + })) + })(u, e, Ip), n[e] = null, i.set(e, null), r.set(e, 0); + var h, c = [], p = [], d = 0; + E(u, (function (t, n) { + var i = t.existing, r = t.newOption; + if (r) { + var o = "series" === e, a = Ip.getClass(e, t.keyInfo.subType, !o); + if (!a) return; + if ("tooltip" === e) { + if (h) return void 0; + h = !0 + } + if (i && i.constructor === a) i.name = t.keyInfo.name, i.mergeOption(r, this), i.optionUpdated(r, !1); else { + var s = A({componentIndex: n}, t.keyInfo); + A(i = new a(r, this, this, s), s), t.brandNew && (i.__requireNewView = !0), i.init(r, this, this), i.optionUpdated(null, !0) + } + } else i && (i.mergeOption({}, this), i.optionUpdated({}, !1)); + i ? (c.push(i.option), p.push(i), d++) : (c.push(void 0), p.push(void 0)) + }), this), n[e] = c, i.set(e, p), r.set(e, d), "series" === e && jp(this) + }), this), this._seriesIndices || jp(this) + }, e.prototype.getOption = function () { + var t = T(this.option); + return E(t, (function (e, n) { + if (Ip.hasClass(n)) { + for (var i = ho(e), r = i.length, o = !1, a = r - 1; a >= 0; a--) i[a] && !bo(i[a]) ? o = !0 : (i[a] = null, !o && r--); + i.length = r, t[n] = i + } + })), delete t["\0_ec_inner"], t + }, e.prototype.getTheme = function () { + return this._theme + }, e.prototype.getLocaleModel = function () { + return this._locale + }, e.prototype.setUpdatePayload = function (t) { + this._payload = t + }, e.prototype.getUpdatePayload = function () { + return this._payload + }, e.prototype.getComponent = function (t, e) { + var n = this._componentsMap.get(t); + if (n) { + var i = n[e || 0]; + if (i) return i; + if (null == e) for (var r = 0; r < n.length; r++) if (n[r]) return n[r] + } + }, e.prototype.queryComponents = function (t) { + var e = t.mainType; + if (!e) return []; + var n, i = t.index, r = t.id, o = t.name, a = this._componentsMap.get(e); + return a && a.length ? (null != i ? (n = [], E(ho(i), (function (t) { + a[t] && n.push(a[t]) + }))) : n = null != r ? id("id", r, a) : null != o ? id("name", o, a) : B(a, (function (t) { + return !!t + })), rd(n, t)) : [] + }, e.prototype.findComponents = function (t) { + var e, n, i, r, o, a = t.query, s = t.mainType, + l = (n = s + "Index", i = s + "Id", r = s + "Name", !(e = a) || null == e[n] && null == e[i] && null == e[r] ? null : { + mainType: s, + index: e[n], + id: e[i], + name: e[r] + }), u = l ? this.queryComponents(l) : B(this._componentsMap.get(s), (function (t) { + return !!t + })); + return o = rd(u, t), t.filter ? B(o, t.filter) : o + }, e.prototype.eachComponent = function (t, e, n) { + var i = this._componentsMap; + if (U(t)) { + var r = e, o = t; + i.each((function (t, e) { + for (var n = 0; t && n < t.length; n++) { + var i = t[n]; + i && o.call(r, e, i, i.componentIndex) + } + })) + } else for (var a = X(t) ? i.get(t) : q(t) ? this.findComponents(t) : null, s = 0; a && s < a.length; s++) { + var l = a[s]; + l && e.call(n, l, l.componentIndex) + } + }, e.prototype.getSeriesByName = function (t) { + var e = xo(t, null); + return B(this._componentsMap.get("series"), (function (t) { + return !!t && null != e && t.name === e + })) + }, e.prototype.getSeriesByIndex = function (t) { + return this._componentsMap.get("series")[t] + }, e.prototype.getSeriesByType = function (t) { + return B(this._componentsMap.get("series"), (function (e) { + return !!e && e.subType === t + })) + }, e.prototype.getSeries = function () { + return B(this._componentsMap.get("series"), (function (t) { + return !!t + })) + }, e.prototype.getSeriesCount = function () { + return this._componentsCount.get("series") + }, e.prototype.eachSeries = function (t, e) { + qp(this), E(this._seriesIndices, (function (n) { + var i = this._componentsMap.get("series")[n]; + t.call(e, i, n) + }), this) + }, e.prototype.eachRawSeries = function (t, e) { + E(this._componentsMap.get("series"), (function (n) { + n && t.call(e, n, n.componentIndex) + })) + }, e.prototype.eachSeriesByType = function (t, e, n) { + qp(this), E(this._seriesIndices, (function (i) { + var r = this._componentsMap.get("series")[i]; + r.subType === t && e.call(n, r, i) + }), this) + }, e.prototype.eachRawSeriesByType = function (t, e, n) { + return E(this.getSeriesByType(t), e, n) + }, e.prototype.isSeriesFiltered = function (t) { + return qp(this), null == this._seriesIndicesMap.get(t.componentIndex) + }, e.prototype.getCurrentSeriesIndices = function () { + return (this._seriesIndices || []).slice() + }, e.prototype.filterSeries = function (t, e) { + qp(this); + var n = []; + E(this._seriesIndices, (function (i) { + var r = this._componentsMap.get("series")[i]; + t.call(e, r, i) && n.push(i) + }), this), this._seriesIndices = n, this._seriesIndicesMap = ft(n) + }, e.prototype.restoreData = function (t) { + jp(this); + var e = this._componentsMap, n = []; + e.each((function (t, e) { + Ip.hasClass(e) && n.push(e) + })), Ip.topologicalTravel(n, Ip.getAllClassMainTypes(), (function (n) { + E(e.get(n), (function (e) { + !e || "series" === n && function (t, e) { + if (e) { + var n = e.seriesIndex, i = e.seriesId, r = e.seriesName; + return null != n && t.componentIndex !== n || null != i && t.id !== i || null != r && t.name !== r + } + }(e, t) || e.restoreData() + })) + })) + }, e.internalField = (jp = function (t) { + var e = t._seriesIndices = []; + E(t._componentsMap.get("series"), (function (t) { + t && e.push(t.componentIndex) + })), t._seriesIndicesMap = ft(e) + }, qp = function (t) { + }, void (Kp = function (t, e) { + t.option = {}, t.option["\0_ec_inner"] = 1, t._componentsMap = ft({series: []}), t._componentsCount = ft(); + var n = e.aria; + q(n) && null == n.enabled && (n.enabled = !0), function (t, e) { + var n = t.color && !t.colorLayer; + E(e, (function (e, i) { + "colorLayer" === i && n || Ip.hasClass(i) || ("object" == typeof e ? t[i] = t[i] ? C(t[i], e, !1) : T(e) : null == t[i] && (t[i] = e)) + })) + }(e, t._theme.option), C(e, Dp, !1), t._mergeOption(e, null) + })), e + }(pc); + + function id(t, e, n) { + if (Y(e)) { + var i = ft(); + return E(e, (function (t) { + null != t && (null != xo(t, null) && i.set(t, !0)) + })), B(n, (function (e) { + return e && i.get(e[t]) + })) + } + var r = xo(e, null); + return B(n, (function (e) { + return e && null != r && e[t] === r + })) + } + + function rd(t, e) { + return e.hasOwnProperty("subType") ? B(t, (function (t) { + return t && t.subType === e.subType + })) : t + } + + function od(t) { + var e = ft(); + return t && E(ho(t.replaceMerge), (function (t) { + e.set(t, !0) + })), {replaceMergeMainTypeMap: e} + } + + R(nd, Qp); + var ad = ["getDom", "getZr", "getWidth", "getHeight", "getDevicePixelRatio", "dispatchAction", "isSSR", "isDisposed", "on", "off", "getDataURL", "getConnectedDataURL", "getOption", "getId", "updateLabelLayout"], + sd = function (t) { + E(ad, (function (e) { + this[e] = W(t[e], t) + }), this) + }, ld = {}, ud = function () { + function t() { + this._coordinateSystems = [] + } + + return t.prototype.create = function (t, e) { + var n = []; + E(ld, (function (i, r) { + var o = i.create(t, e); + n = n.concat(o || []) + })), this._coordinateSystems = n + }, t.prototype.update = function (t, e) { + E(this._coordinateSystems, (function (n) { + n.update && n.update(t, e) + })) + }, t.prototype.getCoordinateSystems = function () { + return this._coordinateSystems.slice() + }, t.register = function (t, e) { + ld[t] = e + }, t.get = function (t) { + return ld[t] + }, t + }(), hd = /^(min|max)?(.+)$/, cd = function () { + function t(t) { + this._timelineOptions = [], this._mediaList = [], this._currentMediaIndices = [], this._api = t + } + + return t.prototype.setOption = function (t, e, n) { + t && (E(ho(t.series), (function (t) { + t && t.data && $(t.data) && ct(t.data) + })), E(ho(t.dataset), (function (t) { + t && t.source && $(t.source) && ct(t.source) + }))), t = T(t); + var i = this._optionBackup, r = function (t, e, n) { + var i, r, o = [], a = t.baseOption, s = t.timeline, l = t.options, u = t.media, h = !!t.media, + c = !!(l || s || a && a.timeline); + a ? (r = a).timeline || (r.timeline = s) : ((c || h) && (t.options = t.media = null), r = t); + h && Y(u) && E(u, (function (t) { + t && t.option && (t.query ? o.push(t) : i || (i = t)) + })); + + function p(t) { + E(e, (function (e) { + e(t, n) + })) + } + + return p(r), E(l, (function (t) { + return p(t) + })), E(o, (function (t) { + return p(t.option) + })), {baseOption: r, timelineOptions: l || [], mediaDefault: i, mediaList: o} + }(t, e, !i); + this._newBaseOption = r.baseOption, i ? (r.timelineOptions.length && (i.timelineOptions = r.timelineOptions), r.mediaList.length && (i.mediaList = r.mediaList), r.mediaDefault && (i.mediaDefault = r.mediaDefault)) : this._optionBackup = r + }, t.prototype.mountOption = function (t) { + var e = this._optionBackup; + return this._timelineOptions = e.timelineOptions, this._mediaList = e.mediaList, this._mediaDefault = e.mediaDefault, this._currentMediaIndices = [], T(t ? e.baseOption : this._newBaseOption) + }, t.prototype.getTimelineOption = function (t) { + var e, n = this._timelineOptions; + if (n.length) { + var i = t.getComponent("timeline"); + i && (e = T(n[i.getCurrentIndex()])) + } + return e + }, t.prototype.getMediaOption = function (t) { + var e, n, i = this._api.getWidth(), r = this._api.getHeight(), o = this._mediaList, a = this._mediaDefault, + s = [], l = []; + if (!o.length && !a) return l; + for (var u = 0, h = o.length; u < h; u++) pd(o[u].query, i, r) && s.push(u); + return !s.length && a && (s = [-1]), s.length && (e = s, n = this._currentMediaIndices, e.join(",") !== n.join(",")) && (l = z(s, (function (t) { + return T(-1 === t ? a.option : o[t].option) + }))), this._currentMediaIndices = s, l + }, t + }(); + + function pd(t, e, n) { + var i = {width: e, height: n, aspectratio: e / n}, r = !0; + return E(t, (function (t, e) { + var n = e.match(hd); + if (n && n[1] && n[2]) { + var o = n[1], a = n[2].toLowerCase(); + (function (t, e, n) { + return "min" === n ? t >= e : "max" === n ? t <= e : t === e + })(i[a], t, o) || (r = !1) + } + })), r + } + + var dd = E, fd = q, gd = ["areaStyle", "lineStyle", "nodeStyle", "linkStyle", "chordStyle", "label", "labelLine"]; + + function yd(t) { + var e = t && t.itemStyle; + if (e) for (var n = 0, i = gd.length; n < i; n++) { + var r = gd[n], o = e.normal, a = e.emphasis; + o && o[r] && (t[r] = t[r] || {}, t[r].normal ? C(t[r].normal, o[r]) : t[r].normal = o[r], o[r] = null), a && a[r] && (t[r] = t[r] || {}, t[r].emphasis ? C(t[r].emphasis, a[r]) : t[r].emphasis = a[r], a[r] = null) + } + } + + function vd(t, e, n) { + if (t && t[e] && (t[e].normal || t[e].emphasis)) { + var i = t[e].normal, r = t[e].emphasis; + i && (n ? (t[e].normal = t[e].emphasis = null, k(t[e], i)) : t[e] = i), r && (t.emphasis = t.emphasis || {}, t.emphasis[e] = r, r.focus && (t.emphasis.focus = r.focus), r.blurScope && (t.emphasis.blurScope = r.blurScope)) + } + } + + function md(t) { + vd(t, "itemStyle"), vd(t, "lineStyle"), vd(t, "areaStyle"), vd(t, "label"), vd(t, "labelLine"), vd(t, "upperLabel"), vd(t, "edgeLabel") + } + + function xd(t, e) { + var n = fd(t) && t[e], i = fd(n) && n.textStyle; + if (i) { + 0; + for (var r = 0, o = po.length; r < o; r++) { + var a = po[r]; + i.hasOwnProperty(a) && (n[a] = i[a]) + } + } + } + + function _d(t) { + t && (md(t), xd(t, "label"), t.emphasis && xd(t.emphasis, "label")) + } + + function bd(t) { + return Y(t) ? t : t ? [t] : [] + } + + function wd(t) { + return (Y(t) ? t[0] : t) || {} + } + + function Sd(t, e) { + dd(bd(t.series), (function (t) { + fd(t) && function (t) { + if (fd(t)) { + yd(t), md(t), xd(t, "label"), xd(t, "upperLabel"), xd(t, "edgeLabel"), t.emphasis && (xd(t.emphasis, "label"), xd(t.emphasis, "upperLabel"), xd(t.emphasis, "edgeLabel")); + var e = t.markPoint; + e && (yd(e), _d(e)); + var n = t.markLine; + n && (yd(n), _d(n)); + var i = t.markArea; + i && _d(i); + var r = t.data; + if ("graph" === t.type) { + r = r || t.nodes; + var o = t.links || t.edges; + if (o && !$(o)) for (var a = 0; a < o.length; a++) _d(o[a]); + E(t.categories, (function (t) { + md(t) + })) + } + if (r && !$(r)) for (a = 0; a < r.length; a++) _d(r[a]); + if ((e = t.markPoint) && e.data) { + var s = e.data; + for (a = 0; a < s.length; a++) _d(s[a]) + } + if ((n = t.markLine) && n.data) { + var l = n.data; + for (a = 0; a < l.length; a++) Y(l[a]) ? (_d(l[a][0]), _d(l[a][1])) : _d(l[a]) + } + "gauge" === t.type ? (xd(t, "axisLabel"), xd(t, "title"), xd(t, "detail")) : "treemap" === t.type ? (vd(t.breadcrumb, "itemStyle"), E(t.levels, (function (t) { + md(t) + }))) : "tree" === t.type && md(t.leaves) + } + }(t) + })); + var n = ["xAxis", "yAxis", "radiusAxis", "angleAxis", "singleAxis", "parallelAxis", "radar"]; + e && n.push("valueAxis", "categoryAxis", "logAxis", "timeAxis"), dd(n, (function (e) { + dd(bd(t[e]), (function (t) { + t && (xd(t, "axisLabel"), xd(t.axisPointer, "label")) + })) + })), dd(bd(t.parallel), (function (t) { + var e = t && t.parallelAxisDefault; + xd(e, "axisLabel"), xd(e && e.axisPointer, "label") + })), dd(bd(t.calendar), (function (t) { + vd(t, "itemStyle"), xd(t, "dayLabel"), xd(t, "monthLabel"), xd(t, "yearLabel") + })), dd(bd(t.radar), (function (t) { + xd(t, "name"), t.name && null == t.axisName && (t.axisName = t.name, delete t.name), null != t.nameGap && null == t.axisNameGap && (t.axisNameGap = t.nameGap, delete t.nameGap) + })), dd(bd(t.geo), (function (t) { + fd(t) && (_d(t), dd(bd(t.regions), (function (t) { + _d(t) + }))) + })), dd(bd(t.timeline), (function (t) { + _d(t), vd(t, "label"), vd(t, "itemStyle"), vd(t, "controlStyle", !0); + var e = t.data; + Y(e) && E(e, (function (t) { + q(t) && (vd(t, "label"), vd(t, "itemStyle")) + })) + })), dd(bd(t.toolbox), (function (t) { + vd(t, "iconStyle"), dd(t.feature, (function (t) { + vd(t, "iconStyle") + })) + })), xd(wd(t.axisPointer), "label"), xd(wd(t.tooltip).axisPointer, "label") + } + + function Md(t) { + t && E(Id, (function (e) { + e[0] in t && !(e[1] in t) && (t[e[1]] = t[e[0]]) + })) + } + + var Id = [["x", "left"], ["y", "top"], ["x2", "right"], ["y2", "bottom"]], + Td = ["grid", "geo", "parallel", "legend", "toolbox", "title", "visualMap", "dataZoom", "timeline"], + Cd = [["borderRadius", "barBorderRadius"], ["borderColor", "barBorderColor"], ["borderWidth", "barBorderWidth"]]; + + function Dd(t) { + var e = t && t.itemStyle; + if (e) for (var n = 0; n < Cd.length; n++) { + var i = Cd[n][1], r = Cd[n][0]; + null != e[i] && (e[r] = e[i]) + } + } + + function Ad(t) { + t && "edge" === t.alignTo && null != t.margin && null == t.edgeDistance && (t.edgeDistance = t.margin) + } + + function kd(t) { + t && t.downplay && !t.blur && (t.blur = t.downplay) + } + + function Ld(t, e) { + if (t) for (var n = 0; n < t.length; n++) e(t[n]), t[n] && Ld(t[n].children, e) + } + + function Pd(t, e) { + Sd(t, e), t.series = ho(t.series), E(t.series, (function (t) { + if (q(t)) { + var e = t.type; + if ("line" === e) null != t.clipOverflow && (t.clip = t.clipOverflow); else if ("pie" === e || "gauge" === e) { + if (null != t.clockWise && (t.clockwise = t.clockWise), Ad(t.label), (r = t.data) && !$(r)) for (var n = 0; n < r.length; n++) Ad(r[n]); + null != t.hoverOffset && (t.emphasis = t.emphasis || {}, (t.emphasis.scaleSize = null) && (t.emphasis.scaleSize = t.hoverOffset)) + } else if ("gauge" === e) { + var i = function (t, e) { + for (var n = e.split(","), i = t, r = 0; r < n.length && null != (i = i && i[n[r]]); r++) ; + return i + }(t, "pointer.color"); + null != i && function (t, e, n, i) { + for (var r, o = e.split(","), a = t, s = 0; s < o.length - 1; s++) null == a[r = o[s]] && (a[r] = {}), a = a[r]; + (i || null == a[o[s]]) && (a[o[s]] = n) + }(t, "itemStyle.color", i) + } else if ("bar" === e) { + var r; + if (Dd(t), Dd(t.backgroundStyle), Dd(t.emphasis), (r = t.data) && !$(r)) for (n = 0; n < r.length; n++) "object" == typeof r[n] && (Dd(r[n]), Dd(r[n] && r[n].emphasis)) + } else if ("sunburst" === e) { + var o = t.highlightPolicy; + o && (t.emphasis = t.emphasis || {}, t.emphasis.focus || (t.emphasis.focus = o)), kd(t), Ld(t.data, kd) + } else "graph" === e || "sankey" === e ? function (t) { + t && null != t.focusNodeAdjacency && (t.emphasis = t.emphasis || {}, null == t.emphasis.focus && (t.emphasis.focus = "adjacency")) + }(t) : "map" === e && (t.mapType && !t.map && (t.map = t.mapType), t.mapLocation && k(t, t.mapLocation)); + null != t.hoverAnimation && (t.emphasis = t.emphasis || {}, t.emphasis && null == t.emphasis.scale && (t.emphasis.scale = t.hoverAnimation)), Md(t) + } + })), t.dataRange && (t.visualMap = t.dataRange), E(Td, (function (e) { + var n = t[e]; + n && (Y(n) || (n = [n]), E(n, (function (t) { + Md(t) + }))) + })) + } + + function Od(t) { + E(t, (function (e, n) { + var i = [], r = [NaN, NaN], o = [e.stackResultDimension, e.stackedOverDimension], a = e.data, + s = e.isStackedByIndex; + a.modify(o, (function (o, l, u) { + var h, c, p = a.get(e.stackedDimension, u); + if (isNaN(p)) return r; + s ? c = a.getRawIndex(u) : h = a.get(e.stackedByDimension, u); + for (var d = NaN, f = n - 1; f >= 0; f--) { + var g = t[f]; + if (s || (c = g.data.rawIndexOf(g.stackedByDimension, h)), c >= 0) { + var y = g.data.getByRawIndex(g.stackResultDimension, c); + if (p >= 0 && y > 0 || p <= 0 && y < 0) { + p = Hr(p, y), d = y; + break + } + } + } + return i[0] = p, i[1] = d, i + })) + })) + } + + var Rd, Nd, Ed, zd, Vd, Bd = function (t) { + this.data = t.data || (t.sourceFormat === Op ? {} : []), this.sourceFormat = t.sourceFormat || Np, this.seriesLayoutBy = t.seriesLayoutBy || Ep, this.startIndex = t.startIndex || 0, this.dimensionsDetectedCount = t.dimensionsDetectedCount, this.metaRawOption = t.metaRawOption; + var e = this.dimensionsDefine = t.dimensionsDefine; + if (e) for (var n = 0; n < e.length; n++) { + var i = e[n]; + null == i.type && Up(this, n) === Vp && (i.type = "ordinal") + } + }; + + function Fd(t) { + return t instanceof Bd + } + + function Gd(t, e, n) { + n = n || Hd(t); + var i = e.seriesLayoutBy, r = function (t, e, n, i, r) { + var o, a; + if (!t) return {dimensionsDefine: Yd(r), startIndex: a, dimensionsDetectedCount: o}; + if (e === Lp) { + var s = t; + "auto" === i || null == i ? Ud((function (t) { + null != t && "-" !== t && (X(t) ? null == a && (a = 1) : a = 0) + }), n, s, 10) : a = j(i) ? i : i ? 1 : 0, r || 1 !== a || (r = [], Ud((function (t, e) { + r[e] = null != t ? t + "" : "" + }), n, s, 1 / 0)), o = r ? r.length : n === zp ? s.length : s[0] ? s[0].length : null + } else if (e === Pp) r || (r = function (t) { + var e, n = 0; + for (; n < t.length && !(e = t[n++]);) ; + if (e) { + var i = []; + return E(e, (function (t, e) { + i.push(e) + })), i + } + }(t)); else if (e === Op) r || (r = [], E(t, (function (t, e) { + r.push(e) + }))); else if (e === kp) { + var l = fo(t[0]); + o = Y(l) && l.length || 1 + } + return {startIndex: a, dimensionsDefine: Yd(r), dimensionsDetectedCount: o} + }(t, n, i, e.sourceHeader, e.dimensions); + return new Bd({ + data: t, + sourceFormat: n, + seriesLayoutBy: i, + dimensionsDefine: r.dimensionsDefine, + startIndex: r.startIndex, + dimensionsDetectedCount: r.dimensionsDetectedCount, + metaRawOption: T(e) + }) + } + + function Wd(t) { + return new Bd({data: t, sourceFormat: $(t) ? Rp : kp}) + } + + function Hd(t) { + var e = Np; + if ($(t)) e = Rp; else if (Y(t)) { + 0 === t.length && (e = Lp); + for (var n = 0, i = t.length; n < i; n++) { + var r = t[n]; + if (null != r) { + if (Y(r)) { + e = Lp; + break + } + if (q(r)) { + e = Pp; + break + } + } + } + } else if (q(t)) for (var o in t) if (mt(t, o) && N(t[o])) { + e = Op; + break + } + return e + } + + function Yd(t) { + if (t) { + var e = ft(); + return z(t, (function (t, n) { + var i = {name: (t = q(t) ? t : {name: t}).name, displayName: t.displayName, type: t.type}; + if (null == i.name) return i; + i.name += "", null == i.displayName && (i.displayName = i.name); + var r = e.get(i.name); + return r ? i.name += "-" + r.count++ : e.set(i.name, {count: 1}), i + })) + } + } + + function Ud(t, e, n, i) { + if (e === zp) for (var r = 0; r < n.length && r < i; r++) t(n[r] ? n[r][0] : null, r); else { + var o = n[0] || []; + for (r = 0; r < o.length && r < i; r++) t(o[r], r) + } + } + + function Xd(t) { + var e = t.sourceFormat; + return e === Pp || e === Op + } + + var Zd = function () { + function t(t, e) { + var n = Fd(t) ? t : Wd(t); + this._source = n; + var i = this._data = n.data; + n.sourceFormat === Rp && (this._offset = 0, this._dimSize = e, this._data = i), Vd(this, i, n) + } + + return t.prototype.getSource = function () { + return this._source + }, t.prototype.count = function () { + return 0 + }, t.prototype.getItem = function (t, e) { + }, t.prototype.appendData = function (t) { + }, t.prototype.clean = function () { + }, t.protoInitialize = function () { + var e = t.prototype; + e.pure = !1, e.persistent = !0 + }(), t.internalField = function () { + var t; + Vd = function (t, r, o) { + var a = o.sourceFormat, s = o.seriesLayoutBy, l = o.startIndex, u = o.dimensionsDefine, + h = zd[rf(a, s)]; + if (A(t, h), a === Rp) t.getItem = e, t.count = i, t.fillStorage = n; else { + var c = Kd(a, s); + t.getItem = W(c, null, r, l, u); + var p = Qd(a, s); + t.count = W(p, null, r, l, u) + } + }; + var e = function (t, e) { + t -= this._offset, e = e || []; + for (var n = this._data, i = this._dimSize, r = i * t, o = 0; o < i; o++) e[o] = n[r + o]; + return e + }, n = function (t, e, n, i) { + for (var r = this._data, o = this._dimSize, a = 0; a < o; a++) { + for (var s = i[a], l = null == s[0] ? 1 / 0 : s[0], u = null == s[1] ? -1 / 0 : s[1], h = e - t, c = n[a], p = 0; p < h; p++) { + var d = r[p * o + a]; + c[t + p] = d, d < l && (l = d), d > u && (u = d) + } + s[0] = l, s[1] = u + } + }, i = function () { + return this._data ? this._data.length / this._dimSize : 0 + }; + + function r(t) { + for (var e = 0; e < t.length; e++) this._data.push(t[e]) + } + + (t = {}).arrayRows_column = {pure: !0, appendData: r}, t.arrayRows_row = { + pure: !0, + appendData: function () { + throw new Error('Do not support appendData when set seriesLayoutBy: "row".') + } + }, t.objectRows = {pure: !0, appendData: r}, t.keyedColumns = { + pure: !0, appendData: function (t) { + var e = this._data; + E(t, (function (t, n) { + for (var i = e[n] || (e[n] = []), r = 0; r < (t || []).length; r++) i.push(t[r]) + })) + } + }, t.original = {appendData: r}, t.typedArray = { + persistent: !1, pure: !0, appendData: function (t) { + this._data = t + }, clean: function () { + this._offset += this.count(), this._data = null + } + }, zd = t + }(), t + }(), jd = function (t, e, n, i) { + return t[i] + }, qd = ((Rd = {}).arrayRows_column = function (t, e, n, i) { + return t[i + e] + }, Rd.arrayRows_row = function (t, e, n, i, r) { + i += e; + for (var o = r || [], a = t, s = 0; s < a.length; s++) { + var l = a[s]; + o[s] = l ? l[i] : null + } + return o + }, Rd.objectRows = jd, Rd.keyedColumns = function (t, e, n, i, r) { + for (var o = r || [], a = 0; a < n.length; a++) { + var s = n[a].name; + 0; + var l = t[s]; + o[a] = l ? l[i] : null + } + return o + }, Rd.original = jd, Rd); + + function Kd(t, e) { + var n = qd[rf(t, e)]; + return n + } + + var $d = function (t, e, n) { + return t.length + }, Jd = ((Nd = {}).arrayRows_column = function (t, e, n) { + return Math.max(0, t.length - e) + }, Nd.arrayRows_row = function (t, e, n) { + var i = t[0]; + return i ? Math.max(0, i.length - e) : 0 + }, Nd.objectRows = $d, Nd.keyedColumns = function (t, e, n) { + var i = n[0].name; + var r = t[i]; + return r ? r.length : 0 + }, Nd.original = $d, Nd); + + function Qd(t, e) { + var n = Jd[rf(t, e)]; + return n + } + + var tf = function (t, e, n) { + return t[e] + }, ef = ((Ed = {}).arrayRows = tf, Ed.objectRows = function (t, e, n) { + return t[n] + }, Ed.keyedColumns = tf, Ed.original = function (t, e, n) { + var i = fo(t); + return i instanceof Array ? i[e] : i + }, Ed.typedArray = tf, Ed); + + function nf(t) { + var e = ef[t]; + return e + } + + function rf(t, e) { + return t === Lp ? t + "_" + e : t + } + + function of(t, e, n) { + if (t) { + var i = t.getRawDataItem(e); + if (null != i) { + var r = t.getStore(), o = r.getSource().sourceFormat; + if (null != n) { + var a = t.getDimensionIndex(n), s = r.getDimensionProperty(a); + return nf(o)(i, a, s) + } + var l = i; + return o === kp && (l = fo(i)), l + } + } + } + + var af = /\{@(.+?)\}/g, sf = function () { + function t() { + } + + return t.prototype.getDataParams = function (t, e) { + var n = this.getData(e), i = this.getRawValue(t, e), r = n.getRawIndex(t), o = n.getName(t), + a = n.getRawDataItem(t), s = n.getItemVisual(t, "style"), + l = s && s[n.getItemVisual(t, "drawType") || "fill"], u = s && s.stroke, h = this.mainType, + c = "series" === h, p = n.userOutput && n.userOutput.get(); + return { + componentType: h, + componentSubType: this.subType, + componentIndex: this.componentIndex, + seriesType: c ? this.subType : null, + seriesIndex: this.seriesIndex, + seriesId: c ? this.id : null, + seriesName: c ? this.name : null, + name: o, + dataIndex: r, + data: a, + dataType: e, + value: i, + color: l, + borderColor: u, + dimensionNames: p ? p.fullDimensions : null, + encode: p ? p.encode : null, + $vars: ["seriesName", "name", "value"] + } + }, t.prototype.getFormattedLabel = function (t, e, n, i, r, o) { + e = e || "normal"; + var a = this.getData(n), s = this.getDataParams(t, n); + (o && (s.value = o.interpolatedValue), null != i && Y(s.value) && (s.value = s.value[i]), r) || (r = a.getItemModel(t).get("normal" === e ? ["label", "formatter"] : [e, "label", "formatter"])); + return U(r) ? (s.status = e, s.dimensionIndex = i, r(s)) : X(r) ? up(r, s).replace(af, (function (e, n) { + var i = n.length, r = n; + "[" === r.charAt(0) && "]" === r.charAt(i - 1) && (r = +r.slice(1, i - 1)); + var s = of(a, t, r); + if (o && Y(o.interpolatedValue)) { + var l = a.getDimensionIndex(r); + l >= 0 && (s = o.interpolatedValue[l]) + } + return null != s ? s + "" : "" + })) : void 0 + }, t.prototype.getRawValue = function (t, e) { + return of(this.getData(e), t) + }, t.prototype.formatTooltip = function (t, e, n) { + }, t + }(); + + function lf(t) { + var e, n; + return q(t) ? t.type && (n = t) : e = t, {text: e, frag: n} + } + + function uf(t) { + return new hf(t) + } + + var hf = function () { + function t(t) { + t = t || {}, this._reset = t.reset, this._plan = t.plan, this._count = t.count, this._onDirty = t.onDirty, this._dirty = !0 + } + + return t.prototype.perform = function (t) { + var e, n = this._upstream, i = t && t.skip; + if (this._dirty && n) { + var r = this.context; + r.data = r.outputData = n.context.outputData + } + this.__pipeline && (this.__pipeline.currentTask = this), this._plan && !i && (e = this._plan(this.context)); + var o, a = h(this._modBy), s = this._modDataCount || 0, l = h(t && t.modBy), u = t && t.modDataCount || 0; + + function h(t) { + return !(t >= 1) && (t = 1), t + } + + a === l && s === u || (e = "reset"), (this._dirty || "reset" === e) && (this._dirty = !1, o = this._doReset(i)), this._modBy = l, this._modDataCount = u; + var c = t && t.step; + if (this._dueEnd = n ? n._outputDueEnd : this._count ? this._count(this.context) : 1 / 0, this._progress) { + var p = this._dueIndex, d = Math.min(null != c ? this._dueIndex + c : 1 / 0, this._dueEnd); + if (!i && (o || p < d)) { + var f = this._progress; + if (Y(f)) for (var g = 0; g < f.length; g++) this._doProgress(f[g], p, d, l, u); else this._doProgress(f, p, d, l, u) + } + this._dueIndex = d; + var y = null != this._settedOutputEnd ? this._settedOutputEnd : d; + 0, this._outputDueEnd = y + } else this._dueIndex = this._outputDueEnd = null != this._settedOutputEnd ? this._settedOutputEnd : this._dueEnd; + return this.unfinished() + }, t.prototype.dirty = function () { + this._dirty = !0, this._onDirty && this._onDirty(this.context) + }, t.prototype._doProgress = function (t, e, n, i, r) { + cf.reset(e, n, i, r), this._callingProgress = t, this._callingProgress({ + start: e, + end: n, + count: n - e, + next: cf.next + }, this.context) + }, t.prototype._doReset = function (t) { + var e, n; + this._dueIndex = this._outputDueEnd = this._dueEnd = 0, this._settedOutputEnd = null, !t && this._reset && ((e = this._reset(this.context)) && e.progress && (n = e.forceFirstProgress, e = e.progress), Y(e) && !e.length && (e = null)), this._progress = e, this._modBy = this._modDataCount = null; + var i = this._downstream; + return i && i.dirty(), n + }, t.prototype.unfinished = function () { + return this._progress && this._dueIndex < this._dueEnd + }, t.prototype.pipe = function (t) { + (this._downstream !== t || this._dirty) && (this._downstream = t, t._upstream = this, t.dirty()) + }, t.prototype.dispose = function () { + this._disposed || (this._upstream && (this._upstream._downstream = null), this._downstream && (this._downstream._upstream = null), this._dirty = !1, this._disposed = !0) + }, t.prototype.getUpstream = function () { + return this._upstream + }, t.prototype.getDownstream = function () { + return this._downstream + }, t.prototype.setOutputEnd = function (t) { + this._outputDueEnd = this._settedOutputEnd = t + }, t + }(), cf = function () { + var t, e, n, i, r, o = { + reset: function (l, u, h, c) { + e = l, t = u, n = h, i = c, r = Math.ceil(i / n), o.next = n > 1 && i > 0 ? s : a + } + }; + return o; + + function a() { + return e < t ? e++ : null + } + + function s() { + var o = e % r * n + Math.ceil(e / r), a = e >= t ? null : o < i ? o : e; + return e++, a + } + }(); + + function pf(t, e) { + var n = e && e.type; + return "ordinal" === n ? t : ("time" !== n || j(t) || null == t || "-" === t || (t = +jr(t)), null == t || "" === t ? NaN : +t) + } + + var df = ft({ + number: function (t) { + return parseFloat(t) + }, time: function (t) { + return +jr(t) + }, trim: function (t) { + return X(t) ? ut(t) : t + } + }); + + function ff(t) { + return df.get(t) + } + + var gf = { + lt: function (t, e) { + return t < e + }, lte: function (t, e) { + return t <= e + }, gt: function (t, e) { + return t > e + }, gte: function (t, e) { + return t >= e + } + }, yf = function () { + function t(t, e) { + if (!j(e)) { + var n = ""; + 0, ao(n) + } + this._opFn = gf[t], this._rvalFloat = to(e) + } + + return t.prototype.evaluate = function (t) { + return j(t) ? this._opFn(t, this._rvalFloat) : this._opFn(to(t), this._rvalFloat) + }, t + }(), vf = function () { + function t(t, e) { + var n = "desc" === t; + this._resultLT = n ? 1 : -1, null == e && (e = n ? "min" : "max"), this._incomparable = "min" === e ? -1 / 0 : 1 / 0 + } + + return t.prototype.evaluate = function (t, e) { + var n = j(t) ? t : to(t), i = j(e) ? e : to(e), r = isNaN(n), o = isNaN(i); + if (r && (n = this._incomparable), o && (i = this._incomparable), r && o) { + var a = X(t), s = X(e); + a && (n = s ? t : 0), s && (i = a ? e : 0) + } + return n < i ? this._resultLT : n > i ? -this._resultLT : 0 + }, t + }(), mf = function () { + function t(t, e) { + this._rval = e, this._isEQ = t, this._rvalTypeof = typeof e, this._rvalFloat = to(e) + } + + return t.prototype.evaluate = function (t) { + var e = t === this._rval; + if (!e) { + var n = typeof t; + n === this._rvalTypeof || "number" !== n && "number" !== this._rvalTypeof || (e = to(t) === this._rvalFloat) + } + return this._isEQ ? e : !e + }, t + }(); + + function xf(t, e) { + return "eq" === t || "ne" === t ? new mf("eq" === t, e) : mt(gf, t) ? new yf(t, e) : null + } + + var _f = function () { + function t() { + } + + return t.prototype.getRawData = function () { + throw new Error("not supported") + }, t.prototype.getRawDataItem = function (t) { + throw new Error("not supported") + }, t.prototype.cloneRawData = function () { + }, t.prototype.getDimensionInfo = function (t) { + }, t.prototype.cloneAllDimensionInfo = function () { + }, t.prototype.count = function () { + }, t.prototype.retrieveValue = function (t, e) { + }, t.prototype.retrieveValueFromItem = function (t, e) { + }, t.prototype.convertValue = function (t, e) { + return pf(t, e) + }, t + }(); + + function bf(t) { + var e = t.sourceFormat; + if (!Cf(e)) { + var n = ""; + 0, ao(n) + } + return t.data + } + + function wf(t) { + var e = t.sourceFormat, n = t.data; + if (!Cf(e)) { + var i = ""; + 0, ao(i) + } + if (e === Lp) { + for (var r = [], o = 0, a = n.length; o < a; o++) r.push(n[o].slice()); + return r + } + if (e === Pp) { + for (r = [], o = 0, a = n.length; o < a; o++) r.push(A({}, n[o])); + return r + } + } + + function Sf(t, e, n) { + if (null != n) return j(n) || !isNaN(n) && !mt(e, n) ? t[n] : mt(e, n) ? e[n] : void 0 + } + + function Mf(t) { + return T(t) + } + + var If = ft(); + + function Tf(t, e, n, i) { + var r = ""; + e.length || ao(r), q(t) || ao(r); + var o = t.type, a = If.get(o); + a || ao(r); + var s = z(e, (function (t) { + return function (t, e) { + var n = new _f, i = t.data, r = n.sourceFormat = t.sourceFormat, o = t.startIndex, a = ""; + t.seriesLayoutBy !== Ep && ao(a); + var s = [], l = {}, u = t.dimensionsDefine; + if (u) E(u, (function (t, e) { + var n = t.name, i = {index: e, name: n, displayName: t.displayName}; + if (s.push(i), null != n) { + var r = ""; + mt(l, n) && ao(r), l[n] = i + } + })); else for (var h = 0; h < t.dimensionsDetectedCount; h++) s.push({index: h}); + var c = Kd(r, Ep); + e.__isBuiltIn && (n.getRawDataItem = function (t) { + return c(i, o, s, t) + }, n.getRawData = W(bf, null, t)), n.cloneRawData = W(wf, null, t); + var p = Qd(r, Ep); + n.count = W(p, null, i, o, s); + var d = nf(r); + n.retrieveValue = function (t, e) { + var n = c(i, o, s, t); + return f(n, e) + }; + var f = n.retrieveValueFromItem = function (t, e) { + if (null != t) { + var n = s[e]; + return n ? d(t, e, n.name) : void 0 + } + }; + return n.getDimensionInfo = W(Sf, null, s, l), n.cloneAllDimensionInfo = W(Mf, null, s), n + }(t, a) + })), l = ho(a.transform({upstream: s[0], upstreamList: s, config: T(t.config)})); + return z(l, (function (t, n) { + var i, r = ""; + q(t) || ao(r), t.data || ao(r), Cf(Hd(t.data)) || ao(r); + var o = e[0]; + if (o && 0 === n && !t.dimensions) { + var a = o.startIndex; + a && (t.data = o.data.slice(0, a).concat(t.data)), i = { + seriesLayoutBy: Ep, + sourceHeader: a, + dimensions: o.metaRawOption.dimensions + } + } else i = {seriesLayoutBy: Ep, sourceHeader: 0, dimensions: t.dimensions}; + return Gd(t.data, i, null) + })) + } + + function Cf(t) { + return t === Lp || t === Pp + } + + var Df, Af = "undefined", kf = typeof Uint32Array === Af ? Array : Uint32Array, + Lf = typeof Uint16Array === Af ? Array : Uint16Array, Pf = typeof Int32Array === Af ? Array : Int32Array, + Of = typeof Float64Array === Af ? Array : Float64Array, + Rf = {float: Of, int: Pf, ordinal: Array, number: Array, time: Of}; + + function Nf(t) { + return t > 65535 ? kf : Lf + } + + function Ef(t, e, n, i, r) { + var o = Rf[n || "float"]; + if (r) { + var a = t[e], s = a && a.length; + if (s !== i) { + for (var l = new o(i), u = 0; u < s; u++) l[u] = a[u]; + t[e] = l + } + } else t[e] = new o(i) + } + + var zf = function () { + function t() { + this._chunks = [], this._rawExtent = [], this._extent = [], this._count = 0, this._rawCount = 0, this._calcDimNameToIdx = ft() + } + + return t.prototype.initData = function (t, e, n) { + this._provider = t, this._chunks = [], this._indices = null, this.getRawIndex = this._getRawIdxIdentity; + var i = t.getSource(), r = this.defaultDimValueGetter = Df[i.sourceFormat]; + this._dimValueGetter = n || r, this._rawExtent = []; + Xd(i); + this._dimensions = z(e, (function (t) { + return {type: t.type, property: t.property} + })), this._initDataFromProvider(0, t.count()) + }, t.prototype.getProvider = function () { + return this._provider + }, t.prototype.getSource = function () { + return this._provider.getSource() + }, t.prototype.ensureCalculationDimension = function (t, e) { + var n = this._calcDimNameToIdx, i = this._dimensions, r = n.get(t); + if (null != r) { + if (i[r].type === e) return r + } else r = i.length; + return i[r] = {type: e}, n.set(t, r), this._chunks[r] = new Rf[e || "float"](this._rawCount), this._rawExtent[r] = [1 / 0, -1 / 0], r + }, t.prototype.collectOrdinalMeta = function (t, e) { + var n = this._chunks[t], i = this._dimensions[t], r = this._rawExtent, o = i.ordinalOffset || 0, + a = n.length; + 0 === o && (r[t] = [1 / 0, -1 / 0]); + for (var s = r[t], l = o; l < a; l++) { + var u = n[l] = e.parseAndCollect(n[l]); + s[0] = Math.min(u, s[0]), s[1] = Math.max(u, s[1]) + } + i.ordinalMeta = e, i.ordinalOffset = a, i.type = "ordinal" + }, t.prototype.getOrdinalMeta = function (t) { + return this._dimensions[t].ordinalMeta + }, t.prototype.getDimensionProperty = function (t) { + var e = this._dimensions[t]; + return e && e.property + }, t.prototype.appendData = function (t) { + var e = this._provider, n = this.count(); + e.appendData(t); + var i = e.count(); + return e.persistent || (i += n), n < i && this._initDataFromProvider(n, i, !0), [n, i] + }, t.prototype.appendValues = function (t, e) { + for (var n = this._chunks, i = this._dimensions, r = i.length, o = this._rawExtent, a = this.count(), s = a + Math.max(t.length, e || 0), l = 0; l < r; l++) { + Ef(n, l, (d = i[l]).type, s, !0) + } + for (var u = [], h = a; h < s; h++) for (var c = h - a, p = 0; p < r; p++) { + var d = i[p], f = Df.arrayRows.call(this, t[c] || u, d.property, c, p); + n[p][h] = f; + var g = o[p]; + f < g[0] && (g[0] = f), f > g[1] && (g[1] = f) + } + return this._rawCount = this._count = s, {start: a, end: s} + }, t.prototype._initDataFromProvider = function (t, e, n) { + for (var i = this._provider, r = this._chunks, o = this._dimensions, a = o.length, s = this._rawExtent, l = z(o, (function (t) { + return t.property + })), u = 0; u < a; u++) { + var h = o[u]; + s[u] || (s[u] = [1 / 0, -1 / 0]), Ef(r, u, h.type, e, n) + } + if (i.fillStorage) i.fillStorage(t, e, r, s); else for (var c = [], p = t; p < e; p++) { + c = i.getItem(p, c); + for (var d = 0; d < a; d++) { + var f = r[d], g = this._dimValueGetter(c, l[d], p, d); + f[p] = g; + var y = s[d]; + g < y[0] && (y[0] = g), g > y[1] && (y[1] = g) + } + } + !i.persistent && i.clean && i.clean(), this._rawCount = this._count = e, this._extent = [] + }, t.prototype.count = function () { + return this._count + }, t.prototype.get = function (t, e) { + if (!(e >= 0 && e < this._count)) return NaN; + var n = this._chunks[t]; + return n ? n[this.getRawIndex(e)] : NaN + }, t.prototype.getValues = function (t, e) { + var n = [], i = []; + if (null == e) { + e = t, t = []; + for (var r = 0; r < this._dimensions.length; r++) i.push(r) + } else i = t; + r = 0; + for (var o = i.length; r < o; r++) n.push(this.get(i[r], e)); + return n + }, t.prototype.getByRawIndex = function (t, e) { + if (!(e >= 0 && e < this._rawCount)) return NaN; + var n = this._chunks[t]; + return n ? n[e] : NaN + }, t.prototype.getSum = function (t) { + var e = 0; + if (this._chunks[t]) for (var n = 0, i = this.count(); n < i; n++) { + var r = this.get(t, n); + isNaN(r) || (e += r) + } + return e + }, t.prototype.getMedian = function (t) { + var e = []; + this.each([t], (function (t) { + isNaN(t) || e.push(t) + })); + var n = e.sort((function (t, e) { + return t - e + })), i = this.count(); + return 0 === i ? 0 : i % 2 == 1 ? n[(i - 1) / 2] : (n[i / 2] + n[i / 2 - 1]) / 2 + }, t.prototype.indexOfRawIndex = function (t) { + if (t >= this._rawCount || t < 0) return -1; + if (!this._indices) return t; + var e = this._indices, n = e[t]; + if (null != n && n < this._count && n === t) return t; + for (var i = 0, r = this._count - 1; i <= r;) { + var o = (i + r) / 2 | 0; + if (e[o] < t) i = o + 1; else { + if (!(e[o] > t)) return o; + r = o - 1 + } + } + return -1 + }, t.prototype.indicesOfNearest = function (t, e, n) { + var i = this._chunks[t], r = []; + if (!i) return r; + null == n && (n = 1 / 0); + for (var o = 1 / 0, a = -1, s = 0, l = 0, u = this.count(); l < u; l++) { + var h = e - i[this.getRawIndex(l)], c = Math.abs(h); + c <= n && ((c < o || c === o && h >= 0 && a < 0) && (o = c, a = h, s = 0), h === a && (r[s++] = l)) + } + return r.length = s, r + }, t.prototype.getIndices = function () { + var t, e = this._indices; + if (e) { + var n = e.constructor, i = this._count; + if (n === Array) { + t = new n(i); + for (var r = 0; r < i; r++) t[r] = e[r] + } else t = new n(e.buffer, 0, i) + } else { + t = new (n = Nf(this._rawCount))(this.count()); + for (r = 0; r < t.length; r++) t[r] = r + } + return t + }, t.prototype.filter = function (t, e) { + if (!this._count) return this; + for (var n = this.clone(), i = n.count(), r = new (Nf(n._rawCount))(i), o = [], a = t.length, s = 0, l = t[0], u = n._chunks, h = 0; h < i; h++) { + var c = void 0, p = n.getRawIndex(h); + if (0 === a) c = e(h); else if (1 === a) { + c = e(u[l][p], h) + } else { + for (var d = 0; d < a; d++) o[d] = u[t[d]][p]; + o[d] = h, c = e.apply(null, o) + } + c && (r[s++] = p) + } + return s < i && (n._indices = r), n._count = s, n._extent = [], n._updateGetRawIdx(), n + }, t.prototype.selectRange = function (t) { + var e = this.clone(), n = e._count; + if (!n) return this; + var i = G(t), r = i.length; + if (!r) return this; + var o = e.count(), a = new (Nf(e._rawCount))(o), s = 0, l = i[0], u = t[l][0], h = t[l][1], c = e._chunks, + p = !1; + if (!e._indices) { + var d = 0; + if (1 === r) { + for (var f = c[i[0]], g = 0; g < n; g++) { + ((x = f[g]) >= u && x <= h || isNaN(x)) && (a[s++] = d), d++ + } + p = !0 + } else if (2 === r) { + f = c[i[0]]; + var y = c[i[1]], v = t[i[1]][0], m = t[i[1]][1]; + for (g = 0; g < n; g++) { + var x = f[g], _ = y[g]; + (x >= u && x <= h || isNaN(x)) && (_ >= v && _ <= m || isNaN(_)) && (a[s++] = d), d++ + } + p = !0 + } + } + if (!p) if (1 === r) for (g = 0; g < o; g++) { + var b = e.getRawIndex(g); + ((x = c[i[0]][b]) >= u && x <= h || isNaN(x)) && (a[s++] = b) + } else for (g = 0; g < o; g++) { + for (var w = !0, S = (b = e.getRawIndex(g), 0); S < r; S++) { + var M = i[S]; + ((x = c[M][b]) < t[M][0] || x > t[M][1]) && (w = !1) + } + w && (a[s++] = e.getRawIndex(g)) + } + return s < o && (e._indices = a), e._count = s, e._extent = [], e._updateGetRawIdx(), e + }, t.prototype.map = function (t, e) { + var n = this.clone(t); + return this._updateDims(n, t, e), n + }, t.prototype.modify = function (t, e) { + this._updateDims(this, t, e) + }, t.prototype._updateDims = function (t, e, n) { + for (var i = t._chunks, r = [], o = e.length, a = t.count(), s = [], l = t._rawExtent, u = 0; u < e.length; u++) l[e[u]] = [1 / 0, -1 / 0]; + for (var h = 0; h < a; h++) { + for (var c = t.getRawIndex(h), p = 0; p < o; p++) s[p] = i[e[p]][c]; + s[o] = h; + var d = n && n.apply(null, s); + if (null != d) { + "object" != typeof d && (r[0] = d, d = r); + for (u = 0; u < d.length; u++) { + var f = e[u], g = d[u], y = l[f], v = i[f]; + v && (v[c] = g), g < y[0] && (y[0] = g), g > y[1] && (y[1] = g) + } + } + } + }, t.prototype.lttbDownSample = function (t, e) { + var n, i, r, o = this.clone([t], !0), a = o._chunks[t], s = this.count(), l = 0, u = Math.floor(1 / e), + h = this.getRawIndex(0), c = new (Nf(this._rawCount))(Math.ceil(s / u) + 2); + c[l++] = h; + for (var p = 1; p < s - 1; p += u) { + for (var d = Math.min(p + u, s - 1), f = Math.min(p + 2 * u, s), g = (f + d) / 2, y = 0, v = d; v < f; v++) { + var m = a[S = this.getRawIndex(v)]; + isNaN(m) || (y += m) + } + y /= f - d; + var x = p, _ = Math.min(p + u, s), b = p - 1, w = a[h]; + n = -1, r = x; + for (v = x; v < _; v++) { + var S; + m = a[S = this.getRawIndex(v)]; + isNaN(m) || (i = Math.abs((b - g) * (m - w) - (b - v) * (y - w))) > n && (n = i, r = S) + } + c[l++] = r, h = r + } + return c[l++] = this.getRawIndex(s - 1), o._count = l, o._indices = c, o.getRawIndex = this._getRawIdx, o + }, t.prototype.downSample = function (t, e, n, i) { + for (var r = this.clone([t], !0), o = r._chunks, a = [], s = Math.floor(1 / e), l = o[t], u = this.count(), h = r._rawExtent[t] = [1 / 0, -1 / 0], c = new (Nf(this._rawCount))(Math.ceil(u / s)), p = 0, d = 0; d < u; d += s) { + s > u - d && (s = u - d, a.length = s); + for (var f = 0; f < s; f++) { + var g = this.getRawIndex(d + f); + a[f] = l[g] + } + var y = n(a), v = this.getRawIndex(Math.min(d + i(a, y) || 0, u - 1)); + l[v] = y, y < h[0] && (h[0] = y), y > h[1] && (h[1] = y), c[p++] = v + } + return r._count = p, r._indices = c, r._updateGetRawIdx(), r + }, t.prototype.each = function (t, e) { + if (this._count) for (var n = t.length, i = this._chunks, r = 0, o = this.count(); r < o; r++) { + var a = this.getRawIndex(r); + switch (n) { + case 0: + e(r); + break; + case 1: + e(i[t[0]][a], r); + break; + case 2: + e(i[t[0]][a], i[t[1]][a], r); + break; + default: + for (var s = 0, l = []; s < n; s++) l[s] = i[t[s]][a]; + l[s] = r, e.apply(null, l) + } + } + }, t.prototype.getDataExtent = function (t) { + var e = this._chunks[t], n = [1 / 0, -1 / 0]; + if (!e) return n; + var i, r = this.count(); + if (!this._indices) return this._rawExtent[t].slice(); + if (i = this._extent[t]) return i.slice(); + for (var o = (i = n)[0], a = i[1], s = 0; s < r; s++) { + var l = e[this.getRawIndex(s)]; + l < o && (o = l), l > a && (a = l) + } + return i = [o, a], this._extent[t] = i, i + }, t.prototype.getRawDataItem = function (t) { + var e = this.getRawIndex(t); + if (this._provider.persistent) return this._provider.getItem(e); + for (var n = [], i = this._chunks, r = 0; r < i.length; r++) n.push(i[r][e]); + return n + }, t.prototype.clone = function (e, n) { + var i, r, o = new t, a = this._chunks, s = e && V(e, (function (t, e) { + return t[e] = !0, t + }), {}); + if (s) for (var l = 0; l < a.length; l++) o._chunks[l] = s[l] ? (i = a[l], r = void 0, (r = i.constructor) === Array ? i.slice() : new r(i)) : a[l]; else o._chunks = a; + return this._copyCommonProps(o), n || (o._indices = this._cloneIndices()), o._updateGetRawIdx(), o + }, t.prototype._copyCommonProps = function (t) { + t._count = this._count, t._rawCount = this._rawCount, t._provider = this._provider, t._dimensions = this._dimensions, t._extent = T(this._extent), t._rawExtent = T(this._rawExtent) + }, t.prototype._cloneIndices = function () { + if (this._indices) { + var t = this._indices.constructor, e = void 0; + if (t === Array) { + var n = this._indices.length; + e = new t(n); + for (var i = 0; i < n; i++) e[i] = this._indices[i] + } else e = new t(this._indices); + return e + } + return null + }, t.prototype._getRawIdxIdentity = function (t) { + return t + }, t.prototype._getRawIdx = function (t) { + return t < this._count && t >= 0 ? this._indices[t] : -1 + }, t.prototype._updateGetRawIdx = function () { + this.getRawIndex = this._indices ? this._getRawIdx : this._getRawIdxIdentity + }, t.internalField = function () { + function t(t, e, n, i) { + return pf(t[i], this._dimensions[i]) + } + + Df = { + arrayRows: t, objectRows: function (t, e, n, i) { + return pf(t[e], this._dimensions[i]) + }, keyedColumns: t, original: function (t, e, n, i) { + var r = t && (null == t.value ? t : t.value); + return pf(r instanceof Array ? r[i] : r, this._dimensions[i]) + }, typedArray: function (t, e, n, i) { + return t[i] + } + } + }(), t + }(), Vf = function () { + function t(t) { + this._sourceList = [], this._storeList = [], this._upstreamSignList = [], this._versionSignBase = 0, this._dirty = !0, this._sourceHost = t + } + + return t.prototype.dirty = function () { + this._setLocalSource([], []), this._storeList = [], this._dirty = !0 + }, t.prototype._setLocalSource = function (t, e) { + this._sourceList = t, this._upstreamSignList = e, this._versionSignBase++, this._versionSignBase > 9e10 && (this._versionSignBase = 0) + }, t.prototype._getVersionSign = function () { + return this._sourceHost.uid + "_" + this._versionSignBase + }, t.prototype.prepareSource = function () { + this._isDirty() && (this._createSource(), this._dirty = !1) + }, t.prototype._createSource = function () { + this._setLocalSource([], []); + var t, e, n = this._sourceHost, i = this._getUpstreamSourceManagers(), r = !!i.length; + if (Ff(n)) { + var o = n, a = void 0, s = void 0, l = void 0; + if (r) { + var u = i[0]; + u.prepareSource(), a = (l = u.getSource()).data, s = l.sourceFormat, e = [u._getVersionSign()] + } else s = $(a = o.get("data", !0)) ? Rp : kp, e = []; + var h = this._getSourceMetaRawOption() || {}, c = l && l.metaRawOption || {}, + p = rt(h.seriesLayoutBy, c.seriesLayoutBy) || null, d = rt(h.sourceHeader, c.sourceHeader), + f = rt(h.dimensions, c.dimensions); + t = p !== c.seriesLayoutBy || !!d != !!c.sourceHeader || f ? [Gd(a, { + seriesLayoutBy: p, + sourceHeader: d, + dimensions: f + }, s)] : [] + } else { + var g = n; + if (r) { + var y = this._applyTransform(i); + t = y.sourceList, e = y.upstreamSignList + } else { + t = [Gd(g.get("source", !0), this._getSourceMetaRawOption(), null)], e = [] + } + } + this._setLocalSource(t, e) + }, t.prototype._applyTransform = function (t) { + var e, n = this._sourceHost, i = n.get("transform", !0), r = n.get("fromTransformResult", !0); + if (null != r) { + var o = ""; + 1 !== t.length && Gf(o) + } + var a, s = [], l = []; + return E(t, (function (t) { + t.prepareSource(); + var e = t.getSource(r || 0), n = ""; + null == r || e || Gf(n), s.push(e), l.push(t._getVersionSign()) + })), i ? e = function (t, e, n) { + var i = ho(t), r = i.length, o = ""; + r || ao(o); + for (var a = 0, s = r; a < s; a++) e = Tf(i[a], e), a !== s - 1 && (e.length = Math.max(e.length, 1)); + return e + }(i, s, n.componentIndex) : null != r && (e = [(a = s[0], new Bd({ + data: a.data, + sourceFormat: a.sourceFormat, + seriesLayoutBy: a.seriesLayoutBy, + dimensionsDefine: T(a.dimensionsDefine), + startIndex: a.startIndex, + dimensionsDetectedCount: a.dimensionsDetectedCount + }))]), {sourceList: e, upstreamSignList: l} + }, t.prototype._isDirty = function () { + if (this._dirty) return !0; + for (var t = this._getUpstreamSourceManagers(), e = 0; e < t.length; e++) { + var n = t[e]; + if (n._isDirty() || this._upstreamSignList[e] !== n._getVersionSign()) return !0 + } + }, t.prototype.getSource = function (t) { + t = t || 0; + var e = this._sourceList[t]; + if (!e) { + var n = this._getUpstreamSourceManagers(); + return n[0] && n[0].getSource(t) + } + return e + }, t.prototype.getSharedDataStore = function (t) { + var e = t.makeStoreSchema(); + return this._innerGetDataStore(e.dimensions, t.source, e.hash) + }, t.prototype._innerGetDataStore = function (t, e, n) { + var i = this._storeList, r = i[0]; + r || (r = i[0] = {}); + var o = r[n]; + if (!o) { + var a = this._getUpstreamSourceManagers()[0]; + Ff(this._sourceHost) && a ? o = a._innerGetDataStore(t, e, n) : (o = new zf).initData(new Zd(e, t.length), t), r[n] = o + } + return o + }, t.prototype._getUpstreamSourceManagers = function () { + var t = this._sourceHost; + if (Ff(t)) { + var e = Yp(t); + return e ? [e.getSourceManager()] : [] + } + return z(function (t) { + return t.get("transform", !0) || t.get("fromTransformResult", !0) ? Ao(t.ecModel, "dataset", { + index: t.get("fromDatasetIndex", !0), + id: t.get("fromDatasetId", !0) + }, Co).models : [] + }(t), (function (t) { + return t.getSourceManager() + })) + }, t.prototype._getSourceMetaRawOption = function () { + var t, e, n, i = this._sourceHost; + if (Ff(i)) t = i.get("seriesLayoutBy", !0), e = i.get("sourceHeader", !0), n = i.get("dimensions", !0); else if (!this._getUpstreamSourceManagers().length) { + var r = i; + t = r.get("seriesLayoutBy", !0), e = r.get("sourceHeader", !0), n = r.get("dimensions", !0) + } + return {seriesLayoutBy: t, sourceHeader: e, dimensions: n} + }, t + }(); + + function Bf(t) { + t.option.transform && ct(t.option.transform) + } + + function Ff(t) { + return "series" === t.mainType + } + + function Gf(t) { + throw new Error(t) + } + + function Wf(t, e) { + var n = t.color || "#6e7079", i = t.fontSize || 12, r = t.fontWeight || "400", o = t.color || "#464646", + a = t.fontSize || 14, s = t.fontWeight || "900"; + return "html" === e ? { + nameStyle: "font-size:" + op(i + "") + "px;color:" + op(n) + ";font-weight:" + op(r + ""), + valueStyle: "font-size:" + op(a + "") + "px;color:" + op(o) + ";font-weight:" + op(s + "") + } : {nameStyle: {fontSize: i, fill: n, fontWeight: r}, valueStyle: {fontSize: a, fill: o, fontWeight: s}} + } + + var Hf = [0, 10, 20, 30], Yf = ["", "\n", "\n\n", "\n\n\n"]; + + function Uf(t, e) { + return e.type = t, e + } + + function Xf(t) { + return "section" === t.type + } + + function Zf(t) { + return Xf(t) ? qf : Kf + } + + function jf(t) { + if (Xf(t)) { + var e = 0, n = t.blocks.length, i = n > 1 || n > 0 && !t.noHeader; + return E(t.blocks, (function (t) { + var n = jf(t); + n >= e && (e = n + +(i && (!n || Xf(t) && !t.noHeader))) + })), e + } + return 0 + } + + function qf(t, e, n, i) { + var r, o = e.noHeader, a = (r = jf(e), {html: Hf[r], richText: Yf[r]}), s = [], l = e.blocks || []; + lt(!l || Y(l)), l = l || []; + var u = t.orderMode; + if (e.sortBlocks && u) { + l = l.slice(); + var h = {valueAsc: "asc", valueDesc: "desc"}; + if (mt(h, u)) { + var c = new vf(h[u], null); + l.sort((function (t, e) { + return c.evaluate(t.sortParam, e.sortParam) + })) + } else "seriesDesc" === u && l.reverse() + } + E(l, (function (n, r) { + var o = e.valueFormatter, l = Zf(n)(o ? A(A({}, t), {valueFormatter: o}) : t, n, r > 0 ? a.html : 0, i); + null != l && s.push(l) + })); + var p = "richText" === t.renderMode ? s.join(a.richText) : Jf(s.join(""), o ? n : a.html); + if (o) return p; + var d = ap(e.header, "ordinal", t.useUTC), f = Wf(i, t.renderMode).nameStyle; + return "richText" === t.renderMode ? Qf(t, d, f) + a.richText + p : Jf('
    ' + op(d) + "
    " + p, n) + } + + function Kf(t, e, n, i) { + var r = t.renderMode, o = e.noName, a = e.noValue, s = !e.markerType, l = e.name, u = t.useUTC, + h = e.valueFormatter || t.valueFormatter || function (t) { + return z(t = Y(t) ? t : [t], (function (t, e) { + return ap(t, Y(d) ? d[e] : d, u) + })) + }; + if (!o || !a) { + var c = s ? "" : t.markupStyleCreator.makeTooltipMarker(e.markerType, e.markerColor || "#333", r), + p = o ? "" : ap(l, "ordinal", u), d = e.valueType, f = a ? [] : h(e.value), g = !s || !o, y = !s && o, + v = Wf(i, r), m = v.nameStyle, x = v.valueStyle; + return "richText" === r ? (s ? "" : c) + (o ? "" : Qf(t, p, m)) + (a ? "" : function (t, e, n, i, r) { + var o = [r], a = i ? 10 : 20; + return n && o.push({ + padding: [0, 0, 0, a], + align: "right" + }), t.markupStyleCreator.wrapRichTextStyle(Y(e) ? e.join(" ") : e, o) + }(t, f, g, y, x)) : Jf((s ? "" : c) + (o ? "" : function (t, e, n) { + return '' + op(t) + "" + }(p, !s, m)) + (a ? "" : function (t, e, n, i) { + var r = n ? "10px" : "20px", o = e ? "float:right;margin-left:" + r : ""; + return t = Y(t) ? t : [t], '' + z(t, (function (t) { + return op(t) + })).join("  ") + "" + }(f, g, y, x)), n) + } + } + + function $f(t, e, n, i, r, o) { + if (t) return Zf(t)({ + useUTC: r, + renderMode: n, + orderMode: i, + markupStyleCreator: e, + valueFormatter: t.valueFormatter + }, t, 0, o) + } + + function Jf(t, e) { + return '
    ' + t + '
    ' + } + + function Qf(t, e, n) { + return t.markupStyleCreator.wrapRichTextStyle(e, n) + } + + function tg(t, e) { + return cp(t.getData().getItemVisual(e, "style")[t.visualDrawType]) + } + + function eg(t, e) { + var n = t.get("padding"); + return null != n ? n : "richText" === e ? [8, 10] : 10 + } + + var ng = function () { + function t() { + this.richTextStyles = {}, this._nextStyleNameId = no() + } + + return t.prototype._generateStyleName = function () { + return "__EC_aUTo_" + this._nextStyleNameId++ + }, t.prototype.makeTooltipMarker = function (t, e, n) { + var i = "richText" === n ? this._generateStyleName() : null, + r = hp({color: e, type: t, renderMode: n, markerId: i}); + return X(r) ? r : (this.richTextStyles[i] = r.style, r.content) + }, t.prototype.wrapRichTextStyle = function (t, e) { + var n = {}; + Y(e) ? E(e, (function (t) { + return A(n, t) + })) : A(n, e); + var i = this._generateStyleName(); + return this.richTextStyles[i] = n, "{" + i + "|" + t + "}" + }, t + }(); + + function ig(t) { + var e, n, i, r, o = t.series, a = t.dataIndex, s = t.multipleSeries, l = o.getData(), + u = l.mapDimensionsAll("defaultedTooltip"), h = u.length, c = o.getRawValue(a), p = Y(c), d = tg(o, a); + if (h > 1 || p && !h) { + var f = function (t, e, n, i, r) { + var o = e.getData(), a = V(t, (function (t, e, n) { + var i = o.getDimensionInfo(n); + return t || i && !1 !== i.tooltip && null != i.displayName + }), !1), s = [], l = [], u = []; + + function h(t, e) { + var n = o.getDimensionInfo(e); + n && !1 !== n.otherDims.tooltip && (a ? u.push(Uf("nameValue", { + markerType: "subItem", + markerColor: r, + name: n.displayName, + value: t, + valueType: n.type + })) : (s.push(t), l.push(n.type))) + } + + return i.length ? E(i, (function (t) { + h(of(o, n, t), t) + })) : E(t, h), {inlineValues: s, inlineValueTypes: l, blocks: u} + }(c, o, a, u, d); + e = f.inlineValues, n = f.inlineValueTypes, i = f.blocks, r = f.inlineValues[0] + } else if (h) { + var g = l.getDimensionInfo(u[0]); + r = e = of(l, a, u[0]), n = g.type + } else r = e = p ? c[0] : c; + var y = _o(o), v = y && o.name || "", m = l.getName(a), x = s ? v : m; + return Uf("section", { + header: v, + noHeader: s || !y, + sortParam: r, + blocks: [Uf("nameValue", { + markerType: "item", + markerColor: d, + name: x, + noName: !ut(x), + value: e, + valueType: n + })].concat(i || []) + }) + } + + var rg = So(); + + function og(t, e) { + return t.getName(e) || t.getId(e) + } + + var ag = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e._selectedDataIndicesMap = {}, e + } + + return n(e, t), e.prototype.init = function (t, e, n) { + this.seriesIndex = this.componentIndex, this.dataTask = uf({ + count: lg, + reset: ug + }), this.dataTask.context = {model: this}, this.mergeDefaultAndTheme(t, n), (rg(this).sourceManager = new Vf(this)).prepareSource(); + var i = this.getInitialData(t, n); + cg(i, this), this.dataTask.context.data = i, rg(this).dataBeforeProcessed = i, sg(this), this._initSelectedMapFromData(i) + }, e.prototype.mergeDefaultAndTheme = function (t, e) { + var n = _p(this), i = n ? wp(t) : {}, r = this.subType; + Ip.hasClass(r) && (r += "Series"), C(t, e.getTheme().get(this.subType)), C(t, this.getDefaultOption()), co(t, "label", ["show"]), this.fillDataTextStyle(t.data), n && bp(t, i, n) + }, e.prototype.mergeOption = function (t, e) { + t = C(this.option, t, !0), this.fillDataTextStyle(t.data); + var n = _p(this); + n && bp(this.option, t, n); + var i = rg(this).sourceManager; + i.dirty(), i.prepareSource(); + var r = this.getInitialData(t, e); + cg(r, this), this.dataTask.dirty(), this.dataTask.context.data = r, rg(this).dataBeforeProcessed = r, sg(this), this._initSelectedMapFromData(r) + }, e.prototype.fillDataTextStyle = function (t) { + if (t && !$(t)) for (var e = ["show"], n = 0; n < t.length; n++) t[n] && t[n].label && co(t[n], "label", e) + }, e.prototype.getInitialData = function (t, e) { + }, e.prototype.appendData = function (t) { + this.getRawData().appendData(t.data) + }, e.prototype.getData = function (t) { + var e = dg(this); + if (e) { + var n = e.context.data; + return null == t ? n : n.getLinkedData(t) + } + return rg(this).data + }, e.prototype.getAllData = function () { + var t = this.getData(); + return t && t.getLinkedDataAll ? t.getLinkedDataAll() : [{data: t}] + }, e.prototype.setData = function (t) { + var e = dg(this); + if (e) { + var n = e.context; + n.outputData = t, e !== this.dataTask && (n.data = t) + } + rg(this).data = t + }, e.prototype.getEncode = function () { + var t = this.get("encode", !0); + if (t) return ft(t) + }, e.prototype.getSourceManager = function () { + return rg(this).sourceManager + }, e.prototype.getSource = function () { + return this.getSourceManager().getSource() + }, e.prototype.getRawData = function () { + return rg(this).dataBeforeProcessed + }, e.prototype.getColorBy = function () { + return this.get("colorBy") || "series" + }, e.prototype.isColorBySeries = function () { + return "series" === this.getColorBy() + }, e.prototype.getBaseAxis = function () { + var t = this.coordinateSystem; + return t && t.getBaseAxis && t.getBaseAxis() + }, e.prototype.formatTooltip = function (t, e, n) { + return ig({series: this, dataIndex: t, multipleSeries: e}) + }, e.prototype.isAnimationEnabled = function () { + var t = this.ecModel; + if (r.node && (!t || !t.ssr)) return !1; + var e = this.getShallow("animation"); + return e && this.getData().count() > this.getShallow("animationThreshold") && (e = !1), !!e + }, e.prototype.restoreData = function () { + this.dataTask.dirty() + }, e.prototype.getColorFromPalette = function (t, e, n) { + var i = this.ecModel, r = Qp.prototype.getColorFromPalette.call(this, t, e, n); + return r || (r = i.getColorFromPalette(t, e, n)), r + }, e.prototype.coordDimToDataDim = function (t) { + return this.getRawData().mapDimensionsAll(t) + }, e.prototype.getProgressive = function () { + return this.get("progressive") + }, e.prototype.getProgressiveThreshold = function () { + return this.get("progressiveThreshold") + }, e.prototype.select = function (t, e) { + this._innerSelect(this.getData(e), t) + }, e.prototype.unselect = function (t, e) { + var n = this.option.selectedMap; + if (n) { + var i = this.option.selectedMode, r = this.getData(e); + if ("series" === i || "all" === n) return this.option.selectedMap = {}, void (this._selectedDataIndicesMap = {}); + for (var o = 0; o < t.length; o++) { + var a = og(r, t[o]); + n[a] = !1, this._selectedDataIndicesMap[a] = -1 + } + } + }, e.prototype.toggleSelect = function (t, e) { + for (var n = [], i = 0; i < t.length; i++) n[0] = t[i], this.isSelected(t[i], e) ? this.unselect(n, e) : this.select(n, e) + }, e.prototype.getSelectedDataIndices = function () { + if ("all" === this.option.selectedMap) return [].slice.call(this.getData().getIndices()); + for (var t = this._selectedDataIndicesMap, e = G(t), n = [], i = 0; i < e.length; i++) { + var r = t[e[i]]; + r >= 0 && n.push(r) + } + return n + }, e.prototype.isSelected = function (t, e) { + var n = this.option.selectedMap; + if (!n) return !1; + var i = this.getData(e); + return ("all" === n || n[og(i, t)]) && !i.getItemModel(t).get(["select", "disabled"]) + }, e.prototype.isUniversalTransitionEnabled = function () { + if (this.__universalTransitionEnabled) return !0; + var t = this.option.universalTransition; + return !!t && (!0 === t || t && t.enabled) + }, e.prototype._innerSelect = function (t, e) { + var n, i, r = this.option, o = r.selectedMode, a = e.length; + if (o && a) if ("series" === o) r.selectedMap = "all"; else if ("multiple" === o) { + q(r.selectedMap) || (r.selectedMap = {}); + for (var s = r.selectedMap, l = 0; l < a; l++) { + var u = e[l]; + s[c = og(t, u)] = !0, this._selectedDataIndicesMap[c] = t.getRawIndex(u) + } + } else if ("single" === o || !0 === o) { + var h = e[a - 1], c = og(t, h); + r.selectedMap = ((n = {})[c] = !0, n), this._selectedDataIndicesMap = ((i = {})[c] = t.getRawIndex(h), i) + } + }, e.prototype._initSelectedMapFromData = function (t) { + if (!this.option.selectedMap) { + var e = []; + t.hasItemOption && t.each((function (n) { + var i = t.getRawDataItem(n); + i && i.selected && e.push(n) + })), e.length > 0 && this._innerSelect(t, e) + } + }, e.registerClass = function (t) { + return Ip.registerClass(t) + }, e.protoInitialize = function () { + var t = e.prototype; + t.type = "series.__base__", t.seriesIndex = 0, t.ignoreStyleOnData = !1, t.hasSymbolVisual = !1, t.defaultSymbol = "circle", t.visualStyleAccessPath = "itemStyle", t.visualDrawType = "fill" + }(), e + }(Ip); + + function sg(t) { + var e = t.name; + _o(t) || (t.name = function (t) { + var e = t.getRawData(), n = e.mapDimensionsAll("seriesName"), i = []; + return E(n, (function (t) { + var n = e.getDimensionInfo(t); + n.displayName && i.push(n.displayName) + })), i.join(" ") + }(t) || e) + } + + function lg(t) { + return t.model.getRawData().count() + } + + function ug(t) { + var e = t.model; + return e.setData(e.getRawData().cloneShallow()), hg + } + + function hg(t, e) { + e.outputData && t.end > e.outputData.count() && e.model.getRawData().cloneShallow(e.outputData) + } + + function cg(t, e) { + E(gt(t.CHANGABLE_METHODS, t.DOWNSAMPLE_METHODS), (function (n) { + t.wrapMethod(n, H(pg, e)) + })) + } + + function pg(t, e) { + var n = dg(t); + return n && n.setOutputEnd((e || this).count()), e + } + + function dg(t) { + var e = (t.ecModel || {}).scheduler, n = e && e.getPipeline(t.uid); + if (n) { + var i = n.currentTask; + if (i) { + var r = i.agentStubMap; + r && (i = r.get(t.uid)) + } + return i + } + } + + R(ag, sf), R(ag, Qp), zo(ag, Ip); + var fg = function () { + function t() { + this.group = new Cr, this.uid = fc("viewComponent") + } + + return t.prototype.init = function (t, e) { + }, t.prototype.render = function (t, e, n, i) { + }, t.prototype.dispose = function (t, e) { + }, t.prototype.updateView = function (t, e, n, i) { + }, t.prototype.updateLayout = function (t, e, n, i) { + }, t.prototype.updateVisual = function (t, e, n, i) { + }, t.prototype.blurSeries = function (t, e) { + }, t.prototype.eachRendered = function (t) { + var e = this.group; + e && e.traverse(t) + }, t + }(); + + function gg() { + var t = So(); + return function (e) { + var n = t(e), i = e.pipelineContext, r = !!n.large, o = !!n.progressiveRender, + a = n.large = !(!i || !i.large), s = n.progressiveRender = !(!i || !i.progressiveRender); + return !(r === a && o === s) && "reset" + } + } + + Eo(fg), Go(fg); + var yg = So(), vg = gg(), mg = function () { + function t() { + this.group = new Cr, this.uid = fc("viewChart"), this.renderTask = uf({ + plan: bg, + reset: wg + }), this.renderTask.context = {view: this} + } + + return t.prototype.init = function (t, e) { + }, t.prototype.render = function (t, e, n, i) { + 0 + }, t.prototype.highlight = function (t, e, n, i) { + var r = t.getData(i && i.dataType); + r && _g(r, i, "emphasis") + }, t.prototype.downplay = function (t, e, n, i) { + var r = t.getData(i && i.dataType); + r && _g(r, i, "normal") + }, t.prototype.remove = function (t, e) { + this.group.removeAll() + }, t.prototype.dispose = function (t, e) { + }, t.prototype.updateView = function (t, e, n, i) { + this.render(t, e, n, i) + }, t.prototype.updateLayout = function (t, e, n, i) { + this.render(t, e, n, i) + }, t.prototype.updateVisual = function (t, e, n, i) { + this.render(t, e, n, i) + }, t.prototype.eachRendered = function (t) { + zh(this.group, t) + }, t.markUpdateMethod = function (t, e) { + yg(t).updateMethod = e + }, t.protoInitialize = void (t.prototype.type = "chart"), t + }(); + + function xg(t, e, n) { + t && Bl(t) && ("emphasis" === e ? xl : _l)(t, n) + } + + function _g(t, e, n) { + var i = wo(t, e), r = e && null != e.highlightKey ? function (t) { + var e = Us[t]; + return null == e && Ys <= 32 && (e = Us[t] = Ys++), e + }(e.highlightKey) : null; + null != i ? E(ho(i), (function (e) { + xg(t.getItemGraphicEl(e), n, r) + })) : t.eachItemGraphicEl((function (t) { + xg(t, n, r) + })) + } + + function bg(t) { + return vg(t.model) + } + + function wg(t) { + var e = t.model, n = t.ecModel, i = t.api, r = t.payload, o = e.pipelineContext.progressiveRender, a = t.view, + s = r && yg(r).updateMethod, l = o ? "incrementalPrepareRender" : s && a[s] ? s : "render"; + return "render" !== l && a[l](e, n, i, r), Sg[l] + } + + Eo(mg), Go(mg); + var Sg = { + incrementalPrepareRender: { + progress: function (t, e) { + e.view.incrementalRender(t, e.model, e.ecModel, e.api, e.payload) + } + }, render: { + forceFirstProgress: !0, progress: function (t, e) { + e.view.render(e.model, e.ecModel, e.api, e.payload) + } + } + }, Mg = "\0__throttleOriginMethod", Ig = "\0__throttleRate", Tg = "\0__throttleType"; + + function Cg(t, e, n) { + var i, r, o, a, s, l = 0, u = 0, h = null; + + function c() { + u = (new Date).getTime(), h = null, t.apply(o, a || []) + } + + e = e || 0; + var p = function () { + for (var t = [], p = 0; p < arguments.length; p++) t[p] = arguments[p]; + i = (new Date).getTime(), o = this, a = t; + var d = s || e, f = s || n; + s = null, r = i - (f ? l : u) - d, clearTimeout(h), f ? h = setTimeout(c, d) : r >= 0 ? c() : h = setTimeout(c, -r), l = i + }; + return p.clear = function () { + h && (clearTimeout(h), h = null) + }, p.debounceNextCall = function (t) { + s = t + }, p + } + + function Dg(t, e, n, i) { + var r = t[e]; + if (r) { + var o = r[Mg] || r, a = r[Tg]; + if (r[Ig] !== n || a !== i) { + if (null == n || !i) return t[e] = o; + (r = t[e] = Cg(o, n, "debounce" === i))[Mg] = o, r[Tg] = i, r[Ig] = n + } + return r + } + } + + function Ag(t, e) { + var n = t[e]; + n && n[Mg] && (n.clear && n.clear(), t[e] = n[Mg]) + } + + var kg = So(), Lg = {itemStyle: Wo(uc, !0), lineStyle: Wo(ac, !0)}, Pg = {lineStyle: "stroke", itemStyle: "fill"}; + + function Og(t, e) { + var n = t.visualStyleMapper || Lg[e]; + return n || (console.warn("Unkown style type '" + e + "'."), Lg.itemStyle) + } + + function Rg(t, e) { + var n = t.visualDrawType || Pg[e]; + return n || (console.warn("Unkown style type '" + e + "'."), "fill") + } + + var Ng = { + createOnAllSeries: !0, performRawSeries: !0, reset: function (t, e) { + var n = t.getData(), i = t.visualStyleAccessPath || "itemStyle", r = t.getModel(i), o = Og(t, i)(r), + a = r.getShallow("decal"); + a && (n.setVisual("decal", a), a.dirty = !0); + var s = Rg(t, i), l = o[s], u = U(l) ? l : null, h = "auto" === o.fill || "auto" === o.stroke; + if (!o[s] || u || h) { + var c = t.getColorFromPalette(t.name, null, e.getSeriesCount()); + o[s] || (o[s] = c, n.setVisual("colorFromPalette", !0)), o.fill = "auto" === o.fill || U(o.fill) ? c : o.fill, o.stroke = "auto" === o.stroke || U(o.stroke) ? c : o.stroke + } + if (n.setVisual("style", o), n.setVisual("drawType", s), !e.isSeriesFiltered(t) && u) return n.setVisual("colorFromPalette", !1), { + dataEach: function (e, n) { + var i = t.getDataParams(n), r = A({}, o); + r[s] = u(i), e.setItemVisual(n, "style", r) + } + } + } + }, Eg = new pc, zg = { + createOnAllSeries: !0, performRawSeries: !0, reset: function (t, e) { + if (!t.ignoreStyleOnData && !e.isSeriesFiltered(t)) { + var n = t.getData(), i = t.visualStyleAccessPath || "itemStyle", r = Og(t, i), + o = n.getVisual("drawType"); + return { + dataEach: n.hasItemOption ? function (t, e) { + var n = t.getRawDataItem(e); + if (n && n[i]) { + Eg.option = n[i]; + var a = r(Eg); + A(t.ensureUniqueItemVisual(e, "style"), a), Eg.option.decal && (t.setItemVisual(e, "decal", Eg.option.decal), Eg.option.decal.dirty = !0), o in a && t.setItemVisual(e, "colorFromPalette", !1) + } + } : null + } + } + } + }, Vg = { + performRawSeries: !0, overallReset: function (t) { + var e = ft(); + t.eachSeries((function (t) { + var n = t.getColorBy(); + if (!t.isColorBySeries()) { + var i = t.type + "-" + n, r = e.get(i); + r || (r = {}, e.set(i, r)), kg(t).scope = r + } + })), t.eachSeries((function (e) { + if (!e.isColorBySeries() && !t.isSeriesFiltered(e)) { + var n = e.getRawData(), i = {}, r = e.getData(), o = kg(e).scope, + a = e.visualStyleAccessPath || "itemStyle", s = Rg(e, a); + r.each((function (t) { + var e = r.getRawIndex(t); + i[e] = t + })), n.each((function (t) { + var a = i[t]; + if (r.getItemVisual(a, "colorFromPalette")) { + var l = r.ensureUniqueItemVisual(a, "style"), u = n.getName(t) || t + "", h = n.count(); + l[s] = e.getColorFromPalette(u, o, h) + } + })) + } + })) + } + }, Bg = Math.PI; + var Fg = function () { + function t(t, e, n, i) { + this._stageTaskMap = ft(), this.ecInstance = t, this.api = e, n = this._dataProcessorHandlers = n.slice(), i = this._visualHandlers = i.slice(), this._allHandlers = n.concat(i) + } + + return t.prototype.restoreData = function (t, e) { + t.restoreData(e), this._stageTaskMap.each((function (t) { + var e = t.overallTask; + e && e.dirty() + })) + }, t.prototype.getPerformArgs = function (t, e) { + if (t.__pipeline) { + var n = this._pipelineMap.get(t.__pipeline.id), i = n.context, + r = !e && n.progressiveEnabled && (!i || i.progressiveRender) && t.__idxInPipeline > n.blockIndex ? n.step : null, + o = i && i.modDataCount; + return {step: r, modBy: null != o ? Math.ceil(o / r) : null, modDataCount: o} + } + }, t.prototype.getPipeline = function (t) { + return this._pipelineMap.get(t) + }, t.prototype.updateStreamModes = function (t, e) { + var n = this._pipelineMap.get(t.uid), i = t.getData().count(), + r = n.progressiveEnabled && e.incrementalPrepareRender && i >= n.threshold, + o = t.get("large") && i >= t.get("largeThreshold"), + a = "mod" === t.get("progressiveChunkMode") ? i : null; + t.pipelineContext = n.context = {progressiveRender: r, modDataCount: a, large: o} + }, t.prototype.restorePipelines = function (t) { + var e = this, n = e._pipelineMap = ft(); + t.eachSeries((function (t) { + var i = t.getProgressive(), r = t.uid; + n.set(r, { + id: r, + head: null, + tail: null, + threshold: t.getProgressiveThreshold(), + progressiveEnabled: i && !(t.preventIncremental && t.preventIncremental()), + blockIndex: -1, + step: Math.round(i || 700), + count: 0 + }), e._pipe(t, t.dataTask) + })) + }, t.prototype.prepareStageTasks = function () { + var t = this._stageTaskMap, e = this.api.getModel(), n = this.api; + E(this._allHandlers, (function (i) { + var r = t.get(i.uid) || t.set(i.uid, {}), o = ""; + lt(!(i.reset && i.overallReset), o), i.reset && this._createSeriesStageTask(i, r, e, n), i.overallReset && this._createOverallStageTask(i, r, e, n) + }), this) + }, t.prototype.prepareView = function (t, e, n, i) { + var r = t.renderTask, o = r.context; + o.model = e, o.ecModel = n, o.api = i, r.__block = !t.incrementalPrepareRender, this._pipe(e, r) + }, t.prototype.performDataProcessorTasks = function (t, e) { + this._performStageTasks(this._dataProcessorHandlers, t, e, {block: !0}) + }, t.prototype.performVisualTasks = function (t, e, n) { + this._performStageTasks(this._visualHandlers, t, e, n) + }, t.prototype._performStageTasks = function (t, e, n, i) { + i = i || {}; + var r = !1, o = this; + + function a(t, e) { + return t.setDirty && (!t.dirtyMap || t.dirtyMap.get(e.__pipeline.id)) + } + + E(t, (function (t, s) { + if (!i.visualType || i.visualType === t.visualType) { + var l = o._stageTaskMap.get(t.uid), u = l.seriesTaskMap, h = l.overallTask; + if (h) { + var c, p = h.agentStubMap; + p.each((function (t) { + a(i, t) && (t.dirty(), c = !0) + })), c && h.dirty(), o.updatePayload(h, n); + var d = o.getPerformArgs(h, i.block); + p.each((function (t) { + t.perform(d) + })), h.perform(d) && (r = !0) + } else u && u.each((function (s, l) { + a(i, s) && s.dirty(); + var u = o.getPerformArgs(s, i.block); + u.skip = !t.performRawSeries && e.isSeriesFiltered(s.context.model), o.updatePayload(s, n), s.perform(u) && (r = !0) + })) + } + })), this.unfinished = r || this.unfinished + }, t.prototype.performSeriesTasks = function (t) { + var e; + t.eachSeries((function (t) { + e = t.dataTask.perform() || e + })), this.unfinished = e || this.unfinished + }, t.prototype.plan = function () { + this._pipelineMap.each((function (t) { + var e = t.tail; + do { + if (e.__block) { + t.blockIndex = e.__idxInPipeline; + break + } + e = e.getUpstream() + } while (e) + })) + }, t.prototype.updatePayload = function (t, e) { + "remain" !== e && (t.context.payload = e) + }, t.prototype._createSeriesStageTask = function (t, e, n, i) { + var r = this, o = e.seriesTaskMap, a = e.seriesTaskMap = ft(), s = t.seriesType, l = t.getTargetSeries; + + function u(e) { + var s = e.uid, l = a.set(s, o && o.get(s) || uf({plan: Ug, reset: Xg, count: qg})); + l.context = { + model: e, + ecModel: n, + api: i, + useClearVisual: t.isVisual && !t.isLayout, + plan: t.plan, + reset: t.reset, + scheduler: r + }, r._pipe(e, l) + } + + t.createOnAllSeries ? n.eachRawSeries(u) : s ? n.eachRawSeriesByType(s, u) : l && l(n, i).each(u) + }, t.prototype._createOverallStageTask = function (t, e, n, i) { + var r = this, o = e.overallTask = e.overallTask || uf({reset: Gg}); + o.context = {ecModel: n, api: i, overallReset: t.overallReset, scheduler: r}; + var a = o.agentStubMap, s = o.agentStubMap = ft(), l = t.seriesType, u = t.getTargetSeries, h = !0, c = !1, + p = ""; + + function d(t) { + var e = t.uid, n = s.set(e, a && a.get(e) || (c = !0, uf({reset: Wg, onDirty: Yg}))); + n.context = {model: t, overallProgress: h}, n.agent = o, n.__block = h, r._pipe(t, n) + } + + lt(!t.createOnAllSeries, p), l ? n.eachRawSeriesByType(l, d) : u ? u(n, i).each(d) : (h = !1, E(n.getSeries(), d)), c && o.dirty() + }, t.prototype._pipe = function (t, e) { + var n = t.uid, i = this._pipelineMap.get(n); + !i.head && (i.head = e), i.tail && i.tail.pipe(e), i.tail = e, e.__idxInPipeline = i.count++, e.__pipeline = i + }, t.wrapStageHandler = function (t, e) { + return U(t) && (t = { + overallReset: t, + seriesType: Kg(t) + }), t.uid = fc("stageHandler"), e && (t.visualType = e), t + }, t + }(); + + function Gg(t) { + t.overallReset(t.ecModel, t.api, t.payload) + } + + function Wg(t) { + return t.overallProgress && Hg + } + + function Hg() { + this.agent.dirty(), this.getDownstream().dirty() + } + + function Yg() { + this.agent && this.agent.dirty() + } + + function Ug(t) { + return t.plan ? t.plan(t.model, t.ecModel, t.api, t.payload) : null + } + + function Xg(t) { + t.useClearVisual && t.data.clearAllVisual(); + var e = t.resetDefines = ho(t.reset(t.model, t.ecModel, t.api, t.payload)); + return e.length > 1 ? z(e, (function (t, e) { + return jg(e) + })) : Zg + } + + var Zg = jg(0); + + function jg(t) { + return function (e, n) { + var i = n.data, r = n.resetDefines[t]; + if (r && r.dataEach) for (var o = e.start; o < e.end; o++) r.dataEach(i, o); else r && r.progress && r.progress(e, i) + } + } + + function qg(t) { + return t.data.count() + } + + function Kg(t) { + $g = null; + try { + t(Jg, Qg) + } catch (t) { + } + return $g + } + + var $g, Jg = {}, Qg = {}; + + function ty(t, e) { + for (var n in e.prototype) t[n] = xt + } + + ty(Jg, nd), ty(Qg, sd), Jg.eachSeriesByType = Jg.eachRawSeriesByType = function (t) { + $g = t + }, Jg.eachComponent = function (t) { + "series" === t.mainType && t.subType && ($g = t.subType) + }; + var ey = ["#37A2DA", "#32C5E9", "#67E0E3", "#9FE6B8", "#FFDB5C", "#ff9f7f", "#fb7293", "#E062AE", "#E690D1", "#e7bcf3", "#9d96f5", "#8378EA", "#96BFFF"], + ny = { + color: ey, + colorLayer: [["#37A2DA", "#ffd85c", "#fd7b5f"], ["#37A2DA", "#67E0E3", "#FFDB5C", "#ff9f7f", "#E062AE", "#9d96f5"], ["#37A2DA", "#32C5E9", "#9FE6B8", "#FFDB5C", "#ff9f7f", "#fb7293", "#e7bcf3", "#8378EA", "#96BFFF"], ey] + }, iy = "#B9B8CE", ry = "#100C2A", oy = function () { + return { + axisLine: {lineStyle: {color: iy}}, + splitLine: {lineStyle: {color: "#484753"}}, + splitArea: {areaStyle: {color: ["rgba(255,255,255,0.02)", "rgba(255,255,255,0.05)"]}}, + minorSplitLine: {lineStyle: {color: "#20203B"}} + } + }, ay = ["#4992ff", "#7cffb2", "#fddd60", "#ff6e76", "#58d9f9", "#05c091", "#ff8a45", "#8d48e3", "#dd79ff"], sy = { + darkMode: !0, + color: ay, + backgroundColor: ry, + axisPointer: {lineStyle: {color: "#817f91"}, crossStyle: {color: "#817f91"}, label: {color: "#fff"}}, + legend: {textStyle: {color: iy}}, + textStyle: {color: iy}, + title: {textStyle: {color: "#EEF1FA"}, subtextStyle: {color: "#B9B8CE"}}, + toolbox: {iconStyle: {borderColor: iy}}, + dataZoom: { + borderColor: "#71708A", + textStyle: {color: iy}, + brushStyle: {color: "rgba(135,163,206,0.3)"}, + handleStyle: {color: "#353450", borderColor: "#C5CBE3"}, + moveHandleStyle: {color: "#B0B6C3", opacity: .3}, + fillerColor: "rgba(135,163,206,0.2)", + emphasis: { + handleStyle: {borderColor: "#91B7F2", color: "#4D587D"}, + moveHandleStyle: {color: "#636D9A", opacity: .7} + }, + dataBackground: {lineStyle: {color: "#71708A", width: 1}, areaStyle: {color: "#71708A"}}, + selectedDataBackground: {lineStyle: {color: "#87A3CE"}, areaStyle: {color: "#87A3CE"}} + }, + visualMap: {textStyle: {color: iy}}, + timeline: {lineStyle: {color: iy}, label: {color: iy}, controlStyle: {color: iy, borderColor: iy}}, + calendar: {itemStyle: {color: ry}, dayLabel: {color: iy}, monthLabel: {color: iy}, yearLabel: {color: iy}}, + timeAxis: oy(), + logAxis: oy(), + valueAxis: oy(), + categoryAxis: oy(), + line: {symbol: "circle"}, + graph: {color: ay}, + gauge: { + title: {color: iy}, + axisLine: {lineStyle: {color: [[1, "rgba(207,212,219,0.2)"]]}}, + axisLabel: {color: iy}, + detail: {color: "#EEF1FA"} + }, + candlestick: {itemStyle: {color: "#f64e56", color0: "#54ea92", borderColor: "#f64e56", borderColor0: "#54ea92"}} + }; + sy.categoryAxis.splitLine.show = !1; + var ly = function () { + function t() { + } + + return t.prototype.normalizeQuery = function (t) { + var e = {}, n = {}, i = {}; + if (X(t)) { + var r = No(t); + e.mainType = r.main || null, e.subType = r.sub || null + } else { + var o = ["Index", "Name", "Id"], a = {name: 1, dataIndex: 1, dataType: 1}; + E(t, (function (t, r) { + for (var s = !1, l = 0; l < o.length; l++) { + var u = o[l], h = r.lastIndexOf(u); + if (h > 0 && h === r.length - u.length) { + var c = r.slice(0, h); + "data" !== c && (e.mainType = c, e[u.toLowerCase()] = t, s = !0) + } + } + a.hasOwnProperty(r) && (n[r] = t, s = !0), s || (i[r] = t) + })) + } + return {cptQuery: e, dataQuery: n, otherQuery: i} + }, t.prototype.filter = function (t, e) { + var n = this.eventInfo; + if (!n) return !0; + var i = n.targetEl, r = n.packedEvent, o = n.model, a = n.view; + if (!o || !a) return !0; + var s = e.cptQuery, l = e.dataQuery; + return u(s, o, "mainType") && u(s, o, "subType") && u(s, o, "index", "componentIndex") && u(s, o, "name") && u(s, o, "id") && u(l, r, "name") && u(l, r, "dataIndex") && u(l, r, "dataType") && (!a.filterForExposedEvent || a.filterForExposedEvent(t, e.otherQuery, i, r)); + + function u(t, e, n, i) { + return null == t[n] || e[i || n] === t[n] + } + }, t.prototype.afterTrigger = function () { + this.eventInfo = null + }, t + }(), uy = ["symbol", "symbolSize", "symbolRotate", "symbolOffset"], hy = uy.concat(["symbolKeepAspect"]), cy = { + createOnAllSeries: !0, performRawSeries: !0, reset: function (t, e) { + var n = t.getData(); + if (t.legendIcon && n.setVisual("legendIcon", t.legendIcon), t.hasSymbolVisual) { + for (var i = {}, r = {}, o = !1, a = 0; a < uy.length; a++) { + var s = uy[a], l = t.get(s); + U(l) ? (o = !0, r[s] = l) : i[s] = l + } + if (i.symbol = i.symbol || t.defaultSymbol, n.setVisual(A({ + legendIcon: t.legendIcon || i.symbol, + symbolKeepAspect: t.get("symbolKeepAspect") + }, i)), !e.isSeriesFiltered(t)) { + var u = G(r); + return { + dataEach: o ? function (e, n) { + for (var i = t.getRawValue(n), o = t.getDataParams(n), a = 0; a < u.length; a++) { + var s = u[a]; + e.setItemVisual(n, s, r[s](i, o)) + } + } : null + } + } + } + } + }, py = { + createOnAllSeries: !0, performRawSeries: !0, reset: function (t, e) { + if (t.hasSymbolVisual && !e.isSeriesFiltered(t)) return { + dataEach: t.getData().hasItemOption ? function (t, e) { + for (var n = t.getItemModel(e), i = 0; i < hy.length; i++) { + var r = hy[i], o = n.getShallow(r, !0); + null != o && t.setItemVisual(e, r, o) + } + } : null + } + } + }; + + function dy(t, e, n) { + switch (n) { + case"color": + return t.getItemVisual(e, "style")[t.getVisual("drawType")]; + case"opacity": + return t.getItemVisual(e, "style").opacity; + case"symbol": + case"symbolSize": + case"liftZ": + return t.getItemVisual(e, n); + default: + 0 + } + } + + function fy(t, e) { + switch (e) { + case"color": + return t.getVisual("style")[t.getVisual("drawType")]; + case"opacity": + return t.getVisual("style").opacity; + case"symbol": + case"symbolSize": + case"liftZ": + return t.getVisual(e); + default: + 0 + } + } + + function gy(t, e, n, i) { + switch (n) { + case"color": + t.ensureUniqueItemVisual(e, "style")[t.getVisual("drawType")] = i, t.setItemVisual(e, "colorFromPalette", !1); + break; + case"opacity": + t.ensureUniqueItemVisual(e, "style").opacity = i; + break; + case"symbol": + case"symbolSize": + case"liftZ": + t.setItemVisual(e, n, i); + break; + default: + 0 + } + } + + function yy(t, e) { + function n(e, n) { + var i = []; + return e.eachComponent({mainType: "series", subType: t, query: n}, (function (t) { + i.push(t.seriesIndex) + })), i + } + + E([[t + "ToggleSelect", "toggleSelect"], [t + "Select", "select"], [t + "UnSelect", "unselect"]], (function (t) { + e(t[0], (function (e, i, r) { + e = A({}, e), r.dispatchAction(A(e, {type: t[1], seriesIndex: n(i, e)})) + })) + })) + } + + function vy(t, e, n, i, r) { + var o = t + e; + n.isSilent(o) || i.eachComponent({mainType: "series", subType: "pie"}, (function (t) { + for (var e = t.seriesIndex, i = t.option.selectedMap, a = r.selected, s = 0; s < a.length; s++) if (a[s].seriesIndex === e) { + var l = t.getData(), u = wo(l, r.fromActionPayload); + n.trigger(o, { + type: o, + seriesId: t.id, + name: Y(u) ? l.getName(u[0]) : l.getName(u), + selected: X(i) ? i : A({}, i) + }) + } + })) + } + + function my(t, e, n) { + for (var i; t && (!e(t) || (i = t, !n));) t = t.__hostTarget || t.parent; + return i + } + + var xy = Math.round(9 * Math.random()), _y = "function" == typeof Object.defineProperty, by = function () { + function t() { + this._id = "__ec_inner_" + xy++ + } + + return t.prototype.get = function (t) { + return this._guard(t)[this._id] + }, t.prototype.set = function (t, e) { + var n = this._guard(t); + return _y ? Object.defineProperty(n, this._id, { + value: e, + enumerable: !1, + configurable: !0 + }) : n[this._id] = e, this + }, t.prototype.delete = function (t) { + return !!this.has(t) && (delete this._guard(t)[this._id], !0) + }, t.prototype.has = function (t) { + return !!this._guard(t)[this._id] + }, t.prototype._guard = function (t) { + if (t !== Object(t)) throw TypeError("Value of WeakMap is not a non-null object."); + return t + }, t + }(), wy = fs.extend({ + type: "triangle", shape: {cx: 0, cy: 0, width: 0, height: 0}, buildPath: function (t, e) { + var n = e.cx, i = e.cy, r = e.width / 2, o = e.height / 2; + t.moveTo(n, i - o), t.lineTo(n + r, i + o), t.lineTo(n - r, i + o), t.closePath() + } + }), Sy = fs.extend({ + type: "diamond", shape: {cx: 0, cy: 0, width: 0, height: 0}, buildPath: function (t, e) { + var n = e.cx, i = e.cy, r = e.width / 2, o = e.height / 2; + t.moveTo(n, i - o), t.lineTo(n + r, i), t.lineTo(n, i + o), t.lineTo(n - r, i), t.closePath() + } + }), My = fs.extend({ + type: "pin", shape: {x: 0, y: 0, width: 0, height: 0}, buildPath: function (t, e) { + var n = e.x, i = e.y, r = e.width / 5 * 3, o = Math.max(r, e.height), a = r / 2, s = a * a / (o - a), + l = i - o + a + s, u = Math.asin(s / a), h = Math.cos(u) * a, c = Math.sin(u), p = Math.cos(u), + d = .6 * a, f = .7 * a; + t.moveTo(n - h, l + s), t.arc(n, l, a, Math.PI - u, 2 * Math.PI + u), t.bezierCurveTo(n + h - c * d, l + s + p * d, n, i - f, n, i), t.bezierCurveTo(n, i - f, n - h + c * d, l + s + p * d, n - h, l + s), t.closePath() + } + }), Iy = fs.extend({ + type: "arrow", shape: {x: 0, y: 0, width: 0, height: 0}, buildPath: function (t, e) { + var n = e.height, i = e.width, r = e.x, o = e.y, a = i / 3 * 2; + t.moveTo(r, o), t.lineTo(r + a, o + n), t.lineTo(r, o + n / 4 * 3), t.lineTo(r - a, o + n), t.lineTo(r, o), t.closePath() + } + }), Ty = { + line: function (t, e, n, i, r) { + r.x1 = t, r.y1 = e + i / 2, r.x2 = t + n, r.y2 = e + i / 2 + }, rect: function (t, e, n, i, r) { + r.x = t, r.y = e, r.width = n, r.height = i + }, roundRect: function (t, e, n, i, r) { + r.x = t, r.y = e, r.width = n, r.height = i, r.r = Math.min(n, i) / 4 + }, square: function (t, e, n, i, r) { + var o = Math.min(n, i); + r.x = t, r.y = e, r.width = o, r.height = o + }, circle: function (t, e, n, i, r) { + r.cx = t + n / 2, r.cy = e + i / 2, r.r = Math.min(n, i) / 2 + }, diamond: function (t, e, n, i, r) { + r.cx = t + n / 2, r.cy = e + i / 2, r.width = n, r.height = i + }, pin: function (t, e, n, i, r) { + r.x = t + n / 2, r.y = e + i / 2, r.width = n, r.height = i + }, arrow: function (t, e, n, i, r) { + r.x = t + n / 2, r.y = e + i / 2, r.width = n, r.height = i + }, triangle: function (t, e, n, i, r) { + r.cx = t + n / 2, r.cy = e + i / 2, r.width = n, r.height = i + } + }, Cy = {}; + E({ + line: Eu, + rect: Ts, + roundRect: Ts, + square: Ts, + circle: uu, + diamond: Sy, + pin: My, + arrow: Iy, + triangle: wy + }, (function (t, e) { + Cy[e] = new t + })); + var Dy = fs.extend({ + type: "symbol", + shape: {symbolType: "", x: 0, y: 0, width: 0, height: 0}, + calculateTextPosition: function (t, e, n) { + var i = yr(t, e, n), r = this.shape; + return r && "pin" === r.symbolType && "inside" === e.position && (i.y = n.y + .4 * n.height), i + }, + buildPath: function (t, e, n) { + var i = e.symbolType; + if ("none" !== i) { + var r = Cy[i]; + r || (r = Cy[i = "rect"]), Ty[i](e.x, e.y, e.width, e.height, r.shape), r.buildPath(t, r.shape, n) + } + } + }); + + function Ay(t, e) { + if ("image" !== this.type) { + var n = this.style; + this.__isEmptyBrush ? (n.stroke = t, n.fill = e || "#fff", n.lineWidth = 2) : "line" === this.shape.symbolType ? n.stroke = t : n.fill = t, this.markRedraw() + } + } + + function ky(t, e, n, i, r, o, a) { + var s, l = 0 === t.indexOf("empty"); + return l && (t = t.substr(5, 1).toLowerCase() + t.substr(6)), (s = 0 === t.indexOf("image://") ? xh(t.slice(8), new sr(e, n, i, r), a ? "center" : "cover") : 0 === t.indexOf("path://") ? mh(t.slice(7), {}, new sr(e, n, i, r), a ? "center" : "cover") : new Dy({ + shape: { + symbolType: t, + x: e, + y: n, + width: i, + height: r + } + })).__isEmptyBrush = l, s.setColor = Ay, o && s.setColor(o), s + } + + function Ly(t) { + return Y(t) || (t = [+t, +t]), [t[0] || 0, t[1] || 0] + } + + function Py(t, e) { + if (null != t) return Y(t) || (t = [t, t]), [Er(t[0], e[0]) || 0, Er(rt(t[1], t[0]), e[1]) || 0] + } + + function Oy(t, e, n) { + for (var i = "radial" === e.type ? function (t, e, n) { + var i = n.width, r = n.height, o = Math.min(i, r), a = null == e.x ? .5 : e.x, s = null == e.y ? .5 : e.y, + l = null == e.r ? .5 : e.r; + return e.global || (a = a * i + n.x, s = s * r + n.y, l *= o), t.createRadialGradient(a, s, 0, a, s, l) + }(t, e, n) : function (t, e, n) { + var i = null == e.x ? 0 : e.x, r = null == e.x2 ? 1 : e.x2, o = null == e.y ? 0 : e.y, + a = null == e.y2 ? 0 : e.y2; + return e.global || (i = i * n.width + n.x, r = r * n.width + n.x, o = o * n.height + n.y, a = a * n.height + n.y), i = isNaN(i) ? 0 : i, r = isNaN(r) ? 1 : r, o = isNaN(o) ? 0 : o, a = isNaN(a) ? 0 : a, t.createLinearGradient(i, o, r, a) + }(t, e, n), r = e.colorStops, o = 0; o < r.length; o++) i.addColorStop(r[o].offset, r[o].color); + return i + } + + function Ry(t) { + return parseInt(t, 10) + } + + function Ny(t, e, n) { + var i = ["width", "height"][e], r = ["clientWidth", "clientHeight"][e], o = ["paddingLeft", "paddingTop"][e], + a = ["paddingRight", "paddingBottom"][e]; + if (null != n[i] && "auto" !== n[i]) return parseFloat(n[i]); + var s = document.defaultView.getComputedStyle(t); + return (t[r] || Ry(s[i]) || Ry(t.style[i])) - (Ry(s[o]) || 0) - (Ry(s[a]) || 0) | 0 + } + + function Ey(t) { + var e, n, i = t.style, + r = i.lineDash && i.lineWidth > 0 && (e = i.lineDash, n = i.lineWidth, e && "solid" !== e && n > 0 ? "dashed" === e ? [4 * n, 2 * n] : "dotted" === e ? [n] : j(e) ? [e] : Y(e) ? e : null : null), + o = i.lineDashOffset; + if (r) { + var a = i.strokeNoScale && t.getLineScale ? t.getLineScale() : 1; + a && 1 !== a && (r = z(r, (function (t) { + return t / a + })), o /= a) + } + return [r, o] + } + + var zy = new ja(!0); + + function Vy(t) { + var e = t.stroke; + return !(null == e || "none" === e || !(t.lineWidth > 0)) + } + + function By(t) { + return "string" == typeof t && "none" !== t + } + + function Fy(t) { + var e = t.fill; + return null != e && "none" !== e + } + + function Gy(t, e) { + if (null != e.fillOpacity && 1 !== e.fillOpacity) { + var n = t.globalAlpha; + t.globalAlpha = e.fillOpacity * e.opacity, t.fill(), t.globalAlpha = n + } else t.fill() + } + + function Wy(t, e) { + if (null != e.strokeOpacity && 1 !== e.strokeOpacity) { + var n = t.globalAlpha; + t.globalAlpha = e.strokeOpacity * e.opacity, t.stroke(), t.globalAlpha = n + } else t.stroke() + } + + function Hy(t, e, n) { + var i = Zo(e.image, e.__image, n); + if (qo(i)) { + var r = t.createPattern(i, e.repeat || "repeat"); + if ("function" == typeof DOMMatrix && r && r.setTransform) { + var o = new DOMMatrix; + o.translateSelf(e.x || 0, e.y || 0), o.rotateSelf(0, 0, (e.rotation || 0) * _t), o.scaleSelf(e.scaleX || 1, e.scaleY || 1), r.setTransform(o) + } + return r + } + } + + var Yy = ["shadowBlur", "shadowOffsetX", "shadowOffsetY"], + Uy = [["lineCap", "butt"], ["lineJoin", "miter"], ["miterLimit", 10]]; + + function Xy(t, e, n, i, r) { + var o = !1; + if (!i && e === (n = n || {})) return !1; + if (i || e.opacity !== n.opacity) { + qy(t, r), o = !0; + var a = Math.max(Math.min(e.opacity, 1), 0); + t.globalAlpha = isNaN(a) ? ua.opacity : a + } + (i || e.blend !== n.blend) && (o || (qy(t, r), o = !0), t.globalCompositeOperation = e.blend || ua.blend); + for (var s = 0; s < Yy.length; s++) { + var l = Yy[s]; + (i || e[l] !== n[l]) && (o || (qy(t, r), o = !0), t[l] = t.dpr * (e[l] || 0)) + } + return (i || e.shadowColor !== n.shadowColor) && (o || (qy(t, r), o = !0), t.shadowColor = e.shadowColor || ua.shadowColor), o + } + + function Zy(t, e, n, i, r) { + var o = Ky(e, r.inHover), a = i ? null : n && Ky(n, r.inHover) || {}; + if (o === a) return !1; + var s = Xy(t, o, a, i, r); + if ((i || o.fill !== a.fill) && (s || (qy(t, r), s = !0), By(o.fill) && (t.fillStyle = o.fill)), (i || o.stroke !== a.stroke) && (s || (qy(t, r), s = !0), By(o.stroke) && (t.strokeStyle = o.stroke)), (i || o.opacity !== a.opacity) && (s || (qy(t, r), s = !0), t.globalAlpha = null == o.opacity ? 1 : o.opacity), e.hasStroke()) { + var l = o.lineWidth / (o.strokeNoScale && e.getLineScale ? e.getLineScale() : 1); + t.lineWidth !== l && (s || (qy(t, r), s = !0), t.lineWidth = l) + } + for (var u = 0; u < Uy.length; u++) { + var h = Uy[u], c = h[0]; + (i || o[c] !== a[c]) && (s || (qy(t, r), s = !0), t[c] = o[c] || h[1]) + } + return s + } + + function jy(t, e) { + var n = e.transform, i = t.dpr || 1; + n ? t.setTransform(i * n[0], i * n[1], i * n[2], i * n[3], i * n[4], i * n[5]) : t.setTransform(i, 0, 0, i, 0, 0) + } + + function qy(t, e) { + e.batchFill && t.fill(), e.batchStroke && t.stroke(), e.batchFill = "", e.batchStroke = "" + } + + function Ky(t, e) { + return e && t.__hoverStyle || t.style + } + + function $y(t, e) { + Jy(t, e, {inHover: !1, viewWidth: 0, viewHeight: 0}, !0) + } + + function Jy(t, e, n, i) { + var r = e.transform; + if (!e.shouldBePainted(n.viewWidth, n.viewHeight, !1, !1)) return e.__dirty &= -2, void (e.__isRendered = !1); + var o = e.__clipPaths, s = n.prevElClipPaths, l = !1, u = !1; + if (s && !function (t, e) { + if (t === e || !t && !e) return !1; + if (!t || !e || t.length !== e.length) return !0; + for (var n = 0; n < t.length; n++) if (t[n] !== e[n]) return !0; + return !1 + }(o, s) || (s && s.length && (qy(t, n), t.restore(), u = l = !0, n.prevElClipPaths = null, n.allClipped = !1, n.prevEl = null), o && o.length && (qy(t, n), t.save(), function (t, e, n) { + for (var i = !1, r = 0; r < t.length; r++) { + var o = t[r]; + i = i || o.isZeroArea(), jy(e, o), e.beginPath(), o.buildPath(e, o.shape), e.clip() + } + n.allClipped = i + }(o, t, n), l = !0), n.prevElClipPaths = o), n.allClipped) e.__isRendered = !1; else { + e.beforeBrush && e.beforeBrush(), e.innerBeforeBrush(); + var h = n.prevEl; + h || (u = l = !0); + var c, p, d = e instanceof fs && e.autoBatch && function (t) { + var e = Fy(t), n = Vy(t); + return !(t.lineDash || !(+e ^ +n) || e && "string" != typeof t.fill || n && "string" != typeof t.stroke || t.strokePercent < 1 || t.strokeOpacity < 1 || t.fillOpacity < 1) + }(e.style); + l || (c = r, p = h.transform, c && p ? c[0] !== p[0] || c[1] !== p[1] || c[2] !== p[2] || c[3] !== p[3] || c[4] !== p[4] || c[5] !== p[5] : c || p) ? (qy(t, n), jy(t, e)) : d || qy(t, n); + var f = Ky(e, n.inHover); + e instanceof fs ? (1 !== n.lastDrawType && (u = !0, n.lastDrawType = 1), Zy(t, e, h, u, n), d && (n.batchFill || n.batchStroke) || t.beginPath(), function (t, e, n, i) { + var r, o = Vy(n), a = Fy(n), s = n.strokePercent, l = s < 1, u = !e.path; + e.silent && !l || !u || e.createPathProxy(); + var h = e.path || zy, c = e.__dirty; + if (!i) { + var p = n.fill, d = n.stroke, f = a && !!p.colorStops, g = o && !!d.colorStops, y = a && !!p.image, + v = o && !!d.image, m = void 0, x = void 0, _ = void 0, b = void 0, w = void 0; + (f || g) && (w = e.getBoundingRect()), f && (m = c ? Oy(t, p, w) : e.__canvasFillGradient, e.__canvasFillGradient = m), g && (x = c ? Oy(t, d, w) : e.__canvasStrokeGradient, e.__canvasStrokeGradient = x), y && (_ = c || !e.__canvasFillPattern ? Hy(t, p, e) : e.__canvasFillPattern, e.__canvasFillPattern = _), v && (b = c || !e.__canvasStrokePattern ? Hy(t, d, e) : e.__canvasStrokePattern, e.__canvasStrokePattern = _), f ? t.fillStyle = m : y && (_ ? t.fillStyle = _ : a = !1), g ? t.strokeStyle = x : v && (b ? t.strokeStyle = b : o = !1) + } + var S, M, I = e.getGlobalScale(); + h.setScale(I[0], I[1], e.segmentIgnoreThreshold), t.setLineDash && n.lineDash && (S = (r = Ey(e))[0], M = r[1]); + var T = !0; + (u || 4 & c) && (h.setDPR(t.dpr), l ? h.setContext(null) : (h.setContext(t), T = !1), h.reset(), e.buildPath(h, e.shape, i), h.toStatic(), e.pathUpdated()), T && h.rebuildPath(t, l ? s : 1), S && (t.setLineDash(S), t.lineDashOffset = M), i || (n.strokeFirst ? (o && Wy(t, n), a && Gy(t, n)) : (a && Gy(t, n), o && Wy(t, n))), S && t.setLineDash([]) + }(t, e, f, d), d && (n.batchFill = f.fill || "", n.batchStroke = f.stroke || "")) : e instanceof ys ? (3 !== n.lastDrawType && (u = !0, n.lastDrawType = 3), Zy(t, e, h, u, n), function (t, e, n) { + var i, r = n.text; + if (null != r && (r += ""), r) { + t.font = n.font || a, t.textAlign = n.textAlign, t.textBaseline = n.textBaseline; + var o = void 0, s = void 0; + t.setLineDash && n.lineDash && (o = (i = Ey(e))[0], s = i[1]), o && (t.setLineDash(o), t.lineDashOffset = s), n.strokeFirst ? (Vy(n) && t.strokeText(r, n.x, n.y), Fy(n) && t.fillText(r, n.x, n.y)) : (Fy(n) && t.fillText(r, n.x, n.y), Vy(n) && t.strokeText(r, n.x, n.y)), o && t.setLineDash([]) + } + }(t, e, f)) : e instanceof xs ? (2 !== n.lastDrawType && (u = !0, n.lastDrawType = 2), function (t, e, n, i, r) { + Xy(t, Ky(e, r.inHover), n && Ky(n, r.inHover), i, r) + }(t, e, h, u, n), function (t, e, n) { + var i = e.__image = Zo(n.image, e.__image, e, e.onload); + if (i && qo(i)) { + var r = n.x || 0, o = n.y || 0, a = e.getWidth(), s = e.getHeight(), l = i.width / i.height; + if (null == a && null != s ? a = s * l : null == s && null != a ? s = a / l : null == a && null == s && (a = i.width, s = i.height), n.sWidth && n.sHeight) { + var u = n.sx || 0, h = n.sy || 0; + t.drawImage(i, u, h, n.sWidth, n.sHeight, r, o, a, s) + } else if (n.sx && n.sy) { + var c = a - (u = n.sx), p = s - (h = n.sy); + t.drawImage(i, u, h, c, p, r, o, a, s) + } else t.drawImage(i, r, o, a, s) + } + }(t, e, f)) : e.getTemporalDisplayables && (4 !== n.lastDrawType && (u = !0, n.lastDrawType = 4), function (t, e, n) { + var i = e.getDisplayables(), r = e.getTemporalDisplayables(); + t.save(); + var o, a, s = { + prevElClipPaths: null, + prevEl: null, + allClipped: !1, + viewWidth: n.viewWidth, + viewHeight: n.viewHeight, + inHover: n.inHover + }; + for (o = e.getCursor(), a = i.length; o < a; o++) { + (h = i[o]).beforeBrush && h.beforeBrush(), h.innerBeforeBrush(), Jy(t, h, s, o === a - 1), h.innerAfterBrush(), h.afterBrush && h.afterBrush(), s.prevEl = h + } + for (var l = 0, u = r.length; l < u; l++) { + var h; + (h = r[l]).beforeBrush && h.beforeBrush(), h.innerBeforeBrush(), Jy(t, h, s, l === u - 1), h.innerAfterBrush(), h.afterBrush && h.afterBrush(), s.prevEl = h + } + e.clearTemporalDisplayables(), e.notClear = !0, t.restore() + }(t, e, n)), d && i && qy(t, n), e.innerAfterBrush(), e.afterBrush && e.afterBrush(), n.prevEl = e, e.__dirty = 0, e.__isRendered = !0 + } + } + + var Qy = new by, tv = new ln(100), + ev = ["symbol", "symbolSize", "symbolKeepAspect", "color", "backgroundColor", "dashArrayX", "dashArrayY", "maxTileWidth", "maxTileHeight"]; + + function nv(t, e) { + if ("none" === t) return null; + var n = e.getDevicePixelRatio(), i = e.getZr(), r = "svg" === i.painter.type; + t.dirty && Qy.delete(t); + var o = Qy.get(t); + if (o) return o; + var a = k(t, { + symbol: "rect", + symbolSize: 1, + symbolKeepAspect: !0, + color: "rgba(0, 0, 0, 0.2)", + backgroundColor: null, + dashArrayX: 5, + dashArrayY: 5, + rotation: 0, + maxTileWidth: 512, + maxTileHeight: 512 + }); + "none" === a.backgroundColor && (a.backgroundColor = null); + var s = {repeat: "repeat"}; + return function (t) { + for (var e, o = [n], s = !0, l = 0; l < ev.length; ++l) { + var u = a[ev[l]]; + if (null != u && !Y(u) && !X(u) && !j(u) && "boolean" != typeof u) { + s = !1; + break + } + o.push(u) + } + if (s) { + e = o.join(",") + (r ? "-svg" : ""); + var c = tv.get(e); + c && (r ? t.svgElement = c : t.image = c) + } + var p, d = rv(a.dashArrayX), f = function (t) { + if (!t || "object" == typeof t && 0 === t.length) return [0, 0]; + if (j(t)) { + var e = Math.ceil(t); + return [e, e] + } + var n = z(t, (function (t) { + return Math.ceil(t) + })); + return t.length % 2 ? n.concat(n) : n + }(a.dashArrayY), g = iv(a.symbol), y = (b = d, z(b, (function (t) { + return ov(t) + }))), v = ov(f), m = !r && h.createCanvas(), x = r && {tag: "g", attrs: {}, key: "dcl", children: []}, + _ = function () { + for (var t = 1, e = 0, n = y.length; e < n; ++e) t = ro(t, y[e]); + var i = 1; + for (e = 0, n = g.length; e < n; ++e) i = ro(i, g[e].length); + t *= i; + var r = v * y.length * g.length; + return { + width: Math.max(1, Math.min(t, a.maxTileWidth)), + height: Math.max(1, Math.min(r, a.maxTileHeight)) + } + }(); + var b; + m && (m.width = _.width * n, m.height = _.height * n, p = m.getContext("2d")); + (function () { + p && (p.clearRect(0, 0, m.width, m.height), a.backgroundColor && (p.fillStyle = a.backgroundColor, p.fillRect(0, 0, m.width, m.height))); + for (var t = 0, e = 0; e < f.length; ++e) t += f[e]; + if (t <= 0) return; + var o = -v, s = 0, l = 0, u = 0; + for (; o < _.height;) { + if (s % 2 == 0) { + for (var h = l / 2 % g.length, c = 0, y = 0, b = 0; c < 2 * _.width;) { + var w = 0; + for (e = 0; e < d[u].length; ++e) w += d[u][e]; + if (w <= 0) break; + if (y % 2 == 0) { + var S = .5 * (1 - a.symbolSize), M = c + d[u][y] * S, I = o + f[s] * S, + T = d[u][y] * a.symbolSize, C = f[s] * a.symbolSize, D = b / 2 % g[h].length; + A(M, I, T, C, g[h][D]) + } + c += d[u][y], ++b, ++y === d[u].length && (y = 0) + } + ++u === d.length && (u = 0) + } + o += f[s], ++l, ++s === f.length && (s = 0) + } + + function A(t, e, o, s, l) { + var u = r ? 1 : n, h = ky(l, t * u, e * u, o * u, s * u, a.color, a.symbolKeepAspect); + if (r) { + var c = i.painter.renderOneToVNode(h); + c && x.children.push(c) + } else $y(p, h) + } + })(), s && tv.put(e, m || x); + t.image = m, t.svgElement = x, t.svgWidth = _.width, t.svgHeight = _.height + }(s), s.rotation = a.rotation, s.scaleX = s.scaleY = r ? 1 : 1 / n, Qy.set(t, s), t.dirty = !1, s + } + + function iv(t) { + if (!t || 0 === t.length) return [["rect"]]; + if (X(t)) return [[t]]; + for (var e = !0, n = 0; n < t.length; ++n) if (!X(t[n])) { + e = !1; + break + } + if (e) return iv([t]); + var i = []; + for (n = 0; n < t.length; ++n) X(t[n]) ? i.push([t[n]]) : i.push(t[n]); + return i + } + + function rv(t) { + if (!t || 0 === t.length) return [[0, 0]]; + if (j(t)) return [[r = Math.ceil(t), r]]; + for (var e = !0, n = 0; n < t.length; ++n) if (!j(t[n])) { + e = !1; + break + } + if (e) return rv([t]); + var i = []; + for (n = 0; n < t.length; ++n) if (j(t[n])) { + var r = Math.ceil(t[n]); + i.push([r, r]) + } else { + (r = z(t[n], (function (t) { + return Math.ceil(t) + }))).length % 2 == 1 ? i.push(r.concat(r)) : i.push(r) + } + return i + } + + function ov(t) { + for (var e = 0, n = 0; n < t.length; ++n) e += t[n]; + return t.length % 2 == 1 ? 2 * e : e + } + + var av = new Xt, sv = {}; + + function lv(t) { + return sv[t] + } + + var uv = "undefined" != typeof window, hv = 2e3, cv = 4500, pv = { + PROCESSOR: {FILTER: 1e3, SERIES_FILTER: 800, STATISTIC: 5e3}, + VISUAL: { + LAYOUT: 1e3, + PROGRESSIVE_LAYOUT: 1100, + GLOBAL: hv, + CHART: 3e3, + POST_CHART_LAYOUT: 4600, + COMPONENT: 4e3, + BRUSH: 5e3, + CHART_ITEM: cv, + ARIA: 6e3, + DECAL: 7e3 + } + }, dv = /^[a-zA-Z0-9_]+$/, fv = "__connectUpdateStatus"; + + function gv(t) { + return function () { + for (var e = [], n = 0; n < arguments.length; n++) e[n] = arguments[n]; + if (!this.isDisposed()) return vv(this, t, e); + Gv(this.id) + } + } + + function yv(t) { + return function () { + for (var e = [], n = 0; n < arguments.length; n++) e[n] = arguments[n]; + return vv(this, t, e) + } + } + + function vv(t, e, n) { + return n[0] = n[0] && n[0].toLowerCase(), Xt.prototype[e].apply(t, n) + } + + var mv, xv, _v, bv, wv, Sv, Mv, Iv, Tv, Cv, Dv, Av, kv, Lv, Pv, Ov, Rv, Nv, Ev = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e + }(Xt), zv = Ev.prototype; + zv.on = yv("on"), zv.off = yv("off"); + var Vv = function (t) { + function e(e, n, i) { + var r = t.call(this, new ly) || this; + r._chartsViews = [], r._chartsMap = {}, r._componentsViews = [], r._componentsMap = {}, r._pendingActions = [], i = i || {}, X(n) && (n = Zv[n]), r._dom = e; + var o = "canvas", a = !1, s = r._zr = Lr(e, { + renderer: i.renderer || o, + devicePixelRatio: i.devicePixelRatio, + width: i.width, + height: i.height, + ssr: i.ssr, + useDirtyRect: null == i.useDirtyRect ? a : i.useDirtyRect + }); + r._ssr = i.ssr, r._throttledZrFlush = Cg(W(s.flush, s), 17), (n = T(n)) && Pd(n, !0), r._theme = n, r._locale = function (t) { + if (X(t)) { + var e = xc[t.toUpperCase()] || {}; + return t === yc || t === vc ? T(e) : C(T(e), T(xc.EN), !1) + } + return C(T(t), T(xc.EN), !1) + }(i.locale || bc), r._coordSysMgr = new ud; + var l = r._api = Pv(r); + + function u(t, e) { + return t.__prio - e.__prio + } + + return Ie(Xv, u), Ie(Yv, u), r._scheduler = new Fg(r, l, Yv, Xv), r._messageCenter = new Ev, r._initEvents(), r.resize = W(r.resize, r), s.animation.on("frame", r._onframe, r), Cv(s, r), Dv(s, r), ct(r), r + } + + return n(e, t), e.prototype._onframe = function () { + if (!this._disposed) { + Nv(this); + var t = this._scheduler; + if (this.__pendingUpdate) { + var e = this.__pendingUpdate.silent; + this.__flagInMainProcess = !0; + try { + mv(this), bv.update.call(this, null, this.__pendingUpdate.updateParams) + } catch (t) { + throw this.__flagInMainProcess = !1, this.__pendingUpdate = null, t + } + this._zr.flush(), this.__flagInMainProcess = !1, this.__pendingUpdate = null, Iv.call(this, e), Tv.call(this, e) + } else if (t.unfinished) { + var n = 1, i = this._model, r = this._api; + t.unfinished = !1; + do { + var o = +new Date; + t.performSeriesTasks(i), t.performDataProcessorTasks(i), Sv(this, i), t.performVisualTasks(i), Lv(this, this._model, r, "remain", {}), n -= +new Date - o + } while (n > 0 && t.unfinished); + t.unfinished || this._zr.flush() + } + } + }, e.prototype.getDom = function () { + return this._dom + }, e.prototype.getId = function () { + return this.id + }, e.prototype.getZr = function () { + return this._zr + }, e.prototype.isSSR = function () { + return this._ssr + }, e.prototype.setOption = function (t, e, n) { + if (!this.__flagInMainProcess) if (this._disposed) Gv(this.id); else { + var i, r, o; + if (q(e) && (n = e.lazyUpdate, i = e.silent, r = e.replaceMerge, o = e.transition, e = e.notMerge), this.__flagInMainProcess = !0, !this._model || e) { + var a = new cd(this._api), s = this._theme, l = this._model = new nd; + l.scheduler = this._scheduler, l.ssr = this._ssr, l.init(null, null, null, s, this._locale, a) + } + this._model.setOption(t, {replaceMerge: r}, Uv); + var u = {seriesTransition: o, optionChanged: !0}; + if (n) this.__pendingUpdate = { + silent: i, + updateParams: u + }, this.__flagInMainProcess = !1, this.getZr().wakeUp(); else { + try { + mv(this), bv.update.call(this, null, u) + } catch (t) { + throw this.__pendingUpdate = null, this.__flagInMainProcess = !1, t + } + this._ssr || this._zr.flush(), this.__pendingUpdate = null, this.__flagInMainProcess = !1, Iv.call(this, i), Tv.call(this, i) + } + } + }, e.prototype.setTheme = function () { + oo() + }, e.prototype.getModel = function () { + return this._model + }, e.prototype.getOption = function () { + return this._model && this._model.getOption() + }, e.prototype.getWidth = function () { + return this._zr.getWidth() + }, e.prototype.getHeight = function () { + return this._zr.getHeight() + }, e.prototype.getDevicePixelRatio = function () { + return this._zr.painter.dpr || uv && window.devicePixelRatio || 1 + }, e.prototype.getRenderedCanvas = function (t) { + return this.renderToCanvas(t) + }, e.prototype.renderToCanvas = function (t) { + t = t || {}; + var e = this._zr.painter; + return e.getRenderedCanvas({ + backgroundColor: t.backgroundColor || this._model.get("backgroundColor"), + pixelRatio: t.pixelRatio || this.getDevicePixelRatio() + }) + }, e.prototype.renderToSVGString = function (t) { + t = t || {}; + var e = this._zr.painter; + return e.renderToString({useViewBox: t.useViewBox}) + }, e.prototype.getSvgDataURL = function () { + if (r.svgSupported) { + var t = this._zr; + return E(t.storage.getDisplayList(), (function (t) { + t.stopAnimation(null, !0) + })), t.painter.toDataURL() + } + }, e.prototype.getDataURL = function (t) { + if (!this._disposed) { + var e = (t = t || {}).excludeComponents, n = this._model, i = [], r = this; + E(e, (function (t) { + n.eachComponent({mainType: t}, (function (t) { + var e = r._componentsMap[t.__viewId]; + e.group.ignore || (i.push(e), e.group.ignore = !0) + })) + })); + var o = "svg" === this._zr.painter.getType() ? this.getSvgDataURL() : this.renderToCanvas(t).toDataURL("image/" + (t && t.type || "png")); + return E(i, (function (t) { + t.group.ignore = !1 + })), o + } + Gv(this.id) + }, e.prototype.getConnectedDataURL = function (t) { + if (!this._disposed) { + var e = "svg" === t.type, n = this.group, i = Math.min, r = Math.max, o = 1 / 0; + if (Kv[n]) { + var a = o, s = o, l = -1 / 0, u = -1 / 0, c = [], + p = t && t.pixelRatio || this.getDevicePixelRatio(); + E(qv, (function (o, h) { + if (o.group === n) { + var p = e ? o.getZr().painter.getSvgDom().innerHTML : o.renderToCanvas(T(t)), + d = o.getDom().getBoundingClientRect(); + a = i(d.left, a), s = i(d.top, s), l = r(d.right, l), u = r(d.bottom, u), c.push({ + dom: p, + left: d.left, + top: d.top + }) + } + })); + var d = (l *= p) - (a *= p), f = (u *= p) - (s *= p), g = h.createCanvas(), + y = Lr(g, {renderer: e ? "svg" : "canvas"}); + if (y.resize({width: d, height: f}), e) { + var v = ""; + return E(c, (function (t) { + var e = t.left - a, n = t.top - s; + v += '' + t.dom + "" + })), y.painter.getSvgRoot().innerHTML = v, t.connectedBackgroundColor && y.painter.setBackgroundColor(t.connectedBackgroundColor), y.refreshImmediately(), y.painter.toDataURL() + } + return t.connectedBackgroundColor && y.add(new Ts({ + shape: {x: 0, y: 0, width: d, height: f}, + style: {fill: t.connectedBackgroundColor} + })), E(c, (function (t) { + var e = new xs({style: {x: t.left * p - a, y: t.top * p - s, image: t.dom}}); + y.add(e) + })), y.refreshImmediately(), g.toDataURL("image/" + (t && t.type || "png")) + } + return this.getDataURL(t) + } + Gv(this.id) + }, e.prototype.convertToPixel = function (t, e) { + return wv(this, "convertToPixel", t, e) + }, e.prototype.convertFromPixel = function (t, e) { + return wv(this, "convertFromPixel", t, e) + }, e.prototype.containPixel = function (t, e) { + var n; + if (!this._disposed) return E(Io(this._model, t), (function (t, i) { + i.indexOf("Models") >= 0 && E(t, (function (t) { + var r = t.coordinateSystem; + if (r && r.containPoint) n = n || !!r.containPoint(e); else if ("seriesModels" === i) { + var o = this._chartsMap[t.__viewId]; + o && o.containPoint && (n = n || o.containPoint(e, t)) + } else 0 + }), this) + }), this), !!n; + Gv(this.id) + }, e.prototype.getVisual = function (t, e) { + var n = Io(this._model, t, {defaultMainType: "series"}), i = n.seriesModel; + var r = i.getData(), + o = n.hasOwnProperty("dataIndexInside") ? n.dataIndexInside : n.hasOwnProperty("dataIndex") ? r.indexOfRawIndex(n.dataIndex) : null; + return null != o ? dy(r, o, e) : fy(r, e) + }, e.prototype.getViewOfComponentModel = function (t) { + return this._componentsMap[t.__viewId] + }, e.prototype.getViewOfSeriesModel = function (t) { + return this._chartsMap[t.__viewId] + }, e.prototype._initEvents = function () { + var t, e, n, i = this; + E(Fv, (function (t) { + var e = function (e) { + var n, r = i.getModel(), o = e.target, a = "globalout" === t; + if (a ? n = {} : o && my(o, (function (t) { + var e = Ws(t); + if (e && null != e.dataIndex) { + var i = e.dataModel || r.getSeriesByIndex(e.seriesIndex); + return n = i && i.getDataParams(e.dataIndex, e.dataType) || {}, !0 + } + if (e.eventData) return n = A({}, e.eventData), !0 + }), !0), n) { + var s = n.componentType, l = n.componentIndex; + "markLine" !== s && "markPoint" !== s && "markArea" !== s || (s = "series", l = n.seriesIndex); + var u = s && null != l && r.getComponent(s, l), + h = u && i["series" === u.mainType ? "_chartsMap" : "_componentsMap"][u.__viewId]; + 0, n.event = e, n.type = t, i._$eventProcessor.eventInfo = { + targetEl: o, + packedEvent: n, + model: u, + view: h + }, i.trigger(t, n) + } + }; + e.zrEventfulCallAtLast = !0, i._zr.on(t, e, i) + })), E(Hv, (function (t, e) { + i._messageCenter.on(e, (function (t) { + this.trigger(e, t) + }), i) + })), E(["selectchanged"], (function (t) { + i._messageCenter.on(t, (function (e) { + this.trigger(t, e) + }), i) + })), t = this._messageCenter, e = this, n = this._api, t.on("selectchanged", (function (t) { + var i = n.getModel(); + t.isFromClick ? (vy("map", "selectchanged", e, i, t), vy("pie", "selectchanged", e, i, t)) : "select" === t.fromAction ? (vy("map", "selected", e, i, t), vy("pie", "selected", e, i, t)) : "unselect" === t.fromAction && (vy("map", "unselected", e, i, t), vy("pie", "unselected", e, i, t)) + })) + }, e.prototype.isDisposed = function () { + return this._disposed + }, e.prototype.clear = function () { + this._disposed ? Gv(this.id) : this.setOption({series: []}, !0) + }, e.prototype.dispose = function () { + if (this._disposed) Gv(this.id); else { + this._disposed = !0, this.getDom() && ko(this.getDom(), Qv, ""); + var t = this, e = t._api, n = t._model; + E(t._componentsViews, (function (t) { + t.dispose(n, e) + })), E(t._chartsViews, (function (t) { + t.dispose(n, e) + })), t._zr.dispose(), t._dom = t._model = t._chartsMap = t._componentsMap = t._chartsViews = t._componentsViews = t._scheduler = t._api = t._zr = t._throttledZrFlush = t._theme = t._coordSysMgr = t._messageCenter = null, delete qv[t.id] + } + }, e.prototype.resize = function (t) { + if (!this.__flagInMainProcess) if (this._disposed) Gv(this.id); else { + this._zr.resize(t); + var e = this._model; + if (this._loadingFX && this._loadingFX.resize(), e) { + var n = e.resetOption("media"), i = t && t.silent; + this.__pendingUpdate && (null == i && (i = this.__pendingUpdate.silent), n = !0, this.__pendingUpdate = null), this.__flagInMainProcess = !0; + try { + n && mv(this), bv.update.call(this, { + type: "resize", + animation: A({duration: 0}, t && t.animation) + }) + } catch (t) { + throw this.__flagInMainProcess = !1, t + } + this.__flagInMainProcess = !1, Iv.call(this, i), Tv.call(this, i) + } + } + }, e.prototype.showLoading = function (t, e) { + if (this._disposed) Gv(this.id); else if (q(t) && (e = t, t = ""), t = t || "default", this.hideLoading(), jv[t]) { + var n = jv[t](this._api, e), i = this._zr; + this._loadingFX = n, i.add(n) + } + }, e.prototype.hideLoading = function () { + this._disposed ? Gv(this.id) : (this._loadingFX && this._zr.remove(this._loadingFX), this._loadingFX = null) + }, e.prototype.makeActionFromEvent = function (t) { + var e = A({}, t); + return e.type = Hv[t.type], e + }, e.prototype.dispatchAction = function (t, e) { + if (this._disposed) Gv(this.id); else if (q(e) || (e = {silent: !!e}), Wv[t.type] && this._model) if (this.__flagInMainProcess) this._pendingActions.push(t); else { + var n = e.silent; + Mv.call(this, t, n); + var i = e.flush; + i ? this._zr.flush() : !1 !== i && r.browser.weChat && this._throttledZrFlush(), Iv.call(this, n), Tv.call(this, n) + } + }, e.prototype.updateLabelLayout = function () { + av.trigger("series:layoutlabels", this._model, this._api, {updatedSeries: []}) + }, e.prototype.appendData = function (t) { + if (this._disposed) Gv(this.id); else { + var e = t.seriesIndex, n = this.getModel().getSeriesByIndex(e); + 0, n.appendData(t), this._scheduler.unfinished = !0, this.getZr().wakeUp() + } + }, e.internalField = function () { + function t(t) { + t.clearColorPalette(), t.eachSeries((function (t) { + t.clearColorPalette() + })) + } + + function e(t) { + for (var e = [], n = t.currentStates, i = 0; i < n.length; i++) { + var r = n[i]; + "emphasis" !== r && "blur" !== r && "select" !== r && e.push(r) + } + t.selected && t.states.select && e.push("select"), 2 === t.hoverState && t.states.emphasis ? e.push("emphasis") : 1 === t.hoverState && t.states.blur && e.push("blur"), t.useStates(e) + } + + function i(t, e) { + if (!t.preventAutoZ) { + var n = t.get("z") || 0, i = t.get("zlevel") || 0; + e.eachRendered((function (t) { + return o(t, n, i, -1 / 0), !0 + })) + } + } + + function o(t, e, n, i) { + var r = t.getTextContent(), a = t.getTextGuideLine(); + if (t.isGroup) for (var s = t.childrenRef(), l = 0; l < s.length; l++) i = Math.max(o(s[l], e, n, i), i); else t.z = e, t.zlevel = n, i = Math.max(t.z2, i); + if (r && (r.z = e, r.zlevel = n, isFinite(i) && (r.z2 = i + 2)), a) { + var u = t.textGuideLineConfig; + a.z = e, a.zlevel = n, isFinite(i) && (a.z2 = i + (u && u.showAbove ? 1 : -1)) + } + return i + } + + function a(t, e) { + e.eachRendered((function (t) { + if (!oh(t)) { + var e = t.getTextContent(), n = t.getTextGuideLine(); + t.stateTransition && (t.stateTransition = null), e && e.stateTransition && (e.stateTransition = null), n && n.stateTransition && (n.stateTransition = null), t.hasState() ? (t.prevStates = t.currentStates, t.clearStates()) : t.prevStates && (t.prevStates = null) + } + })) + } + + function s(t, n) { + var i = t.getModel("stateAnimation"), r = t.isAnimationEnabled(), o = i.get("duration"), + a = o > 0 ? {duration: o, delay: i.get("delay"), easing: i.get("easing")} : null; + n.eachRendered((function (t) { + if (t.states && t.states.emphasis) { + if (oh(t)) return; + if (t instanceof fs && function (t) { + var e = Xs(t); + e.normalFill = t.style.fill, e.normalStroke = t.style.stroke; + var n = t.states.select || {}; + e.selectFill = n.style && n.style.fill || null, e.selectStroke = n.style && n.style.stroke || null + }(t), t.__dirty) { + var n = t.prevStates; + n && t.useStates(n) + } + if (r) { + t.stateTransition = a; + var i = t.getTextContent(), o = t.getTextGuideLine(); + i && (i.stateTransition = a), o && (o.stateTransition = a) + } + t.__dirty && e(t) + } + })) + } + + mv = function (t) { + var e = t._scheduler; + e.restorePipelines(t._model), e.prepareStageTasks(), xv(t, !0), xv(t, !1), e.plan() + }, xv = function (t, e) { + for (var n = t._model, i = t._scheduler, r = e ? t._componentsViews : t._chartsViews, o = e ? t._componentsMap : t._chartsMap, a = t._zr, s = t._api, l = 0; l < r.length; l++) r[l].__alive = !1; + + function u(t) { + var l = t.__requireNewView; + t.__requireNewView = !1; + var u = "_ec_" + t.id + "_" + t.type, h = !l && o[u]; + if (!h) { + var c = No(t.type), p = e ? fg.getClass(c.main, c.sub) : mg.getClass(c.sub); + 0, (h = new p).init(n, s), o[u] = h, r.push(h), a.add(h.group) + } + t.__viewId = h.__id = u, h.__alive = !0, h.__model = t, h.group.__ecComponentInfo = { + mainType: t.mainType, + index: t.componentIndex + }, !e && i.prepareView(h, t, n, s) + } + + e ? n.eachComponent((function (t, e) { + "series" !== t && u(e) + })) : n.eachSeries(u); + for (l = 0; l < r.length;) { + var h = r[l]; + h.__alive ? l++ : (!e && h.renderTask.dispose(), a.remove(h.group), h.dispose(n, s), r.splice(l, 1), o[h.__id] === h && delete o[h.__id], h.__id = h.group.__ecComponentInfo = null) + } + }, _v = function (t, e, n, i, r) { + var o = t._model; + if (o.setUpdatePayload(n), i) { + var a = {}; + a[i + "Id"] = n[i + "Id"], a[i + "Index"] = n[i + "Index"], a[i + "Name"] = n[i + "Name"]; + var s = {mainType: i, query: a}; + r && (s.subType = r); + var l, u = n.excludeSeriesId; + null != u && (l = ft(), E(ho(u), (function (t) { + var e = xo(t, null); + null != e && l.set(e, !0) + }))), o && o.eachComponent(s, (function (e) { + if (!(l && null !== l.get(e.id))) if (Gl(n)) if (e instanceof ag) n.type !== $s || n.notBlur || e.get(["emphasis", "disabled"]) || function (t, e, n) { + var i = t.seriesIndex, r = t.getData(e.dataType); + if (r) { + var o = wo(r, e); + o = (Y(o) ? o[0] : o) || 0; + var a = r.getItemGraphicEl(o); + if (!a) for (var s = r.count(), l = 0; !a && l < s;) a = r.getItemGraphicEl(l++); + if (a) { + var u = Ws(a); + Cl(i, u.focus, u.blurScope, n) + } else { + var h = t.get(["emphasis", "focus"]), c = t.get(["emphasis", "blurScope"]); + null != h && Cl(i, h, c, n) + } + } + }(e, n, t._api); else { + var i = Al(e.mainType, e.componentIndex, n.name, t._api), r = i.focusSelf, + o = i.dispatchers; + n.type === $s && r && !n.notBlur && Dl(e.mainType, e.componentIndex, t._api), o && E(o, (function (t) { + n.type === $s ? xl(t) : _l(t) + })) + } else Fl(n) && e instanceof ag && (!function (t, e, n) { + if (Fl(e)) { + var i = e.dataType, r = wo(t.getData(i), e); + Y(r) || (r = [r]), t[e.type === el ? "toggleSelect" : e.type === Qs ? "select" : "unselect"](r, i) + } + }(e, n, t._api), kl(e), Rv(t)) + }), t), o && o.eachComponent(s, (function (e) { + l && null !== l.get(e.id) || h(t["series" === i ? "_chartsMap" : "_componentsMap"][e.__viewId]) + }), t) + } else E([].concat(t._componentsViews).concat(t._chartsViews), h); + + function h(i) { + i && i.__alive && i[e] && i[e](i.__model, o, t._api, n) + } + }, bv = { + prepareAndUpdate: function (t) { + mv(this), bv.update.call(this, t, {optionChanged: null != t.newOption}) + }, update: function (e, n) { + var i = this._model, r = this._api, o = this._zr, a = this._coordSysMgr, s = this._scheduler; + if (i) { + i.setUpdatePayload(e), s.restoreData(i, e), s.performSeriesTasks(i), a.create(i, r), s.performDataProcessorTasks(i, e), Sv(this, i), a.update(i, r), t(i), s.performVisualTasks(i, e), Av(this, i, r, e, n); + var l = i.get("backgroundColor") || "transparent", u = i.get("darkMode"); + o.setBackgroundColor(l), null != u && "auto" !== u && o.setDarkMode(u), av.trigger("afterupdate", i, r) + } + }, updateTransform: function (e) { + var n = this, i = this._model, r = this._api; + if (i) { + i.setUpdatePayload(e); + var o = []; + i.eachComponent((function (t, a) { + if ("series" !== t) { + var s = n.getViewOfComponentModel(a); + if (s && s.__alive) if (s.updateTransform) { + var l = s.updateTransform(a, i, r, e); + l && l.update && o.push(s) + } else o.push(s) + } + })); + var a = ft(); + i.eachSeries((function (t) { + var o = n._chartsMap[t.__viewId]; + if (o.updateTransform) { + var s = o.updateTransform(t, i, r, e); + s && s.update && a.set(t.uid, 1) + } else a.set(t.uid, 1) + })), t(i), this._scheduler.performVisualTasks(i, e, { + setDirty: !0, + dirtyMap: a + }), Lv(this, i, r, e, {}, a), av.trigger("afterupdate", i, r) + } + }, updateView: function (e) { + var n = this._model; + n && (n.setUpdatePayload(e), mg.markUpdateMethod(e, "updateView"), t(n), this._scheduler.performVisualTasks(n, e, {setDirty: !0}), Av(this, n, this._api, e, {}), av.trigger("afterupdate", n, this._api)) + }, updateVisual: function (e) { + var n = this, i = this._model; + i && (i.setUpdatePayload(e), i.eachSeries((function (t) { + t.getData().clearAllVisual() + })), mg.markUpdateMethod(e, "updateVisual"), t(i), this._scheduler.performVisualTasks(i, e, { + visualType: "visual", + setDirty: !0 + }), i.eachComponent((function (t, r) { + if ("series" !== t) { + var o = n.getViewOfComponentModel(r); + o && o.__alive && o.updateVisual(r, i, n._api, e) + } + })), i.eachSeries((function (t) { + n._chartsMap[t.__viewId].updateVisual(t, i, n._api, e) + })), av.trigger("afterupdate", i, this._api)) + }, updateLayout: function (t) { + bv.update.call(this, t) + } + }, wv = function (t, e, n, i) { + if (t._disposed) Gv(t.id); else { + for (var r, o = t._model, a = t._coordSysMgr.getCoordinateSystems(), s = Io(o, n), l = 0; l < a.length; l++) { + var u = a[l]; + if (u[e] && null != (r = u[e](o, s, i))) return r + } + 0 + } + }, Sv = function (t, e) { + var n = t._chartsMap, i = t._scheduler; + e.eachSeries((function (t) { + i.updateStreamModes(t, n[t.__viewId]) + })) + }, Mv = function (t, e) { + var n = this, i = this.getModel(), r = t.type, o = t.escapeConnect, a = Wv[r], s = a.actionInfo, + l = (s.update || "update").split(":"), u = l.pop(), h = null != l[0] && No(l[0]); + this.__flagInMainProcess = !0; + var c = [t], p = !1; + t.batch && (p = !0, c = z(t.batch, (function (e) { + return (e = k(A({}, e), t)).batch = null, e + }))); + var d, f = [], g = Fl(t), y = Gl(t); + if (y && Tl(this._api), E(c, (function (e) { + if ((d = (d = a.action(e, n._model, n._api)) || A({}, e)).type = s.event || d.type, f.push(d), y) { + var i = To(t), r = i.queryOptionMap, o = i.mainTypeSpecified ? r.keys()[0] : "series"; + _v(n, u, e, o), Rv(n) + } else g ? (_v(n, u, e, "series"), Rv(n)) : h && _v(n, u, e, h.main, h.sub) + })), "none" !== u && !y && !g && !h) try { + this.__pendingUpdate ? (mv(this), bv.update.call(this, t), this.__pendingUpdate = null) : bv[u].call(this, t) + } catch (t) { + throw this.__flagInMainProcess = !1, t + } + if (d = p ? { + type: s.event || r, + escapeConnect: o, + batch: f + } : f[0], this.__flagInMainProcess = !1, !e) { + var v = this._messageCenter; + if (v.trigger(d.type, d), g) { + var m = { + type: "selectchanged", + escapeConnect: o, + selected: Ll(i), + isFromClick: t.isFromClick || !1, + fromAction: t.type, + fromActionPayload: t + }; + v.trigger(m.type, m) + } + } + }, Iv = function (t) { + for (var e = this._pendingActions; e.length;) { + var n = e.shift(); + Mv.call(this, n, t) + } + }, Tv = function (t) { + !t && this.trigger("updated") + }, Cv = function (t, e) { + t.on("rendered", (function (n) { + e.trigger("rendered", n), !t.animation.isFinished() || e.__pendingUpdate || e._scheduler.unfinished || e._pendingActions.length || e.trigger("finished") + })) + }, Dv = function (t, e) { + t.on("mouseover", (function (t) { + var n = my(t.target, Bl); + n && (!function (t, e, n) { + var i = Ws(t), r = Al(i.componentMainType, i.componentIndex, i.componentHighDownName, n), + o = r.dispatchers, a = r.focusSelf; + o ? (a && Dl(i.componentMainType, i.componentIndex, n), E(o, (function (t) { + return vl(t, e) + }))) : (Cl(i.seriesIndex, i.focus, i.blurScope, n), "self" === i.focus && Dl(i.componentMainType, i.componentIndex, n), vl(t, e)) + }(n, t, e._api), Rv(e)) + })).on("mouseout", (function (t) { + var n = my(t.target, Bl); + n && (!function (t, e, n) { + Tl(n); + var i = Ws(t), + r = Al(i.componentMainType, i.componentIndex, i.componentHighDownName, n).dispatchers; + r ? E(r, (function (t) { + return ml(t, e) + })) : ml(t, e) + }(n, t, e._api), Rv(e)) + })).on("click", (function (t) { + var n = my(t.target, (function (t) { + return null != Ws(t).dataIndex + }), !0); + if (n) { + var i = n.selected ? "unselect" : "select", r = Ws(n); + e._api.dispatchAction({ + type: i, + dataType: r.dataType, + dataIndexInside: r.dataIndex, + seriesIndex: r.seriesIndex, + isFromClick: !0 + }) + } + })) + }, Av = function (t, e, n, i, r) { + !function (t) { + var e = [], n = [], i = !1; + if (t.eachComponent((function (t, r) { + var o = r.get("zlevel") || 0, a = r.get("z") || 0, s = r.getZLevelKey(); + i = i || !!s, ("series" === t ? n : e).push({ + zlevel: o, + z: a, + idx: r.componentIndex, + type: t, + key: s + }) + })), i) { + var r, o, a = e.concat(n); + Ie(a, (function (t, e) { + return t.zlevel === e.zlevel ? t.z - e.z : t.zlevel - e.zlevel + })), E(a, (function (e) { + var n = t.getComponent(e.type, e.idx), i = e.zlevel, a = e.key; + null != r && (i = Math.max(r, i)), a ? (i === r && a !== o && i++, o = a) : o && (i === r && i++, o = ""), r = i, n.setZLevel(i) + })) + } + }(e), kv(t, e, n, i, r), E(t._chartsViews, (function (t) { + t.__alive = !1 + })), Lv(t, e, n, i, r), E(t._chartsViews, (function (t) { + t.__alive || t.remove(e, n) + })) + }, kv = function (t, e, n, r, o, l) { + E(l || t._componentsViews, (function (t) { + var o = t.__model; + a(o, t), t.render(o, e, n, r), i(o, t), s(o, t) + })) + }, Lv = function (t, e, n, o, l, u) { + var h = t._scheduler; + l = A(l || {}, {updatedSeries: e.getSeries()}), av.trigger("series:beforeupdate", e, n, l); + var c = !1; + e.eachSeries((function (e) { + var n = t._chartsMap[e.__viewId]; + n.__alive = !0; + var i = n.renderTask; + h.updatePayload(i, o), a(e, n), u && u.get(e.uid) && i.dirty(), i.perform(h.getPerformArgs(i)) && (c = !0), n.group.silent = !!e.get("silent"), function (t, e) { + var n = t.get("blendMode") || null; + e.eachRendered((function (t) { + t.isGroup || (t.style.blend = n) + })) + }(e, n), kl(e) + })), h.unfinished = c || h.unfinished, av.trigger("series:layoutlabels", e, n, l), av.trigger("series:transition", e, n, l), e.eachSeries((function (e) { + var n = t._chartsMap[e.__viewId]; + i(e, n), s(e, n) + })), function (t, e) { + var n = t._zr.storage, i = 0; + n.traverse((function (t) { + t.isGroup || i++ + })), i > e.get("hoverLayerThreshold") && !r.node && !r.worker && e.eachSeries((function (e) { + if (!e.preventUsingHoverLayer) { + var n = t._chartsMap[e.__viewId]; + n.__alive && n.eachRendered((function (t) { + t.states.emphasis && (t.states.emphasis.hoverLayer = !0) + })) + } + })) + }(t, e), av.trigger("series:afterupdate", e, n, l) + }, Rv = function (t) { + t.__needsUpdateStatus = !0, t.getZr().wakeUp() + }, Nv = function (t) { + t.__needsUpdateStatus && (t.getZr().storage.traverse((function (t) { + oh(t) || e(t) + })), t.__needsUpdateStatus = !1) + }, Pv = function (t) { + return new (function (e) { + function i() { + return null !== e && e.apply(this, arguments) || this + } + + return n(i, e), i.prototype.getCoordinateSystems = function () { + return t._coordSysMgr.getCoordinateSystems() + }, i.prototype.getComponentByElement = function (e) { + for (; e;) { + var n = e.__ecComponentInfo; + if (null != n) return t._model.getComponent(n.mainType, n.index); + e = e.parent + } + }, i.prototype.enterEmphasis = function (e, n) { + xl(e, n), Rv(t) + }, i.prototype.leaveEmphasis = function (e, n) { + _l(e, n), Rv(t) + }, i.prototype.enterBlur = function (e) { + bl(e), Rv(t) + }, i.prototype.leaveBlur = function (e) { + wl(e), Rv(t) + }, i.prototype.enterSelect = function (e) { + Sl(e), Rv(t) + }, i.prototype.leaveSelect = function (e) { + Ml(e), Rv(t) + }, i.prototype.getModel = function () { + return t.getModel() + }, i.prototype.getViewOfComponentModel = function (e) { + return t.getViewOfComponentModel(e) + }, i.prototype.getViewOfSeriesModel = function (e) { + return t.getViewOfSeriesModel(e) + }, i + }(sd))(t) + }, Ov = function (t) { + function e(t, e) { + for (var n = 0; n < t.length; n++) { + t[n][fv] = e + } + } + + E(Hv, (function (n, i) { + t._messageCenter.on(i, (function (n) { + if (Kv[t.group] && 0 !== t[fv]) { + if (n && n.escapeConnect) return; + var i = t.makeActionFromEvent(n), r = []; + E(qv, (function (e) { + e !== t && e.group === t.group && r.push(e) + })), e(r, 0), E(r, (function (t) { + 1 !== t[fv] && t.dispatchAction(i) + })), e(r, 2) + } + })) + })) + } + }(), e + }(Xt), Bv = Vv.prototype; + Bv.on = gv("on"), Bv.off = gv("off"), Bv.one = function (t, e, n) { + var i = this; + oo(), this.on.call(this, t, (function n() { + for (var r = [], o = 0; o < arguments.length; o++) r[o] = arguments[o]; + e && e.apply && e.apply(this, r), i.off(t, n) + }), n) + }; + var Fv = ["click", "dblclick", "mouseover", "mouseout", "mousemove", "mousedown", "mouseup", "globalout", "contextmenu"]; + + function Gv(t) { + 0 + } + + var Wv = {}, Hv = {}, Yv = [], Uv = [], Xv = [], Zv = {}, jv = {}, qv = {}, Kv = {}, $v = +new Date - 0, + Jv = +new Date - 0, Qv = "_echarts_instance_"; + + function tm(t) { + Kv[t] = !1 + } + + var em = tm; + + function nm(t) { + return qv[function (t, e) { + return t.getAttribute ? t.getAttribute(e) : t[e] + }(t, Qv)] + } + + function im(t, e) { + Zv[t] = e + } + + function rm(t) { + P(Uv, t) < 0 && Uv.push(t) + } + + function om(t, e) { + fm(Yv, t, e, 2e3) + } + + function am(t) { + lm("afterinit", t) + } + + function sm(t) { + lm("afterupdate", t) + } + + function lm(t, e) { + av.on(t, e) + } + + function um(t, e, n) { + U(e) && (n = e, e = ""); + var i = q(t) ? t.type : [t, t = {event: e}][0]; + t.event = (t.event || i).toLowerCase(), e = t.event, Hv[e] || (lt(dv.test(i) && dv.test(e)), Wv[i] || (Wv[i] = { + action: n, + actionInfo: t + }), Hv[e] = i) + } + + function hm(t, e) { + ud.register(t, e) + } + + function cm(t, e) { + fm(Xv, t, e, 1e3, "layout") + } + + function pm(t, e) { + fm(Xv, t, e, 3e3, "visual") + } + + var dm = []; + + function fm(t, e, n, i, r) { + if ((U(e) || q(e)) && (n = e, e = i), !(P(dm, n) >= 0)) { + dm.push(n); + var o = Fg.wrapStageHandler(n, r); + o.__prio = e, o.__raw = n, t.push(o) + } + } + + function gm(t, e) { + jv[t] = e + } + + function ym(t, e, n) { + var i = lv("registerMap"); + i && i(t, e, n) + } + + var vm = function (t) { + var e = (t = T(t)).type, n = ""; + e || ao(n); + var i = e.split(":"); + 2 !== i.length && ao(n); + var r = !1; + "echarts" === i[0] && (e = i[1], r = !0), t.__isBuiltIn = r, If.set(e, t) + }; + pm(hv, Ng), pm(cv, zg), pm(cv, Vg), pm(hv, cy), pm(cv, py), pm(7e3, (function (t, e) { + t.eachRawSeries((function (n) { + if (!t.isSeriesFiltered(n)) { + var i = n.getData(); + i.hasItemVisual() && i.each((function (t) { + var n = i.getItemVisual(t, "decal"); + n && (i.ensureUniqueItemVisual(t, "style").decal = nv(n, e)) + })); + var r = i.getVisual("decal"); + if (r) i.getVisual("style").decal = nv(r, e) + } + })) + })), rm(Pd), om(900, (function (t) { + var e = ft(); + t.eachSeries((function (t) { + var n = t.get("stack"); + if (n) { + var i = e.get(n) || e.set(n, []), r = t.getData(), o = { + stackResultDimension: r.getCalculationInfo("stackResultDimension"), + stackedOverDimension: r.getCalculationInfo("stackedOverDimension"), + stackedDimension: r.getCalculationInfo("stackedDimension"), + stackedByDimension: r.getCalculationInfo("stackedByDimension"), + isStackedByIndex: r.getCalculationInfo("isStackedByIndex"), + data: r, + seriesModel: t + }; + if (!o.stackedDimension || !o.isStackedByIndex && !o.stackedByDimension) return; + i.length && r.setCalculationInfo("stackedOnSeries", i[i.length - 1].seriesModel), i.push(o) + } + })), e.each(Od) + })), gm("default", (function (t, e) { + k(e = e || {}, { + text: "loading", + textColor: "#000", + fontSize: 12, + fontWeight: "normal", + fontStyle: "normal", + fontFamily: "sans-serif", + maskColor: "rgba(255, 255, 255, 0.8)", + showSpinner: !0, + color: "#5470c6", + spinnerRadius: 10, + lineWidth: 5, + zlevel: 0 + }); + var n = new Cr, i = new Ts({style: {fill: e.maskColor}, zlevel: e.zlevel, z: 1e4}); + n.add(i); + var r, o = new As({ + style: { + text: e.text, + fill: e.textColor, + fontSize: e.fontSize, + fontWeight: e.fontWeight, + fontStyle: e.fontStyle, + fontFamily: e.fontFamily + }, zlevel: e.zlevel, z: 10001 + }), a = new Ts({ + style: {fill: "none"}, + textContent: o, + textConfig: {position: "right", distance: 10}, + zlevel: e.zlevel, + z: 10001 + }); + return n.add(a), e.showSpinner && ((r = new Wu({ + shape: { + startAngle: -Bg / 2, + endAngle: -Bg / 2 + .1, + r: e.spinnerRadius + }, style: {stroke: e.color, lineCap: "round", lineWidth: e.lineWidth}, zlevel: e.zlevel, z: 10001 + })).animateShape(!0).when(1e3, {endAngle: 3 * Bg / 2}).start("circularInOut"), r.animateShape(!0).when(1e3, {startAngle: 3 * Bg / 2}).delay(300).start("circularInOut"), n.add(r)), n.resize = function () { + var n = o.getBoundingRect().width, s = e.showSpinner ? e.spinnerRadius : 0, + l = (t.getWidth() - 2 * s - (e.showSpinner && n ? 10 : 0) - n) / 2 - (e.showSpinner && n ? 0 : 5 + n / 2) + (e.showSpinner ? 0 : n / 2) + (n ? 0 : s), + u = t.getHeight() / 2; + e.showSpinner && r.setShape({cx: l, cy: u}), a.setShape({ + x: l - s, + y: u - s, + width: 2 * s, + height: 2 * s + }), i.setShape({x: 0, y: 0, width: t.getWidth(), height: t.getHeight()}) + }, n.resize(), n + })), um({type: $s, event: $s, update: $s}, xt), um({type: Js, event: Js, update: Js}, xt), um({ + type: Qs, + event: Qs, + update: Qs + }, xt), um({type: tl, event: tl, update: tl}, xt), um({ + type: el, + event: el, + update: el + }, xt), im("light", ny), im("dark", sy); + var mm = [], xm = { + registerPreprocessor: rm, + registerProcessor: om, + registerPostInit: am, + registerPostUpdate: sm, + registerUpdateLifecycle: lm, + registerAction: um, + registerCoordinateSystem: hm, + registerLayout: cm, + registerVisual: pm, + registerTransform: vm, + registerLoading: gm, + registerMap: ym, + registerImpl: function (t, e) { + sv[t] = e + }, + PRIORITY: pv, + ComponentModel: Ip, + ComponentView: fg, + SeriesModel: ag, + ChartView: mg, + registerComponentModel: function (t) { + Ip.registerClass(t) + }, + registerComponentView: function (t) { + fg.registerClass(t) + }, + registerSeriesModel: function (t) { + ag.registerClass(t) + }, + registerChartView: function (t) { + mg.registerClass(t) + }, + registerSubTypeDefaulter: function (t, e) { + Ip.registerSubTypeDefaulter(t, e) + }, + registerPainter: function (t, e) { + Pr(t, e) + } + }; + + function _m(t) { + Y(t) ? E(t, (function (t) { + _m(t) + })) : P(mm, t) >= 0 || (mm.push(t), U(t) && (t = {install: t}), t.install(xm)) + } + + function bm(t) { + return null == t ? 0 : t.length || 1 + } + + function wm(t) { + return t + } + + var Sm = function () { + function t(t, e, n, i, r, o) { + this._old = t, this._new = e, this._oldKeyGetter = n || wm, this._newKeyGetter = i || wm, this.context = r, this._diffModeMultiple = "multiple" === o + } + + return t.prototype.add = function (t) { + return this._add = t, this + }, t.prototype.update = function (t) { + return this._update = t, this + }, t.prototype.updateManyToOne = function (t) { + return this._updateManyToOne = t, this + }, t.prototype.updateOneToMany = function (t) { + return this._updateOneToMany = t, this + }, t.prototype.updateManyToMany = function (t) { + return this._updateManyToMany = t, this + }, t.prototype.remove = function (t) { + return this._remove = t, this + }, t.prototype.execute = function () { + this[this._diffModeMultiple ? "_executeMultiple" : "_executeOneToOne"]() + }, t.prototype._executeOneToOne = function () { + var t = this._old, e = this._new, n = {}, i = new Array(t.length), r = new Array(e.length); + this._initIndexMap(t, null, i, "_oldKeyGetter"), this._initIndexMap(e, n, r, "_newKeyGetter"); + for (var o = 0; o < t.length; o++) { + var a = i[o], s = n[a], l = bm(s); + if (l > 1) { + var u = s.shift(); + 1 === s.length && (n[a] = s[0]), this._update && this._update(u, o) + } else 1 === l ? (n[a] = null, this._update && this._update(s, o)) : this._remove && this._remove(o) + } + this._performRestAdd(r, n) + }, t.prototype._executeMultiple = function () { + var t = this._old, e = this._new, n = {}, i = {}, r = [], o = []; + this._initIndexMap(t, n, r, "_oldKeyGetter"), this._initIndexMap(e, i, o, "_newKeyGetter"); + for (var a = 0; a < r.length; a++) { + var s = r[a], l = n[s], u = i[s], h = bm(l), c = bm(u); + if (h > 1 && 1 === c) this._updateManyToOne && this._updateManyToOne(u, l), i[s] = null; else if (1 === h && c > 1) this._updateOneToMany && this._updateOneToMany(u, l), i[s] = null; else if (1 === h && 1 === c) this._update && this._update(u, l), i[s] = null; else if (h > 1 && c > 1) this._updateManyToMany && this._updateManyToMany(u, l), i[s] = null; else if (h > 1) for (var p = 0; p < h; p++) this._remove && this._remove(l[p]); else this._remove && this._remove(l) + } + this._performRestAdd(o, i) + }, t.prototype._performRestAdd = function (t, e) { + for (var n = 0; n < t.length; n++) { + var i = t[n], r = e[i], o = bm(r); + if (o > 1) for (var a = 0; a < o; a++) this._add && this._add(r[a]); else 1 === o && this._add && this._add(r); + e[i] = null + } + }, t.prototype._initIndexMap = function (t, e, n, i) { + for (var r = this._diffModeMultiple, o = 0; o < t.length; o++) { + var a = "_ec_" + this[i](t[o], o); + if (r || (n[o] = a), e) { + var s = e[a], l = bm(s); + 0 === l ? (e[a] = o, r && n.push(a)) : 1 === l ? e[a] = [s, o] : s.push(o) + } + } + }, t + }(), Mm = function () { + function t(t, e) { + this._encode = t, this._schema = e + } + + return t.prototype.get = function () { + return {fullDimensions: this._getFullDimensionNames(), encode: this._encode} + }, t.prototype._getFullDimensionNames = function () { + return this._cachedDimNames || (this._cachedDimNames = this._schema ? this._schema.makeOutputDimensionNames() : []), this._cachedDimNames + }, t + }(); + + function Im(t, e) { + return t.hasOwnProperty(e) || (t[e] = []), t[e] + } + + function Tm(t) { + return "category" === t ? "ordinal" : "time" === t ? "time" : "float" + } + + var Cm = function (t) { + this.otherDims = {}, null != t && A(this, t) + }, Dm = So(), Am = {float: "f", int: "i", ordinal: "o", number: "n", time: "t"}, km = function () { + function t(t) { + this.dimensions = t.dimensions, this._dimOmitted = t.dimensionOmitted, this.source = t.source, this._fullDimCount = t.fullDimensionCount, this._updateDimOmitted(t.dimensionOmitted) + } + + return t.prototype.isDimensionOmitted = function () { + return this._dimOmitted + }, t.prototype._updateDimOmitted = function (t) { + this._dimOmitted = t, t && (this._dimNameMap || (this._dimNameMap = Om(this.source))) + }, t.prototype.getSourceDimensionIndex = function (t) { + return rt(this._dimNameMap.get(t), -1) + }, t.prototype.getSourceDimension = function (t) { + var e = this.source.dimensionsDefine; + if (e) return e[t] + }, t.prototype.makeStoreSchema = function () { + for (var t = this._fullDimCount, e = Xd(this.source), n = !Rm(t), i = "", r = [], o = 0, a = 0; o < t; o++) { + var s = void 0, l = void 0, u = void 0, h = this.dimensions[a]; + if (h && h.storeDimIndex === o) s = e ? h.name : null, l = h.type, u = h.ordinalMeta, a++; else { + var c = this.getSourceDimension(o); + c && (s = e ? c.name : null, l = c.type) + } + r.push({ + property: s, + type: l, + ordinalMeta: u + }), !e || null == s || h && h.isCalculationCoord || (i += n ? s.replace(/\`/g, "`1").replace(/\$/g, "`2") : s), i += "$", i += Am[l] || "f", u && (i += u.uid), i += "$" + } + var p = this.source; + return {dimensions: r, hash: [p.seriesLayoutBy, p.startIndex, i].join("$$")} + }, t.prototype.makeOutputDimensionNames = function () { + for (var t = [], e = 0, n = 0; e < this._fullDimCount; e++) { + var i = void 0, r = this.dimensions[n]; + if (r && r.storeDimIndex === e) r.isCalculationCoord || (i = r.name), n++; else { + var o = this.getSourceDimension(e); + o && (i = o.name) + } + t.push(i) + } + return t + }, t.prototype.appendCalculationDimension = function (t) { + this.dimensions.push(t), t.isCalculationCoord = !0, this._fullDimCount++, this._updateDimOmitted(!0) + }, t + }(); + + function Lm(t) { + return t instanceof km + } + + function Pm(t) { + for (var e = ft(), n = 0; n < (t || []).length; n++) { + var i = t[n], r = q(i) ? i.name : i; + null != r && null == e.get(r) && e.set(r, n) + } + return e + } + + function Om(t) { + var e = Dm(t); + return e.dimNameMap || (e.dimNameMap = Pm(t.dimensionsDefine)) + } + + function Rm(t) { + return t > 30 + } + + var Nm, Em, zm, Vm, Bm, Fm, Gm, Wm = q, Hm = z, Ym = "undefined" == typeof Int32Array ? Array : Int32Array, + Um = ["hasItemOption", "_nameList", "_idList", "_invertedIndicesMap", "_dimSummary", "userOutput", "_rawData", "_dimValueGetter", "_nameDimIdx", "_idDimIdx", "_nameRepeatCount"], + Xm = ["_approximateExtent"], Zm = function () { + function t(t, e) { + var n; + this.type = "list", this._dimOmitted = !1, this._nameList = [], this._idList = [], this._visual = {}, this._layout = {}, this._itemVisuals = [], this._itemLayouts = [], this._graphicEls = [], this._approximateExtent = {}, this._calculationInfo = {}, this.hasItemOption = !1, this.TRANSFERABLE_METHODS = ["cloneShallow", "downSample", "lttbDownSample", "map"], this.CHANGABLE_METHODS = ["filterSelf", "selectRange"], this.DOWNSAMPLE_METHODS = ["downSample", "lttbDownSample"]; + var i = !1; + Lm(t) ? (n = t.dimensions, this._dimOmitted = t.isDimensionOmitted(), this._schema = t) : (i = !0, n = t), n = n || ["x", "y"]; + for (var r = {}, o = [], a = {}, s = !1, l = {}, u = 0; u < n.length; u++) { + var h = n[u], c = X(h) ? new Cm({name: h}) : h instanceof Cm ? h : new Cm(h), p = c.name; + c.type = c.type || "float", c.coordDim || (c.coordDim = p, c.coordDimIndex = 0); + var d = c.otherDims = c.otherDims || {}; + o.push(p), r[p] = c, null != l[p] && (s = !0), c.createInvertedIndices && (a[p] = []), 0 === d.itemName && (this._nameDimIdx = u), 0 === d.itemId && (this._idDimIdx = u), i && (c.storeDimIndex = u) + } + if (this.dimensions = o, this._dimInfos = r, this._initGetDimensionInfo(s), this.hostModel = e, this._invertedIndicesMap = a, this._dimOmitted) { + var f = this._dimIdxToName = ft(); + E(o, (function (t) { + f.set(r[t].storeDimIndex, t) + })) + } + } + + return t.prototype.getDimension = function (t) { + var e = this._recognizeDimIndex(t); + if (null == e) return t; + if (e = t, !this._dimOmitted) return this.dimensions[e]; + var n = this._dimIdxToName.get(e); + if (null != n) return n; + var i = this._schema.getSourceDimension(e); + return i ? i.name : void 0 + }, t.prototype.getDimensionIndex = function (t) { + var e = this._recognizeDimIndex(t); + if (null != e) return e; + if (null == t) return -1; + var n = this._getDimInfo(t); + return n ? n.storeDimIndex : this._dimOmitted ? this._schema.getSourceDimensionIndex(t) : -1 + }, t.prototype._recognizeDimIndex = function (t) { + if (j(t) || null != t && !isNaN(t) && !this._getDimInfo(t) && (!this._dimOmitted || this._schema.getSourceDimensionIndex(t) < 0)) return +t + }, t.prototype._getStoreDimIndex = function (t) { + var e = this.getDimensionIndex(t); + return e + }, t.prototype.getDimensionInfo = function (t) { + return this._getDimInfo(this.getDimension(t)) + }, t.prototype._initGetDimensionInfo = function (t) { + var e = this._dimInfos; + this._getDimInfo = t ? function (t) { + return e.hasOwnProperty(t) ? e[t] : void 0 + } : function (t) { + return e[t] + } + }, t.prototype.getDimensionsOnCoord = function () { + return this._dimSummary.dataDimsOnCoord.slice() + }, t.prototype.mapDimension = function (t, e) { + var n = this._dimSummary; + if (null == e) return n.encodeFirstDimNotExtra[t]; + var i = n.encode[t]; + return i ? i[e] : null + }, t.prototype.mapDimensionsAll = function (t) { + return (this._dimSummary.encode[t] || []).slice() + }, t.prototype.getStore = function () { + return this._store + }, t.prototype.initData = function (t, e, n) { + var i, r = this; + if (t instanceof zf && (i = t), !i) { + var o = this.dimensions, a = Fd(t) || N(t) ? new Zd(t, o.length) : t; + i = new zf; + var s = Hm(o, (function (t) { + return {type: r._dimInfos[t].type, property: t} + })); + i.initData(a, s, n) + } + this._store = i, this._nameList = (e || []).slice(), this._idList = [], this._nameRepeatCount = {}, this._doInit(0, i.count()), this._dimSummary = function (t, e) { + var n = {}, i = n.encode = {}, r = ft(), o = [], a = [], s = {}; + E(t.dimensions, (function (e) { + var n, l = t.getDimensionInfo(e), u = l.coordDim; + if (u) { + var h = l.coordDimIndex; + Im(i, u)[h] = e, l.isExtraCoord || (r.set(u, 1), "ordinal" !== (n = l.type) && "time" !== n && (o[0] = e), Im(s, u)[h] = t.getDimensionIndex(l.name)), l.defaultTooltip && a.push(e) + } + Ap.each((function (t, e) { + var n = Im(i, e), r = l.otherDims[e]; + null != r && !1 !== r && (n[r] = l.name) + })) + })); + var l = [], u = {}; + r.each((function (t, e) { + var n = i[e]; + u[e] = n[0], l = l.concat(n) + })), n.dataDimsOnCoord = l, n.dataDimIndicesOnCoord = z(l, (function (e) { + return t.getDimensionInfo(e).storeDimIndex + })), n.encodeFirstDimNotExtra = u; + var h = i.label; + h && h.length && (o = h.slice()); + var c = i.tooltip; + return c && c.length ? a = c.slice() : a.length || (a = o.slice()), i.defaultedLabel = o, i.defaultedTooltip = a, n.userOutput = new Mm(s, e), n + }(this, this._schema), this.userOutput = this._dimSummary.userOutput + }, t.prototype.appendData = function (t) { + var e = this._store.appendData(t); + this._doInit(e[0], e[1]) + }, t.prototype.appendValues = function (t, e) { + var n = this._store.appendValues(t, e.length), i = n.start, r = n.end, o = this._shouldMakeIdFromName(); + if (this._updateOrdinalMeta(), e) for (var a = i; a < r; a++) { + var s = a - i; + this._nameList[a] = e[s], o && Gm(this, a) + } + }, t.prototype._updateOrdinalMeta = function () { + for (var t = this._store, e = this.dimensions, n = 0; n < e.length; n++) { + var i = this._dimInfos[e[n]]; + i.ordinalMeta && t.collectOrdinalMeta(i.storeDimIndex, i.ordinalMeta) + } + }, t.prototype._shouldMakeIdFromName = function () { + var t = this._store.getProvider(); + return null == this._idDimIdx && t.getSource().sourceFormat !== Rp && !t.fillStorage + }, t.prototype._doInit = function (t, e) { + if (!(t >= e)) { + var n = this._store.getProvider(); + this._updateOrdinalMeta(); + var i = this._nameList, r = this._idList; + if (n.getSource().sourceFormat === kp && !n.pure) for (var o = [], a = t; a < e; a++) { + var s = n.getItem(a, o); + if (!this.hasItemOption && go(s) && (this.hasItemOption = !0), s) { + var l = s.name; + null == i[a] && null != l && (i[a] = xo(l, null)); + var u = s.id; + null == r[a] && null != u && (r[a] = xo(u, null)) + } + } + if (this._shouldMakeIdFromName()) for (a = t; a < e; a++) Gm(this, a); + Nm(this) + } + }, t.prototype.getApproximateExtent = function (t) { + return this._approximateExtent[t] || this._store.getDataExtent(this._getStoreDimIndex(t)) + }, t.prototype.setApproximateExtent = function (t, e) { + e = this.getDimension(e), this._approximateExtent[e] = t.slice() + }, t.prototype.getCalculationInfo = function (t) { + return this._calculationInfo[t] + }, t.prototype.setCalculationInfo = function (t, e) { + Wm(t) ? A(this._calculationInfo, t) : this._calculationInfo[t] = e + }, t.prototype.getName = function (t) { + var e = this.getRawIndex(t), n = this._nameList[e]; + return null == n && null != this._nameDimIdx && (n = zm(this, this._nameDimIdx, e)), null == n && (n = ""), n + }, t.prototype._getCategory = function (t, e) { + var n = this._store.get(t, e), i = this._store.getOrdinalMeta(t); + return i ? i.categories[n] : n + }, t.prototype.getId = function (t) { + return Em(this, this.getRawIndex(t)) + }, t.prototype.count = function () { + return this._store.count() + }, t.prototype.get = function (t, e) { + var n = this._store, i = this._dimInfos[t]; + if (i) return n.get(i.storeDimIndex, e) + }, t.prototype.getByRawIndex = function (t, e) { + var n = this._store, i = this._dimInfos[t]; + if (i) return n.getByRawIndex(i.storeDimIndex, e) + }, t.prototype.getIndices = function () { + return this._store.getIndices() + }, t.prototype.getDataExtent = function (t) { + return this._store.getDataExtent(this._getStoreDimIndex(t)) + }, t.prototype.getSum = function (t) { + return this._store.getSum(this._getStoreDimIndex(t)) + }, t.prototype.getMedian = function (t) { + return this._store.getMedian(this._getStoreDimIndex(t)) + }, t.prototype.getValues = function (t, e) { + var n = this, i = this._store; + return Y(t) ? i.getValues(Hm(t, (function (t) { + return n._getStoreDimIndex(t) + })), e) : i.getValues(t) + }, t.prototype.hasValue = function (t) { + for (var e = this._dimSummary.dataDimIndicesOnCoord, n = 0, i = e.length; n < i; n++) if (isNaN(this._store.get(e[n], t))) return !1; + return !0 + }, t.prototype.indexOfName = function (t) { + for (var e = 0, n = this._store.count(); e < n; e++) if (this.getName(e) === t) return e; + return -1 + }, t.prototype.getRawIndex = function (t) { + return this._store.getRawIndex(t) + }, t.prototype.indexOfRawIndex = function (t) { + return this._store.indexOfRawIndex(t) + }, t.prototype.rawIndexOf = function (t, e) { + var n = t && this._invertedIndicesMap[t]; + var i = n[e]; + return null == i || isNaN(i) ? -1 : i + }, t.prototype.indicesOfNearest = function (t, e, n) { + return this._store.indicesOfNearest(this._getStoreDimIndex(t), e, n) + }, t.prototype.each = function (t, e, n) { + U(t) && (n = e, e = t, t = []); + var i = n || this, r = Hm(Vm(t), this._getStoreDimIndex, this); + this._store.each(r, i ? W(e, i) : e) + }, t.prototype.filterSelf = function (t, e, n) { + U(t) && (n = e, e = t, t = []); + var i = n || this, r = Hm(Vm(t), this._getStoreDimIndex, this); + return this._store = this._store.filter(r, i ? W(e, i) : e), this + }, t.prototype.selectRange = function (t) { + var e = this, n = {}; + return E(G(t), (function (i) { + var r = e._getStoreDimIndex(i); + n[r] = t[i] + })), this._store = this._store.selectRange(n), this + }, t.prototype.mapArray = function (t, e, n) { + U(t) && (n = e, e = t, t = []), n = n || this; + var i = []; + return this.each(t, (function () { + i.push(e && e.apply(this, arguments)) + }), n), i + }, t.prototype.map = function (t, e, n, i) { + var r = n || i || this, o = Hm(Vm(t), this._getStoreDimIndex, this), a = Fm(this); + return a._store = this._store.map(o, r ? W(e, r) : e), a + }, t.prototype.modify = function (t, e, n, i) { + var r = n || i || this; + var o = Hm(Vm(t), this._getStoreDimIndex, this); + this._store.modify(o, r ? W(e, r) : e) + }, t.prototype.downSample = function (t, e, n, i) { + var r = Fm(this); + return r._store = this._store.downSample(this._getStoreDimIndex(t), e, n, i), r + }, t.prototype.lttbDownSample = function (t, e) { + var n = Fm(this); + return n._store = this._store.lttbDownSample(this._getStoreDimIndex(t), e), n + }, t.prototype.getRawDataItem = function (t) { + return this._store.getRawDataItem(t) + }, t.prototype.getItemModel = function (t) { + var e = this.hostModel, n = this.getRawDataItem(t); + return new pc(n, e, e && e.ecModel) + }, t.prototype.diff = function (t) { + var e = this; + return new Sm(t ? t.getStore().getIndices() : [], this.getStore().getIndices(), (function (e) { + return Em(t, e) + }), (function (t) { + return Em(e, t) + })) + }, t.prototype.getVisual = function (t) { + var e = this._visual; + return e && e[t] + }, t.prototype.setVisual = function (t, e) { + this._visual = this._visual || {}, Wm(t) ? A(this._visual, t) : this._visual[t] = e + }, t.prototype.getItemVisual = function (t, e) { + var n = this._itemVisuals[t], i = n && n[e]; + return null == i ? this.getVisual(e) : i + }, t.prototype.hasItemVisual = function () { + return this._itemVisuals.length > 0 + }, t.prototype.ensureUniqueItemVisual = function (t, e) { + var n = this._itemVisuals, i = n[t]; + i || (i = n[t] = {}); + var r = i[e]; + return null == r && (Y(r = this.getVisual(e)) ? r = r.slice() : Wm(r) && (r = A({}, r)), i[e] = r), r + }, t.prototype.setItemVisual = function (t, e, n) { + var i = this._itemVisuals[t] || {}; + this._itemVisuals[t] = i, Wm(e) ? A(i, e) : i[e] = n + }, t.prototype.clearAllVisual = function () { + this._visual = {}, this._itemVisuals = [] + }, t.prototype.setLayout = function (t, e) { + Wm(t) ? A(this._layout, t) : this._layout[t] = e + }, t.prototype.getLayout = function (t) { + return this._layout[t] + }, t.prototype.getItemLayout = function (t) { + return this._itemLayouts[t] + }, t.prototype.setItemLayout = function (t, e, n) { + this._itemLayouts[t] = n ? A(this._itemLayouts[t] || {}, e) : e + }, t.prototype.clearItemLayouts = function () { + this._itemLayouts.length = 0 + }, t.prototype.setItemGraphicEl = function (t, e) { + var n = this.hostModel && this.hostModel.seriesIndex; + Hs(n, this.dataType, t, e), this._graphicEls[t] = e + }, t.prototype.getItemGraphicEl = function (t) { + return this._graphicEls[t] + }, t.prototype.eachItemGraphicEl = function (t, e) { + E(this._graphicEls, (function (n, i) { + n && t && t.call(e, n, i) + })) + }, t.prototype.cloneShallow = function (e) { + return e || (e = new t(this._schema ? this._schema : Hm(this.dimensions, this._getDimInfo, this), this.hostModel)), Bm(e, this), e._store = this._store, e + }, t.prototype.wrapMethod = function (t, e) { + var n = this[t]; + U(n) && (this.__wrappedMethods = this.__wrappedMethods || [], this.__wrappedMethods.push(t), this[t] = function () { + var t = n.apply(this, arguments); + return e.apply(this, [t].concat(at(arguments))) + }) + }, t.internalField = (Nm = function (t) { + var e = t._invertedIndicesMap; + E(e, (function (n, i) { + var r = t._dimInfos[i], o = r.ordinalMeta, a = t._store; + if (o) { + n = e[i] = new Ym(o.categories.length); + for (var s = 0; s < n.length; s++) n[s] = -1; + for (s = 0; s < a.count(); s++) n[a.get(r.storeDimIndex, s)] = s + } + })) + }, zm = function (t, e, n) { + return xo(t._getCategory(e, n), null) + }, Em = function (t, e) { + var n = t._idList[e]; + return null == n && null != t._idDimIdx && (n = zm(t, t._idDimIdx, e)), null == n && (n = "e\0\0" + e), n + }, Vm = function (t) { + return Y(t) || (t = null != t ? [t] : []), t + }, Fm = function (e) { + var n = new t(e._schema ? e._schema : Hm(e.dimensions, e._getDimInfo, e), e.hostModel); + return Bm(n, e), n + }, Bm = function (t, e) { + E(Um.concat(e.__wrappedMethods || []), (function (n) { + e.hasOwnProperty(n) && (t[n] = e[n]) + })), t.__wrappedMethods = e.__wrappedMethods, E(Xm, (function (n) { + t[n] = T(e[n]) + })), t._calculationInfo = A({}, e._calculationInfo) + }, void (Gm = function (t, e) { + var n = t._nameList, i = t._idList, r = t._nameDimIdx, o = t._idDimIdx, a = n[e], s = i[e]; + if (null == a && null != r && (n[e] = a = zm(t, r, e)), null == s && null != o && (i[e] = s = zm(t, o, e)), null == s && null != a) { + var l = t._nameRepeatCount, u = l[a] = (l[a] || 0) + 1; + s = a, u > 1 && (s += "__ec__" + u), i[e] = s + } + })), t + }(); + + function jm(t, e) { + Fd(t) || (t = Wd(t)); + var n = (e = e || {}).coordDimensions || [], i = e.dimensionsDefine || t.dimensionsDefine || [], r = ft(), + o = [], a = function (t, e, n, i) { + var r = Math.max(t.dimensionsDetectedCount || 1, e.length, n.length, i || 0); + return E(e, (function (t) { + var e; + q(t) && (e = t.dimsDef) && (r = Math.max(r, e.length)) + })), r + }(t, n, i, e.dimensionsCount), s = e.canOmitUnusedDimensions && Rm(a), l = i === t.dimensionsDefine, + u = l ? Om(t) : Pm(i), h = e.encodeDefine; + !h && e.encodeDefaulter && (h = e.encodeDefaulter(t, a)); + for (var c = ft(h), p = new Pf(a), d = 0; d < p.length; d++) p[d] = -1; + + function f(t) { + var e = p[t]; + if (e < 0) { + var n = i[t], r = q(n) ? n : {name: n}, a = new Cm, s = r.name; + null != s && null != u.get(s) && (a.name = a.displayName = s), null != r.type && (a.type = r.type), null != r.displayName && (a.displayName = r.displayName); + var l = o.length; + return p[t] = l, a.storeDimIndex = t, o.push(a), a + } + return o[e] + } + + if (!s) for (d = 0; d < a; d++) f(d); + c.each((function (t, e) { + var n = ho(t).slice(); + if (1 === n.length && !X(n[0]) && n[0] < 0) c.set(e, !1); else { + var i = c.set(e, []); + E(n, (function (t, n) { + var r = X(t) ? u.get(t) : t; + null != r && r < a && (i[n] = r, y(f(r), e, n)) + })) + } + })); + var g = 0; + + function y(t, e, n) { + null != Ap.get(e) ? t.otherDims[e] = n : (t.coordDim = e, t.coordDimIndex = n, r.set(e, !0)) + } + + E(n, (function (t) { + var e, n, i, r; + if (X(t)) e = t, r = {}; else { + e = (r = t).name; + var o = r.ordinalMeta; + r.ordinalMeta = null, (r = A({}, r)).ordinalMeta = o, n = r.dimsDef, i = r.otherDims, r.name = r.coordDim = r.coordDimIndex = r.dimsDef = r.otherDims = null + } + var s = c.get(e); + if (!1 !== s) { + if (!(s = ho(s)).length) for (var u = 0; u < (n && n.length || 1); u++) { + for (; g < a && null != f(g).coordDim;) g++; + g < a && s.push(g++) + } + E(s, (function (t, o) { + var a = f(t); + if (l && null != r.type && (a.type = r.type), y(k(a, r), e, o), null == a.name && n) { + var s = n[o]; + !q(s) && (s = {name: s}), a.name = a.displayName = s.name, a.defaultTooltip = s.defaultTooltip + } + i && k(a.otherDims, i) + })) + } + })); + var v = e.generateCoord, m = e.generateCoordCount, x = null != m; + m = v ? m || 1 : 0; + var _ = v || "value"; + + function b(t) { + null == t.name && (t.name = t.coordDim) + } + + if (s) E(o, (function (t) { + b(t) + })), o.sort((function (t, e) { + return t.storeDimIndex - e.storeDimIndex + })); else for (var w = 0; w < a; w++) { + var S = f(w); + null == S.coordDim && (S.coordDim = qm(_, r, x), S.coordDimIndex = 0, (!v || m <= 0) && (S.isExtraCoord = !0), m--), b(S), null != S.type || Up(t, w) !== Vp && (!S.isExtraCoord || null == S.otherDims.itemName && null == S.otherDims.seriesName) || (S.type = "ordinal") + } + return function (t) { + for (var e = ft(), n = 0; n < t.length; n++) { + var i = t[n], r = i.name, o = e.get(r) || 0; + o > 0 && (i.name = r + (o - 1)), o++, e.set(r, o) + } + }(o), new km({source: t, dimensions: o, fullDimensionCount: a, dimensionOmitted: s}) + } + + function qm(t, e, n) { + var i = e.data; + if (n || i.hasOwnProperty(t)) { + for (var r = 0; i.hasOwnProperty(t + r);) r++; + t += r + } + return e.set(t, !0), t + } + + var Km = function (t) { + this.coordSysDims = [], this.axisMap = ft(), this.categoryAxisMap = ft(), this.coordSysName = t + }; + var $m = { + cartesian2d: function (t, e, n, i) { + var r = t.getReferringComponents("xAxis", Co).models[0], + o = t.getReferringComponents("yAxis", Co).models[0]; + e.coordSysDims = ["x", "y"], n.set("x", r), n.set("y", o), Jm(r) && (i.set("x", r), e.firstCategoryDimIndex = 0), Jm(o) && (i.set("y", o), null == e.firstCategoryDimIndex && (e.firstCategoryDimIndex = 1)) + }, singleAxis: function (t, e, n, i) { + var r = t.getReferringComponents("singleAxis", Co).models[0]; + e.coordSysDims = ["single"], n.set("single", r), Jm(r) && (i.set("single", r), e.firstCategoryDimIndex = 0) + }, polar: function (t, e, n, i) { + var r = t.getReferringComponents("polar", Co).models[0], o = r.findAxisModel("radiusAxis"), + a = r.findAxisModel("angleAxis"); + e.coordSysDims = ["radius", "angle"], n.set("radius", o), n.set("angle", a), Jm(o) && (i.set("radius", o), e.firstCategoryDimIndex = 0), Jm(a) && (i.set("angle", a), null == e.firstCategoryDimIndex && (e.firstCategoryDimIndex = 1)) + }, geo: function (t, e, n, i) { + e.coordSysDims = ["lng", "lat"] + }, parallel: function (t, e, n, i) { + var r = t.ecModel, o = r.getComponent("parallel", t.get("parallelIndex")), + a = e.coordSysDims = o.dimensions.slice(); + E(o.parallelAxisIndex, (function (t, o) { + var s = r.getComponent("parallelAxis", t), l = a[o]; + n.set(l, s), Jm(s) && (i.set(l, s), null == e.firstCategoryDimIndex && (e.firstCategoryDimIndex = o)) + })) + } + }; + + function Jm(t) { + return "category" === t.get("type") + } + + function Qm(t, e, n) { + var i, r, o, a = (n = n || {}).byIndex, s = n.stackedCoordDimension; + !function (t) { + return !Lm(t.schema) + }(e) ? (r = e.schema, i = r.dimensions, o = e.store) : i = e; + var l, u, h, c, p = !(!t || !t.get("stack")); + if (E(i, (function (t, e) { + X(t) && (i[e] = t = {name: t}), p && !t.isExtraCoord && (a || l || !t.ordinalMeta || (l = t), u || "ordinal" === t.type || "time" === t.type || s && s !== t.coordDim || (u = t)) + })), !u || a || l || (a = !0), u) { + h = "__\0ecstackresult_" + t.id, c = "__\0ecstackedover_" + t.id, l && (l.createInvertedIndices = !0); + var d = u.coordDim, f = u.type, g = 0; + E(i, (function (t) { + t.coordDim === d && g++ + })); + var y = { + name: h, + coordDim: d, + coordDimIndex: g, + type: f, + isExtraCoord: !0, + isCalculationCoord: !0, + storeDimIndex: i.length + }, v = { + name: c, + coordDim: c, + coordDimIndex: g + 1, + type: f, + isExtraCoord: !0, + isCalculationCoord: !0, + storeDimIndex: i.length + 1 + }; + r ? (o && (y.storeDimIndex = o.ensureCalculationDimension(c, f), v.storeDimIndex = o.ensureCalculationDimension(h, f)), r.appendCalculationDimension(y), r.appendCalculationDimension(v)) : (i.push(y), i.push(v)) + } + return { + stackedDimension: u && u.name, + stackedByDimension: l && l.name, + isStackedByIndex: a, + stackedOverDimension: c, + stackResultDimension: h + } + } + + function tx(t, e) { + return !!e && e === t.getCalculationInfo("stackedDimension") + } + + function ex(t, e) { + return tx(t, e) ? t.getCalculationInfo("stackResultDimension") : e + } + + function nx(t, e, n) { + n = n || {}; + var i, r = e.getSourceManager(), o = !1; + t ? (o = !0, i = Wd(t)) : o = (i = r.getSource()).sourceFormat === kp; + var a = function (t) { + var e = t.get("coordinateSystem"), n = new Km(e), i = $m[e]; + if (i) return i(t, n, n.axisMap, n.categoryAxisMap), n + }(e), s = function (t, e) { + var n, i = t.get("coordinateSystem"), r = ud.get(i); + return e && e.coordSysDims && (n = z(e.coordSysDims, (function (t) { + var n = {name: t}, i = e.axisMap.get(t); + if (i) { + var r = i.get("type"); + n.type = Tm(r) + } + return n + }))), n || (n = r && (r.getDimensionsInfo ? r.getDimensionsInfo() : r.dimensions.slice()) || ["x", "y"]), n + }(e, a), l = n.useEncodeDefaulter, u = U(l) ? l : l ? H(Wp, s, e) : null, h = jm(i, { + coordDimensions: s, + generateCoord: n.generateCoord, + encodeDefine: e.getEncode(), + encodeDefaulter: u, + canOmitUnusedDimensions: !o + }), c = function (t, e, n) { + var i, r; + return n && E(t, (function (t, o) { + var a = t.coordDim, s = n.categoryAxisMap.get(a); + s && (null == i && (i = o), t.ordinalMeta = s.getOrdinalMeta(), e && (t.createInvertedIndices = !0)), null != t.otherDims.itemName && (r = !0) + })), r || null == i || (t[i].otherDims.itemName = 0), i + }(h.dimensions, n.createInvertedIndices, a), p = o ? null : r.getSharedDataStore(h), + d = Qm(e, {schema: h, store: p}), f = new Zm(h, e); + f.setCalculationInfo(d); + var g = null != c && function (t) { + if (t.sourceFormat === kp) { + return !Y(fo(function (t) { + var e = 0; + for (; e < t.length && null == t[e];) e++; + return t[e] + }(t.data || []))) + } + }(i) ? function (t, e, n, i) { + return i === c ? n : this.defaultDimValueGetter(t, e, n, i) + } : null; + return f.hasItemOption = !1, f.initData(o ? i : p, null, g), f + } + + var ix = function () { + function t(t) { + this._setting = t || {}, this._extent = [1 / 0, -1 / 0] + } + + return t.prototype.getSetting = function (t) { + return this._setting[t] + }, t.prototype.unionExtent = function (t) { + var e = this._extent; + t[0] < e[0] && (e[0] = t[0]), t[1] > e[1] && (e[1] = t[1]) + }, t.prototype.unionExtentFromData = function (t, e) { + this.unionExtent(t.getApproximateExtent(e)) + }, t.prototype.getExtent = function () { + return this._extent.slice() + }, t.prototype.setExtent = function (t, e) { + var n = this._extent; + isNaN(t) || (n[0] = t), isNaN(e) || (n[1] = e) + }, t.prototype.isInExtentRange = function (t) { + return this._extent[0] <= t && this._extent[1] >= t + }, t.prototype.isBlank = function () { + return this._isBlank + }, t.prototype.setBlank = function (t) { + this._isBlank = t + }, t + }(); + Go(ix); + var rx = 0, ox = function () { + function t(t) { + this.categories = t.categories || [], this._needCollect = t.needCollect, this._deduplication = t.deduplication, this.uid = ++rx + } + + return t.createByAxisModel = function (e) { + var n = e.option, i = n.data, r = i && z(i, ax); + return new t({categories: r, needCollect: !r, deduplication: !1 !== n.dedplication}) + }, t.prototype.getOrdinal = function (t) { + return this._getOrCreateMap().get(t) + }, t.prototype.parseAndCollect = function (t) { + var e, n = this._needCollect; + if (!X(t) && !n) return t; + if (n && !this._deduplication) return e = this.categories.length, this.categories[e] = t, e; + var i = this._getOrCreateMap(); + return null == (e = i.get(t)) && (n ? (e = this.categories.length, this.categories[e] = t, i.set(t, e)) : e = NaN), e + }, t.prototype._getOrCreateMap = function () { + return this._map || (this._map = ft(this.categories)) + }, t + }(); + + function ax(t) { + return q(t) && null != t.value ? t.value : t + "" + } + + function sx(t) { + return "interval" === t.type || "log" === t.type + } + + function lx(t, e, n, i) { + var r = {}, o = t[1] - t[0], a = r.interval = $r(o / e, !0); + null != n && a < n && (a = r.interval = n), null != i && a > i && (a = r.interval = i); + var s = r.intervalPrecision = hx(a); + return function (t, e) { + !isFinite(t[0]) && (t[0] = e[0]), !isFinite(t[1]) && (t[1] = e[1]), cx(t, 0, e), cx(t, 1, e), t[0] > t[1] && (t[0] = t[1]) + }(r.niceTickExtent = [zr(Math.ceil(t[0] / a) * a, s), zr(Math.floor(t[1] / a) * a, s)], t), r + } + + function ux(t) { + var e = Math.pow(10, Kr(t)), n = t / e; + return n ? 2 === n ? n = 3 : 3 === n ? n = 5 : n *= 2 : n = 1, zr(n * e) + } + + function hx(t) { + return Br(t) + 2 + } + + function cx(t, e, n) { + t[e] = Math.max(Math.min(t[e], n[1]), n[0]) + } + + function px(t, e) { + return t >= e[0] && t <= e[1] + } + + function dx(t, e) { + return e[1] === e[0] ? .5 : (t - e[0]) / (e[1] - e[0]) + } + + function fx(t, e) { + return t * (e[1] - e[0]) + e[0] + } + + var gx = function (t) { + function e(e) { + var n = t.call(this, e) || this; + n.type = "ordinal"; + var i = n.getSetting("ordinalMeta"); + return i || (i = new ox({})), Y(i) && (i = new ox({ + categories: z(i, (function (t) { + return q(t) ? t.value : t + })) + })), n._ordinalMeta = i, n._extent = n.getSetting("extent") || [0, i.categories.length - 1], n + } + + return n(e, t), e.prototype.parse = function (t) { + return X(t) ? this._ordinalMeta.getOrdinal(t) : Math.round(t) + }, e.prototype.contain = function (t) { + return px(t = this.parse(t), this._extent) && null != this._ordinalMeta.categories[t] + }, e.prototype.normalize = function (t) { + return dx(t = this._getTickNumber(this.parse(t)), this._extent) + }, e.prototype.scale = function (t) { + return t = Math.round(fx(t, this._extent)), this.getRawOrdinalNumber(t) + }, e.prototype.getTicks = function () { + for (var t = [], e = this._extent, n = e[0]; n <= e[1];) t.push({value: n}), n++; + return t + }, e.prototype.getMinorTicks = function (t) { + }, e.prototype.setSortInfo = function (t) { + if (null != t) { + for (var e = t.ordinalNumbers, n = this._ordinalNumbersByTick = [], i = this._ticksByOrdinalNumber = [], r = 0, o = this._ordinalMeta.categories.length, a = Math.min(o, e.length); r < a; ++r) { + var s = e[r]; + n[r] = s, i[s] = r + } + for (var l = 0; r < o; ++r) { + for (; null != i[l];) l++; + n.push(l), i[l] = r + } + } else this._ordinalNumbersByTick = this._ticksByOrdinalNumber = null + }, e.prototype._getTickNumber = function (t) { + var e = this._ticksByOrdinalNumber; + return e && t >= 0 && t < e.length ? e[t] : t + }, e.prototype.getRawOrdinalNumber = function (t) { + var e = this._ordinalNumbersByTick; + return e && t >= 0 && t < e.length ? e[t] : t + }, e.prototype.getLabel = function (t) { + if (!this.isBlank()) { + var e = this.getRawOrdinalNumber(t.value), n = this._ordinalMeta.categories[e]; + return null == n ? "" : n + "" + } + }, e.prototype.count = function () { + return this._extent[1] - this._extent[0] + 1 + }, e.prototype.unionExtentFromData = function (t, e) { + this.unionExtent(t.getApproximateExtent(e)) + }, e.prototype.isInExtentRange = function (t) { + return t = this._getTickNumber(t), this._extent[0] <= t && this._extent[1] >= t + }, e.prototype.getOrdinalMeta = function () { + return this._ordinalMeta + }, e.prototype.calcNiceTicks = function () { + }, e.prototype.calcNiceExtent = function () { + }, e.type = "ordinal", e + }(ix); + ix.registerClass(gx); + var yx = zr, vx = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.type = "interval", e._interval = 0, e._intervalPrecision = 2, e + } + + return n(e, t), e.prototype.parse = function (t) { + return t + }, e.prototype.contain = function (t) { + return px(t, this._extent) + }, e.prototype.normalize = function (t) { + return dx(t, this._extent) + }, e.prototype.scale = function (t) { + return fx(t, this._extent) + }, e.prototype.setExtent = function (t, e) { + var n = this._extent; + isNaN(t) || (n[0] = parseFloat(t)), isNaN(e) || (n[1] = parseFloat(e)) + }, e.prototype.unionExtent = function (t) { + var e = this._extent; + t[0] < e[0] && (e[0] = t[0]), t[1] > e[1] && (e[1] = t[1]), this.setExtent(e[0], e[1]) + }, e.prototype.getInterval = function () { + return this._interval + }, e.prototype.setInterval = function (t) { + this._interval = t, this._niceExtent = this._extent.slice(), this._intervalPrecision = hx(t) + }, e.prototype.getTicks = function (t) { + var e = this._interval, n = this._extent, i = this._niceExtent, r = this._intervalPrecision, o = []; + if (!e) return o; + n[0] < i[0] && (t ? o.push({value: yx(i[0] - e, r)}) : o.push({value: n[0]})); + for (var a = i[0]; a <= i[1] && (o.push({value: a}), (a = yx(a + e, r)) !== o[o.length - 1].value);) if (o.length > 1e4) return []; + var s = o.length ? o[o.length - 1].value : i[1]; + return n[1] > s && (t ? o.push({value: yx(s + e, r)}) : o.push({value: n[1]})), o + }, e.prototype.getMinorTicks = function (t) { + for (var e = this.getTicks(!0), n = [], i = this.getExtent(), r = 1; r < e.length; r++) { + for (var o = e[r], a = e[r - 1], s = 0, l = [], u = (o.value - a.value) / t; s < t - 1;) { + var h = yx(a.value + (s + 1) * u); + h > i[0] && h < i[1] && l.push(h), s++ + } + n.push(l) + } + return n + }, e.prototype.getLabel = function (t, e) { + if (null == t) return ""; + var n = e && e.precision; + return null == n ? n = Br(t.value) || 0 : "auto" === n && (n = this._intervalPrecision), tp(yx(t.value, n, !0)) + }, e.prototype.calcNiceTicks = function (t, e, n) { + t = t || 5; + var i = this._extent, r = i[1] - i[0]; + if (isFinite(r)) { + r < 0 && (r = -r, i.reverse()); + var o = lx(i, t, e, n); + this._intervalPrecision = o.intervalPrecision, this._interval = o.interval, this._niceExtent = o.niceTickExtent + } + }, e.prototype.calcNiceExtent = function (t) { + var e = this._extent; + if (e[0] === e[1]) if (0 !== e[0]) { + var n = e[0]; + t.fixMax || (e[1] += n / 2), e[0] -= n / 2 + } else e[1] = 1; + var i = e[1] - e[0]; + isFinite(i) || (e[0] = 0, e[1] = 1), this.calcNiceTicks(t.splitNumber, t.minInterval, t.maxInterval); + var r = this._interval; + t.fixMin || (e[0] = yx(Math.floor(e[0] / r) * r)), t.fixMax || (e[1] = yx(Math.ceil(e[1] / r) * r)) + }, e.prototype.setNiceExtent = function (t, e) { + this._niceExtent = [t, e] + }, e.type = "interval", e + }(ix); + ix.registerClass(vx); + var mx = "undefined" != typeof Float32Array, xx = mx ? Float32Array : Array; + + function _x(t) { + return Y(t) ? mx ? new Float32Array(t) : t : new xx(t) + } + + var bx = "__ec_stack_"; + + function Sx(t) { + return t.get("stack") || bx + t.seriesIndex + } + + function Mx(t) { + return t.dim + t.index + } + + function Ix(t, e) { + var n = []; + return e.eachSeriesByType(t, (function (t) { + kx(t) && n.push(t) + })), n + } + + function Tx(t) { + var e = function (t) { + var e = {}; + E(t, (function (t) { + var n = t.coordinateSystem.getBaseAxis(); + if ("time" === n.type || "value" === n.type) for (var i = t.getData(), r = n.dim + "_" + n.index, o = i.getDimensionIndex(i.mapDimension(n.dim)), a = i.getStore(), s = 0, l = a.count(); s < l; ++s) { + var u = a.get(o, s); + e[r] ? e[r].push(u) : e[r] = [u] + } + })); + var n = {}; + for (var i in e) if (e.hasOwnProperty(i)) { + var r = e[i]; + if (r) { + r.sort((function (t, e) { + return t - e + })); + for (var o = null, a = 1; a < r.length; ++a) { + var s = r[a] - r[a - 1]; + s > 0 && (o = null === o ? s : Math.min(o, s)) + } + n[i] = o + } + } + return n + }(t), n = []; + return E(t, (function (t) { + var i, r = t.coordinateSystem.getBaseAxis(), o = r.getExtent(); + if ("category" === r.type) i = r.getBandWidth(); else if ("value" === r.type || "time" === r.type) { + var a = r.dim + "_" + r.index, s = e[a], l = Math.abs(o[1] - o[0]), u = r.scale.getExtent(), + h = Math.abs(u[1] - u[0]); + i = s ? l / h * s : l + } else { + var c = t.getData(); + i = Math.abs(o[1] - o[0]) / c.count() + } + var p = Er(t.get("barWidth"), i), d = Er(t.get("barMaxWidth"), i), + f = Er(t.get("barMinWidth") || (Lx(t) ? .5 : 1), i), g = t.get("barGap"), y = t.get("barCategoryGap"); + n.push({ + bandWidth: i, + barWidth: p, + barMaxWidth: d, + barMinWidth: f, + barGap: g, + barCategoryGap: y, + axisKey: Mx(r), + stackId: Sx(t) + }) + })), Cx(n) + } + + function Cx(t) { + var e = {}; + E(t, (function (t, n) { + var i = t.axisKey, r = t.bandWidth, o = e[i] || { + bandWidth: r, + remainedWidth: r, + autoWidthCount: 0, + categoryGap: null, + gap: "20%", + stacks: {} + }, a = o.stacks; + e[i] = o; + var s = t.stackId; + a[s] || o.autoWidthCount++, a[s] = a[s] || {width: 0, maxWidth: 0}; + var l = t.barWidth; + l && !a[s].width && (a[s].width = l, l = Math.min(o.remainedWidth, l), o.remainedWidth -= l); + var u = t.barMaxWidth; + u && (a[s].maxWidth = u); + var h = t.barMinWidth; + h && (a[s].minWidth = h); + var c = t.barGap; + null != c && (o.gap = c); + var p = t.barCategoryGap; + null != p && (o.categoryGap = p) + })); + var n = {}; + return E(e, (function (t, e) { + n[e] = {}; + var i = t.stacks, r = t.bandWidth, o = t.categoryGap; + if (null == o) { + var a = G(i).length; + o = Math.max(35 - 4 * a, 15) + "%" + } + var s = Er(o, r), l = Er(t.gap, 1), u = t.remainedWidth, h = t.autoWidthCount, + c = (u - s) / (h + (h - 1) * l); + c = Math.max(c, 0), E(i, (function (t) { + var e = t.maxWidth, n = t.minWidth; + if (t.width) { + i = t.width; + e && (i = Math.min(i, e)), n && (i = Math.max(i, n)), t.width = i, u -= i + l * i, h-- + } else { + var i = c; + e && e < i && (i = Math.min(e, u)), n && n > i && (i = n), i !== c && (t.width = i, u -= i + l * i, h--) + } + })), c = (u - s) / (h + (h - 1) * l), c = Math.max(c, 0); + var p, d = 0; + E(i, (function (t, e) { + t.width || (t.width = c), p = t, d += t.width * (1 + l) + })), p && (d -= p.width * l); + var f = -d / 2; + E(i, (function (t, i) { + n[e][i] = n[e][i] || {bandWidth: r, offset: f, width: t.width}, f += t.width * (1 + l) + })) + })), n + } + + function Dx(t, e) { + var n = Ix(t, e), i = Tx(n); + E(n, (function (t) { + var e = t.getData(), n = t.coordinateSystem.getBaseAxis(), r = Sx(t), o = i[Mx(n)][r], a = o.offset, + s = o.width; + e.setLayout({bandWidth: o.bandWidth, offset: a, size: s}) + })) + } + + function Ax(t) { + return { + seriesType: t, plan: gg(), reset: function (t) { + if (kx(t)) { + var e = t.getData(), n = t.coordinateSystem, i = n.getBaseAxis(), r = n.getOtherAxis(i), + o = e.getDimensionIndex(e.mapDimension(r.dim)), a = e.getDimensionIndex(e.mapDimension(i.dim)), + s = t.get("showBackground", !0), l = e.mapDimension(r.dim), + u = e.getCalculationInfo("stackResultDimension"), + h = tx(e, l) && !!e.getCalculationInfo("stackedOnSeries"), c = r.isHorizontal(), + p = function (t, e) { + return e.toGlobalCoord(e.dataToCoord("log" === e.type ? 1 : 0)) + }(0, r), d = Lx(t), f = t.get("barMinHeight") || 0, g = u && e.getDimensionIndex(u), + y = e.getLayout("size"), v = e.getLayout("offset"); + return { + progress: function (t, e) { + for (var i, r = t.count, l = d && _x(3 * r), u = d && s && _x(3 * r), m = d && _x(r), x = n.master.getRect(), _ = c ? x.width : x.height, b = e.getStore(), w = 0; null != (i = t.next());) { + var S = b.get(h ? g : o, i), M = b.get(a, i), I = p, T = void 0; + h && (T = +S - b.get(o, i)); + var C = void 0, D = void 0, A = void 0, k = void 0; + if (c) { + var L = n.dataToPoint([S, M]); + if (h) I = n.dataToPoint([T, M])[0]; + C = I, D = L[1] + v, A = L[0] - I, k = y, Math.abs(A) < f && (A = (A < 0 ? -1 : 1) * f) + } else { + L = n.dataToPoint([M, S]); + if (h) I = n.dataToPoint([M, T])[1]; + C = L[0] + v, D = I, A = y, k = L[1] - I, Math.abs(k) < f && (k = (k <= 0 ? -1 : 1) * f) + } + d ? (l[w] = C, l[w + 1] = D, l[w + 2] = c ? A : k, u && (u[w] = c ? x.x : C, u[w + 1] = c ? D : x.y, u[w + 2] = _), m[i] = i) : e.setItemLayout(i, { + x: C, + y: D, + width: A, + height: k + }), w += 3 + } + d && e.setLayout({ + largePoints: l, + largeDataIndices: m, + largeBackgroundPoints: u, + valueAxisHorizontal: c + }) + } + } + } + } + } + } + + function kx(t) { + return t.coordinateSystem && "cartesian2d" === t.coordinateSystem.type + } + + function Lx(t) { + return t.pipelineContext && t.pipelineContext.large + } + + var Px = function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n.type = "time", n + } + + return n(e, t), e.prototype.getLabel = function (t) { + var e = this.getSetting("useUTC"); + return zc(t.value, Lc[function (t) { + switch (t) { + case"year": + case"month": + return "day"; + case"millisecond": + return "millisecond"; + default: + return "second" + } + }(Nc(this._minLevelUnit))] || Lc.second, e, this.getSetting("locale")) + }, e.prototype.getFormattedLabel = function (t, e, n) { + var i = this.getSetting("useUTC"); + return function (t, e, n, i, r) { + var o = null; + if (X(n)) o = n; else if (U(n)) o = n(t.value, e, {level: t.level}); else { + var a = A({}, Ac); + if (t.level > 0) for (var s = 0; s < Pc.length; ++s) a[Pc[s]] = "{primary|" + a[Pc[s]] + "}"; + var l = n ? !1 === n.inherit ? n : k(n, a) : a, u = Vc(t.value, r); + if (l[u]) o = l[u]; else if (l.inherit) { + for (s = Oc.indexOf(u) - 1; s >= 0; --s) if (l[u]) { + o = l[u]; + break + } + o = o || a.none + } + if (Y(o)) { + var h = null == t.level ? 0 : t.level >= 0 ? t.level : o.length + t.level; + o = o[h = Math.min(h, o.length - 1)] + } + } + return zc(new Date(t.value), o, r, i) + }(t, e, n, this.getSetting("locale"), i) + }, e.prototype.getTicks = function () { + var t = this._interval, e = this._extent, n = []; + if (!t) return n; + n.push({value: e[0], level: 0}); + var i = this.getSetting("useUTC"), r = function (t, e, n, i) { + var r = 1e4, o = Oc, a = 0; + + function s(t, e, n, r, o, a, s) { + for (var l = new Date(e), u = e, h = l[r](); u < n && u <= i[1];) s.push({value: u}), h += t, l[o](h), u = l.getTime(); + s.push({value: u, notAdd: !0}) + } + + function l(t, r, o) { + var a = [], l = !r.length; + if (!function (t, e, n, i) { + var r = jr(e), o = jr(n), a = function (t) { + return Bc(r, t, i) === Bc(o, t, i) + }, s = function () { + return a("year") + }, l = function () { + return s() && a("month") + }, u = function () { + return l() && a("day") + }, h = function () { + return u() && a("hour") + }, c = function () { + return h() && a("minute") + }, p = function () { + return c() && a("second") + }, d = function () { + return p() && a("millisecond") + }; + switch (t) { + case"year": + return s(); + case"month": + return l(); + case"day": + return u(); + case"hour": + return h(); + case"minute": + return c(); + case"second": + return p(); + case"millisecond": + return d() + } + }(Nc(t), i[0], i[1], n)) { + l && (r = [{value: Bx(new Date(i[0]), t, n)}, {value: i[1]}]); + for (var u = 0; u < r.length - 1; u++) { + var h = r[u].value, c = r[u + 1].value; + if (h !== c) { + var p = void 0, d = void 0, f = void 0, g = !1; + switch (t) { + case"year": + p = Math.max(1, Math.round(e / Cc / 365)), d = Fc(n), f = Zc(n); + break; + case"half-year": + case"quarter": + case"month": + p = Nx(e), d = Gc(n), f = jc(n); + break; + case"week": + case"half-week": + case"day": + p = Rx(e), d = Wc(n), f = qc(n), g = !0; + break; + case"half-day": + case"quarter-day": + case"hour": + p = Ex(e), d = Hc(n), f = Kc(n); + break; + case"minute": + p = zx(e, !0), d = Yc(n), f = $c(n); + break; + case"second": + p = zx(e, !1), d = Uc(n), f = Jc(n); + break; + case"millisecond": + p = Vx(e), d = Xc(n), f = Qc(n) + } + s(p, h, c, d, f, g, a), "year" === t && o.length > 1 && 0 === u && o.unshift({value: o[0].value - p}) + } + } + for (u = 0; u < a.length; u++) o.push(a[u]); + return a + } + } + + for (var u = [], h = [], c = 0, p = 0, d = 0; d < o.length && a++ < r; ++d) { + var f = Nc(o[d]); + if (Ec(o[d])) if (l(o[d], u[u.length - 1] || [], h), f !== (o[d + 1] ? Nc(o[d + 1]) : null)) { + if (h.length) { + p = c, h.sort((function (t, e) { + return t.value - e.value + })); + for (var g = [], y = 0; y < h.length; ++y) { + var v = h[y].value; + 0 !== y && h[y - 1].value === v || (g.push(h[y]), v >= i[0] && v <= i[1] && c++) + } + var m = (i[1] - i[0]) / e; + if (c > 1.5 * m && p > m / 1.5) break; + if (u.push(g), c > m || t === o[d]) break + } + h = [] + } + } + 0; + var x = B(z(u, (function (t) { + return B(t, (function (t) { + return t.value >= i[0] && t.value <= i[1] && !t.notAdd + })) + })), (function (t) { + return t.length > 0 + })), _ = [], b = x.length - 1; + for (d = 0; d < x.length; ++d) for (var w = x[d], S = 0; S < w.length; ++S) _.push({ + value: w[S].value, + level: b - d + }); + _.sort((function (t, e) { + return t.value - e.value + })); + var M = []; + for (d = 0; d < _.length; ++d) 0 !== d && _[d].value === _[d - 1].value || M.push(_[d]); + return M + }(this._minLevelUnit, this._approxInterval, i, e); + return (n = n.concat(r)).push({value: e[1], level: 0}), n + }, e.prototype.calcNiceExtent = function (t) { + var e = this._extent; + if (e[0] === e[1] && (e[0] -= Cc, e[1] += Cc), e[1] === -1 / 0 && e[0] === 1 / 0) { + var n = new Date; + e[1] = +new Date(n.getFullYear(), n.getMonth(), n.getDate()), e[0] = e[1] - Cc + } + this.calcNiceTicks(t.splitNumber, t.minInterval, t.maxInterval) + }, e.prototype.calcNiceTicks = function (t, e, n) { + t = t || 10; + var i = this._extent, r = i[1] - i[0]; + this._approxInterval = r / t, null != e && this._approxInterval < e && (this._approxInterval = e), null != n && this._approxInterval > n && (this._approxInterval = n); + var o = Ox.length, a = Math.min(function (t, e, n, i) { + for (; n < i;) { + var r = n + i >>> 1; + t[r][1] < e ? n = r + 1 : i = r + } + return n + }(Ox, this._approxInterval, 0, o), o - 1); + this._interval = Ox[a][1], this._minLevelUnit = Ox[Math.max(a - 1, 0)][0] + }, e.prototype.parse = function (t) { + return j(t) ? t : +jr(t) + }, e.prototype.contain = function (t) { + return px(this.parse(t), this._extent) + }, e.prototype.normalize = function (t) { + return dx(this.parse(t), this._extent) + }, e.prototype.scale = function (t) { + return fx(t, this._extent) + }, e.type = "time", e + }(vx), + Ox = [["second", Mc], ["minute", Ic], ["hour", Tc], ["quarter-day", 216e5], ["half-day", 432e5], ["day", 10368e4], ["half-week", 3024e5], ["week", 6048e5], ["month", 26784e5], ["quarter", 8208e6], ["half-year", Dc / 2], ["year", Dc]]; + + function Rx(t, e) { + return (t /= Cc) > 16 ? 16 : t > 7.5 ? 7 : t > 3.5 ? 4 : t > 1.5 ? 2 : 1 + } + + function Nx(t) { + return (t /= 2592e6) > 6 ? 6 : t > 3 ? 3 : t > 2 ? 2 : 1 + } + + function Ex(t) { + return (t /= Tc) > 12 ? 12 : t > 6 ? 6 : t > 3.5 ? 4 : t > 2 ? 2 : 1 + } + + function zx(t, e) { + return (t /= e ? Ic : Mc) > 30 ? 30 : t > 20 ? 20 : t > 15 ? 15 : t > 10 ? 10 : t > 5 ? 5 : t > 2 ? 2 : 1 + } + + function Vx(t) { + return $r(t, !0) + } + + function Bx(t, e, n) { + var i = new Date(t); + switch (Nc(e)) { + case"year": + case"month": + i[jc(n)](0); + case"day": + i[qc(n)](1); + case"hour": + i[Kc(n)](0); + case"minute": + i[$c(n)](0); + case"second": + i[Jc(n)](0), i[Qc(n)](0) + } + return i.getTime() + } + + ix.registerClass(Px); + var Fx = ix.prototype, Gx = vx.prototype, Wx = zr, Hx = Math.floor, Yx = Math.ceil, Ux = Math.pow, Xx = Math.log, + Zx = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.type = "log", e.base = 10, e._originalScale = new vx, e._interval = 0, e + } + + return n(e, t), e.prototype.getTicks = function (t) { + var e = this._originalScale, n = this._extent, i = e.getExtent(); + return z(Gx.getTicks.call(this, t), (function (t) { + var e = t.value, r = zr(Ux(this.base, e)); + return r = e === n[0] && this._fixMin ? qx(r, i[0]) : r, {value: r = e === n[1] && this._fixMax ? qx(r, i[1]) : r} + }), this) + }, e.prototype.setExtent = function (t, e) { + var n = this.base; + t = Xx(t) / Xx(n), e = Xx(e) / Xx(n), Gx.setExtent.call(this, t, e) + }, e.prototype.getExtent = function () { + var t = this.base, e = Fx.getExtent.call(this); + e[0] = Ux(t, e[0]), e[1] = Ux(t, e[1]); + var n = this._originalScale.getExtent(); + return this._fixMin && (e[0] = qx(e[0], n[0])), this._fixMax && (e[1] = qx(e[1], n[1])), e + }, e.prototype.unionExtent = function (t) { + this._originalScale.unionExtent(t); + var e = this.base; + t[0] = Xx(t[0]) / Xx(e), t[1] = Xx(t[1]) / Xx(e), Fx.unionExtent.call(this, t) + }, e.prototype.unionExtentFromData = function (t, e) { + this.unionExtent(t.getApproximateExtent(e)) + }, e.prototype.calcNiceTicks = function (t) { + t = t || 10; + var e = this._extent, n = e[1] - e[0]; + if (!(n === 1 / 0 || n <= 0)) { + var i = qr(n); + for (t / n * i <= .5 && (i *= 10); !isNaN(i) && Math.abs(i) < 1 && Math.abs(i) > 0;) i *= 10; + var r = [zr(Yx(e[0] / i) * i), zr(Hx(e[1] / i) * i)]; + this._interval = i, this._niceExtent = r + } + }, e.prototype.calcNiceExtent = function (t) { + Gx.calcNiceExtent.call(this, t), this._fixMin = t.fixMin, this._fixMax = t.fixMax + }, e.prototype.parse = function (t) { + return t + }, e.prototype.contain = function (t) { + return px(t = Xx(t) / Xx(this.base), this._extent) + }, e.prototype.normalize = function (t) { + return dx(t = Xx(t) / Xx(this.base), this._extent) + }, e.prototype.scale = function (t) { + return t = fx(t, this._extent), Ux(this.base, t) + }, e.type = "log", e + }(ix), jx = Zx.prototype; + + function qx(t, e) { + return Wx(t, Br(e)) + } + + jx.getMinorTicks = Gx.getMinorTicks, jx.getLabel = Gx.getLabel, ix.registerClass(Zx); + var Kx = function () { + function t(t, e, n) { + this._prepareParams(t, e, n) + } + + return t.prototype._prepareParams = function (t, e, n) { + n[1] < n[0] && (n = [NaN, NaN]), this._dataMin = n[0], this._dataMax = n[1]; + var i = this._isOrdinal = "ordinal" === t.type; + this._needCrossZero = "interval" === t.type && e.getNeedCrossZero && e.getNeedCrossZero(); + var r = this._modelMinRaw = e.get("min", !0); + U(r) ? this._modelMinNum = t_(t, r({ + min: n[0], + max: n[1] + })) : "dataMin" !== r && (this._modelMinNum = t_(t, r)); + var o = this._modelMaxRaw = e.get("max", !0); + if (U(o) ? this._modelMaxNum = t_(t, o({ + min: n[0], + max: n[1] + })) : "dataMax" !== o && (this._modelMaxNum = t_(t, o)), i) this._axisDataLen = e.getCategories().length; else { + var a = e.get("boundaryGap"), s = Y(a) ? a : [a || 0, a || 0]; + "boolean" == typeof s[0] || "boolean" == typeof s[1] ? this._boundaryGapInner = [0, 0] : this._boundaryGapInner = [gr(s[0], 1), gr(s[1], 1)] + } + }, t.prototype.calculate = function () { + var t = this._isOrdinal, e = this._dataMin, n = this._dataMax, i = this._axisDataLen, + r = this._boundaryGapInner, o = t ? null : n - e || Math.abs(e), + a = "dataMin" === this._modelMinRaw ? e : this._modelMinNum, + s = "dataMax" === this._modelMaxRaw ? n : this._modelMaxNum, l = null != a, u = null != s; + null == a && (a = t ? i ? 0 : NaN : e - r[0] * o), null == s && (s = t ? i ? i - 1 : NaN : n + r[1] * o), (null == a || !isFinite(a)) && (a = NaN), (null == s || !isFinite(s)) && (s = NaN); + var h = nt(a) || nt(s) || t && !i; + this._needCrossZero && (a > 0 && s > 0 && !l && (a = 0), a < 0 && s < 0 && !u && (s = 0)); + var c = this._determinedMin, p = this._determinedMax; + return null != c && (a = c, l = !0), null != p && (s = p, u = !0), { + min: a, + max: s, + minFixed: l, + maxFixed: u, + isBlank: h + } + }, t.prototype.modifyDataMinMax = function (t, e) { + this[Jx[t]] = e + }, t.prototype.setDeterminedMinMax = function (t, e) { + var n = $x[t]; + this[n] = e + }, t.prototype.freeze = function () { + this.frozen = !0 + }, t + }(), $x = {min: "_determinedMin", max: "_determinedMax"}, Jx = {min: "_dataMin", max: "_dataMax"}; + + function Qx(t, e, n) { + var i = t.rawExtentInfo; + return i || (i = new Kx(t, e, n), t.rawExtentInfo = i, i) + } + + function t_(t, e) { + return null == e ? null : nt(e) ? NaN : t.parse(e) + } + + function e_(t, e) { + var n = t.type, i = Qx(t, e, t.getExtent()).calculate(); + t.setBlank(i.isBlank); + var r = i.min, o = i.max, a = e.ecModel; + if (a && "time" === n) { + var s = Ix("bar", a), l = !1; + if (E(s, (function (t) { + l = l || t.getBaseAxis() === e.axis + })), l) { + var u = Tx(s), h = function (t, e, n, i) { + var r = n.axis.getExtent(), o = r[1] - r[0], a = function (t, e, n) { + if (t && e) { + var i = t[Mx(e)]; + return null != i && null != n ? i[Sx(n)] : i + } + }(i, n.axis); + if (void 0 === a) return {min: t, max: e}; + var s = 1 / 0; + E(a, (function (t) { + s = Math.min(t.offset, s) + })); + var l = -1 / 0; + E(a, (function (t) { + l = Math.max(t.offset + t.width, l) + })), s = Math.abs(s), l = Math.abs(l); + var u = s + l, h = e - t, c = h / (1 - (s + l) / o) - h; + return {min: t -= c * (s / u), max: e += c * (l / u)} + }(r, o, e, u); + r = h.min, o = h.max + } + } + return {extent: [r, o], fixMin: i.minFixed, fixMax: i.maxFixed} + } + + function n_(t, e) { + var n = e, i = e_(t, n), r = i.extent, o = n.get("splitNumber"); + t instanceof Zx && (t.base = n.get("logBase")); + var a = t.type, s = n.get("interval"), l = "interval" === a || "time" === a; + t.setExtent(r[0], r[1]), t.calcNiceExtent({ + splitNumber: o, + fixMin: i.fixMin, + fixMax: i.fixMax, + minInterval: l ? n.get("minInterval") : null, + maxInterval: l ? n.get("maxInterval") : null + }), null != s && t.setInterval && t.setInterval(s) + } + + function i_(t, e) { + if (e = e || t.get("type")) switch (e) { + case"category": + return new gx({ + ordinalMeta: t.getOrdinalMeta ? t.getOrdinalMeta() : t.getCategories(), + extent: [1 / 0, -1 / 0] + }); + case"time": + return new Px({locale: t.ecModel.getLocaleModel(), useUTC: t.ecModel.get("useUTC")}); + default: + return new (ix.getClass(e) || vx) + } + } + + function r_(t) { + var e, n, i = t.getLabelModel().get("formatter"), r = "category" === t.type ? t.scale.getExtent()[0] : null; + return "time" === t.scale.type ? (n = i, function (e, i) { + return t.scale.getFormattedLabel(e, i, n) + }) : X(i) ? function (e) { + return function (n) { + var i = t.scale.getLabel(n); + return e.replace("{value}", null != i ? i : "") + } + }(i) : U(i) ? (e = i, function (n, i) { + return null != r && (i = n.value - r), e(o_(t, n), i, null != n.level ? {level: n.level} : null) + }) : function (e) { + return t.scale.getLabel(e) + } + } + + function o_(t, e) { + return "category" === t.type ? t.scale.getLabel(e) : e.value + } + + function a_(t, e) { + var n = e * Math.PI / 180, i = t.width, r = t.height, o = i * Math.abs(Math.cos(n)) + Math.abs(r * Math.sin(n)), + a = i * Math.abs(Math.sin(n)) + Math.abs(r * Math.cos(n)); + return new sr(t.x, t.y, o, a) + } + + function s_(t) { + var e = t.get("interval"); + return null == e ? "auto" : e + } + + function l_(t) { + return "category" === t.type && 0 === s_(t.getLabelModel()) + } + + function u_(t, e) { + var n = {}; + return E(t.mapDimensionsAll(e), (function (e) { + n[ex(t, e)] = !0 + })), G(n) + } + + var h_ = function () { + function t() { + } + + return t.prototype.getNeedCrossZero = function () { + return !this.option.scale + }, t.prototype.getCoordSysModel = function () { + }, t + }(); + var c_ = {isDimensionStacked: tx, enableDataStack: Qm, getStackedDimension: ex}; + var p_ = Object.freeze({ + __proto__: null, createList: function (t) { + return nx(null, t) + }, getLayoutRect: mp, dataStack: c_, createScale: function (t, e) { + var n = e; + e instanceof pc || (n = new pc(e)); + var i = i_(n); + return i.setExtent(t[0], t[1]), n_(i, n), i + }, mixinAxisModelCommonMethods: function (t) { + R(t, h_) + }, getECData: Ws, createTextStyle: function (t, e) { + return Yh(t, null, null, "normal" !== (e = e || {}).state) + }, createDimensions: function (t, e) { + return jm(t, e).dimensions + }, createSymbol: ky, enableHoverEmphasis: Pl + }); + + function d_(t, e) { + return Math.abs(t - e) < 1e-8 + } + + function f_(t, e, n) { + var i = 0, r = t[0]; + if (!r) return !1; + for (var o = 1; o < t.length; o++) { + var a = t[o]; + i += ns(r[0], r[1], a[0], a[1], e, n), r = a + } + var s = t[0]; + return d_(r[0], s[0]) && d_(r[1], s[1]) || (i += ns(r[0], r[1], s[0], s[1], e, n)), 0 !== i + } + + var g_ = []; + + function y_(t, e) { + for (var n = 0; n < t.length; n++) Ft(t[n], t[n], e) + } + + function v_(t, e, n, i) { + for (var r = 0; r < t.length; r++) { + var o = t[r]; + i && (o = i.project(o)), o && isFinite(o[0]) && isFinite(o[1]) && (Gt(e, e, o), Wt(n, n, o)) + } + } + + var m_ = function () { + function t(t) { + this.name = t + } + + return t.prototype.setCenter = function (t) { + this._center = t + }, t.prototype.getCenter = function () { + var t = this._center; + return t || (t = this._center = this.calcCenter()), t + }, t + }(), x_ = function (t, e) { + this.type = "polygon", this.exterior = t, this.interiors = e + }, __ = function (t) { + this.type = "linestring", this.points = t + }, b_ = function (t) { + function e(e, n, i) { + var r = t.call(this, e) || this; + return r.type = "geoJSON", r.geometries = n, r._center = i && [i[0], i[1]], r + } + + return n(e, t), e.prototype.calcCenter = function () { + for (var t, e = this.geometries, n = 0, i = 0; i < e.length; i++) { + var r = e[i], o = r.exterior, a = o && o.length; + a > n && (t = r, n = a) + } + if (t) return function (t) { + for (var e = 0, n = 0, i = 0, r = t.length, o = t[r - 1][0], a = t[r - 1][1], s = 0; s < r; s++) { + var l = t[s][0], u = t[s][1], h = o * u - l * a; + e += h, n += (o + l) * h, i += (a + u) * h, o = l, a = u + } + return e ? [n / e / 3, i / e / 3, e] : [t[0][0] || 0, t[0][1] || 0] + }(t.exterior); + var s = this.getBoundingRect(); + return [s.x + s.width / 2, s.y + s.height / 2] + }, e.prototype.getBoundingRect = function (t) { + var e = this._rect; + if (e && !t) return e; + var n = [1 / 0, 1 / 0], i = [-1 / 0, -1 / 0]; + return E(this.geometries, (function (e) { + "polygon" === e.type ? v_(e.exterior, n, i, t) : E(e.points, (function (e) { + v_(e, n, i, t) + })) + })), isFinite(n[0]) && isFinite(n[1]) && isFinite(i[0]) && isFinite(i[1]) || (n[0] = n[1] = i[0] = i[1] = 0), e = new sr(n[0], n[1], i[0] - n[0], i[1] - n[1]), t || (this._rect = e), e + }, e.prototype.contain = function (t) { + var e = this.getBoundingRect(), n = this.geometries; + if (!e.contain(t[0], t[1])) return !1; + t:for (var i = 0, r = n.length; i < r; i++) { + var o = n[i]; + if ("polygon" === o.type) { + var a = o.exterior, s = o.interiors; + if (f_(a, t[0], t[1])) { + for (var l = 0; l < (s ? s.length : 0); l++) if (f_(s[l], t[0], t[1])) continue t; + return !0 + } + } + } + return !1 + }, e.prototype.transformTo = function (t, e, n, i) { + var r = this.getBoundingRect(), o = r.width / r.height; + n ? i || (i = n / o) : n = o * i; + for (var a = new sr(t, e, n, i), s = r.calculateTransform(a), l = this.geometries, u = 0; u < l.length; u++) { + var h = l[u]; + "polygon" === h.type ? (y_(h.exterior, s), E(h.interiors, (function (t) { + y_(t, s) + }))) : E(h.points, (function (t) { + y_(t, s) + })) + } + (r = this._rect).copy(a), this._center = [r.x + r.width / 2, r.y + r.height / 2] + }, e.prototype.cloneShallow = function (t) { + null == t && (t = this.name); + var n = new e(t, this.geometries, this._center); + return n._rect = this._rect, n.transformTo = null, n + }, e + }(m_), w_ = function (t) { + function e(e, n) { + var i = t.call(this, e) || this; + return i.type = "geoSVG", i._elOnlyForCalculate = n, i + } + + return n(e, t), e.prototype.calcCenter = function () { + for (var t = this._elOnlyForCalculate, e = t.getBoundingRect(), n = [e.x + e.width / 2, e.y + e.height / 2], i = Oi(g_), r = t; r && !r.isGeoSVGGraphicRoot;) Ni(i, r.getLocalTransform(), i), r = r.parent; + return Bi(i, i), Ft(n, n, i), n + }, e + }(m_); + + function S_(t, e, n) { + for (var i = 0; i < t.length; i++) t[i] = M_(t[i], e[i], n) + } + + function M_(t, e, n) { + for (var i = [], r = e[0], o = e[1], a = 0; a < t.length; a += 2) { + var s = t.charCodeAt(a) - 64, l = t.charCodeAt(a + 1) - 64; + s = s >> 1 ^ -(1 & s), l = l >> 1 ^ -(1 & l), r = s += r, o = l += o, i.push([s / n, l / n]) + } + return i + } + + function I_(t, e) { + return z(B((t = function (t) { + if (!t.UTF8Encoding) return t; + var e = t, n = e.UTF8Scale; + return null == n && (n = 1024), E(e.features, (function (t) { + var e = t.geometry, i = e.encodeOffsets, r = e.coordinates; + if (i) switch (e.type) { + case"LineString": + e.coordinates = M_(r, i, n); + break; + case"Polygon": + case"MultiLineString": + S_(r, i, n); + break; + case"MultiPolygon": + E(r, (function (t, e) { + return S_(t, i[e], n) + })) + } + })), e.UTF8Encoding = !1, e + }(t)).features, (function (t) { + return t.geometry && t.properties && t.geometry.coordinates.length > 0 + })), (function (t) { + var n = t.properties, i = t.geometry, r = []; + switch (i.type) { + case"Polygon": + var o = i.coordinates; + r.push(new x_(o[0], o.slice(1))); + break; + case"MultiPolygon": + E(i.coordinates, (function (t) { + t[0] && r.push(new x_(t[0], t.slice(1))) + })); + break; + case"LineString": + r.push(new __([i.coordinates])); + break; + case"MultiLineString": + r.push(new __(i.coordinates)) + } + var a = new b_(n[e || "name"], r, n.cp); + return a.properties = n, a + })) + } + + var T_ = Object.freeze({ + __proto__: null, + linearMap: Nr, + round: zr, + asc: Vr, + getPrecision: Br, + getPrecisionSafe: Fr, + getPixelPrecision: Gr, + getPercentWithPrecision: Wr, + MAX_SAFE_INTEGER: Yr, + remRadian: Ur, + isRadianAroundZero: Xr, + parseDate: jr, + quantity: qr, + quantityExponent: Kr, + nice: $r, + quantile: Jr, + reformIntervals: Qr, + isNumeric: eo, + numericToNumber: to + }), C_ = Object.freeze({__proto__: null, parse: jr, format: zc}), D_ = Object.freeze({ + __proto__: null, + extendShape: dh, + extendPath: gh, + makePath: mh, + makeImage: xh, + mergePath: bh, + resizePath: wh, + createIcon: Lh, + updateProps: ih, + initProps: rh, + getTransform: Mh, + clipPointsByRect: Ah, + clipRectByRect: kh, + registerShape: yh, + getShapeClass: vh, + Group: Cr, + Image: xs, + Text: As, + Circle: uu, + Ellipse: cu, + Sector: Tu, + Ring: Du, + Polygon: Lu, + Polyline: Ou, + Rect: Ts, + Line: Eu, + BezierCurve: Fu, + Arc: Wu, + IncrementalDisplayable: Qu, + CompoundPath: Hu, + LinearGradient: Uu, + RadialGradient: Xu, + BoundingRect: sr + }), A_ = Object.freeze({ + __proto__: null, + addCommas: tp, + toCamelCase: ep, + normalizeCssArray: np, + encodeHTML: op, + formatTpl: up, + getTooltipMarker: hp, + formatTime: function (t, e, n) { + "week" !== t && "month" !== t && "quarter" !== t && "half-year" !== t && "year" !== t || (t = "MM-dd\nyyyy"); + var i = jr(e), r = n ? "getUTC" : "get", o = i[r + "FullYear"](), a = i[r + "Month"]() + 1, + s = i[r + "Date"](), l = i[r + "Hours"](), u = i[r + "Minutes"](), h = i[r + "Seconds"](), + c = i[r + "Milliseconds"](); + return t = t.replace("MM", Rc(a, 2)).replace("M", a).replace("yyyy", o).replace("yy", o % 100 + "").replace("dd", Rc(s, 2)).replace("d", s).replace("hh", Rc(l, 2)).replace("h", l).replace("mm", Rc(u, 2)).replace("m", u).replace("ss", Rc(h, 2)).replace("s", h).replace("SSS", Rc(c, 3)) + }, + capitalFirst: function (t) { + return t ? t.charAt(0).toUpperCase() + t.substr(1) : t + }, + truncateText: $o, + getTextRect: function (t, e, n, i, r, o, a, s) { + return new As({ + style: { + text: t, + font: e, + align: n, + verticalAlign: i, + padding: r, + rich: o, + overflow: a ? "truncate" : null, + lineHeight: s + } + }).getBoundingRect() + } + }), k_ = Object.freeze({ + __proto__: null, + map: z, + each: E, + indexOf: P, + inherits: O, + reduce: V, + filter: B, + bind: W, + curry: H, + isArray: Y, + isString: X, + isObject: q, + isFunction: U, + extend: A, + defaults: k, + clone: T, + merge: C + }), L_ = So(); + + function P_(t) { + return "category" === t.type ? function (t) { + var e = t.getLabelModel(), n = R_(t, e); + return !e.get("show") || t.scale.isBlank() ? { + labels: [], + labelCategoryInterval: n.labelCategoryInterval + } : n + }(t) : function (t) { + var e = t.scale.getTicks(), n = r_(t); + return { + labels: z(e, (function (e, i) { + return {level: e.level, formattedLabel: n(e, i), rawLabel: t.scale.getLabel(e), tickValue: e.value} + })) + } + }(t) + } + + function O_(t, e) { + return "category" === t.type ? function (t, e) { + var n, i, r = N_(t, "ticks"), o = s_(e), a = E_(r, o); + if (a) return a; + e.get("show") && !t.scale.isBlank() || (n = []); + if (U(o)) n = B_(t, o, !0); else if ("auto" === o) { + var s = R_(t, t.getLabelModel()); + i = s.labelCategoryInterval, n = z(s.labels, (function (t) { + return t.tickValue + })) + } else n = V_(t, i = o, !0); + return z_(r, o, {ticks: n, tickCategoryInterval: i}) + }(t, e) : { + ticks: z(t.scale.getTicks(), (function (t) { + return t.value + })) + } + } + + function R_(t, e) { + var n, i, r = N_(t, "labels"), o = s_(e), a = E_(r, o); + return a || (U(o) ? n = B_(t, o) : (i = "auto" === o ? function (t) { + var e = L_(t).autoInterval; + return null != e ? e : L_(t).autoInterval = t.calculateCategoryInterval() + }(t) : o, n = V_(t, i)), z_(r, o, {labels: n, labelCategoryInterval: i})) + } + + function N_(t, e) { + return L_(t)[e] || (L_(t)[e] = []) + } + + function E_(t, e) { + for (var n = 0; n < t.length; n++) if (t[n].key === e) return t[n].value + } + + function z_(t, e, n) { + return t.push({key: e, value: n}), n + } + + function V_(t, e, n) { + var i = r_(t), r = t.scale, o = r.getExtent(), a = t.getLabelModel(), s = [], l = Math.max((e || 0) + 1, 1), + u = o[0], h = r.count(); + 0 !== u && l > 1 && h / l > 2 && (u = Math.round(Math.ceil(u / l) * l)); + var c = l_(t), p = a.get("showMinLabel") || c, d = a.get("showMaxLabel") || c; + p && u !== o[0] && g(o[0]); + for (var f = u; f <= o[1]; f += l) g(f); + + function g(t) { + var e = {value: t}; + s.push(n ? t : {formattedLabel: i(e), rawLabel: r.getLabel(e), tickValue: t}) + } + + return d && f - l !== o[1] && g(o[1]), s + } + + function B_(t, e, n) { + var i = t.scale, r = r_(t), o = []; + return E(i.getTicks(), (function (t) { + var a = i.getLabel(t), s = t.value; + e(t.value, a) && o.push(n ? s : {formattedLabel: r(t), rawLabel: a, tickValue: s}) + })), o + } + + var F_ = [0, 1], G_ = function () { + function t(t, e, n) { + this.onBand = !1, this.inverse = !1, this.dim = t, this.scale = e, this._extent = n || [0, 0] + } + + return t.prototype.contain = function (t) { + var e = this._extent, n = Math.min(e[0], e[1]), i = Math.max(e[0], e[1]); + return t >= n && t <= i + }, t.prototype.containData = function (t) { + return this.scale.contain(t) + }, t.prototype.getExtent = function () { + return this._extent.slice() + }, t.prototype.getPixelPrecision = function (t) { + return Gr(t || this.scale.getExtent(), this._extent) + }, t.prototype.setExtent = function (t, e) { + var n = this._extent; + n[0] = t, n[1] = e + }, t.prototype.dataToCoord = function (t, e) { + var n = this._extent, i = this.scale; + return t = i.normalize(t), this.onBand && "ordinal" === i.type && W_(n = n.slice(), i.count()), Nr(t, F_, n, e) + }, t.prototype.coordToData = function (t, e) { + var n = this._extent, i = this.scale; + this.onBand && "ordinal" === i.type && W_(n = n.slice(), i.count()); + var r = Nr(t, n, F_, e); + return this.scale.scale(r) + }, t.prototype.pointToData = function (t, e) { + }, t.prototype.getTicksCoords = function (t) { + var e = (t = t || {}).tickModel || this.getTickModel(), n = z(O_(this, e).ticks, (function (t) { + return { + coord: this.dataToCoord("ordinal" === this.scale.type ? this.scale.getRawOrdinalNumber(t) : t), + tickValue: t + } + }), this); + return function (t, e, n, i) { + var r = e.length; + if (!t.onBand || n || !r) return; + var o, a, s = t.getExtent(); + if (1 === r) e[0].coord = s[0], o = e[1] = {coord: s[0]}; else { + var l = e[r - 1].tickValue - e[0].tickValue, u = (e[r - 1].coord - e[0].coord) / l; + E(e, (function (t) { + t.coord -= u / 2 + })), a = 1 + t.scale.getExtent()[1] - e[r - 1].tickValue, o = {coord: e[r - 1].coord + u * a}, e.push(o) + } + var h = s[0] > s[1]; + c(e[0].coord, s[0]) && (i ? e[0].coord = s[0] : e.shift()); + i && c(s[0], e[0].coord) && e.unshift({coord: s[0]}); + c(s[1], o.coord) && (i ? o.coord = s[1] : e.pop()); + i && c(o.coord, s[1]) && e.push({coord: s[1]}); + + function c(t, e) { + return t = zr(t), e = zr(e), h ? t > e : t < e + } + }(this, n, e.get("alignWithLabel"), t.clamp), n + }, t.prototype.getMinorTicksCoords = function () { + if ("ordinal" === this.scale.type) return []; + var t = this.model.getModel("minorTick").get("splitNumber"); + return t > 0 && t < 100 || (t = 5), z(this.scale.getMinorTicks(t), (function (t) { + return z(t, (function (t) { + return {coord: this.dataToCoord(t), tickValue: t} + }), this) + }), this) + }, t.prototype.getViewLabels = function () { + return P_(this).labels + }, t.prototype.getLabelModel = function () { + return this.model.getModel("axisLabel") + }, t.prototype.getTickModel = function () { + return this.model.getModel("axisTick") + }, t.prototype.getBandWidth = function () { + var t = this._extent, e = this.scale.getExtent(), n = e[1] - e[0] + (this.onBand ? 1 : 0); + 0 === n && (n = 1); + var i = Math.abs(t[1] - t[0]); + return Math.abs(i) / n + }, t.prototype.calculateCategoryInterval = function () { + return function (t) { + var e = function (t) { + var e = t.getLabelModel(); + return { + axisRotate: t.getRotate ? t.getRotate() : t.isHorizontal && !t.isHorizontal() ? 90 : 0, + labelRotate: e.get("rotate") || 0, + font: e.getFont() + } + }(t), n = r_(t), i = (e.axisRotate - e.labelRotate) / 180 * Math.PI, r = t.scale, o = r.getExtent(), + a = r.count(); + if (o[1] - o[0] < 1) return 0; + var s = 1; + a > 40 && (s = Math.max(1, Math.floor(a / 40))); + for (var l = o[0], u = t.dataToCoord(l + 1) - t.dataToCoord(l), h = Math.abs(u * Math.cos(i)), c = Math.abs(u * Math.sin(i)), p = 0, d = 0; l <= o[1]; l += s) { + var f, g, y = cr(n({value: l}), e.font, "center", "top"); + f = 1.3 * y.width, g = 1.3 * y.height, p = Math.max(p, f, 7), d = Math.max(d, g, 7) + } + var v = p / h, m = d / c; + isNaN(v) && (v = 1 / 0), isNaN(m) && (m = 1 / 0); + var x = Math.max(0, Math.floor(Math.min(v, m))), _ = L_(t.model), b = t.getExtent(), + w = _.lastAutoInterval, S = _.lastTickCount; + return null != w && null != S && Math.abs(w - x) <= 1 && Math.abs(S - a) <= 1 && w > x && _.axisExtent0 === b[0] && _.axisExtent1 === b[1] ? x = w : (_.lastTickCount = a, _.lastAutoInterval = x, _.axisExtent0 = b[0], _.axisExtent1 = b[1]), x + }(this) + }, t + }(); + + function W_(t, e) { + var n = (t[1] - t[0]) / e / 2; + t[0] += n, t[1] -= n + } + + var H_ = 2 * Math.PI, Y_ = ja.CMD, U_ = ["top", "right", "bottom", "left"]; + + function X_(t, e, n, i, r) { + var o = n.width, a = n.height; + switch (t) { + case"top": + i.set(n.x + o / 2, n.y - e), r.set(0, -1); + break; + case"bottom": + i.set(n.x + o / 2, n.y + a + e), r.set(0, 1); + break; + case"left": + i.set(n.x - e, n.y + a / 2), r.set(-1, 0); + break; + case"right": + i.set(n.x + o + e, n.y + a / 2), r.set(1, 0) + } + } + + function Z_(t, e, n, i, r, o, a, s, l) { + a -= t, s -= e; + var u = Math.sqrt(a * a + s * s), h = (a /= u) * n + t, c = (s /= u) * n + e; + if (Math.abs(i - r) % H_ < 1e-4) return l[0] = h, l[1] = c, u - n; + if (o) { + var p = i; + i = Qa(r), r = Qa(p) + } else i = Qa(i), r = Qa(r); + i > r && (r += H_); + var d = Math.atan2(s, a); + if (d < 0 && (d += H_), d >= i && d <= r || d + H_ >= i && d + H_ <= r) return l[0] = h, l[1] = c, u - n; + var f = n * Math.cos(i) + t, g = n * Math.sin(i) + e, y = n * Math.cos(r) + t, v = n * Math.sin(r) + e, + m = (f - a) * (f - a) + (g - s) * (g - s), x = (y - a) * (y - a) + (v - s) * (v - s); + return m < x ? (l[0] = f, l[1] = g, Math.sqrt(m)) : (l[0] = y, l[1] = v, Math.sqrt(x)) + } + + function j_(t, e, n, i, r, o, a, s) { + var l = r - t, u = o - e, h = n - t, c = i - e, p = Math.sqrt(h * h + c * c), + d = (l * (h /= p) + u * (c /= p)) / p; + s && (d = Math.min(Math.max(d, 0), 1)), d *= p; + var f = a[0] = t + d * h, g = a[1] = e + d * c; + return Math.sqrt((f - r) * (f - r) + (g - o) * (g - o)) + } + + function q_(t, e, n, i, r, o, a) { + n < 0 && (t += n, n = -n), i < 0 && (e += i, i = -i); + var s = t + n, l = e + i, u = a[0] = Math.min(Math.max(r, t), s), h = a[1] = Math.min(Math.max(o, e), l); + return Math.sqrt((u - r) * (u - r) + (h - o) * (h - o)) + } + + var K_ = []; + + function $_(t, e, n) { + var i = q_(e.x, e.y, e.width, e.height, t.x, t.y, K_); + return n.set(K_[0], K_[1]), i + } + + function J_(t, e, n) { + for (var i, r, o = 0, a = 0, s = 0, l = 0, u = 1 / 0, h = e.data, c = t.x, p = t.y, d = 0; d < h.length;) { + var f = h[d++]; + 1 === d && (s = o = h[d], l = a = h[d + 1]); + var g = u; + switch (f) { + case Y_.M: + o = s = h[d++], a = l = h[d++]; + break; + case Y_.L: + g = j_(o, a, h[d], h[d + 1], c, p, K_, !0), o = h[d++], a = h[d++]; + break; + case Y_.C: + g = je(o, a, h[d++], h[d++], h[d++], h[d++], h[d], h[d + 1], c, p, K_), o = h[d++], a = h[d++]; + break; + case Y_.Q: + g = tn(o, a, h[d++], h[d++], h[d], h[d + 1], c, p, K_), o = h[d++], a = h[d++]; + break; + case Y_.A: + var y = h[d++], v = h[d++], m = h[d++], x = h[d++], _ = h[d++], b = h[d++]; + d += 1; + var w = !!(1 - h[d++]); + i = Math.cos(_) * m + y, r = Math.sin(_) * x + v, d <= 1 && (s = i, l = r), g = Z_(y, v, x, _, _ + b, w, (c - y) * x / m + y, p, K_), o = Math.cos(_ + b) * m + y, a = Math.sin(_ + b) * x + v; + break; + case Y_.R: + g = q_(s = o = h[d++], l = a = h[d++], h[d++], h[d++], c, p, K_); + break; + case Y_.Z: + g = j_(o, a, s, l, c, p, K_, !0), o = s, a = l + } + g < u && (u = g, n.set(K_[0], K_[1])) + } + return u + } + + var Q_ = new Ji, tb = new Ji, eb = new Ji, nb = new Ji, ib = new Ji; + + function rb(t, e) { + if (t) { + var n = t.getTextGuideLine(), i = t.getTextContent(); + if (i && n) { + var r = t.textGuideLineConfig || {}, o = [[0, 0], [0, 0], [0, 0]], a = r.candidates || U_, + s = i.getBoundingRect().clone(); + s.applyTransform(i.getComputedTransform()); + var l = 1 / 0, u = r.anchor, h = t.getComputedTransform(), c = h && Bi([], h), + p = e.get("length2") || 0; + u && eb.copy(u); + for (var d = 0; d < a.length; d++) { + X_(a[d], 0, s, Q_, nb), Ji.scaleAndAdd(tb, Q_, nb, p), tb.transform(c); + var f = t.getBoundingRect(), + g = u ? u.distance(tb) : t instanceof fs ? J_(tb, t.path, eb) : $_(tb, f, eb); + g < l && (l = g, tb.transform(h), eb.transform(h), eb.toArray(o[0]), tb.toArray(o[1]), Q_.toArray(o[2])) + } + sb(o, e.get("minTurnAngle")), n.setShape({points: o}) + } + } + } + + var ob = [], ab = new Ji; + + function sb(t, e) { + if (e <= 180 && e > 0) { + e = e / 180 * Math.PI, Q_.fromArray(t[0]), tb.fromArray(t[1]), eb.fromArray(t[2]), Ji.sub(nb, Q_, tb), Ji.sub(ib, eb, tb); + var n = nb.len(), i = ib.len(); + if (!(n < .001 || i < .001)) { + nb.scale(1 / n), ib.scale(1 / i); + var r = nb.dot(ib); + if (Math.cos(e) < r) { + var o = j_(tb.x, tb.y, eb.x, eb.y, Q_.x, Q_.y, ob, !1); + ab.fromArray(ob), ab.scaleAndAdd(ib, o / Math.tan(Math.PI - e)); + var a = eb.x !== tb.x ? (ab.x - tb.x) / (eb.x - tb.x) : (ab.y - tb.y) / (eb.y - tb.y); + if (isNaN(a)) return; + a < 0 ? Ji.copy(ab, tb) : a > 1 && Ji.copy(ab, eb), ab.toArray(t[1]) + } + } + } + } + + function lb(t, e, n) { + if (n <= 180 && n > 0) { + n = n / 180 * Math.PI, Q_.fromArray(t[0]), tb.fromArray(t[1]), eb.fromArray(t[2]), Ji.sub(nb, tb, Q_), Ji.sub(ib, eb, tb); + var i = nb.len(), r = ib.len(); + if (!(i < .001 || r < .001)) if (nb.scale(1 / i), ib.scale(1 / r), nb.dot(e) < Math.cos(n)) { + var o = j_(tb.x, tb.y, eb.x, eb.y, Q_.x, Q_.y, ob, !1); + ab.fromArray(ob); + var a = Math.PI / 2, s = a + Math.acos(ib.dot(e)) - n; + if (s >= a) Ji.copy(ab, eb); else { + ab.scaleAndAdd(ib, o / Math.tan(Math.PI / 2 - s)); + var l = eb.x !== tb.x ? (ab.x - tb.x) / (eb.x - tb.x) : (ab.y - tb.y) / (eb.y - tb.y); + if (isNaN(l)) return; + l < 0 ? Ji.copy(ab, tb) : l > 1 && Ji.copy(ab, eb) + } + ab.toArray(t[1]) + } + } + } + + function ub(t, e, n, i) { + var r = "normal" === n, o = r ? t : t.ensureState(n); + o.ignore = e; + var a = i.get("smooth"); + a && !0 === a && (a = .3), o.shape = o.shape || {}, a > 0 && (o.shape.smooth = a); + var s = i.getModel("lineStyle").getLineStyle(); + r ? t.useStyle(s) : o.style = s + } + + function hb(t, e) { + var n = e.smooth, i = e.points; + if (i) if (t.moveTo(i[0][0], i[0][1]), n > 0 && i.length >= 3) { + var r = Et(i[0], i[1]), o = Et(i[1], i[2]); + if (!r || !o) return t.lineTo(i[1][0], i[1][1]), void t.lineTo(i[2][0], i[2][1]); + var a = Math.min(r, o) * n, s = Bt([], i[1], i[0], a / r), l = Bt([], i[1], i[2], a / o), + u = Bt([], s, l, .5); + t.bezierCurveTo(s[0], s[1], s[0], s[1], u[0], u[1]), t.bezierCurveTo(l[0], l[1], l[0], l[1], i[2][0], i[2][1]) + } else for (var h = 1; h < i.length; h++) t.lineTo(i[h][0], i[h][1]) + } + + function cb(t, e, n) { + var i = t.getTextGuideLine(), r = t.getTextContent(); + if (r) { + for (var o = e.normal, a = o.get("show"), s = r.ignore, l = 0; l < qs.length; l++) { + var u = qs[l], h = e[u], c = "normal" === u; + if (h) { + var p = h.get("show"); + if ((c ? s : rt(r.states[u] && r.states[u].ignore, s)) || !rt(p, a)) { + var d = c ? i : i && i.states.normal; + d && (d.ignore = !0); + continue + } + i || (i = new Ou, t.setTextGuideLine(i), c || !s && a || ub(i, !0, "normal", e.normal), t.stateProxy && (i.stateProxy = t.stateProxy)), ub(i, !1, u, h) + } + } + if (i) { + k(i.style, n), i.style.fill = null; + var f = o.get("showAbove"); + (t.textGuideLineConfig = t.textGuideLineConfig || {}).showAbove = f || !1, i.buildPath = hb + } + } else i && t.removeTextGuideLine() + } + + function pb(t, e) { + e = e || "labelLine"; + for (var n = {normal: t.getModel(e)}, i = 0; i < js.length; i++) { + var r = js[i]; + n[r] = t.getModel([r, e]) + } + return n + } + + function db(t) { + for (var e = [], n = 0; n < t.length; n++) { + var i = t[n]; + if (!i.defaultAttr.ignore) { + var r = i.label, o = r.getComputedTransform(), a = r.getBoundingRect(), + s = !o || o[1] < 1e-5 && o[2] < 1e-5, l = r.style.margin || 0, u = a.clone(); + u.applyTransform(o), u.x -= l / 2, u.y -= l / 2, u.width += l, u.height += l; + var h = s ? new $u(a, o) : null; + e.push({ + label: r, + labelLine: i.labelLine, + rect: u, + localRect: a, + obb: h, + priority: i.priority, + defaultAttr: i.defaultAttr, + layoutOption: i.computedLayoutOption, + axisAligned: s, + transform: o + }) + } + } + return e + } + + function fb(t, e, n, i, r, o) { + var a = t.length; + if (!(a < 2)) { + t.sort((function (t, n) { + return t.rect[e] - n.rect[e] + })); + for (var s, l = 0, u = !1, h = 0, c = 0; c < a; c++) { + var p = t[c], d = p.rect; + (s = d[e] - l) < 0 && (d[e] -= s, p.label[e] -= s, u = !0), h += Math.max(-s, 0), l = d[e] + d[n] + } + h > 0 && o && _(-h / a, 0, a); + var f, g, y = t[0], v = t[a - 1]; + return m(), f < 0 && b(-f, .8), g < 0 && b(g, .8), m(), x(f, g, 1), x(g, f, -1), m(), f < 0 && w(-f), g < 0 && w(g), u + } + + function m() { + f = y.rect[e] - i, g = r - v.rect[e] - v.rect[n] + } + + function x(t, e, n) { + if (t < 0) { + var i = Math.min(e, -t); + if (i > 0) { + _(i * n, 0, a); + var r = i + t; + r < 0 && b(-r * n, 1) + } else b(-t * n, 1) + } + } + + function _(n, i, r) { + 0 !== n && (u = !0); + for (var o = i; o < r; o++) { + var a = t[o]; + a.rect[e] += n, a.label[e] += n + } + } + + function b(i, r) { + for (var o = [], s = 0, l = 1; l < a; l++) { + var u = t[l - 1].rect, h = Math.max(t[l].rect[e] - u[e] - u[n], 0); + o.push(h), s += h + } + if (s) { + var c = Math.min(Math.abs(i) / s, r); + if (i > 0) for (l = 0; l < a - 1; l++) { + _(o[l] * c, 0, l + 1) + } else for (l = a - 1; l > 0; l--) { + _(-(o[l - 1] * c), l, a) + } + } + } + + function w(t) { + var e = t < 0 ? -1 : 1; + t = Math.abs(t); + for (var n = Math.ceil(t / (a - 1)), i = 0; i < a - 1; i++) if (e > 0 ? _(n, 0, i + 1) : _(-n, a - i - 1, a), (t -= n) <= 0) return + } + } + + function gb(t, e, n, i) { + return fb(t, "y", "height", e, n, i) + } + + function yb(t) { + var e = []; + t.sort((function (t, e) { + return e.priority - t.priority + })); + var n = new sr(0, 0, 0, 0); + + function i(t) { + if (!t.ignore) { + var e = t.ensureState("emphasis"); + null == e.ignore && (e.ignore = !1) + } + t.ignore = !0 + } + + for (var r = 0; r < t.length; r++) { + var o = t[r], a = o.axisAligned, s = o.localRect, l = o.transform, u = o.label, h = o.labelLine; + n.copy(o.rect), n.width -= .1, n.height -= .1, n.x += .05, n.y += .05; + for (var c = o.obb, p = !1, d = 0; d < e.length; d++) { + var f = e[d]; + if (n.intersect(f.rect)) { + if (a && f.axisAligned) { + p = !0; + break + } + if (f.obb || (f.obb = new $u(f.localRect, f.transform)), c || (c = new $u(s, l)), c.intersect(f.obb)) { + p = !0; + break + } + } + } + p ? (i(u), h && i(h)) : (u.attr("ignore", o.defaultAttr.ignore), h && h.attr("ignore", o.defaultAttr.labelGuideIgnore), e.push(o)) + } + } + + function vb(t) { + if (t) { + for (var e = [], n = 0; n < t.length; n++) e.push(t[n].slice()); + return e + } + } + + function mb(t, e) { + var n = t.label, i = e && e.getTextGuideLine(); + return { + dataIndex: t.dataIndex, + dataType: t.dataType, + seriesIndex: t.seriesModel.seriesIndex, + text: t.label.style.text, + rect: t.hostRect, + labelRect: t.rect, + align: n.style.align, + verticalAlign: n.style.verticalAlign, + labelLinePoints: vb(i && i.shape.points) + } + } + + var xb = ["align", "verticalAlign", "width", "height", "fontSize"], _b = new qi, bb = So(), wb = So(); + + function Sb(t, e, n) { + for (var i = 0; i < n.length; i++) { + var r = n[i]; + null != e[r] && (t[r] = e[r]) + } + } + + var Mb = ["x", "y", "rotation"], Ib = function () { + function t() { + this._labelList = [], this._chartViewList = [] + } + + return t.prototype.clearLabels = function () { + this._labelList = [], this._chartViewList = [] + }, t.prototype._addLabel = function (t, e, n, i, r) { + var o = i.style, a = i.__hostTarget.textConfig || {}, s = i.getComputedTransform(), + l = i.getBoundingRect().plain(); + sr.applyTransform(l, l, s), s ? _b.setLocalTransform(s) : (_b.x = _b.y = _b.rotation = _b.originX = _b.originY = 0, _b.scaleX = _b.scaleY = 1); + var u, h = i.__hostTarget; + if (h) { + u = h.getBoundingRect().plain(); + var c = h.getComputedTransform(); + sr.applyTransform(u, u, c) + } + var p = u && h.getTextGuideLine(); + this._labelList.push({ + label: i, + labelLine: p, + seriesModel: n, + dataIndex: t, + dataType: e, + layoutOption: r, + computedLayoutOption: null, + rect: l, + hostRect: u, + priority: u ? u.width * u.height : 0, + defaultAttr: { + ignore: i.ignore, + labelGuideIgnore: p && p.ignore, + x: _b.x, + y: _b.y, + scaleX: _b.scaleX, + scaleY: _b.scaleY, + rotation: _b.rotation, + style: { + x: o.x, + y: o.y, + align: o.align, + verticalAlign: o.verticalAlign, + width: o.width, + height: o.height, + fontSize: o.fontSize + }, + cursor: i.cursor, + attachedPos: a.position, + attachedRot: a.rotation + } + }) + }, t.prototype.addLabelsOfSeries = function (t) { + var e = this; + this._chartViewList.push(t); + var n = t.__model, i = n.get("labelLayout"); + (U(i) || G(i).length) && t.group.traverse((function (t) { + if (t.ignore) return !0; + var r = t.getTextContent(), o = Ws(t); + r && !r.disableLabelLayout && e._addLabel(o.dataIndex, o.dataType, n, r, i) + })) + }, t.prototype.updateLayoutConfig = function (t) { + var e = t.getWidth(), n = t.getHeight(); + + function i(t, e) { + return function () { + rb(t, e) + } + } + + for (var r = 0; r < this._labelList.length; r++) { + var o = this._labelList[r], a = o.label, s = a.__hostTarget, l = o.defaultAttr, u = void 0; + u = (u = U(o.layoutOption) ? o.layoutOption(mb(o, s)) : o.layoutOption) || {}, o.computedLayoutOption = u; + var h = Math.PI / 180; + s && s.setTextConfig({ + local: !1, + position: null != u.x || null != u.y ? null : l.attachedPos, + rotation: null != u.rotate ? u.rotate * h : l.attachedRot, + offset: [u.dx || 0, u.dy || 0] + }); + var c = !1; + if (null != u.x ? (a.x = Er(u.x, e), a.setStyle("x", 0), c = !0) : (a.x = l.x, a.setStyle("x", l.style.x)), null != u.y ? (a.y = Er(u.y, n), a.setStyle("y", 0), c = !0) : (a.y = l.y, a.setStyle("y", l.style.y)), u.labelLinePoints) { + var p = s.getTextGuideLine(); + p && (p.setShape({points: u.labelLinePoints}), c = !1) + } + bb(a).needsUpdateLabelLine = c, a.rotation = null != u.rotate ? u.rotate * h : l.rotation, a.scaleX = l.scaleX, a.scaleY = l.scaleY; + for (var d = 0; d < xb.length; d++) { + var f = xb[d]; + a.setStyle(f, null != u[f] ? u[f] : l.style[f]) + } + if (u.draggable) { + if (a.draggable = !0, a.cursor = "move", s) { + var g = o.seriesModel; + if (null != o.dataIndex) g = o.seriesModel.getData(o.dataType).getItemModel(o.dataIndex); + a.on("drag", i(s, g.getModel("labelLine"))) + } + } else a.off("drag"), a.cursor = l.cursor + } + }, t.prototype.layout = function (t) { + var e, n = t.getWidth(), i = t.getHeight(), r = db(this._labelList), o = B(r, (function (t) { + return "shiftX" === t.layoutOption.moveOverlap + })), a = B(r, (function (t) { + return "shiftY" === t.layoutOption.moveOverlap + })); + fb(o, "x", "width", 0, n, e), gb(a, 0, i), yb(B(r, (function (t) { + return t.layoutOption.hideOverlap + }))) + }, t.prototype.processLabelsOverall = function () { + var t = this; + E(this._chartViewList, (function (e) { + var n = e.__model, i = e.ignoreLabelLineUpdate, r = n.isAnimationEnabled(); + e.group.traverse((function (e) { + if (e.ignore && !e.forceLabelAnimation) return !0; + var o = !i, a = e.getTextContent(); + !o && a && (o = bb(a).needsUpdateLabelLine), o && t._updateLabelLine(e, n), r && t._animateLabels(e, n) + })) + })) + }, t.prototype._updateLabelLine = function (t, e) { + var n = t.getTextContent(), i = Ws(t), r = i.dataIndex; + if (n && null != r) { + var o = e.getData(i.dataType), a = o.getItemModel(r), s = {}, l = o.getItemVisual(r, "style"), + u = o.getVisual("drawType"); + s.stroke = l[u]; + var h = a.getModel("labelLine"); + cb(t, pb(a), s), rb(t, h) + } + }, t.prototype._animateLabels = function (t, e) { + var n = t.getTextContent(), i = t.getTextGuideLine(); + if (n && (t.forceLabelAnimation || !n.ignore && !n.invisible && !t.disableLabelAnimation && !oh(t))) { + var r = (d = bb(n)).oldLayout, o = Ws(t), a = o.dataIndex, s = {x: n.x, y: n.y, rotation: n.rotation}, + l = e.getData(o.dataType); + if (r) { + n.attr(r); + var u = t.prevStates; + u && (P(u, "select") >= 0 && n.attr(d.oldLayoutSelect), P(u, "emphasis") >= 0 && n.attr(d.oldLayoutEmphasis)), ih(n, s, e, a) + } else if (n.attr(s), !$h(n).valueAnimation) { + var h = rt(n.style.opacity, 1); + n.style.opacity = 0, rh(n, {style: {opacity: h}}, e, a) + } + if (d.oldLayout = s, n.states.select) { + var c = d.oldLayoutSelect = {}; + Sb(c, s, Mb), Sb(c, n.states.select, Mb) + } + if (n.states.emphasis) { + var p = d.oldLayoutEmphasis = {}; + Sb(p, s, Mb), Sb(p, n.states.emphasis, Mb) + } + Qh(n, a, l, e, e) + } + if (i && !i.ignore && !i.invisible) { + r = (d = wb(i)).oldLayout; + var d, f = {points: i.shape.points}; + r ? (i.attr({shape: r}), ih(i, {shape: f}, e)) : (i.setShape(f), i.style.strokePercent = 0, rh(i, {style: {strokePercent: 1}}, e)), d.oldLayout = f + } + }, t + }(), Tb = So(); + var Cb = Math.sin, Db = Math.cos, Ab = Math.PI, kb = 2 * Math.PI, Lb = 180 / Ab, Pb = function () { + function t() { + } + + return t.prototype.reset = function (t) { + this._start = !0, this._d = [], this._str = "", this._p = Math.pow(10, t || 4) + }, t.prototype.moveTo = function (t, e) { + this._add("M", t, e) + }, t.prototype.lineTo = function (t, e) { + this._add("L", t, e) + }, t.prototype.bezierCurveTo = function (t, e, n, i, r, o) { + this._add("C", t, e, n, i, r, o) + }, t.prototype.quadraticCurveTo = function (t, e, n, i) { + this._add("Q", t, e, n, i) + }, t.prototype.arc = function (t, e, n, i, r, o) { + this.ellipse(t, e, n, n, 0, i, r, o) + }, t.prototype.ellipse = function (t, e, n, i, r, o, a, s) { + var l = a - o, u = !s, h = Math.abs(l), c = En(h - kb) || (u ? l >= kb : -l >= kb), + p = l > 0 ? l % kb : l % kb + kb, d = !1; + d = !!c || !En(h) && p >= Ab == !!u; + var f = t + n * Db(o), g = e + i * Cb(o); + this._start && this._add("M", f, g); + var y = Math.round(r * Lb); + if (c) { + var v = 1 / this._p, m = (u ? 1 : -1) * (kb - v); + this._add("A", n, i, y, 1, +u, t + n * Db(o + m), e + i * Cb(o + m)), v > .01 && this._add("A", n, i, y, 0, +u, f, g) + } else { + var x = t + n * Db(a), _ = e + i * Cb(a); + this._add("A", n, i, y, +d, +u, x, _) + } + }, t.prototype.rect = function (t, e, n, i) { + this._add("M", t, e), this._add("l", n, 0), this._add("l", 0, i), this._add("l", -n, 0), this._add("Z") + }, t.prototype.closePath = function () { + this._d.length > 0 && this._add("Z") + }, t.prototype._add = function (t, e, n, i, r, o, a, s, l) { + for (var u = [], h = this._p, c = 1; c < arguments.length; c++) { + var p = arguments[c]; + if (isNaN(p)) return void (this._invalid = !0); + u.push(Math.round(p * h) / h) + } + this._d.push(t + u.join(" ")), this._start = "Z" === t + }, t.prototype.generateStr = function () { + this._str = this._invalid ? "" : this._d.join(""), this._d = [] + }, t.prototype.getStr = function () { + return this._str + }, t + }(), Ob = "none", Rb = Math.round; + var Nb = ["lineCap", "miterLimit", "lineJoin"], Eb = z(Nb, (function (t) { + return "stroke-" + t.toLowerCase() + })); + + function zb(t, e, n, i) { + var r = null == e.opacity ? 1 : e.opacity; + if (n instanceof xs) t("opacity", r); else { + if (function (t) { + var e = t.fill; + return null != e && e !== Ob + }(e)) { + var o = Rn(e.fill); + t("fill", o.color); + var a = null != e.fillOpacity ? e.fillOpacity * o.opacity * r : o.opacity * r; + (i || a < 1) && t("fill-opacity", a) + } else t("fill", Ob); + if (function (t) { + var e = t.stroke; + return null != e && e !== Ob + }(e)) { + var s = Rn(e.stroke); + t("stroke", s.color); + var l = e.strokeNoScale ? n.getLineScale() : 1, u = l ? (e.lineWidth || 0) / l : 0, + h = null != e.strokeOpacity ? e.strokeOpacity * s.opacity * r : s.opacity * r, c = e.strokeFirst; + if ((i || 1 !== u) && t("stroke-width", u), (i || c) && t("paint-order", c ? "stroke" : "fill"), (i || h < 1) && t("stroke-opacity", h), e.lineDash) { + var p = Ey(n), d = p[0], f = p[1]; + d && (f = Rb(f || 0), t("stroke-dasharray", d.join(",")), (f || i) && t("stroke-dashoffset", f)) + } else i && t("stroke-dasharray", Ob); + for (var g = 0; g < Nb.length; g++) { + var y = Nb[g]; + if (i || e[y] !== cs[y]) { + var v = e[y] || cs[y]; + v && t(Eb[g], v) + } + } + } else i && t("stroke", Ob) + } + } + + var Vb = "http://www.w3.org/2000/svg", Bb = "http://www.w3.org/1999/xlink"; + + function Fb(t) { + return document.createElementNS(Vb, t) + } + + function Gb(t, e, n, i, r) { + return {tag: t, attrs: n || {}, children: i, text: r, key: e} + } + + function Wb(t, e) { + var n = (e = e || {}).newline ? "\n" : ""; + return function t(e) { + var i = e.children, r = e.tag; + return function (t, e) { + var n = []; + if (e) for (var i in e) { + var r = e[i], o = i; + !1 !== r && (!0 !== r && null != r && (o += '="' + r + '"'), n.push(o)) + } + return "<" + t + " " + n.join(" ") + ">" + }(r, e.attrs) + (e.text || "") + (i ? "" + n + z(i, (function (e) { + return t(e) + })).join(n) + n : "") + ("") + }(t) + } + + function Hb(t) { + return { + zrId: t, + shadowCache: {}, + patternCache: {}, + gradientCache: {}, + clipPathCache: {}, + defs: {}, + cssNodes: {}, + cssAnims: {}, + cssClassIdx: 0, + cssAnimIdx: 0, + shadowIdx: 0, + gradientIdx: 0, + patternIdx: 0, + clipPathIdx: 0 + } + } + + function Yb(t, e, n, i) { + return Gb("svg", "root", { + width: t, + height: e, + xmlns: Vb, + "xmlns:xlink": Bb, + version: "1.1", + baseProfile: "full", + viewBox: !!i && "0 0 " + t + " " + e + }, n) + } + + var Ub = { + cubicIn: "0.32,0,0.67,0", + cubicOut: "0.33,1,0.68,1", + cubicInOut: "0.65,0,0.35,1", + quadraticIn: "0.11,0,0.5,0", + quadraticOut: "0.5,1,0.89,1", + quadraticInOut: "0.45,0,0.55,1", + quarticIn: "0.5,0,0.75,0", + quarticOut: "0.25,1,0.5,1", + quarticInOut: "0.76,0,0.24,1", + quinticIn: "0.64,0,0.78,0", + quinticOut: "0.22,1,0.36,1", + quinticInOut: "0.83,0,0.17,1", + sinusoidalIn: "0.12,0,0.39,0", + sinusoidalOut: "0.61,1,0.88,1", + sinusoidalInOut: "0.37,0,0.63,1", + exponentialIn: "0.7,0,0.84,0", + exponentialOut: "0.16,1,0.3,1", + exponentialInOut: "0.87,0,0.13,1", + circularIn: "0.55,0,1,0.45", + circularOut: "0,0.55,0.45,1", + circularInOut: "0.85,0,0.15,1" + }, Xb = "transform-origin"; + + function Zb(t, e, n) { + var i = A({}, t.shape); + A(i, e), t.buildPath(n, i); + var r = new Pb; + return r.reset(Yn(t)), n.rebuildPath(r, 1), r.generateStr(), r.getStr() + } + + function jb(t, e) { + var n = e.originX, i = e.originY; + (n || i) && (t[Xb] = n + "px " + i + "px") + } + + var qb = {fill: "fill", opacity: "opacity", lineWidth: "stroke-width", lineDashOffset: "stroke-dashoffset"}; + + function Kb(t, e) { + var n = e.zrId + "-ani-" + e.cssAnimIdx++; + return e.cssAnims[n] = t, n + } + + function $b(t) { + return X(t) ? Ub[t] ? "cubic-bezier(" + Ub[t] + ")" : rn(t) ? t : "" : "" + } + + function Jb(t, e, n, i) { + var r = t.animators, o = r.length, a = []; + if (t instanceof Hu) { + if (y = function (t, e, n) { + var i, r, o = t.shape.paths, a = {}; + if (E(o, (function (t) { + var e = Hb(n.zrId); + e.animation = !0, Jb(t, {}, e, !0); + var o = e.cssAnims, s = e.cssNodes, l = G(o), u = l.length; + if (u) { + var h = o[r = l[u - 1]]; + for (var c in h) { + var p = h[c]; + a[c] = a[c] || {d: ""}, a[c].d += p.d || "" + } + for (var d in s) { + var f = s[d].animation; + f.indexOf(r) >= 0 && (i = f) + } + } + })), i) { + e.d = !1; + var s = Kb(a, n); + return i.replace(r, s) + } + }(t, e, n)) a.push(y); else if (!o) return + } else if (!o) return; + for (var s = {}, l = 0; l < o; l++) { + var u = r[l], h = [u.getMaxTime() / 1e3 + "s"], c = $b(u.getClip().easing), p = u.getDelay(); + c ? h.push(c) : h.push("linear"), p && h.push(p / 1e3 + "s"), u.getLoop() && h.push("infinite"); + var d = h.join(" "); + s[d] = s[d] || [d, []], s[d][1].push(u) + } + + function f(r) { + var o, a = r[1], s = a.length, l = {}, u = {}, h = {}; + + function c(t, e, n) { + for (var i = t.getTracks(), r = t.getMaxTime(), o = 0; o < i.length; o++) { + var a = i[o]; + if (a.needsAnimate()) { + var s = a.keyframes, l = a.propName; + if (n && (l = n(l)), l) for (var u = 0; u < s.length; u++) { + var h = s[u], c = Math.round(h.time / r * 100) + "%", p = $b(h.easing), d = h.rawValue; + (X(d) || j(d)) && (e[c] = e[c] || {}, e[c][l] = h.rawValue, p && (e[c]["animation-timing-function"] = p)) + } + } + } + } + + for (var p = 0; p < s; p++) { + (w = (b = a[p]).targetName) ? "shape" === w && c(b, u) : !i && c(b, l) + } + for (var d in l) { + var f = {}; + $i(f, t), A(f, l[d]); + var g = Un(f), y = l[d]["animation-timing-function"]; + h[d] = g ? {transform: g} : {}, jb(h[d], f), y && (h[d]["animation-timing-function"] = y) + } + var v = !0; + for (var d in u) { + h[d] = h[d] || {}; + var m = !o; + y = u[d]["animation-timing-function"]; + m && (o = new ja); + var x = o.len(); + o.reset(), h[d].d = Zb(t, u[d], o); + var _ = o.len(); + if (!m && x !== _) { + v = !1; + break + } + y && (h[d]["animation-timing-function"] = y) + } + if (!v) for (var d in h) delete h[d].d; + if (!i) for (p = 0; p < s; p++) { + var b, w; + "style" === (w = (b = a[p]).targetName) && c(b, h, (function (t) { + return qb[t] + })) + } + var S, M = G(h), I = !0; + for (p = 1; p < M.length; p++) { + var T = M[p - 1], C = M[p]; + if (h[T][Xb] !== h[C][Xb]) { + I = !1; + break + } + S = h[T][Xb] + } + if (I && S) { + for (var d in h) h[d][Xb] && delete h[d][Xb]; + e[Xb] = S + } + if (B(M, (function (t) { + return G(h[t]).length > 0 + })).length) return Kb(h, n) + " " + r[0] + " both" + } + + for (var g in s) { + var y; + (y = f(s[g])) && a.push(y) + } + if (a.length) { + var v = n.zrId + "-cls-" + n.cssClassIdx++; + n.cssNodes["." + v] = {animation: a.join(",")}, e.class = v + } + } + + var Qb = Math.round; + + function tw(t) { + return t && X(t.src) + } + + function ew(t) { + return t && U(t.toDataURL) + } + + function nw(t, e, n, i) { + zb((function (r, o) { + var a = "fill" === r || "stroke" === r; + a && function (t) { + return t && ("linear" === t.type || "radial" === t.type) + }(o) ? function (t, e, n, i) { + var r, o = t[n], a = {gradientUnits: o.global ? "userSpaceOnUse" : "objectBoundingBox"}; + if (Gn(o)) r = "linearGradient", a.x1 = o.x, a.y1 = o.y, a.x2 = o.x2, a.y2 = o.y2; else { + if (!Wn(o)) return void 0; + r = "radialGradient", a.cx = rt(o.x, .5), a.cy = rt(o.y, .5), a.r = rt(o.r, .5) + } + for (var s = o.colorStops, l = [], u = 0, h = s.length; u < h; ++u) { + var c = 100 * Vn(s[u].offset) + "%", p = Rn(s[u].color), d = p.color, f = p.opacity, + g = {offset: c}; + g["stop-color"] = d, f < 1 && (g["stop-opacity"] = f), l.push(Gb("stop", u + "", g)) + } + var y = Wb(Gb(r, "", a, l)), v = i.gradientCache, m = v[y]; + m || (m = i.zrId + "-g" + i.gradientIdx++, v[y] = m, a.id = m, i.defs[m] = Gb(r, m, a, l)); + e[n] = Hn(m) + }(e, t, r, i) : a && function (t) { + return Fn(t) || function (t) { + return t && !!t.svgElement + }(t) + }(o) ? function (t, e, n, i) { + var r, o = t.style[n], a = {patternUnits: "userSpaceOnUse"}; + if (Fn(o)) { + var s = o.imageWidth, l = o.imageHeight, u = void 0, h = o.image; + if (X(h) ? u = h : tw(h) ? u = h.src : ew(h) && (u = h.toDataURL()), "undefined" == typeof Image) { + var c = "Image width/height must been given explictly in svg-ssr renderer."; + lt(s, c), lt(l, c) + } else if (null == s || null == l) { + var p = function (t, e) { + if (t) { + var n = t.elm, i = t.attrs.width = s || e.width, r = t.attrs.height = l || e.height; + n && (n.setAttribute("width", i), n.setAttribute("height", r)) + } + }, d = Zo(u, null, t, (function (t) { + p(f, t), p(r, t) + })); + d && d.width && d.height && (s = s || d.width, l = l || d.height) + } + r = Gb("image", "img", {href: u, width: s, height: l}), a.width = s, a.height = l + } else o.svgElement && (r = o.svgElement, a.width = o.svgWidth, a.height = o.svgHeight); + if (!r) return; + a.patternTransform = Un(o); + var f = Gb("pattern", "", a, [r]), g = Wb(f), y = i.patternCache, v = y[g]; + v || (v = i.zrId + "-p" + i.patternIdx++, y[g] = v, a.id = v, f = i.defs[v] = Gb("pattern", v, a, [r])); + e[n] = Hn(v) + }(n, t, r, i) : t[r] = o + }), e, n, !1), function (t, e, n) { + var i = t.style; + if (function (t) { + return t && (t.shadowBlur || t.shadowOffsetX || t.shadowOffsetY) + }(i)) { + var r = function (t) { + var e = t.style, n = t.getGlobalScale(); + return [e.shadowColor, (e.shadowBlur || 0).toFixed(2), (e.shadowOffsetX || 0).toFixed(2), (e.shadowOffsetY || 0).toFixed(2), n[0], n[1]].join(",") + }(t), o = n.shadowCache, a = o[r]; + if (!a) { + var s = t.getGlobalScale(), l = s[0], u = s[1]; + if (!l || !u) return; + var h = i.shadowOffsetX || 0, c = i.shadowOffsetY || 0, p = i.shadowBlur, d = Rn(i.shadowColor), + f = d.opacity, g = d.color, y = p / 2 / l + " " + p / 2 / u; + a = n.zrId + "-s" + n.shadowIdx++, n.defs[a] = Gb("filter", a, { + id: a, + x: "-100%", + y: "-100%", + width: "300%", + height: "300%" + }, [Gb("feDropShadow", "", { + dx: h / l, + dy: c / u, + stdDeviation: y, + "flood-color": g, + "flood-opacity": f + })]), o[r] = a + } + e.filter = Hn(a) + } + }(n, t, i) + } + + function iw(t) { + return En(t[0] - 1) && En(t[1]) && En(t[2]) && En(t[3] - 1) + } + + function rw(t, e, n) { + if (e && (!function (t) { + return En(t[4]) && En(t[5]) + }(e) || !iw(e))) { + var i = n ? 10 : 1e4; + t.transform = iw(e) ? "translate(" + Qb(e[4] * i) / i + " " + Qb(e[5] * i) / i + ")" : function (t) { + return "matrix(" + zn(t[0]) + "," + zn(t[1]) + "," + zn(t[2]) + "," + zn(t[3]) + "," + Vn(t[4]) + "," + Vn(t[5]) + ")" + }(e) + } + } + + function ow(t, e, n) { + for (var i = t.points, r = [], o = 0; o < i.length; o++) r.push(Qb(i[o][0] * n) / n), r.push(Qb(i[o][1] * n) / n); + e.points = r.join(" ") + } + + function aw(t) { + return !t.smooth + } + + var sw, lw, uw = { + circle: [(sw = ["cx", "cy", "r"], lw = z(sw, (function (t) { + return "string" == typeof t ? [t, t] : t + })), function (t, e, n) { + for (var i = 0; i < lw.length; i++) { + var r = lw[i], o = t[r[0]]; + null != o && (e[r[1]] = Qb(o * n) / n) + } + })], polyline: [ow, aw], polygon: [ow, aw] + }; + + function hw(t, e) { + var n = t.style, i = t.shape, r = uw[t.type], o = {}, a = e.animation, s = "path", l = t.style.strokePercent, + u = e.compress && Yn(t) || 4; + if (!r || e.willUpdate || r[1] && !r[1](i) || a && function (t) { + for (var e = t.animators, n = 0; n < e.length; n++) if ("shape" === e[n].targetName) return !0; + return !1 + }(t) || l < 1) { + t.path || t.createPathProxy(); + var h = t.path; + t.shapeChanged() && (h.beginPath(), t.buildPath(h, t.shape), t.pathUpdated()); + var c = h.getVersion(), p = t, d = p.__svgPathBuilder; + p.__svgPathVersion === c && d && l === p.__svgPathStrokePercent || (d || (d = p.__svgPathBuilder = new Pb), d.reset(u), h.rebuildPath(d, l), d.generateStr(), p.__svgPathVersion = c, p.__svgPathStrokePercent = l), o.d = d.getStr() + } else { + s = t.type; + var f = Math.pow(10, u); + r[0](i, o, f) + } + return rw(o, t.transform), nw(o, n, t, e), e.animation && Jb(t, o, e), Gb(s, t.id + "", o) + } + + function cw(t, e) { + return t instanceof fs ? hw(t, e) : t instanceof xs ? function (t, e) { + var n = t.style, i = n.image; + if (i && !X(i) && (tw(i) ? i = i.src : ew(i) && (i = i.toDataURL())), i) { + var r = n.x || 0, o = n.y || 0, a = {href: i, width: n.width, height: n.height}; + return r && (a.x = r), o && (a.y = o), rw(a, t.transform), nw(a, n, t, e), e.animation && Jb(t, a, e), Gb("image", t.id + "", a) + } + }(t, e) : t instanceof ys ? function (t, e) { + var n = t.style, i = n.text; + if (null != i && (i += ""), i && !isNaN(n.x) && !isNaN(n.y)) { + var r = n.font || a, s = n.x || 0, l = function (t, e, n) { + return "top" === n ? t += e / 2 : "bottom" === n && (t -= e / 2), t + }(n.y || 0, fr(r), n.textBaseline), + u = {"dominant-baseline": "central", "text-anchor": Bn[n.textAlign] || n.textAlign}; + if (Ns(n)) { + var h = "", c = n.fontStyle, p = Os(n.fontSize); + if (!parseFloat(p)) return; + var d = n.fontFamily || o, f = n.fontWeight; + h += "font-size:" + p + ";font-family:" + d + ";", c && "normal" !== c && (h += "font-style:" + c + ";"), f && "normal" !== f && (h += "font-weight:" + f + ";"), u.style = h + } else u.style = "font: " + r; + return i.match(/\s/) && (u["xml:space"] = "preserve"), s && (u.x = s), l && (u.y = l), rw(u, t.transform), nw(u, n, t, e), e.animation && Jb(t, u, e), Gb("text", t.id + "", u, void 0, i) + } + }(t, e) : void 0 + } + + function pw(t, e, n) { + var i = n.clipPathCache, r = n.defs, o = i[t.id]; + if (!o) { + var a = {id: o = n.zrId + "-c" + n.clipPathIdx++}; + i[t.id] = o, r[o] = Gb("clipPath", o, a, [hw(t, n)]) + } + e["clip-path"] = Hn(o) + } + + function dw(t) { + return document.createTextNode(t) + } + + function fw(t, e, n) { + t.insertBefore(e, n) + } + + function gw(t, e) { + t.removeChild(e) + } + + function yw(t, e) { + t.appendChild(e) + } + + function vw(t) { + return t.parentNode + } + + function mw(t) { + return t.nextSibling + } + + function xw(t, e) { + t.textContent = e + } + + var _w = Gb("", ""); + + function bw(t) { + return void 0 === t + } + + function ww(t) { + return void 0 !== t + } + + function Sw(t, e, n) { + for (var i = {}, r = e; r <= n; ++r) { + var o = t[r].key; + void 0 !== o && (i[o] = r) + } + return i + } + + function Mw(t, e) { + var n = t.key === e.key; + return t.tag === e.tag && n + } + + function Iw(t) { + var e, n = t.children, i = t.tag; + if (ww(i)) { + var r = t.elm = Fb(i); + if (Dw(_w, t), Y(n)) for (e = 0; e < n.length; ++e) { + var o = n[e]; + null != o && yw(r, Iw(o)) + } else ww(t.text) && !q(t.text) && yw(r, dw(t.text)) + } else t.elm = dw(t.text); + return t.elm + } + + function Tw(t, e, n, i, r) { + for (; i <= r; ++i) { + var o = n[i]; + null != o && fw(t, Iw(o), e) + } + } + + function Cw(t, e, n, i) { + for (; n <= i; ++n) { + var r = e[n]; + if (null != r) if (ww(r.tag)) gw(vw(r.elm), r.elm); else gw(t, r.elm) + } + } + + function Dw(t, e) { + var n, i = e.elm, r = t && t.attrs || {}, o = e.attrs || {}; + if (r !== o) { + for (n in o) { + var a = o[n]; + r[n] !== a && (!0 === a ? i.setAttribute(n, "") : !1 === a ? i.removeAttribute(n) : 120 !== n.charCodeAt(0) ? i.setAttribute(n, a) : "xmlns:xlink" === n || "xmlns" === n ? i.setAttributeNS("http://www.w3.org/2000/xmlns/", n, a) : 58 === n.charCodeAt(3) ? i.setAttributeNS("http://www.w3.org/XML/1998/namespace", n, a) : 58 === n.charCodeAt(5) ? i.setAttributeNS(Bb, n, a) : i.setAttribute(n, a)) + } + for (n in r) n in o || i.removeAttribute(n) + } + } + + function Aw(t, e) { + var n = e.elm = t.elm, i = t.children, r = e.children; + t !== e && (Dw(t, e), bw(e.text) ? ww(i) && ww(r) ? i !== r && function (t, e, n) { + for (var i, r, o, a = 0, s = 0, l = e.length - 1, u = e[0], h = e[l], c = n.length - 1, p = n[0], d = n[c]; a <= l && s <= c;) null == u ? u = e[++a] : null == h ? h = e[--l] : null == p ? p = n[++s] : null == d ? d = n[--c] : Mw(u, p) ? (Aw(u, p), u = e[++a], p = n[++s]) : Mw(h, d) ? (Aw(h, d), h = e[--l], d = n[--c]) : Mw(u, d) ? (Aw(u, d), fw(t, u.elm, mw(h.elm)), u = e[++a], d = n[--c]) : Mw(h, p) ? (Aw(h, p), fw(t, h.elm, u.elm), h = e[--l], p = n[++s]) : (bw(i) && (i = Sw(e, a, l)), bw(r = i[p.key]) || (o = e[r]).tag !== p.tag ? fw(t, Iw(p), u.elm) : (Aw(o, p), e[r] = void 0, fw(t, o.elm, u.elm)), p = n[++s]); + (a <= l || s <= c) && (a > l ? Tw(t, null == n[c + 1] ? null : n[c + 1].elm, n, s, c) : Cw(t, e, a, l)) + }(n, i, r) : ww(r) ? (ww(t.text) && xw(n, ""), Tw(n, null, r, 0, r.length - 1)) : ww(i) ? Cw(n, i, 0, i.length - 1) : ww(t.text) && xw(n, "") : t.text !== e.text && (ww(i) && Cw(n, i, 0, i.length - 1), xw(n, e.text))) + } + + var kw = 0, Lw = function () { + function t(t, e, n) { + if (this.type = "svg", this.refreshHover = Pw("refreshHover"), this.configLayer = Pw("configLayer"), this.storage = e, this._opts = n = A({}, n), this.root = t, this._id = "zr" + kw++, this._oldVNode = Yb(n.width, n.height), t && !n.ssr) { + var i = this._viewport = document.createElement("div"); + i.style.cssText = "position:relative;overflow:hidden"; + var r = this._svgDom = this._oldVNode.elm = Fb("svg"); + Dw(null, this._oldVNode), i.appendChild(r), t.appendChild(i) + } + this.resize(n.width, n.height) + } + + return t.prototype.getType = function () { + return this.type + }, t.prototype.getViewportRoot = function () { + return this._viewport + }, t.prototype.getViewportRootOffset = function () { + var t = this.getViewportRoot(); + if (t) return {offsetLeft: t.offsetLeft || 0, offsetTop: t.offsetTop || 0} + }, t.prototype.getSvgDom = function () { + return this._svgDom + }, t.prototype.refresh = function () { + if (this.root) { + var t = this.renderToVNode({willUpdate: !0}); + t.attrs.style = "position:absolute;left:0;top:0;user-select:none", function (t, e) { + if (Mw(t, e)) Aw(t, e); else { + var n = t.elm, i = vw(n); + Iw(e), null !== i && (fw(i, e.elm, mw(n)), Cw(i, [t], 0, 0)) + } + }(this._oldVNode, t), this._oldVNode = t + } + }, t.prototype.renderOneToVNode = function (t) { + return cw(t, Hb(this._id)) + }, t.prototype.renderToVNode = function (t) { + t = t || {}; + var e = this.storage.getDisplayList(!0), n = this._backgroundColor, i = this._width, r = this._height, + o = Hb(this._id); + o.animation = t.animation, o.willUpdate = t.willUpdate, o.compress = t.compress; + var a = []; + if (n && "none" !== n) { + var s = Rn(n), l = s.color, u = s.opacity; + this._bgVNode = Gb("rect", "bg", { + width: i, + height: r, + x: "0", + y: "0", + id: "0", + fill: l, + "fill-opacity": u + }), a.push(this._bgVNode) + } else this._bgVNode = null; + var h = t.compress ? null : this._mainVNode = Gb("g", "main", {}, []); + this._paintList(e, o, h ? h.children : a), h && a.push(h); + var c = z(G(o.defs), (function (t) { + return o.defs[t] + })); + if (c.length && a.push(Gb("defs", "defs", {}, c)), t.animation) { + var p = function (t, e, n) { + var i = (n = n || {}).newline ? "\n" : "", r = " {" + i, o = i + "}", a = z(G(t), (function (e) { + return e + r + z(G(t[e]), (function (n) { + return n + ":" + t[e][n] + ";" + })).join(i) + o + })).join(i), s = z(G(e), (function (t) { + return "@keyframes " + t + r + z(G(e[t]), (function (n) { + return n + r + z(G(e[t][n]), (function (i) { + var r = e[t][n][i]; + return "d" === i && (r = 'path("' + r + '")'), i + ":" + r + ";" + })).join(i) + o + })).join(i) + o + })).join(i); + return a || s ? [""].join(i) : "" + }(o.cssNodes, o.cssAnims, {newline: !0}); + if (p) { + var d = Gb("style", "stl", {}, [], p); + a.push(d) + } + } + return Yb(i, r, a, t.useViewBox) + }, t.prototype.renderToString = function (t) { + return t = t || {}, Wb(this.renderToVNode({ + animation: rt(t.cssAnimation, !0), + willUpdate: !1, + compress: !0, + useViewBox: rt(t.useViewBox, !0) + }), {newline: !0}) + }, t.prototype.setBackgroundColor = function (t) { + this._backgroundColor = t; + var e = this._bgVNode; + if (e && e.elm) { + var n = Rn(t), i = n.color, r = n.opacity; + e.elm.setAttribute("fill", i), r < 1 && e.elm.setAttribute("fill-opacity", r) + } + }, t.prototype.getSvgRoot = function () { + return this._mainVNode && this._mainVNode.elm + }, t.prototype._paintList = function (t, e, n) { + for (var i, r, o = t.length, a = [], s = 0, l = 0, u = 0; u < o; u++) { + var h = t[u]; + if (!h.invisible) { + var c = h.__clipPaths, p = c && c.length || 0, d = r && r.length || 0, f = void 0; + for (f = Math.max(p - 1, d - 1); f >= 0 && (!c || !r || c[f] !== r[f]); f--) ; + for (var g = d - 1; g > f; g--) i = a[--s - 1]; + for (var y = f + 1; y < p; y++) { + var v = {}; + pw(c[y], v, e); + var m = Gb("g", "clip-g-" + l++, v, []); + (i ? i.children : n).push(m), a[s++] = m, i = m + } + r = c; + var x = cw(h, e); + x && (i ? i.children : n).push(x) + } + } + }, t.prototype.resize = function (t, e) { + var n = this._opts, i = this.root, r = this._viewport; + if (null != t && (n.width = t), null != e && (n.height = e), i && r && (r.style.display = "none", t = Ny(i, 0, n), e = Ny(i, 1, n), r.style.display = ""), this._width !== t || this._height !== e) { + if (this._width = t, this._height = e, r) { + var o = r.style; + o.width = t + "px", o.height = e + "px" + } + var a = this._svgDom; + a && (a.setAttribute("width", t), a.setAttribute("height", e)) + } + }, t.prototype.getWidth = function () { + return this._width + }, t.prototype.getHeight = function () { + return this._height + }, t.prototype.dispose = function () { + this.root && (this.root.innerHTML = ""), this._svgDom = this._viewport = this.storage = this._oldVNode = this._bgVNode = this._mainVNode = null + }, t.prototype.clear = function () { + this._svgDom && (this._svgDom.innerHTML = null), this._oldVNode = null + }, t.prototype.toDataURL = function (t) { + var e = encodeURIComponent(this.renderToString()), n = "data:image/svg+xml;"; + return t ? (e = Xn(e)) && n + "base64," + e : n + "charset=UTF-8," + e + }, t + }(); + + function Pw(t) { + return function () { + 0 + } + } + + function Ow(t, e, n) { + var i = h.createCanvas(), r = e.getWidth(), o = e.getHeight(), a = i.style; + return a && (a.position = "absolute", a.left = "0", a.top = "0", a.width = r + "px", a.height = o + "px", i.setAttribute("data-zr-dom-id", t)), i.width = r * n, i.height = o * n, i + } + + var Rw = function (t) { + function e(e, n, i) { + var r, o = t.call(this) || this; + o.motionBlur = !1, o.lastFrameAlpha = .7, o.dpr = 1, o.virtual = !1, o.config = {}, o.incremental = !1, o.zlevel = 0, o.maxRepaintRectCount = 5, o.__dirty = !0, o.__firstTimePaint = !0, o.__used = !1, o.__drawIndex = 0, o.__startIndex = 0, o.__endIndex = 0, o.__prevStartIndex = null, o.__prevEndIndex = null, i = i || Ai, "string" == typeof e ? r = Ow(e, n, i) : q(e) && (e = (r = e).id), o.id = e, o.dom = r; + var a = r.style; + return a && (vt(r), r.onselectstart = function () { + return !1 + }, a.padding = "0", a.margin = "0", a.borderWidth = "0"), o.painter = n, o.dpr = i, o + } + + return n(e, t), e.prototype.getElementCount = function () { + return this.__endIndex - this.__startIndex + }, e.prototype.afterBrush = function () { + this.__prevStartIndex = this.__startIndex, this.__prevEndIndex = this.__endIndex + }, e.prototype.initContext = function () { + this.ctx = this.dom.getContext("2d"), this.ctx.dpr = this.dpr + }, e.prototype.setUnpainted = function () { + this.__firstTimePaint = !0 + }, e.prototype.createBackBuffer = function () { + var t = this.dpr; + this.domBack = Ow("back-" + this.id, this.painter, t), this.ctxBack = this.domBack.getContext("2d"), 1 !== t && this.ctxBack.scale(t, t) + }, e.prototype.createRepaintRects = function (t, e, n, i) { + if (this.__firstTimePaint) return this.__firstTimePaint = !1, null; + var r, o = [], a = this.maxRepaintRectCount, s = !1, l = new sr(0, 0, 0, 0); + + function u(t) { + if (t.isFinite() && !t.isZero()) if (0 === o.length) { + (e = new sr(0, 0, 0, 0)).copy(t), o.push(e) + } else { + for (var e, n = !1, i = 1 / 0, r = 0, u = 0; u < o.length; ++u) { + var h = o[u]; + if (h.intersect(t)) { + var c = new sr(0, 0, 0, 0); + c.copy(h), c.union(t), o[u] = c, n = !0; + break + } + if (s) { + l.copy(t), l.union(h); + var p = t.width * t.height, d = h.width * h.height, f = l.width * l.height - p - d; + f < i && (i = f, r = u) + } + } + if (s && (o[r].union(t), n = !0), !n) (e = new sr(0, 0, 0, 0)).copy(t), o.push(e); + s || (s = o.length >= a) + } + } + + for (var h = this.__startIndex; h < this.__endIndex; ++h) { + if (d = t[h]) { + var c = d.shouldBePainted(n, i, !0, !0); + (f = d.__isRendered && (1 & d.__dirty || !c) ? d.getPrevPaintRect() : null) && u(f); + var p = c && (1 & d.__dirty || !d.__isRendered) ? d.getPaintRect() : null; + p && u(p) + } + } + for (h = this.__prevStartIndex; h < this.__prevEndIndex; ++h) { + var d, f; + c = (d = e[h]).shouldBePainted(n, i, !0, !0); + if (d && (!c || !d.__zr) && d.__isRendered) (f = d.getPrevPaintRect()) && u(f) + } + do { + r = !1; + for (h = 0; h < o.length;) if (o[h].isZero()) o.splice(h, 1); else { + for (var g = h + 1; g < o.length;) o[h].intersect(o[g]) ? (r = !0, o[h].union(o[g]), o.splice(g, 1)) : g++; + h++ + } + } while (r); + return this._paintRects = o, o + }, e.prototype.debugGetPaintRects = function () { + return (this._paintRects || []).slice() + }, e.prototype.resize = function (t, e) { + var n = this.dpr, i = this.dom, r = i.style, o = this.domBack; + r && (r.width = t + "px", r.height = e + "px"), i.width = t * n, i.height = e * n, o && (o.width = t * n, o.height = e * n, 1 !== n && this.ctxBack.scale(n, n)) + }, e.prototype.clear = function (t, e, n) { + var i = this.dom, r = this.ctx, o = i.width, a = i.height; + e = e || this.clearColor; + var s = this.motionBlur && !t, l = this.lastFrameAlpha, u = this.dpr, h = this; + s && (this.domBack || this.createBackBuffer(), this.ctxBack.globalCompositeOperation = "copy", this.ctxBack.drawImage(i, 0, 0, o / u, a / u)); + var c = this.domBack; + + function p(t, n, i, o) { + if (r.clearRect(t, n, i, o), e && "transparent" !== e) { + var a = void 0; + Q(e) ? (a = e.__canvasGradient || Oy(r, e, { + x: 0, + y: 0, + width: i, + height: o + }), e.__canvasGradient = a) : tt(e) && (a = Hy(r, e, { + dirty: function () { + h.setUnpainted(), h.__painter.refresh() + } + })), r.save(), r.fillStyle = a || e, r.fillRect(t, n, i, o), r.restore() + } + s && (r.save(), r.globalAlpha = l, r.drawImage(c, t, n, i, o), r.restore()) + } + + !n || s ? p(0, 0, o, a) : n.length && E(n, (function (t) { + p(t.x * u, t.y * u, t.width * u, t.height * u) + })) + }, e + }(Xt), Nw = 1e5, Ew = 314159, zw = .01; + var Vw = function () { + function t(t, e, n, i) { + this.type = "canvas", this._zlevelList = [], this._prevDisplayList = [], this._layers = {}, this._layerConfig = {}, this._needsManuallyCompositing = !1, this.type = "canvas"; + var r = !t.nodeName || "CANVAS" === t.nodeName.toUpperCase(); + this._opts = n = A({}, n || {}), this.dpr = n.devicePixelRatio || Ai, this._singleCanvas = r, this.root = t, t.style && (vt(t), t.innerHTML = ""), this.storage = e; + var o = this._zlevelList; + this._prevDisplayList = []; + var a = this._layers; + if (r) { + var s = t, l = s.width, u = s.height; + null != n.width && (l = n.width), null != n.height && (u = n.height), this.dpr = n.devicePixelRatio || 1, s.width = l * this.dpr, s.height = u * this.dpr, this._width = l, this._height = u; + var h = new Rw(s, this, this.dpr); + h.__builtin__ = !0, h.initContext(), a[314159] = h, h.zlevel = Ew, o.push(Ew), this._domRoot = t + } else { + this._width = Ny(t, 0, n), this._height = Ny(t, 1, n); + var c = this._domRoot = function (t, e) { + var n = document.createElement("div"); + return n.style.cssText = ["position:relative", "width:" + t + "px", "height:" + e + "px", "padding:0", "margin:0", "border-width:0"].join(";") + ";", n + }(this._width, this._height); + t.appendChild(c) + } + } + + return t.prototype.getType = function () { + return "canvas" + }, t.prototype.isSingleCanvas = function () { + return this._singleCanvas + }, t.prototype.getViewportRoot = function () { + return this._domRoot + }, t.prototype.getViewportRootOffset = function () { + var t = this.getViewportRoot(); + if (t) return {offsetLeft: t.offsetLeft || 0, offsetTop: t.offsetTop || 0} + }, t.prototype.refresh = function (t) { + var e = this.storage.getDisplayList(!0), n = this._prevDisplayList, i = this._zlevelList; + this._redrawId = Math.random(), this._paintList(e, n, t, this._redrawId); + for (var r = 0; r < i.length; r++) { + var o = i[r], a = this._layers[o]; + if (!a.__builtin__ && a.refresh) { + var s = 0 === r ? this._backgroundColor : null; + a.refresh(s) + } + } + return this._opts.useDirtyRect && (this._prevDisplayList = e.slice()), this + }, t.prototype.refreshHover = function () { + this._paintHoverList(this.storage.getDisplayList(!1)) + }, t.prototype._paintHoverList = function (t) { + var e = t.length, n = this._hoverlayer; + if (n && n.clear(), e) { + for (var i, r = {inHover: !0, viewWidth: this._width, viewHeight: this._height}, o = 0; o < e; o++) { + var a = t[o]; + a.__inHover && (n || (n = this._hoverlayer = this.getLayer(Nw)), i || (i = n.ctx).save(), Jy(i, a, r, o === e - 1)) + } + i && i.restore() + } + }, t.prototype.getHoverLayer = function () { + return this.getLayer(Nw) + }, t.prototype.paintOne = function (t, e) { + $y(t, e) + }, t.prototype._paintList = function (t, e, n, i) { + if (this._redrawId === i) { + n = n || !1, this._updateLayerStatus(t); + var r = this._doPaintList(t, e, n), o = r.finished, a = r.needsRefreshHover; + if (this._needsManuallyCompositing && this._compositeManually(), a && this._paintHoverList(t), o) this.eachLayer((function (t) { + t.afterBrush && t.afterBrush() + })); else { + var s = this; + ke((function () { + s._paintList(t, e, n, i) + })) + } + } + }, t.prototype._compositeManually = function () { + var t = this.getLayer(Ew).ctx, e = this._domRoot.width, n = this._domRoot.height; + t.clearRect(0, 0, e, n), this.eachBuiltinLayer((function (i) { + i.virtual && t.drawImage(i.dom, 0, 0, e, n) + })) + }, t.prototype._doPaintList = function (t, e, n) { + for (var i = this, o = [], a = this._opts.useDirtyRect, s = 0; s < this._zlevelList.length; s++) { + var l = this._zlevelList[s], u = this._layers[l]; + u.__builtin__ && u !== this._hoverlayer && (u.__dirty || n) && o.push(u) + } + for (var h = !0, c = !1, p = function (r) { + var s, l = o[r], u = l.ctx, p = a && l.createRepaintRects(t, e, d._width, d._height), + f = n ? l.__startIndex : l.__drawIndex, g = !n && l.incremental && Date.now, y = g && Date.now(), + v = l.zlevel === d._zlevelList[0] ? d._backgroundColor : null; + if (l.__startIndex === l.__endIndex) l.clear(!1, v, p); else if (f === l.__startIndex) { + var m = t[f]; + m.incremental && m.notClear && !n || l.clear(!1, v, p) + } + -1 === f && (console.error("For some unknown reason. drawIndex is -1"), f = l.__startIndex); + var x = function (e) { + var n = {inHover: !1, allClipped: !1, prevEl: null, viewWidth: i._width, viewHeight: i._height}; + for (s = f; s < l.__endIndex; s++) { + var r = t[s]; + if (r.__inHover && (c = !0), i._doPaintEl(r, l, a, e, n, s === l.__endIndex - 1), g) if (Date.now() - y > 15) break + } + n.prevElClipPaths && u.restore() + }; + if (p) if (0 === p.length) s = l.__endIndex; else for (var _ = d.dpr, b = 0; b < p.length; ++b) { + var w = p[b]; + u.save(), u.beginPath(), u.rect(w.x * _, w.y * _, w.width * _, w.height * _), u.clip(), x(w), u.restore() + } else u.save(), x(), u.restore(); + l.__drawIndex = s, l.__drawIndex < l.__endIndex && (h = !1) + }, d = this, f = 0; f < o.length; f++) p(f); + return r.wxa && E(this._layers, (function (t) { + t && t.ctx && t.ctx.draw && t.ctx.draw() + })), {finished: h, needsRefreshHover: c} + }, t.prototype._doPaintEl = function (t, e, n, i, r, o) { + var a = e.ctx; + if (n) { + var s = t.getPaintRect(); + (!i || s && s.intersect(i)) && (Jy(a, t, r, o), t.setPrevPaintRect(s)) + } else Jy(a, t, r, o) + }, t.prototype.getLayer = function (t, e) { + this._singleCanvas && !this._needsManuallyCompositing && (t = Ew); + var n = this._layers[t]; + return n || ((n = new Rw("zr_" + t, this, this.dpr)).zlevel = t, n.__builtin__ = !0, this._layerConfig[t] ? C(n, this._layerConfig[t], !0) : this._layerConfig[t - zw] && C(n, this._layerConfig[t - zw], !0), e && (n.virtual = e), this.insertLayer(t, n), n.initContext()), n + }, t.prototype.insertLayer = function (t, e) { + var n = this._layers, i = this._zlevelList, r = i.length, o = this._domRoot, a = null, s = -1; + if (!n[t] && function (t) { + return !!t && (!!t.__builtin__ || "function" == typeof t.resize && "function" == typeof t.refresh) + }(e)) { + if (r > 0 && t > i[0]) { + for (s = 0; s < r - 1 && !(i[s] < t && i[s + 1] > t); s++) ; + a = n[i[s]] + } + if (i.splice(s + 1, 0, t), n[t] = e, !e.virtual) if (a) { + var l = a.dom; + l.nextSibling ? o.insertBefore(e.dom, l.nextSibling) : o.appendChild(e.dom) + } else o.firstChild ? o.insertBefore(e.dom, o.firstChild) : o.appendChild(e.dom); + e.__painter = this + } + }, t.prototype.eachLayer = function (t, e) { + for (var n = this._zlevelList, i = 0; i < n.length; i++) { + var r = n[i]; + t.call(e, this._layers[r], r) + } + }, t.prototype.eachBuiltinLayer = function (t, e) { + for (var n = this._zlevelList, i = 0; i < n.length; i++) { + var r = n[i], o = this._layers[r]; + o.__builtin__ && t.call(e, o, r) + } + }, t.prototype.eachOtherLayer = function (t, e) { + for (var n = this._zlevelList, i = 0; i < n.length; i++) { + var r = n[i], o = this._layers[r]; + o.__builtin__ || t.call(e, o, r) + } + }, t.prototype.getLayers = function () { + return this._layers + }, t.prototype._updateLayerStatus = function (t) { + function e(t) { + o && (o.__endIndex !== t && (o.__dirty = !0), o.__endIndex = t) + } + + if (this.eachBuiltinLayer((function (t, e) { + t.__dirty = t.__used = !1 + })), this._singleCanvas) for (var n = 1; n < t.length; n++) { + if ((s = t[n]).zlevel !== t[n - 1].zlevel || s.incremental) { + this._needsManuallyCompositing = !0; + break + } + } + var i, r, o = null, a = 0; + for (r = 0; r < t.length; r++) { + var s, l = (s = t[r]).zlevel, u = void 0; + i !== l && (i = l, a = 0), s.incremental ? ((u = this.getLayer(l + .001, this._needsManuallyCompositing)).incremental = !0, a = 1) : u = this.getLayer(l + (a > 0 ? zw : 0), this._needsManuallyCompositing), u.__builtin__ || I("ZLevel " + l + " has been used by unkown layer " + u.id), u !== o && (u.__used = !0, u.__startIndex !== r && (u.__dirty = !0), u.__startIndex = r, u.incremental ? u.__drawIndex = -1 : u.__drawIndex = r, e(r), o = u), 1 & s.__dirty && !s.__inHover && (u.__dirty = !0, u.incremental && u.__drawIndex < 0 && (u.__drawIndex = r)) + } + e(r), this.eachBuiltinLayer((function (t, e) { + !t.__used && t.getElementCount() > 0 && (t.__dirty = !0, t.__startIndex = t.__endIndex = t.__drawIndex = 0), t.__dirty && t.__drawIndex < 0 && (t.__drawIndex = t.__startIndex) + })) + }, t.prototype.clear = function () { + return this.eachBuiltinLayer(this._clearLayer), this + }, t.prototype._clearLayer = function (t) { + t.clear() + }, t.prototype.setBackgroundColor = function (t) { + this._backgroundColor = t, E(this._layers, (function (t) { + t.setUnpainted() + })) + }, t.prototype.configLayer = function (t, e) { + if (e) { + var n = this._layerConfig; + n[t] ? C(n[t], e, !0) : n[t] = e; + for (var i = 0; i < this._zlevelList.length; i++) { + var r = this._zlevelList[i]; + if (r === t || r === t + zw) C(this._layers[r], n[t], !0) + } + } + }, t.prototype.delLayer = function (t) { + var e = this._layers, n = this._zlevelList, i = e[t]; + i && (i.dom.parentNode.removeChild(i.dom), delete e[t], n.splice(P(n, t), 1)) + }, t.prototype.resize = function (t, e) { + if (this._domRoot.style) { + var n = this._domRoot; + n.style.display = "none"; + var i = this._opts, r = this.root; + if (null != t && (i.width = t), null != e && (i.height = e), t = Ny(r, 0, i), e = Ny(r, 1, i), n.style.display = "", this._width !== t || e !== this._height) { + for (var o in n.style.width = t + "px", n.style.height = e + "px", this._layers) this._layers.hasOwnProperty(o) && this._layers[o].resize(t, e); + this.refresh(!0) + } + this._width = t, this._height = e + } else { + if (null == t || null == e) return; + this._width = t, this._height = e, this.getLayer(Ew).resize(t, e) + } + return this + }, t.prototype.clearLayer = function (t) { + var e = this._layers[t]; + e && e.clear() + }, t.prototype.dispose = function () { + this.root.innerHTML = "", this.root = this.storage = this._domRoot = this._layers = null + }, t.prototype.getRenderedCanvas = function (t) { + if (t = t || {}, this._singleCanvas && !this._compositeManually) return this._layers[314159].dom; + var e = new Rw("image", this, t.pixelRatio || this.dpr); + e.initContext(), e.clear(!1, t.backgroundColor || this._backgroundColor); + var n = e.ctx; + if (t.pixelRatio <= this.dpr) { + this.refresh(); + var i = e.dom.width, r = e.dom.height; + this.eachLayer((function (t) { + t.__builtin__ ? n.drawImage(t.dom, 0, 0, i, r) : t.renderToCanvas && (n.save(), t.renderToCanvas(n), n.restore()) + })) + } else for (var o = { + inHover: !1, + viewWidth: this._width, + viewHeight: this._height + }, a = this.storage.getDisplayList(!0), s = 0, l = a.length; s < l; s++) { + var u = a[s]; + Jy(n, u, o, s === l - 1) + } + return e.dom + }, t.prototype.getWidth = function () { + return this._width + }, t.prototype.getHeight = function () { + return this._height + }, t + }(); + var Bw = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.hasSymbolVisual = !0, n + } + + return n(e, t), e.prototype.getInitialData = function (t) { + return nx(null, this, {useEncodeDefaulter: !0}) + }, e.prototype.getLegendIcon = function (t) { + var e = new Cr, n = ky("line", 0, t.itemHeight / 2, t.itemWidth, 0, t.lineStyle.stroke, !1); + e.add(n), n.setStyle(t.lineStyle); + var i = this.getData().getVisual("symbol"), r = this.getData().getVisual("symbolRotate"), + o = "none" === i ? "circle" : i, a = .8 * t.itemHeight, + s = ky(o, (t.itemWidth - a) / 2, (t.itemHeight - a) / 2, a, a, t.itemStyle.fill); + e.add(s), s.setStyle(t.itemStyle); + var l = "inherit" === t.iconRotate ? r : t.iconRotate || 0; + return s.rotation = l * Math.PI / 180, s.setOrigin([t.itemWidth / 2, t.itemHeight / 2]), o.indexOf("empty") > -1 && (s.style.stroke = s.style.fill, s.style.fill = "#fff", s.style.lineWidth = 2), e + }, e.type = "series.line", e.dependencies = ["grid", "polar"], e.defaultOption = { + z: 3, + coordinateSystem: "cartesian2d", + legendHoverLink: !0, + clip: !0, + label: {position: "top"}, + endLabel: {show: !1, valueAnimation: !0, distance: 8}, + lineStyle: {width: 2, type: "solid"}, + emphasis: {scale: !0}, + step: !1, + smooth: !1, + smoothMonotone: null, + symbol: "emptyCircle", + symbolSize: 4, + symbolRotate: null, + showSymbol: !0, + showAllSymbol: "auto", + connectNulls: !1, + sampling: "none", + animationEasing: "linear", + progressive: 0, + hoverLayerThreshold: 1 / 0, + universalTransition: {divideShape: "clone"}, + triggerLineEvent: !1 + }, e + }(ag); + + function Fw(t, e) { + var n = t.mapDimensionsAll("defaultedLabel"), i = n.length; + if (1 === i) { + var r = of(t, e, n[0]); + return null != r ? r + "" : null + } + if (i) { + for (var o = [], a = 0; a < n.length; a++) o.push(of(t, e, n[a])); + return o.join(" ") + } + } + + function Gw(t, e) { + var n = t.mapDimensionsAll("defaultedLabel"); + if (!Y(e)) return e + ""; + for (var i = [], r = 0; r < n.length; r++) { + var o = t.getDimensionIndex(n[r]); + o >= 0 && i.push(e[o]) + } + return i.join(" ") + } + + var Ww = function (t) { + function e(e, n, i, r) { + var o = t.call(this) || this; + return o.updateData(e, n, i, r), o + } + + return n(e, t), e.prototype._createSymbol = function (t, e, n, i, r) { + this.removeAll(); + var o = ky(t, -1, -1, 2, 2, null, r); + o.attr({ + z2: 100, + culling: !0, + scaleX: i[0] / 2, + scaleY: i[1] / 2 + }), o.drift = Hw, this._symbolType = t, this.add(o) + }, e.prototype.stopSymbolAnimation = function (t) { + this.childAt(0).stopAnimation(null, t) + }, e.prototype.getSymbolType = function () { + return this._symbolType + }, e.prototype.getSymbolPath = function () { + return this.childAt(0) + }, e.prototype.highlight = function () { + xl(this.childAt(0)) + }, e.prototype.downplay = function () { + _l(this.childAt(0)) + }, e.prototype.setZ = function (t, e) { + var n = this.childAt(0); + n.zlevel = t, n.z = e + }, e.prototype.setDraggable = function (t) { + var e = this.childAt(0); + e.draggable = t, e.cursor = t ? "move" : e.cursor + }, e.prototype.updateData = function (t, n, i, r) { + this.silent = !1; + var o = t.getItemVisual(n, "symbol") || "circle", a = t.hostModel, s = e.getSymbolSize(t, n), + l = o !== this._symbolType, u = r && r.disableAnimation; + if (l) { + var h = t.getItemVisual(n, "symbolKeepAspect"); + this._createSymbol(o, t, n, s, h) + } else { + (p = this.childAt(0)).silent = !1; + var c = {scaleX: s[0] / 2, scaleY: s[1] / 2}; + u ? p.attr(c) : ih(p, c, a, n), uh(p) + } + if (this._updateCommon(t, n, s, i, r), l) { + var p = this.childAt(0); + if (!u) { + c = {scaleX: this._sizeX, scaleY: this._sizeY, style: {opacity: p.style.opacity}}; + p.scaleX = p.scaleY = 0, p.style.opacity = 0, rh(p, c, a, n) + } + } + u && this.childAt(0).stopAnimation("leave"), this._seriesModel = a + }, e.prototype._updateCommon = function (t, e, n, i, r) { + var o, a, s, l, u, h, c, p, d, f = this.childAt(0), g = t.hostModel; + if (i && (o = i.emphasisItemStyle, a = i.blurItemStyle, s = i.selectItemStyle, l = i.focus, u = i.blurScope, c = i.labelStatesModels, p = i.hoverScale, d = i.cursorStyle, h = i.emphasisDisabled), !i || t.hasItemOption) { + var y = i && i.itemModel ? i.itemModel : t.getItemModel(e), v = y.getModel("emphasis"); + o = v.getModel("itemStyle").getItemStyle(), s = y.getModel(["select", "itemStyle"]).getItemStyle(), a = y.getModel(["blur", "itemStyle"]).getItemStyle(), l = v.get("focus"), u = v.get("blurScope"), h = v.get("disabled"), c = Hh(y), p = v.getShallow("scale"), d = y.getShallow("cursor") + } + var m = t.getItemVisual(e, "symbolRotate"); + f.attr("rotation", (m || 0) * Math.PI / 180 || 0); + var x = Py(t.getItemVisual(e, "symbolOffset"), n); + x && (f.x = x[0], f.y = x[1]), d && f.attr("cursor", d); + var _ = t.getItemVisual(e, "style"), b = _.fill; + if (f instanceof xs) { + var w = f.style; + f.useStyle(A({image: w.image, x: w.x, y: w.y, width: w.width, height: w.height}, _)) + } else f.__isEmptyBrush ? f.useStyle(A({}, _)) : f.useStyle(_), f.style.decal = null, f.setColor(b, r && r.symbolInnerColor), f.style.strokeNoScale = !0; + var S = t.getItemVisual(e, "liftZ"), M = this._z2; + null != S ? null == M && (this._z2 = f.z2, f.z2 += S) : null != M && (f.z2 = M, this._z2 = null); + var I = r && r.useNameLabel; + Wh(f, c, { + labelFetcher: g, labelDataIndex: e, defaultText: function (e) { + return I ? t.getName(e) : Fw(t, e) + }, inheritColor: b, defaultOpacity: _.opacity + }), this._sizeX = n[0] / 2, this._sizeY = n[1] / 2; + var T = f.ensureState("emphasis"); + if (T.style = o, f.ensureState("select").style = s, f.ensureState("blur").style = a, p) { + var C = Math.max(1.1, 3 / this._sizeY); + T.scaleX = this._sizeX * C, T.scaleY = this._sizeY * C + } + this.setSymbolScale(1), Ol(this, l, u, h) + }, e.prototype.setSymbolScale = function (t) { + this.scaleX = this.scaleY = t + }, e.prototype.fadeOut = function (t, e) { + var n = this.childAt(0), i = this._seriesModel, r = Ws(this).dataIndex, o = e && e.animation; + if (this.silent = n.silent = !0, e && e.fadeLabel) { + var a = n.getTextContent(); + a && ah(a, {style: {opacity: 0}}, i, { + dataIndex: r, removeOpt: o, cb: function () { + n.removeTextContent() + } + }) + } else n.removeTextContent(); + ah(n, {style: {opacity: 0}, scaleX: 0, scaleY: 0}, i, {dataIndex: r, cb: t, removeOpt: o}) + }, e.getSymbolSize = function (t, e) { + return Ly(t.getItemVisual(e, "symbolSize")) + }, e + }(Cr); + + function Hw(t, e) { + this.parent.drift(t, e) + } + + function Yw(t, e, n, i) { + return e && !isNaN(e[0]) && !isNaN(e[1]) && !(i.isIgnore && i.isIgnore(n)) && !(i.clipShape && !i.clipShape.contain(e[0], e[1])) && "none" !== t.getItemVisual(n, "symbol") + } + + function Uw(t) { + return null == t || q(t) || (t = {isIgnore: t}), t || {} + } + + function Xw(t) { + var e = t.hostModel, n = e.getModel("emphasis"); + return { + emphasisItemStyle: n.getModel("itemStyle").getItemStyle(), + blurItemStyle: e.getModel(["blur", "itemStyle"]).getItemStyle(), + selectItemStyle: e.getModel(["select", "itemStyle"]).getItemStyle(), + focus: n.get("focus"), + blurScope: n.get("blurScope"), + emphasisDisabled: n.get("disabled"), + hoverScale: n.get("scale"), + labelStatesModels: Hh(e), + cursorStyle: e.get("cursor") + } + } + + var Zw = function () { + function t(t) { + this.group = new Cr, this._SymbolCtor = t || Ww + } + + return t.prototype.updateData = function (t, e) { + this._progressiveEls = null, e = Uw(e); + var n = this.group, i = t.hostModel, r = this._data, o = this._SymbolCtor, a = e.disableAnimation, + s = Xw(t), l = {disableAnimation: a}, u = e.getSymbolPoint || function (e) { + return t.getItemLayout(e) + }; + r || n.removeAll(), t.diff(r).add((function (i) { + var r = u(i); + if (Yw(t, r, i, e)) { + var a = new o(t, i, s, l); + a.setPosition(r), t.setItemGraphicEl(i, a), n.add(a) + } + })).update((function (h, c) { + var p = r.getItemGraphicEl(c), d = u(h); + if (Yw(t, d, h, e)) { + var f = t.getItemVisual(h, "symbol") || "circle", g = p && p.getSymbolType && p.getSymbolType(); + if (!p || g && g !== f) n.remove(p), (p = new o(t, h, s, l)).setPosition(d); else { + p.updateData(t, h, s, l); + var y = {x: d[0], y: d[1]}; + a ? p.attr(y) : ih(p, y, i) + } + n.add(p), t.setItemGraphicEl(h, p) + } else n.remove(p) + })).remove((function (t) { + var e = r.getItemGraphicEl(t); + e && e.fadeOut((function () { + n.remove(e) + })) + })).execute(), this._getSymbolPoint = u, this._data = t + }, t.prototype.updateLayout = function () { + var t = this, e = this._data; + e && e.eachItemGraphicEl((function (e, n) { + var i = t._getSymbolPoint(n); + e.setPosition(i), e.markRedraw() + })) + }, t.prototype.incrementalPrepareUpdate = function (t) { + this._seriesScope = Xw(t), this._data = null, this.group.removeAll() + }, t.prototype.incrementalUpdate = function (t, e, n) { + function i(t) { + t.isGroup || (t.incremental = !0, t.ensureState("emphasis").hoverLayer = !0) + } + + this._progressiveEls = [], n = Uw(n); + for (var r = t.start; r < t.end; r++) { + var o = e.getItemLayout(r); + if (Yw(e, o, r, n)) { + var a = new this._SymbolCtor(e, r, this._seriesScope); + a.traverse(i), a.setPosition(o), this.group.add(a), e.setItemGraphicEl(r, a), this._progressiveEls.push(a) + } + } + }, t.prototype.eachRendered = function (t) { + zh(this._progressiveEls || this.group, t) + }, t.prototype.remove = function (t) { + var e = this.group, n = this._data; + n && t ? n.eachItemGraphicEl((function (t) { + t.fadeOut((function () { + e.remove(t) + })) + })) : e.removeAll() + }, t + }(); + + function jw(t, e, n) { + var i = t.getBaseAxis(), r = t.getOtherAxis(i), o = function (t, e) { + var n = 0, i = t.scale.getExtent(); + "start" === e ? n = i[0] : "end" === e ? n = i[1] : i[0] > 0 ? n = i[0] : i[1] < 0 && (n = i[1]); + return n + }(r, n), a = i.dim, s = r.dim, l = e.mapDimension(s), u = e.mapDimension(a), + h = "x" === s || "radius" === s ? 1 : 0, c = z(t.dimensions, (function (t) { + return e.mapDimension(t) + })), p = !1, d = e.getCalculationInfo("stackResultDimension"); + return tx(e, c[0]) && (p = !0, c[0] = d), tx(e, c[1]) && (p = !0, c[1] = d), { + dataDimsForPoint: c, + valueStart: o, + valueAxisDim: s, + baseAxisDim: a, + stacked: !!p, + valueDim: l, + baseDim: u, + baseDataOffset: h, + stackedOverDimension: e.getCalculationInfo("stackedOverDimension") + } + } + + function qw(t, e, n, i) { + var r = NaN; + t.stacked && (r = n.get(n.getCalculationInfo("stackedOverDimension"), i)), isNaN(r) && (r = t.valueStart); + var o = t.baseDataOffset, a = []; + return a[o] = n.get(t.baseDim, i), a[1 - o] = r, e.dataToPoint(a) + } + + var Kw = Math.min, $w = Math.max; + + function Jw(t, e) { + return isNaN(t) || isNaN(e) + } + + function Qw(t, e, n, i, r, o, a, s, l) { + for (var u, h, c, p, d, f, g = n, y = 0; y < i; y++) { + var v = e[2 * g], m = e[2 * g + 1]; + if (g >= r || g < 0) break; + if (Jw(v, m)) { + if (l) { + g += o; + continue + } + break + } + if (g === n) t[o > 0 ? "moveTo" : "lineTo"](v, m), c = v, p = m; else { + var x = v - u, _ = m - h; + if (x * x + _ * _ < .5) { + g += o; + continue + } + if (a > 0) { + for (var b = g + o, w = e[2 * b], S = e[2 * b + 1]; w === v && S === m && y < i;) y++, g += o, w = e[2 * (b += o)], S = e[2 * b + 1], x = (v = e[2 * g]) - u, _ = (m = e[2 * g + 1]) - h; + var M = y + 1; + if (l) for (; Jw(w, S) && M < i;) M++, w = e[2 * (b += o)], S = e[2 * b + 1]; + var I = .5, T = 0, C = 0, D = void 0, A = void 0; + if (M >= i || Jw(w, S)) d = v, f = m; else { + T = w - u, C = S - h; + var k = v - u, L = w - v, P = m - h, O = S - m, R = void 0, N = void 0; + if ("x" === s) { + var E = T > 0 ? 1 : -1; + d = v - E * (R = Math.abs(k)) * a, f = m, D = v + E * (N = Math.abs(L)) * a, A = m + } else if ("y" === s) { + var z = C > 0 ? 1 : -1; + d = v, f = m - z * (R = Math.abs(P)) * a, D = v, A = m + z * (N = Math.abs(O)) * a + } else R = Math.sqrt(k * k + P * P), d = v - T * a * (1 - (I = (N = Math.sqrt(L * L + O * O)) / (N + R))), f = m - C * a * (1 - I), A = m + C * a * I, D = Kw(D = v + T * a * I, $w(w, v)), A = Kw(A, $w(S, m)), D = $w(D, Kw(w, v)), f = m - (C = (A = $w(A, Kw(S, m))) - m) * R / N, d = Kw(d = v - (T = D - v) * R / N, $w(u, v)), f = Kw(f, $w(h, m)), D = v + (T = v - (d = $w(d, Kw(u, v)))) * N / R, A = m + (C = m - (f = $w(f, Kw(h, m)))) * N / R + } + t.bezierCurveTo(c, p, d, f, v, m), c = D, p = A + } else t.lineTo(v, m) + } + u = v, h = m, g += o + } + return y + } + + var tS = function () { + this.smooth = 0, this.smoothConstraint = !0 + }, eS = function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n.type = "ec-polyline", n + } + + return n(e, t), e.prototype.getDefaultStyle = function () { + return {stroke: "#000", fill: null} + }, e.prototype.getDefaultShape = function () { + return new tS + }, e.prototype.buildPath = function (t, e) { + var n = e.points, i = 0, r = n.length / 2; + if (e.connectNulls) { + for (; r > 0 && Jw(n[2 * r - 2], n[2 * r - 1]); r--) ; + for (; i < r && Jw(n[2 * i], n[2 * i + 1]); i++) ; + } + for (; i < r;) i += Qw(t, n, i, r, r, 1, e.smooth, e.smoothMonotone, e.connectNulls) + 1 + }, e.prototype.getPointOn = function (t, e) { + this.path || (this.createPathProxy(), this.buildPath(this.path, this.shape)); + for (var n, i, r = this.path.data, o = ja.CMD, a = "x" === e, s = [], l = 0; l < r.length;) { + var u = void 0, h = void 0, c = void 0, p = void 0, d = void 0, f = void 0, g = void 0; + switch (r[l++]) { + case o.M: + n = r[l++], i = r[l++]; + break; + case o.L: + if (u = r[l++], h = r[l++], (g = a ? (t - n) / (u - n) : (t - i) / (h - i)) <= 1 && g >= 0) { + var y = a ? (h - i) * g + i : (u - n) * g + n; + return a ? [t, y] : [y, t] + } + n = u, i = h; + break; + case o.C: + u = r[l++], h = r[l++], c = r[l++], p = r[l++], d = r[l++], f = r[l++]; + var v = a ? Ue(n, u, c, d, t, s) : Ue(i, h, p, f, t, s); + if (v > 0) for (var m = 0; m < v; m++) { + var x = s[m]; + if (x <= 1 && x >= 0) { + y = a ? He(i, h, p, f, x) : He(n, u, c, d, x); + return a ? [t, y] : [y, t] + } + } + n = d, i = f + } + } + }, e + }(fs), nS = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e + }(tS), iS = function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n.type = "ec-polygon", n + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new nS + }, e.prototype.buildPath = function (t, e) { + var n = e.points, i = e.stackedOnPoints, r = 0, o = n.length / 2, a = e.smoothMonotone; + if (e.connectNulls) { + for (; o > 0 && Jw(n[2 * o - 2], n[2 * o - 1]); o--) ; + for (; r < o && Jw(n[2 * r], n[2 * r + 1]); r++) ; + } + for (; r < o;) { + var s = Qw(t, n, r, o, o, 1, e.smooth, a, e.connectNulls); + Qw(t, i, r + s - 1, s, o, -1, e.stackedOnSmooth, a, e.connectNulls), r += s + 1, t.closePath() + } + }, e + }(fs); + + function rS(t, e, n, i, r) { + var o = t.getArea(), a = o.x, s = o.y, l = o.width, u = o.height, h = n.get(["lineStyle", "width"]) || 2; + a -= h / 2, s -= h / 2, l += h, u += h, a = Math.floor(a), l = Math.round(l); + var c = new Ts({shape: {x: a, y: s, width: l, height: u}}); + if (e) { + var p = t.getBaseAxis(), d = p.isHorizontal(), f = p.inverse; + d ? (f && (c.shape.x += l), c.shape.width = 0) : (f || (c.shape.y += u), c.shape.height = 0); + var g = U(r) ? function (t) { + r(t, c) + } : null; + rh(c, {shape: {width: l, height: u, x: a, y: s}}, n, null, i, g) + } + return c + } + + function oS(t, e, n) { + var i = t.getArea(), r = zr(i.r0, 1), o = zr(i.r, 1), a = new Tu({ + shape: { + cx: zr(t.cx, 1), + cy: zr(t.cy, 1), + r0: r, + r: o, + startAngle: i.startAngle, + endAngle: i.endAngle, + clockwise: i.clockwise + } + }); + e && ("angle" === t.getBaseAxis().dim ? a.shape.endAngle = i.startAngle : a.shape.r = r, rh(a, { + shape: { + endAngle: i.endAngle, + r: o + } + }, n)); + return a + } + + function aS(t, e, n, i, r) { + return t ? "polar" === t.type ? oS(t, e, n) : "cartesian2d" === t.type ? rS(t, e, n, i, r) : null : null + } + + function sS(t, e) { + return t.type === e + } + + function lS(t, e) { + if (t.length === e.length) { + for (var n = 0; n < t.length; n++) if (t[n] !== e[n]) return; + return !0 + } + } + + function uS(t) { + for (var e = 1 / 0, n = 1 / 0, i = -1 / 0, r = -1 / 0, o = 0; o < t.length;) { + var a = t[o++], s = t[o++]; + isNaN(a) || (e = Math.min(a, e), i = Math.max(a, i)), isNaN(s) || (n = Math.min(s, n), r = Math.max(s, r)) + } + return [[e, n], [i, r]] + } + + function hS(t, e) { + var n = uS(t), i = n[0], r = n[1], o = uS(e), a = o[0], s = o[1]; + return Math.max(Math.abs(i[0] - a[0]), Math.abs(i[1] - a[1]), Math.abs(r[0] - s[0]), Math.abs(r[1] - s[1])) + } + + function cS(t) { + return j(t) ? t : t ? .5 : 0 + } + + function pS(t, e, n) { + for (var i = e.getBaseAxis(), r = "x" === i.dim || "radius" === i.dim ? 0 : 1, o = [], a = 0, s = [], l = [], u = []; a < t.length - 2; a += 2) switch (u[0] = t[a + 2], u[1] = t[a + 3], l[0] = t[a], l[1] = t[a + 1], o.push(l[0], l[1]), n) { + case"end": + s[r] = u[r], s[1 - r] = l[1 - r], o.push(s[0], s[1]); + break; + case"middle": + var h = (l[r] + u[r]) / 2, c = []; + s[r] = c[r] = h, s[1 - r] = l[1 - r], c[1 - r] = u[1 - r], o.push(s[0], s[1]), o.push(c[0], c[1]); + break; + default: + s[r] = l[r], s[1 - r] = u[1 - r], o.push(s[0], s[1]) + } + return o.push(t[a++], t[a++]), o + } + + function dS(t, e, n) { + var i = t.getVisual("visualMeta"); + if (i && i.length && t.count() && "cartesian2d" === e.type) { + for (var r, o, a = i.length - 1; a >= 0; a--) { + var s = t.getDimensionInfo(i[a].dimension); + if ("x" === (r = s && s.coordDim) || "y" === r) { + o = i[a]; + break + } + } + if (o) { + var l = e.getAxis(r), u = z(o.stops, (function (t) { + return {coord: l.toGlobalCoord(l.dataToCoord(t.value)), color: t.color} + })), h = u.length, c = o.outerColors.slice(); + h && u[0].coord > u[h - 1].coord && (u.reverse(), c.reverse()); + var p = function (t, e) { + var n, i, r = [], o = t.length; + + function a(t, e, n) { + var i = t.coord; + return {coord: n, color: Tn((n - i) / (e.coord - i), [t.color, e.color])} + } + + for (var s = 0; s < o; s++) { + var l = t[s], u = l.coord; + if (u < 0) n = l; else { + if (u > e) { + i ? r.push(a(i, l, e)) : n && r.push(a(n, l, 0), a(n, l, e)); + break + } + n && (r.push(a(n, l, 0)), n = null), r.push(l), i = l + } + } + return r + }(u, "x" === r ? n.getWidth() : n.getHeight()), d = p.length; + if (!d && h) return u[0].coord < 0 ? c[1] ? c[1] : u[h - 1].color : c[0] ? c[0] : u[0].color; + var f = p[0].coord - 10, g = p[d - 1].coord + 10, y = g - f; + if (y < .001) return "transparent"; + E(p, (function (t) { + t.offset = (t.coord - f) / y + })), p.push({ + offset: d ? p[d - 1].offset : .5, + color: c[1] || "transparent" + }), p.unshift({offset: d ? p[0].offset : .5, color: c[0] || "transparent"}); + var v = new Uu(0, 0, 0, 0, p, !0); + return v[r] = f, v[r + "2"] = g, v + } + } + } + + function fS(t, e, n) { + var i = t.get("showAllSymbol"), r = "auto" === i; + if (!i || r) { + var o = n.getAxesByScale("ordinal")[0]; + if (o && (!r || !function (t, e) { + var n = t.getExtent(), i = Math.abs(n[1] - n[0]) / t.scale.count(); + isNaN(i) && (i = 0); + for (var r = e.count(), o = Math.max(1, Math.round(r / 5)), a = 0; a < r; a += o) if (1.5 * Ww.getSymbolSize(e, a)[t.isHorizontal() ? 1 : 0] > i) return !1; + return !0 + }(o, e))) { + var a = e.mapDimension(o.dim), s = {}; + return E(o.getViewLabels(), (function (t) { + var e = o.scale.getRawOrdinalNumber(t.tickValue); + s[e] = 1 + })), function (t) { + return !s.hasOwnProperty(e.get(a, t)) + } + } + } + } + + function gS(t, e) { + return [t[2 * e], t[2 * e + 1]] + } + + function yS(t) { + if (t.get(["endLabel", "show"])) return !0; + for (var e = 0; e < js.length; e++) if (t.get([js[e], "endLabel", "show"])) return !0; + return !1 + } + + function vS(t, e, n, i) { + if (sS(e, "cartesian2d")) { + var r = i.getModel("endLabel"), o = r.get("valueAnimation"), a = i.getData(), s = {lastFrameIndex: 0}, + l = yS(i) ? function (n, i) { + t._endLabelOnDuring(n, i, a, s, o, r, e) + } : null, u = e.getBaseAxis().isHorizontal(), h = rS(e, n, i, (function () { + var e = t._endLabel; + e && n && null != s.originalX && e.attr({x: s.originalX, y: s.originalY}) + }), l); + if (!i.get("clip", !0)) { + var c = h.shape, p = Math.max(c.width, c.height); + u ? (c.y -= p, c.height += 2 * p) : (c.x -= p, c.width += 2 * p) + } + return l && l(1, h), h + } + return oS(e, n, i) + } + + var mS = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.init = function () { + var t = new Cr, e = new Zw; + this.group.add(e.group), this._symbolDraw = e, this._lineGroup = t + }, e.prototype.render = function (t, e, n) { + var i = this, r = t.coordinateSystem, o = this.group, a = t.getData(), s = t.getModel("lineStyle"), + l = t.getModel("areaStyle"), u = a.getLayout("points") || [], h = "polar" === r.type, + c = this._coordSys, p = this._symbolDraw, d = this._polyline, f = this._polygon, g = this._lineGroup, + y = t.get("animation"), v = !l.isEmpty(), m = l.get("origin"), x = jw(r, a, m), + _ = v && function (t, e, n) { + if (!n.valueDim) return []; + for (var i = e.count(), r = _x(2 * i), o = 0; o < i; o++) { + var a = qw(n, t, e, o); + r[2 * o] = a[0], r[2 * o + 1] = a[1] + } + return r + }(r, a, x), b = t.get("showSymbol"), w = b && !h && fS(t, a, r), S = this._data; + S && S.eachItemGraphicEl((function (t, e) { + t.__temp && (o.remove(t), S.setItemGraphicEl(e, null)) + })), b || p.remove(), o.add(g); + var M, I = !h && t.get("step"); + r && r.getArea && t.get("clip", !0) && (null != (M = r.getArea()).width ? (M.x -= .1, M.y -= .1, M.width += .2, M.height += .2) : M.r0 && (M.r0 -= .5, M.r += .5)), this._clipShapeForSymbol = M; + var T = dS(a, r, n) || a.getVisual("style")[a.getVisual("drawType")]; + if (d && c.type === r.type && I === this._step) { + v && !f ? f = this._newPolygon(u, _) : f && !v && (g.remove(f), f = this._polygon = null), h || this._initOrUpdateEndLabel(t, r, cp(T)); + var C = g.getClipPath(); + if (C) rh(C, {shape: vS(this, r, !1, t).shape}, t); else g.setClipPath(vS(this, r, !0, t)); + b && p.updateData(a, { + isIgnore: w, clipShape: M, disableAnimation: !0, getSymbolPoint: function (t) { + return [u[2 * t], u[2 * t + 1]] + } + }), lS(this._stackedOnPoints, _) && lS(this._points, u) || (y ? this._doUpdateAnimation(a, _, r, n, I, m) : (I && (u = pS(u, r, I), _ && (_ = pS(_, r, I))), d.setShape({points: u}), f && f.setShape({ + points: u, + stackedOnPoints: _ + }))) + } else b && p.updateData(a, { + isIgnore: w, clipShape: M, disableAnimation: !0, getSymbolPoint: function (t) { + return [u[2 * t], u[2 * t + 1]] + } + }), y && this._initSymbolLabelAnimation(a, r, M), I && (u = pS(u, r, I), _ && (_ = pS(_, r, I))), d = this._newPolyline(u), v && (f = this._newPolygon(u, _)), h || this._initOrUpdateEndLabel(t, r, cp(T)), g.setClipPath(vS(this, r, !0, t)); + var D = t.getModel("emphasis"), A = D.get("focus"), L = D.get("blurScope"), P = D.get("disabled"); + (d.useStyle(k(s.getLineStyle(), { + fill: "none", + stroke: T, + lineJoin: "bevel" + })), zl(d, t, "lineStyle"), d.style.lineWidth > 0 && "bolder" === t.get(["emphasis", "lineStyle", "width"])) && (d.getState("emphasis").style.lineWidth = +d.style.lineWidth + 1); + Ws(d).seriesIndex = t.seriesIndex, Ol(d, A, L, P); + var O = cS(t.get("smooth")), R = t.get("smoothMonotone"), N = t.get("connectNulls"); + if (d.setShape({smooth: O, smoothMonotone: R, connectNulls: N}), f) { + var E = a.getCalculationInfo("stackedOnSeries"), z = 0; + f.useStyle(k(l.getAreaStyle(), { + fill: T, + opacity: .7, + lineJoin: "bevel", + decal: a.getVisual("style").decal + })), E && (z = cS(E.get("smooth"))), f.setShape({ + smooth: O, + stackedOnSmooth: z, + smoothMonotone: R, + connectNulls: N + }), zl(f, t, "areaStyle"), Ws(f).seriesIndex = t.seriesIndex, Ol(f, A, L, P) + } + var V = function (t) { + i._changePolyState(t) + }; + a.eachItemGraphicEl((function (t) { + t && (t.onHoverStateChange = V) + })), this._polyline.onHoverStateChange = V, this._data = a, this._coordSys = r, this._stackedOnPoints = _, this._points = u, this._step = I, this._valueOrigin = m, t.get("triggerLineEvent") && (this.packEventData(t, d), f && this.packEventData(t, f)) + }, e.prototype.packEventData = function (t, e) { + Ws(e).eventData = { + componentType: "series", + componentSubType: "line", + componentIndex: t.componentIndex, + seriesIndex: t.seriesIndex, + seriesName: t.name, + seriesType: "line" + } + }, e.prototype.highlight = function (t, e, n, i) { + var r = t.getData(), o = wo(r, i); + if (this._changePolyState("emphasis"), !(o instanceof Array) && null != o && o >= 0) { + var a = r.getLayout("points"), s = r.getItemGraphicEl(o); + if (!s) { + var l = a[2 * o], u = a[2 * o + 1]; + if (isNaN(l) || isNaN(u)) return; + if (this._clipShapeForSymbol && !this._clipShapeForSymbol.contain(l, u)) return; + var h = t.get("zlevel"), c = t.get("z"); + (s = new Ww(r, o)).x = l, s.y = u, s.setZ(h, c); + var p = s.getSymbolPath().getTextContent(); + p && (p.zlevel = h, p.z = c, p.z2 = this._polyline.z2 + 1), s.__temp = !0, r.setItemGraphicEl(o, s), s.stopSymbolAnimation(!0), this.group.add(s) + } + s.highlight() + } else mg.prototype.highlight.call(this, t, e, n, i) + }, e.prototype.downplay = function (t, e, n, i) { + var r = t.getData(), o = wo(r, i); + if (this._changePolyState("normal"), null != o && o >= 0) { + var a = r.getItemGraphicEl(o); + a && (a.__temp ? (r.setItemGraphicEl(o, null), this.group.remove(a)) : a.downplay()) + } else mg.prototype.downplay.call(this, t, e, n, i) + }, e.prototype._changePolyState = function (t) { + var e = this._polygon; + fl(this._polyline, t), e && fl(e, t) + }, e.prototype._newPolyline = function (t) { + var e = this._polyline; + return e && this._lineGroup.remove(e), e = new eS({ + shape: {points: t}, + segmentIgnoreThreshold: 2, + z2: 10 + }), this._lineGroup.add(e), this._polyline = e, e + }, e.prototype._newPolygon = function (t, e) { + var n = this._polygon; + return n && this._lineGroup.remove(n), n = new iS({ + shape: {points: t, stackedOnPoints: e}, + segmentIgnoreThreshold: 2 + }), this._lineGroup.add(n), this._polygon = n, n + }, e.prototype._initSymbolLabelAnimation = function (t, e, n) { + var i, r, o = e.getBaseAxis(), a = o.inverse; + "cartesian2d" === e.type ? (i = o.isHorizontal(), r = !1) : "polar" === e.type && (i = "angle" === o.dim, r = !0); + var s = t.hostModel, l = s.get("animationDuration"); + U(l) && (l = l(null)); + var u = s.get("animationDelay") || 0, h = U(u) ? u(null) : u; + t.eachItemGraphicEl((function (t, o) { + var s = t; + if (s) { + var c = [t.x, t.y], p = void 0, d = void 0, f = void 0; + if (n) if (r) { + var g = n, y = e.pointToCoord(c); + i ? (p = g.startAngle, d = g.endAngle, f = -y[1] / 180 * Math.PI) : (p = g.r0, d = g.r, f = y[0]) + } else { + var v = n; + i ? (p = v.x, d = v.x + v.width, f = t.x) : (p = v.y + v.height, d = v.y, f = t.y) + } + var m = d === p ? 0 : (f - p) / (d - p); + a && (m = 1 - m); + var x = U(u) ? u(o) : l * m + h, _ = s.getSymbolPath(), b = _.getTextContent(); + s.attr({scaleX: 0, scaleY: 0}), s.animateTo({scaleX: 1, scaleY: 1}, { + duration: 200, + setToFinal: !0, + delay: x + }), b && b.animateFrom({style: {opacity: 0}}, { + duration: 300, + delay: x + }), _.disableLabelAnimation = !0 + } + })) + }, e.prototype._initOrUpdateEndLabel = function (t, e, n) { + var i = t.getModel("endLabel"); + if (yS(t)) { + var r = t.getData(), o = this._polyline, a = r.getLayout("points"); + if (!a) return o.removeTextContent(), void (this._endLabel = null); + var s = this._endLabel; + s || ((s = this._endLabel = new As({z2: 200})).ignoreClip = !0, o.setTextContent(this._endLabel), o.disableLabelAnimation = !0); + var l = function (t) { + for (var e, n, i = t.length / 2; i > 0 && (e = t[2 * i - 2], n = t[2 * i - 1], isNaN(e) || isNaN(n)); i--) ; + return i - 1 + }(a); + l >= 0 && (Wh(o, Hh(t, "endLabel"), { + inheritColor: n, + labelFetcher: t, + labelDataIndex: l, + defaultText: function (t, e, n) { + return null != n ? Gw(r, n) : Fw(r, t) + }, + enableTextSetter: !0 + }, function (t, e) { + var n = e.getBaseAxis(), i = n.isHorizontal(), r = n.inverse, + o = i ? r ? "right" : "left" : "center", a = i ? "middle" : r ? "top" : "bottom"; + return {normal: {align: t.get("align") || o, verticalAlign: t.get("verticalAlign") || a}} + }(i, e)), o.textConfig.position = null) + } else this._endLabel && (this._polyline.removeTextContent(), this._endLabel = null) + }, e.prototype._endLabelOnDuring = function (t, e, n, i, r, o, a) { + var s = this._endLabel, l = this._polyline; + if (s) { + t < 1 && null == i.originalX && (i.originalX = s.x, i.originalY = s.y); + var u = n.getLayout("points"), h = n.hostModel, c = h.get("connectNulls"), p = o.get("precision"), + d = o.get("distance") || 0, f = a.getBaseAxis(), g = f.isHorizontal(), y = f.inverse, v = e.shape, + m = y ? g ? v.x : v.y + v.height : g ? v.x + v.width : v.y, x = (g ? d : 0) * (y ? -1 : 1), + _ = (g ? 0 : -d) * (y ? -1 : 1), b = g ? "x" : "y", w = function (t, e, n) { + for (var i, r, o = t.length / 2, a = "x" === n ? 0 : 1, s = 0, l = -1, u = 0; u < o; u++) if (r = t[2 * u + a], !isNaN(r) && !isNaN(t[2 * u + 1 - a])) if (0 !== u) { + if (i <= e && r >= e || i >= e && r <= e) { + l = u; + break + } + s = u, i = r + } else i = r; + return {range: [s, l], t: (e - i) / (r - i)} + }(u, m, b), S = w.range, M = S[1] - S[0], I = void 0; + if (M >= 1) { + if (M > 1 && !c) { + var T = gS(u, S[0]); + s.attr({x: T[0] + x, y: T[1] + _}), r && (I = h.getRawValue(S[0])) + } else { + (T = l.getPointOn(m, b)) && s.attr({x: T[0] + x, y: T[1] + _}); + var C = h.getRawValue(S[0]), D = h.getRawValue(S[1]); + r && (I = Po(n, p, C, D, w.t)) + } + i.lastFrameIndex = S[0] + } else { + var A = 1 === t || i.lastFrameIndex > 0 ? S[0] : 0; + T = gS(u, A); + r && (I = h.getRawValue(A)), s.attr({x: T[0] + x, y: T[1] + _}) + } + r && $h(s).setLabelText(I) + } + }, e.prototype._doUpdateAnimation = function (t, e, n, i, r, o) { + var a = this._polyline, s = this._polygon, l = t.hostModel, u = function (t, e, n, i, r, o, a, s) { + for (var l = function (t, e) { + var n = []; + return e.diff(t).add((function (t) { + n.push({cmd: "+", idx: t}) + })).update((function (t, e) { + n.push({cmd: "=", idx: e, idx1: t}) + })).remove((function (t) { + n.push({cmd: "-", idx: t}) + })).execute(), n + }(t, e), u = [], h = [], c = [], p = [], d = [], f = [], g = [], y = jw(r, e, a), v = t.getLayout("points") || [], m = e.getLayout("points") || [], x = 0; x < l.length; x++) { + var _ = l[x], b = !0, w = void 0, S = void 0; + switch (_.cmd) { + case"=": + w = 2 * _.idx, S = 2 * _.idx1; + var M = v[w], I = v[w + 1], T = m[S], C = m[S + 1]; + (isNaN(M) || isNaN(I)) && (M = T, I = C), u.push(M, I), h.push(T, C), c.push(n[w], n[w + 1]), p.push(i[S], i[S + 1]), g.push(e.getRawIndex(_.idx1)); + break; + case"+": + var D = _.idx, A = y.dataDimsForPoint, k = r.dataToPoint([e.get(A[0], D), e.get(A[1], D)]); + S = 2 * D, u.push(k[0], k[1]), h.push(m[S], m[S + 1]); + var L = qw(y, r, e, D); + c.push(L[0], L[1]), p.push(i[S], i[S + 1]), g.push(e.getRawIndex(D)); + break; + case"-": + b = !1 + } + b && (d.push(_), f.push(f.length)) + } + f.sort((function (t, e) { + return g[t] - g[e] + })); + var P = u.length, O = _x(P), R = _x(P), N = _x(P), E = _x(P), z = []; + for (x = 0; x < f.length; x++) { + var V = f[x], B = 2 * x, F = 2 * V; + O[B] = u[F], O[B + 1] = u[F + 1], R[B] = h[F], R[B + 1] = h[F + 1], N[B] = c[F], N[B + 1] = c[F + 1], E[B] = p[F], E[B + 1] = p[F + 1], z[x] = d[V] + } + return {current: O, next: R, stackedOnCurrent: N, stackedOnNext: E, status: z} + }(this._data, t, this._stackedOnPoints, e, this._coordSys, 0, this._valueOrigin), h = u.current, + c = u.stackedOnCurrent, p = u.next, d = u.stackedOnNext; + if (r && (h = pS(u.current, n, r), c = pS(u.stackedOnCurrent, n, r), p = pS(u.next, n, r), d = pS(u.stackedOnNext, n, r)), hS(h, p) > 3e3 || s && hS(c, d) > 3e3) return a.stopAnimation(), a.setShape({points: p}), void (s && (s.stopAnimation(), s.setShape({ + points: p, + stackedOnPoints: d + }))); + a.shape.__points = u.current, a.shape.points = h; + var f = {shape: {points: p}}; + u.current !== h && (f.shape.__points = u.next), a.stopAnimation(), ih(a, f, l), s && (s.setShape({ + points: h, + stackedOnPoints: c + }), s.stopAnimation(), ih(s, {shape: {stackedOnPoints: d}}, l), a.shape.points !== s.shape.points && (s.shape.points = a.shape.points)); + for (var g = [], y = u.status, v = 0; v < y.length; v++) { + if ("=" === y[v].cmd) { + var m = t.getItemGraphicEl(y[v].idx1); + m && g.push({el: m, ptIdx: v}) + } + } + a.animators && a.animators.length && a.animators[0].during((function () { + s && s.dirtyShape(); + for (var t = a.shape.__points, e = 0; e < g.length; e++) { + var n = g[e].el, i = 2 * g[e].ptIdx; + n.x = t[i], n.y = t[i + 1], n.markRedraw() + } + })) + }, e.prototype.remove = function (t) { + var e = this.group, n = this._data; + this._lineGroup.removeAll(), this._symbolDraw.remove(!0), n && n.eachItemGraphicEl((function (t, i) { + t.__temp && (e.remove(t), n.setItemGraphicEl(i, null)) + })), this._polyline = this._polygon = this._coordSys = this._points = this._stackedOnPoints = this._endLabel = this._data = null + }, e.type = "line", e + }(mg); + + function xS(t, e) { + return { + seriesType: t, plan: gg(), reset: function (t) { + var n = t.getData(), i = t.coordinateSystem, r = t.pipelineContext, o = e || r.large; + if (i) { + var a = z(i.dimensions, (function (t) { + return n.mapDimension(t) + })).slice(0, 2), s = a.length, l = n.getCalculationInfo("stackResultDimension"); + tx(n, a[0]) && (a[0] = l), tx(n, a[1]) && (a[1] = l); + var u = n.getStore(), h = n.getDimensionIndex(a[0]), c = n.getDimensionIndex(a[1]); + return s && { + progress: function (t, e) { + for (var n = t.end - t.start, r = o && _x(n * s), a = [], l = [], p = t.start, d = 0; p < t.end; p++) { + var f = void 0; + if (1 === s) { + var g = u.get(h, p); + f = i.dataToPoint(g, null, l) + } else a[0] = u.get(h, p), a[1] = u.get(c, p), f = i.dataToPoint(a, null, l); + o ? (r[d++] = f[0], r[d++] = f[1]) : e.setItemLayout(p, f.slice()) + } + o && e.setLayout("points", r) + } + } + } + } + } + } + + var _S = { + average: function (t) { + for (var e = 0, n = 0, i = 0; i < t.length; i++) isNaN(t[i]) || (e += t[i], n++); + return 0 === n ? NaN : e / n + }, sum: function (t) { + for (var e = 0, n = 0; n < t.length; n++) e += t[n] || 0; + return e + }, max: function (t) { + for (var e = -1 / 0, n = 0; n < t.length; n++) t[n] > e && (e = t[n]); + return isFinite(e) ? e : NaN + }, min: function (t) { + for (var e = 1 / 0, n = 0; n < t.length; n++) t[n] < e && (e = t[n]); + return isFinite(e) ? e : NaN + }, nearest: function (t) { + return t[0] + } + }, bS = function (t) { + return Math.round(t.length / 2) + }; + + function wS(t) { + return { + seriesType: t, reset: function (t, e, n) { + var i = t.getData(), r = t.get("sampling"), o = t.coordinateSystem, a = i.count(); + if (a > 10 && "cartesian2d" === o.type && r) { + var s = o.getBaseAxis(), l = o.getOtherAxis(s), u = s.getExtent(), h = n.getDevicePixelRatio(), + c = Math.abs(u[1] - u[0]) * (h || 1), p = Math.round(a / c); + if (p > 1) { + "lttb" === r && t.setData(i.lttbDownSample(i.mapDimension(l.dim), 1 / p)); + var d = void 0; + X(r) ? d = _S[r] : U(r) && (d = r), d && t.setData(i.downSample(i.mapDimension(l.dim), 1 / p, d, bS)) + } + } + } + } + } + + var SS = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.getInitialData = function (t, e) { + return nx(null, this, {useEncodeDefaulter: !0}) + }, e.prototype.getMarkerPosition = function (t) { + var e = this.coordinateSystem; + if (e && e.clampData) { + var n = e.dataToPoint(e.clampData(t)), i = this.getData(), r = i.getLayout("offset"), + o = i.getLayout("size"); + return n[e.getBaseAxis().isHorizontal() ? 0 : 1] += r + o / 2, n + } + return [NaN, NaN] + }, e.type = "series.__base_bar__", e.defaultOption = { + z: 2, + coordinateSystem: "cartesian2d", + legendHoverLink: !0, + barMinHeight: 0, + barMinAngle: 0, + large: !1, + largeThreshold: 400, + progressive: 3e3, + progressiveChunkMode: "mod" + }, e + }(ag); + ag.registerClass(SS); + var MS = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.getInitialData = function () { + return nx(null, this, { + useEncodeDefaulter: !0, + createInvertedIndices: !!this.get("realtimeSort", !0) || null + }) + }, e.prototype.getProgressive = function () { + return !!this.get("large") && this.get("progressive") + }, e.prototype.getProgressiveThreshold = function () { + var t = this.get("progressiveThreshold"), e = this.get("largeThreshold"); + return e > t && (t = e), t + }, e.prototype.brushSelector = function (t, e, n) { + return n.rect(e.getItemLayout(t)) + }, e.type = "series.bar", e.dependencies = ["grid", "polar"], e.defaultOption = gc(SS.defaultOption, { + clip: !0, + roundCap: !1, + showBackground: !1, + backgroundStyle: { + color: "rgba(180, 180, 180, 0.2)", + borderColor: null, + borderWidth: 0, + borderType: "solid", + borderRadius: 0, + shadowBlur: 0, + shadowColor: null, + shadowOffsetX: 0, + shadowOffsetY: 0, + opacity: 1 + }, + select: {itemStyle: {borderColor: "#212121"}}, + realtimeSort: !1 + }), e + }(SS), IS = function () { + this.cx = 0, this.cy = 0, this.r0 = 0, this.r = 0, this.startAngle = 0, this.endAngle = 2 * Math.PI, this.clockwise = !0 + }, TS = function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n.type = "sausage", n + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new IS + }, e.prototype.buildPath = function (t, e) { + var n = e.cx, i = e.cy, r = Math.max(e.r0 || 0, 0), o = Math.max(e.r, 0), a = .5 * (o - r), s = r + a, + l = e.startAngle, u = e.endAngle, h = e.clockwise, c = 2 * Math.PI, p = h ? u - l < c : l - u < c; + p || (l = u - (h ? c : -c)); + var d = Math.cos(l), f = Math.sin(l), g = Math.cos(u), y = Math.sin(u); + p ? (t.moveTo(d * r + n, f * r + i), t.arc(d * s + n, f * s + i, a, -Math.PI + l, l, !h)) : t.moveTo(d * o + n, f * o + i), t.arc(n, i, o, l, u, !h), t.arc(g * s + n, y * s + i, a, u - 2 * Math.PI, u - Math.PI, !h), 0 !== r && t.arc(n, i, r, u, l, h) + }, e + }(fs); + + function CS(t, e, n) { + return e * Math.sin(t) * (n ? -1 : 1) + } + + function DS(t, e, n) { + return e * Math.cos(t) * (n ? 1 : -1) + } + + var AS = Math.max, kS = Math.min; + var LS = function (t) { + function e() { + var n = t.call(this) || this; + return n.type = e.type, n._isFirstFrame = !0, n + } + + return n(e, t), e.prototype.render = function (t, e, n, i) { + this._model = t, this._removeOnRenderedListener(n), this._updateDrawMode(t); + var r = t.get("coordinateSystem"); + ("cartesian2d" === r || "polar" === r) && (this._progressiveEls = null, this._isLargeDraw ? this._renderLarge(t, e, n) : this._renderNormal(t, e, n, i)) + }, e.prototype.incrementalPrepareRender = function (t) { + this._clear(), this._updateDrawMode(t), this._updateLargeClip(t) + }, e.prototype.incrementalRender = function (t, e) { + this._progressiveEls = [], this._incrementalRenderLarge(t, e) + }, e.prototype.eachRendered = function (t) { + zh(this._progressiveEls || this.group, t) + }, e.prototype._updateDrawMode = function (t) { + var e = t.pipelineContext.large; + null != this._isLargeDraw && e === this._isLargeDraw || (this._isLargeDraw = e, this._clear()) + }, e.prototype._renderNormal = function (t, e, n, i) { + var r, o = this.group, a = t.getData(), s = this._data, l = t.coordinateSystem, u = l.getBaseAxis(); + "cartesian2d" === l.type ? r = u.isHorizontal() : "polar" === l.type && (r = "angle" === u.dim); + var h = t.isAnimationEnabled() ? t : null, c = function (t, e) { + var n = t.get("realtimeSort", !0), i = e.getBaseAxis(); + 0; + if (n && "category" === i.type && "cartesian2d" === e.type) return { + baseAxis: i, + otherAxis: e.getOtherAxis(i) + } + }(t, l); + c && this._enableRealtimeSort(c, a, n); + var p = t.get("clip", !0) || c, d = function (t, e) { + var n = t.getArea && t.getArea(); + if (sS(t, "cartesian2d")) { + var i = t.getBaseAxis(); + if ("category" !== i.type || !i.onBand) { + var r = e.getLayout("bandWidth"); + i.isHorizontal() ? (n.x -= r, n.width += 2 * r) : (n.y -= r, n.height += 2 * r) + } + } + return n + }(l, a); + o.removeClipPath(); + var f = t.get("roundCap", !0), g = t.get("showBackground", !0), y = t.getModel("backgroundStyle"), + v = y.get("borderRadius") || 0, m = [], x = this._backgroundEls, _ = i && i.isInitSort, + b = i && "changeAxisOrder" === i.type; + + function w(t) { + var e = BS[l.type](a, t), n = function (t, e, n) { + return new ("polar" === t.type ? Tu : Ts)({shape: XS(e, n, t), silent: !0, z2: 0}) + }(l, r, e); + return n.useStyle(y.getItemStyle()), "cartesian2d" === l.type && n.setShape("r", v), m[t] = n, n + } + + a.diff(s).add((function (e) { + var n = a.getItemModel(e), i = BS[l.type](a, e, n); + if (g && w(e), a.hasValue(e) && VS[l.type](i)) { + var s = !1; + p && (s = PS[l.type](d, i)); + var y = OS[l.type](t, a, e, i, r, h, u.model, !1, f); + c && (y.forceLabelAnimation = !0), GS(y, a, e, n, i, t, r, "polar" === l.type), _ ? y.attr({shape: i}) : c ? RS(c, h, y, i, e, r, !1, !1) : rh(y, {shape: i}, t, e), a.setItemGraphicEl(e, y), o.add(y), y.ignore = s + } + })).update((function (e, n) { + var i = a.getItemModel(e), S = BS[l.type](a, e, i); + if (g) { + var M = void 0; + 0 === x.length ? M = w(n) : ((M = x[n]).useStyle(y.getItemStyle()), "cartesian2d" === l.type && M.setShape("r", v), m[e] = M); + var I = BS[l.type](a, e); + ih(M, {shape: XS(r, I, l)}, h, e) + } + var T = s.getItemGraphicEl(n); + if (a.hasValue(e) && VS[l.type](S)) { + var C = !1; + if (p && (C = PS[l.type](d, S)) && o.remove(T), T ? uh(T) : T = OS[l.type](t, a, e, S, r, h, u.model, !!T, f), c && (T.forceLabelAnimation = !0), b) { + var D = T.getTextContent(); + if (D) { + var A = $h(D); + null != A.prevValue && (A.prevValue = A.value) + } + } else GS(T, a, e, i, S, t, r, "polar" === l.type); + _ ? T.attr({shape: S}) : c ? RS(c, h, T, S, e, r, !0, b) : ih(T, {shape: S}, t, e, null), a.setItemGraphicEl(e, T), T.ignore = C, o.add(T) + } else o.remove(T) + })).remove((function (e) { + var n = s.getItemGraphicEl(e); + n && lh(n, t, e) + })).execute(); + var S = this._backgroundGroup || (this._backgroundGroup = new Cr); + S.removeAll(); + for (var M = 0; M < m.length; ++M) S.add(m[M]); + o.add(S), this._backgroundEls = m, this._data = a + }, e.prototype._renderLarge = function (t, e, n) { + this._clear(), YS(t, this.group), this._updateLargeClip(t) + }, e.prototype._incrementalRenderLarge = function (t, e) { + this._removeBackground(), YS(e, this.group, this._progressiveEls, !0) + }, e.prototype._updateLargeClip = function (t) { + var e = t.get("clip", !0) && aS(t.coordinateSystem, !1, t), n = this.group; + e ? n.setClipPath(e) : n.removeClipPath() + }, e.prototype._enableRealtimeSort = function (t, e, n) { + var i = this; + if (e.count()) { + var r = t.baseAxis; + if (this._isFirstFrame) this._dispatchInitSort(e, t, n), this._isFirstFrame = !1; else { + var o = function (t) { + var n = e.getItemGraphicEl(t), i = n && n.shape; + return i && Math.abs(r.isHorizontal() ? i.height : i.width) || 0 + }; + this._onRendered = function () { + i._updateSortWithinSameData(e, o, r, n) + }, n.getZr().on("rendered", this._onRendered) + } + } + }, e.prototype._dataSort = function (t, e, n) { + var i = []; + return t.each(t.mapDimension(e.dim), (function (t, e) { + var r = n(e); + r = null == r ? NaN : r, i.push({dataIndex: e, mappedValue: r, ordinalNumber: t}) + })), i.sort((function (t, e) { + return e.mappedValue - t.mappedValue + })), { + ordinalNumbers: z(i, (function (t) { + return t.ordinalNumber + })) + } + }, e.prototype._isOrderChangedWithinSameData = function (t, e, n) { + for (var i = n.scale, r = t.mapDimension(n.dim), o = Number.MAX_VALUE, a = 0, s = i.getOrdinalMeta().categories.length; a < s; ++a) { + var l = t.rawIndexOf(r, i.getRawOrdinalNumber(a)), + u = l < 0 ? Number.MIN_VALUE : e(t.indexOfRawIndex(l)); + if (u > o) return !0; + o = u + } + return !1 + }, e.prototype._isOrderDifferentInView = function (t, e) { + for (var n = e.scale, i = n.getExtent(), r = Math.max(0, i[0]), o = Math.min(i[1], n.getOrdinalMeta().categories.length - 1); r <= o; ++r) if (t.ordinalNumbers[r] !== n.getRawOrdinalNumber(r)) return !0 + }, e.prototype._updateSortWithinSameData = function (t, e, n, i) { + if (this._isOrderChangedWithinSameData(t, e, n)) { + var r = this._dataSort(t, n, e); + this._isOrderDifferentInView(r, n) && (this._removeOnRenderedListener(i), i.dispatchAction({ + type: "changeAxisOrder", + componentType: n.dim + "Axis", + axisId: n.index, + sortInfo: r + })) + } + }, e.prototype._dispatchInitSort = function (t, e, n) { + var i = e.baseAxis, r = this._dataSort(t, i, (function (n) { + return t.get(t.mapDimension(e.otherAxis.dim), n) + })); + n.dispatchAction({ + type: "changeAxisOrder", + componentType: i.dim + "Axis", + isInitSort: !0, + axisId: i.index, + sortInfo: r + }) + }, e.prototype.remove = function (t, e) { + this._clear(this._model), this._removeOnRenderedListener(e) + }, e.prototype.dispose = function (t, e) { + this._removeOnRenderedListener(e) + }, e.prototype._removeOnRenderedListener = function (t) { + this._onRendered && (t.getZr().off("rendered", this._onRendered), this._onRendered = null) + }, e.prototype._clear = function (t) { + var e = this.group, n = this._data; + t && t.isAnimationEnabled() && n && !this._isLargeDraw ? (this._removeBackground(), this._backgroundEls = [], n.eachItemGraphicEl((function (e) { + lh(e, t, Ws(e).dataIndex) + }))) : e.removeAll(), this._data = null, this._isFirstFrame = !0 + }, e.prototype._removeBackground = function () { + this.group.remove(this._backgroundGroup), this._backgroundGroup = null + }, e.type = "bar", e + }(mg), PS = { + cartesian2d: function (t, e) { + var n = e.width < 0 ? -1 : 1, i = e.height < 0 ? -1 : 1; + n < 0 && (e.x += e.width, e.width = -e.width), i < 0 && (e.y += e.height, e.height = -e.height); + var r = t.x + t.width, o = t.y + t.height, a = AS(e.x, t.x), s = kS(e.x + e.width, r), l = AS(e.y, t.y), + u = kS(e.y + e.height, o), h = s < a, c = u < l; + return e.x = h && a > r ? s : a, e.y = c && l > o ? u : l, e.width = h ? 0 : s - a, e.height = c ? 0 : u - l, n < 0 && (e.x += e.width, e.width = -e.width), i < 0 && (e.y += e.height, e.height = -e.height), h || c + }, polar: function (t, e) { + var n = e.r0 <= e.r ? 1 : -1; + if (n < 0) { + var i = e.r; + e.r = e.r0, e.r0 = i + } + var r = kS(e.r, t.r), o = AS(e.r0, t.r0); + e.r = r, e.r0 = o; + var a = r - o < 0; + if (n < 0) { + i = e.r; + e.r = e.r0, e.r0 = i + } + return a + } + }, OS = { + cartesian2d: function (t, e, n, i, r, o, a, s, l) { + var u = new Ts({shape: A({}, i), z2: 1}); + (u.__dataIndex = n, u.name = "item", o) && (u.shape[r ? "height" : "width"] = 0); + return u + }, polar: function (t, e, n, i, r, o, a, s, l) { + var u = !r && l ? TS : Tu, h = new u({shape: i, z2: 1}); + h.name = "item"; + var c, p, d = FS(r); + if (h.calculateTextPosition = (c = d, p = ({isRoundCap: u === TS} || {}).isRoundCap, function (t, e, n) { + var i = e.position; + if (!i || i instanceof Array) return yr(t, e, n); + var r = c(i), o = null != e.distance ? e.distance : 5, a = this.shape, s = a.cx, l = a.cy, u = a.r, + h = a.r0, d = (u + h) / 2, f = a.startAngle, g = a.endAngle, y = (f + g) / 2, + v = p ? Math.abs(u - h) / 2 : 0, m = Math.cos, x = Math.sin, _ = s + u * m(f), b = l + u * x(f), + w = "left", S = "top"; + switch (r) { + case"startArc": + _ = s + (h - o) * m(y), b = l + (h - o) * x(y), w = "center", S = "top"; + break; + case"insideStartArc": + _ = s + (h + o) * m(y), b = l + (h + o) * x(y), w = "center", S = "bottom"; + break; + case"startAngle": + _ = s + d * m(f) + CS(f, o + v, !1), b = l + d * x(f) + DS(f, o + v, !1), w = "right", S = "middle"; + break; + case"insideStartAngle": + _ = s + d * m(f) + CS(f, -o + v, !1), b = l + d * x(f) + DS(f, -o + v, !1), w = "left", S = "middle"; + break; + case"middle": + _ = s + d * m(y), b = l + d * x(y), w = "center", S = "middle"; + break; + case"endArc": + _ = s + (u + o) * m(y), b = l + (u + o) * x(y), w = "center", S = "bottom"; + break; + case"insideEndArc": + _ = s + (u - o) * m(y), b = l + (u - o) * x(y), w = "center", S = "top"; + break; + case"endAngle": + _ = s + d * m(g) + CS(g, o + v, !0), b = l + d * x(g) + DS(g, o + v, !0), w = "left", S = "middle"; + break; + case"insideEndAngle": + _ = s + d * m(g) + CS(g, -o + v, !0), b = l + d * x(g) + DS(g, -o + v, !0), w = "right", S = "middle"; + break; + default: + return yr(t, e, n) + } + return (t = t || {}).x = _, t.y = b, t.align = w, t.verticalAlign = S, t + }), o) { + var f = r ? "r" : "endAngle", g = {}; + h.shape[f] = r ? 0 : i.startAngle, g[f] = i[f], (s ? ih : rh)(h, {shape: g}, o) + } + return h + } + }; + + function RS(t, e, n, i, r, o, a, s) { + var l, u; + o ? (u = {x: i.x, width: i.width}, l = {y: i.y, height: i.height}) : (u = { + y: i.y, + height: i.height + }, l = { + x: i.x, + width: i.width + }), s || (a ? ih : rh)(n, {shape: l}, e, r, null), (a ? ih : rh)(n, {shape: u}, e ? t.baseAxis.model : null, r) + } + + function NS(t, e) { + for (var n = 0; n < e.length; n++) if (!isFinite(t[e[n]])) return !0; + return !1 + } + + var ES = ["x", "y", "width", "height"], zS = ["cx", "cy", "r", "startAngle", "endAngle"], VS = { + cartesian2d: function (t) { + return !NS(t, ES) + }, polar: function (t) { + return !NS(t, zS) + } + }, BS = { + cartesian2d: function (t, e, n) { + var i = t.getItemLayout(e), r = n ? function (t, e) { + var n = t.get(["itemStyle", "borderColor"]); + if (!n || "none" === n) return 0; + var i = t.get(["itemStyle", "borderWidth"]) || 0, + r = isNaN(e.width) ? Number.MAX_VALUE : Math.abs(e.width), + o = isNaN(e.height) ? Number.MAX_VALUE : Math.abs(e.height); + return Math.min(i, r, o) + }(n, i) : 0, o = i.width > 0 ? 1 : -1, a = i.height > 0 ? 1 : -1; + return {x: i.x + o * r / 2, y: i.y + a * r / 2, width: i.width - o * r, height: i.height - a * r} + }, polar: function (t, e, n) { + var i = t.getItemLayout(e); + return { + cx: i.cx, + cy: i.cy, + r0: i.r0, + r: i.r, + startAngle: i.startAngle, + endAngle: i.endAngle, + clockwise: i.clockwise + } + } + }; + + function FS(t) { + return function (t) { + var e = t ? "Arc" : "Angle"; + return function (t) { + switch (t) { + case"start": + case"insideStart": + case"end": + case"insideEnd": + return t + e; + default: + return t + } + } + }(t) + } + + function GS(t, e, n, i, r, o, a, s) { + var l = e.getItemVisual(n, "style"); + s || t.setShape("r", i.get(["itemStyle", "borderRadius"]) || 0), t.useStyle(l); + var u = i.getShallow("cursor"); + u && t.attr("cursor", u); + var h = s ? a ? r.r >= r.r0 ? "endArc" : "startArc" : r.endAngle >= r.startAngle ? "endAngle" : "startAngle" : a ? r.height >= 0 ? "bottom" : "top" : r.width >= 0 ? "right" : "left", + c = Hh(i); + Wh(t, c, { + labelFetcher: o, + labelDataIndex: n, + defaultText: Fw(o.getData(), n), + inheritColor: l.fill, + defaultOpacity: l.opacity, + defaultOutsidePosition: h + }); + var p = t.getTextContent(); + if (s && p) { + var d = i.get(["label", "position"]); + t.textConfig.inside = "middle" === d || null, function (t, e, n, i) { + if (j(i)) t.setTextConfig({rotation: i}); else if (Y(e)) t.setTextConfig({rotation: 0}); else { + var r, o = t.shape, a = o.clockwise ? o.startAngle : o.endAngle, + s = o.clockwise ? o.endAngle : o.startAngle, l = (a + s) / 2, u = n(e); + switch (u) { + case"startArc": + case"insideStartArc": + case"middle": + case"insideEndArc": + case"endArc": + r = l; + break; + case"startAngle": + case"insideStartAngle": + r = a; + break; + case"endAngle": + case"insideEndAngle": + r = s; + break; + default: + return void t.setTextConfig({rotation: 0}) + } + var h = 1.5 * Math.PI - r; + "middle" === u && h > Math.PI / 2 && h < 1.5 * Math.PI && (h -= Math.PI), t.setTextConfig({rotation: h}) + } + }(t, "outside" === d ? h : d, FS(a), i.get(["label", "rotate"])) + } + Jh(p, c, o.getRawValue(n), (function (t) { + return Gw(e, t) + })); + var f = i.getModel(["emphasis"]); + Ol(t, f.get("focus"), f.get("blurScope"), f.get("disabled")), zl(t, i), function (t) { + return null != t.startAngle && null != t.endAngle && t.startAngle === t.endAngle + }(r) && (t.style.fill = "none", t.style.stroke = "none", E(t.states, (function (t) { + t.style && (t.style.fill = t.style.stroke = "none") + }))) + } + + var WS = function () { + }, HS = function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n.type = "largeBar", n + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new WS + }, e.prototype.buildPath = function (t, e) { + for (var n = e.points, i = this.baseDimIdx, r = 1 - this.baseDimIdx, o = [], a = [], s = this.barWidth, l = 0; l < n.length; l += 3) a[i] = s, a[r] = n[l + 2], o[i] = n[l + i], o[r] = n[l + r], t.rect(o[0], o[1], a[0], a[1]) + }, e + }(fs); + + function YS(t, e, n, i) { + var r = t.getData(), o = r.getLayout("valueAxisHorizontal") ? 1 : 0, a = r.getLayout("largeDataIndices"), + s = r.getLayout("size"), l = t.getModel("backgroundStyle"), u = r.getLayout("largeBackgroundPoints"); + if (u) { + var h = new HS({shape: {points: u}, incremental: !!i, silent: !0, z2: 0}); + h.baseDimIdx = o, h.largeDataIndices = a, h.barWidth = s, h.useStyle(l.getItemStyle()), e.add(h), n && n.push(h) + } + var c = new HS({shape: {points: r.getLayout("largePoints")}, incremental: !!i, z2: 1}); + c.baseDimIdx = o, c.largeDataIndices = a, c.barWidth = s, e.add(c), c.useStyle(r.getVisual("style")), Ws(c).seriesIndex = t.seriesIndex, t.get("silent") || (c.on("mousedown", US), c.on("mousemove", US)), n && n.push(c) + } + + var US = Cg((function (t) { + var e = function (t, e, n) { + for (var i = t.baseDimIdx, r = 1 - i, o = t.shape.points, a = t.largeDataIndices, s = [], l = [], u = t.barWidth, h = 0, c = o.length / 3; h < c; h++) { + var p = 3 * h; + if (l[i] = u, l[r] = o[p + 2], s[i] = o[p + i], s[r] = o[p + r], l[r] < 0 && (s[r] += l[r], l[r] = -l[r]), e >= s[0] && e <= s[0] + l[0] && n >= s[1] && n <= s[1] + l[1]) return a[h] + } + return -1 + }(this, t.offsetX, t.offsetY); + Ws(this).dataIndex = e >= 0 ? e : null + }), 30, !1); + + function XS(t, e, n) { + if (sS(n, "cartesian2d")) { + var i = e, r = n.getArea(); + return {x: t ? i.x : r.x, y: t ? r.y : i.y, width: t ? i.width : r.width, height: t ? r.height : i.height} + } + var o = e; + return { + cx: (r = n.getArea()).cx, + cy: r.cy, + r0: t ? r.r0 : o.r0, + r: t ? r.r : o.r, + startAngle: t ? o.startAngle : 0, + endAngle: t ? o.endAngle : 2 * Math.PI + } + } + + var ZS = 2 * Math.PI, jS = Math.PI / 180; + + function qS(t, e) { + return mp(t.getBoxLayoutParams(), {width: e.getWidth(), height: e.getHeight()}) + } + + function KS(t, e) { + var n = qS(t, e), i = t.get("center"), r = t.get("radius"); + Y(r) || (r = [0, r]), Y(i) || (i = [i, i]); + var o = Er(n.width, e.getWidth()), a = Er(n.height, e.getHeight()), s = Math.min(o, a); + return {cx: Er(i[0], o) + n.x, cy: Er(i[1], a) + n.y, r0: Er(r[0], s / 2), r: Er(r[1], s / 2)} + } + + function $S(t, e, n) { + e.eachSeriesByType(t, (function (t) { + var e = t.getData(), i = e.mapDimension("value"), r = qS(t, n), o = KS(t, n), a = o.cx, s = o.cy, l = o.r, + u = o.r0, h = -t.get("startAngle") * jS, c = t.get("minAngle") * jS, p = 0; + e.each(i, (function (t) { + !isNaN(t) && p++ + })); + var d = e.getSum(i), f = Math.PI / (d || p) * 2, g = t.get("clockwise"), y = t.get("roseType"), + v = t.get("stillShowZeroSum"), m = e.getDataExtent(i); + m[0] = 0; + var x = ZS, _ = 0, b = h, w = g ? 1 : -1; + if (e.setLayout({viewRect: r, r: l}), e.each(i, (function (t, n) { + var i; + if (isNaN(t)) e.setItemLayout(n, { + angle: NaN, + startAngle: NaN, + endAngle: NaN, + clockwise: g, + cx: a, + cy: s, + r0: u, + r: y ? NaN : l + }); else { + (i = "area" !== y ? 0 === d && v ? f : t * f : ZS / p) < c ? (i = c, x -= c) : _ += t; + var r = b + w * i; + e.setItemLayout(n, { + angle: i, + startAngle: b, + endAngle: r, + clockwise: g, + cx: a, + cy: s, + r0: u, + r: y ? Nr(t, m, [u, l]) : l + }), b = r + } + })), x < ZS && p) if (x <= .001) { + var S = ZS / p; + e.each(i, (function (t, n) { + if (!isNaN(t)) { + var i = e.getItemLayout(n); + i.angle = S, i.startAngle = h + w * n * S, i.endAngle = h + w * (n + 1) * S + } + })) + } else f = x / _, b = h, e.each(i, (function (t, n) { + if (!isNaN(t)) { + var i = e.getItemLayout(n), r = i.angle === c ? c : t * f; + i.startAngle = b, i.endAngle = b + w * r, b += w * r + } + })) + })) + } + + function JS(t) { + return { + seriesType: t, reset: function (t, e) { + var n = e.findComponents({mainType: "legend"}); + if (n && n.length) { + var i = t.getData(); + i.filterSelf((function (t) { + for (var e = i.getName(t), r = 0; r < n.length; r++) if (!n[r].isSelected(e)) return !1; + return !0 + })) + } + } + } + } + + var QS = Math.PI / 180; + + function tM(t, e, n, i, r, o, a, s, l, u) { + if (!(t.length < 2)) { + for (var h = t.length, c = 0; c < h; c++) if ("outer" === t[c].position && "labelLine" === t[c].labelAlignTo) { + var p = t[c].label.x - u; + t[c].linePoints[1][0] += p, t[c].label.x = u + } + gb(t, l, l + a) && function (t) { + for (var o = {list: [], maxY: 0}, a = { + list: [], + maxY: 0 + }, s = 0; s < t.length; s++) if ("none" === t[s].labelAlignTo) { + var l = t[s], u = l.label.y > n ? a : o, h = Math.abs(l.label.y - n); + if (h >= u.maxY) { + var c = l.label.x - e - l.len2 * r, p = i + l.len, + f = Math.abs(c) < p ? Math.sqrt(h * h / (1 - c * c / p / p)) : p; + u.rB = f, u.maxY = h + } + u.list.push(l) + } + d(o), d(a) + }(t) + } + + function d(t) { + for (var o = t.rB, a = o * o, s = 0; s < t.list.length; s++) { + var l = t.list[s], u = Math.abs(l.label.y - n), h = i + l.len, c = h * h, + p = Math.sqrt((1 - Math.abs(u * u / a)) * c), d = e + (p + l.len2) * r, f = d - l.label.x; + eM(l, l.targetTextWidth - f * r, !0), l.label.x = d + } + } + } + + function eM(t, e, n) { + if (void 0 === n && (n = !1), null == t.labelStyleWidth) { + var i = t.label, r = i.style, o = t.rect, a = r.backgroundColor, s = r.padding, l = s ? s[1] + s[3] : 0, + u = r.overflow, h = o.width + (a ? 0 : l); + if (e < h || n) { + var c = o.height; + if (u && u.match("break")) { + i.setStyle("backgroundColor", null), i.setStyle("width", e - l); + var p = i.getBoundingRect(); + i.setStyle("width", Math.ceil(p.width)), i.setStyle("backgroundColor", a) + } else { + var d = e - l, f = e < h ? d : n ? d > t.unconstrainedWidth ? null : d : null; + i.setStyle("width", f) + } + var g = i.getBoundingRect(); + o.width = g.width; + var y = (i.style.margin || 0) + 2.1; + o.height = g.height + y, o.y -= (o.height - c) / 2 + } + } + } + + function nM(t) { + return "center" === t.position + } + + function iM(t) { + var e, n, i = t.getData(), r = [], o = !1, a = (t.get("minShowLabelAngle") || 0) * QS, + s = i.getLayout("viewRect"), l = i.getLayout("r"), u = s.width, h = s.x, c = s.y, p = s.height; + + function d(t) { + t.ignore = !0 + } + + i.each((function (t) { + var s = i.getItemGraphicEl(t), c = s.shape, p = s.getTextContent(), f = s.getTextGuideLine(), + g = i.getItemModel(t), y = g.getModel("label"), + v = y.get("position") || g.get(["emphasis", "label", "position"]), m = y.get("distanceToLabelLine"), + x = y.get("alignTo"), _ = Er(y.get("edgeDistance"), u), b = y.get("bleedMargin"), + w = g.getModel("labelLine"), S = w.get("length"); + S = Er(S, u); + var M = w.get("length2"); + if (M = Er(M, u), Math.abs(c.endAngle - c.startAngle) < a) return E(p.states, d), void (p.ignore = !0); + if (function (t) { + if (!t.ignore) return !0; + for (var e in t.states) if (!1 === t.states[e].ignore) return !0; + return !1 + }(p)) { + var I, T, C, D, A = (c.startAngle + c.endAngle) / 2, k = Math.cos(A), L = Math.sin(A); + e = c.cx, n = c.cy; + var P = "inside" === v || "inner" === v; + if ("center" === v) I = c.cx, T = c.cy, D = "center"; else { + var O = (P ? (c.r + c.r0) / 2 * k : c.r * k) + e, R = (P ? (c.r + c.r0) / 2 * L : c.r * L) + n; + if (I = O + 3 * k, T = R + 3 * L, !P) { + var N = O + k * (S + l - c.r), z = R + L * (S + l - c.r), V = N + (k < 0 ? -1 : 1) * M; + I = "edge" === x ? k < 0 ? h + _ : h + u - _ : V + (k < 0 ? -m : m), T = z, C = [[O, R], [N, z], [V, z]] + } + D = P ? "center" : "edge" === x ? k > 0 ? "right" : "left" : k > 0 ? "left" : "right" + } + var B = Math.PI, F = 0, G = y.get("rotate"); + if (j(G)) F = G * (B / 180); else if ("center" === v) F = 0; else if ("radial" === G || !0 === G) { + F = k < 0 ? -A + B : -A + } else if ("tangential" === G && "outside" !== v && "outer" !== v) { + var W = Math.atan2(k, L); + W < 0 && (W = 2 * B + W), L > 0 && (W = B + W), F = W - B + } + if (o = !!F, p.x = I, p.y = T, p.rotation = F, p.setStyle({verticalAlign: "middle"}), P) { + p.setStyle({align: D}); + var H = p.states.select; + H && (H.x += p.x, H.y += p.y) + } else { + var Y = p.getBoundingRect().clone(); + Y.applyTransform(p.getComputedTransform()); + var U = (p.style.margin || 0) + 2.1; + Y.y -= U / 2, Y.height += U, r.push({ + label: p, + labelLine: f, + position: v, + len: S, + len2: M, + minTurnAngle: w.get("minTurnAngle"), + maxSurfaceAngle: w.get("maxSurfaceAngle"), + surfaceNormal: new Ji(k, L), + linePoints: C, + textAlign: D, + labelDistance: m, + labelAlignTo: x, + edgeDistance: _, + bleedMargin: b, + rect: Y, + unconstrainedWidth: Y.width, + labelStyleWidth: p.style.width + }) + } + s.setTextConfig({inside: P}) + } + })), !o && t.get("avoidLabelOverlap") && function (t, e, n, i, r, o, a, s) { + for (var l = [], u = [], h = Number.MAX_VALUE, c = -Number.MAX_VALUE, p = 0; p < t.length; p++) { + var d = t[p].label; + nM(t[p]) || (d.x < e ? (h = Math.min(h, d.x), l.push(t[p])) : (c = Math.max(c, d.x), u.push(t[p]))) + } + for (p = 0; p < t.length; p++) if (!nM(y = t[p]) && y.linePoints) { + if (null != y.labelStyleWidth) continue; + d = y.label; + var f = y.linePoints, g = void 0; + g = "edge" === y.labelAlignTo ? d.x < e ? f[2][0] - y.labelDistance - a - y.edgeDistance : a + r - y.edgeDistance - f[2][0] - y.labelDistance : "labelLine" === y.labelAlignTo ? d.x < e ? h - a - y.bleedMargin : a + r - c - y.bleedMargin : d.x < e ? d.x - a - y.bleedMargin : a + r - d.x - y.bleedMargin, y.targetTextWidth = g, eM(y, g) + } + for (tM(u, e, n, i, 1, 0, o, 0, s, c), tM(l, e, n, i, -1, 0, o, 0, s, h), p = 0; p < t.length; p++) { + var y; + if (!nM(y = t[p]) && y.linePoints) { + d = y.label, f = y.linePoints; + var v = "edge" === y.labelAlignTo, m = d.style.padding, x = m ? m[1] + m[3] : 0, + _ = d.style.backgroundColor ? 0 : x, b = y.rect.width + _, w = f[1][0] - f[2][0]; + v ? d.x < e ? f[2][0] = a + y.edgeDistance + b + y.labelDistance : f[2][0] = a + r - y.edgeDistance - b - y.labelDistance : (d.x < e ? f[2][0] = d.x + y.labelDistance : f[2][0] = d.x - y.labelDistance, f[1][0] = f[2][0] + w), f[1][1] = f[2][1] = d.y + } + } + }(r, e, n, l, u, p, h, c); + for (var f = 0; f < r.length; f++) { + var g = r[f], y = g.label, v = g.labelLine, m = isNaN(y.x) || isNaN(y.y); + if (y) { + y.setStyle({align: g.textAlign}), m && (E(y.states, d), y.ignore = !0); + var x = y.states.select; + x && (x.x += y.x, x.y += y.y) + } + if (v) { + var _ = g.linePoints; + m || !_ ? (E(v.states, d), v.ignore = !0) : (sb(_, g.minTurnAngle), lb(_, g.surfaceNormal, g.maxSurfaceAngle), v.setShape({points: _}), y.__hostTarget.textGuideLineConfig = {anchor: new Ji(_[0][0], _[0][1])}) + } + } + } + + function rM(t, e, n) { + var i = t.get("borderRadius"); + if (null == i) return n ? {cornerRadius: 0} : null; + Y(i) || (i = [i, i, i, i]); + var r = Math.abs(e.r || 0 - e.r0 || 0); + return { + cornerRadius: z(i, (function (t) { + return gr(t, r) + })) + } + } + + var oM = function (t) { + function e(e, n, i) { + var r = t.call(this) || this; + r.z2 = 2; + var o = new As; + return r.setTextContent(o), r.updateData(e, n, i, !0), r + } + + return n(e, t), e.prototype.updateData = function (t, e, n, i) { + var r = this, o = t.hostModel, a = t.getItemModel(e), s = a.getModel("emphasis"), l = t.getItemLayout(e), + u = A(rM(a.getModel("itemStyle"), l, !0), l); + if (isNaN(u.startAngle)) r.setShape(u); else { + if (i) { + r.setShape(u); + var h = o.getShallow("animationType"); + o.ecModel.ssr ? (rh(r, {scaleX: 0, scaleY: 0}, o, { + dataIndex: e, + isFrom: !0 + }), r.originX = u.cx, r.originY = u.cy) : "scale" === h ? (r.shape.r = l.r0, rh(r, {shape: {r: l.r}}, o, e)) : null != n ? (r.setShape({ + startAngle: n, + endAngle: n + }), rh(r, { + shape: { + startAngle: l.startAngle, + endAngle: l.endAngle + } + }, o, e)) : (r.shape.endAngle = l.startAngle, ih(r, {shape: {endAngle: l.endAngle}}, o, e)) + } else uh(r), ih(r, {shape: u}, o, e); + r.useStyle(t.getItemVisual(e, "style")), zl(r, a); + var c = (l.startAngle + l.endAngle) / 2, p = o.get("selectedOffset"), d = Math.cos(c) * p, + f = Math.sin(c) * p, g = a.getShallow("cursor"); + g && r.attr("cursor", g), this._updateLabel(o, t, e), r.ensureState("emphasis").shape = A({r: l.r + (s.get("scale") && s.get("scaleSize") || 0)}, rM(s.getModel("itemStyle"), l)), A(r.ensureState("select"), { + x: d, + y: f, + shape: rM(a.getModel(["select", "itemStyle"]), l) + }), A(r.ensureState("blur"), {shape: rM(a.getModel(["blur", "itemStyle"]), l)}); + var y = r.getTextGuideLine(), v = r.getTextContent(); + y && A(y.ensureState("select"), {x: d, y: f}), A(v.ensureState("select"), { + x: d, + y: f + }), Ol(this, s.get("focus"), s.get("blurScope"), s.get("disabled")) + } + }, e.prototype._updateLabel = function (t, e, n) { + var i = this, r = e.getItemModel(n), o = r.getModel("labelLine"), a = e.getItemVisual(n, "style"), + s = a && a.fill, l = a && a.opacity; + Wh(i, Hh(r), { + labelFetcher: e.hostModel, + labelDataIndex: n, + inheritColor: s, + defaultOpacity: l, + defaultText: t.getFormattedLabel(n, "normal") || e.getName(n) + }); + var u = i.getTextContent(); + i.setTextConfig({position: null, rotation: null}), u.attr({z2: 10}); + var h = t.get(["label", "position"]); + if ("outside" !== h && "outer" !== h) i.removeTextGuideLine(); else { + var c = this.getTextGuideLine(); + c || (c = new Ou, this.setTextGuideLine(c)), cb(this, pb(r), { + stroke: s, + opacity: ot(o.get(["lineStyle", "opacity"]), l, 1) + }) + } + }, e + }(Tu), aM = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.ignoreLabelLineUpdate = !0, e + } + + return n(e, t), e.prototype.init = function () { + var t = new Cr; + this._sectorGroup = t + }, e.prototype.render = function (t, e, n, i) { + var r, o = t.getData(), a = this._data, s = this.group; + if (!a && o.count() > 0) { + for (var l = o.getItemLayout(0), u = 1; isNaN(l && l.startAngle) && u < o.count(); ++u) l = o.getItemLayout(u); + l && (r = l.startAngle) + } + if (this._emptyCircleSector && s.remove(this._emptyCircleSector), 0 === o.count() && t.get("showEmptyCircle")) { + var h = new Tu({shape: KS(t, n)}); + h.useStyle(t.getModel("emptyCircleStyle").getItemStyle()), this._emptyCircleSector = h, s.add(h) + } + o.diff(a).add((function (t) { + var e = new oM(o, t, r); + o.setItemGraphicEl(t, e), s.add(e) + })).update((function (t, e) { + var n = a.getItemGraphicEl(e); + n.updateData(o, t, r), n.off("click"), s.add(n), o.setItemGraphicEl(t, n) + })).remove((function (e) { + lh(a.getItemGraphicEl(e), t, e) + })).execute(), iM(t), "expansion" !== t.get("animationTypeUpdate") && (this._data = o) + }, e.prototype.dispose = function () { + }, e.prototype.containPoint = function (t, e) { + var n = e.getData().getItemLayout(0); + if (n) { + var i = t[0] - n.cx, r = t[1] - n.cy, o = Math.sqrt(i * i + r * r); + return o <= n.r && o >= n.r0 + } + }, e.type = "pie", e + }(mg); + + function sM(t, e, n) { + e = Y(e) && {coordDimensions: e} || A({encodeDefine: t.getEncode()}, e); + var i = t.getSource(), r = jm(i, e).dimensions, o = new Zm(r, t); + return o.initData(i, n), o + } + + var lM = function () { + function t(t, e) { + this._getDataWithEncodedVisual = t, this._getRawData = e + } + + return t.prototype.getAllNames = function () { + var t = this._getRawData(); + return t.mapArray(t.getName) + }, t.prototype.containName = function (t) { + return this._getRawData().indexOfName(t) >= 0 + }, t.prototype.indexOfName = function (t) { + return this._getDataWithEncodedVisual().indexOfName(t) + }, t.prototype.getItemVisual = function (t, e) { + return this._getDataWithEncodedVisual().getItemVisual(t, e) + }, t + }(), uM = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.init = function (e) { + t.prototype.init.apply(this, arguments), this.legendVisualProvider = new lM(W(this.getData, this), W(this.getRawData, this)), this._defaultLabelLine(e) + }, e.prototype.mergeOption = function () { + t.prototype.mergeOption.apply(this, arguments) + }, e.prototype.getInitialData = function () { + return sM(this, {coordDimensions: ["value"], encodeDefaulter: H(Hp, this)}) + }, e.prototype.getDataParams = function (e) { + var n = this.getData(), i = t.prototype.getDataParams.call(this, e), r = []; + return n.each(n.mapDimension("value"), (function (t) { + r.push(t) + })), i.percent = Wr(r, e, n.hostModel.get("percentPrecision")), i.$vars.push("percent"), i + }, e.prototype._defaultLabelLine = function (t) { + co(t, "labelLine", ["show"]); + var e = t.labelLine, n = t.emphasis.labelLine; + e.show = e.show && t.label.show, n.show = n.show && t.emphasis.label.show + }, e.type = "series.pie", e.defaultOption = { + z: 2, + legendHoverLink: !0, + colorBy: "data", + center: ["50%", "50%"], + radius: [0, "75%"], + clockwise: !0, + startAngle: 90, + minAngle: 0, + minShowLabelAngle: 0, + selectedOffset: 10, + percentPrecision: 2, + stillShowZeroSum: !0, + left: 0, + top: 0, + right: 0, + bottom: 0, + width: null, + height: null, + label: { + rotate: 0, + show: !0, + overflow: "truncate", + position: "outer", + alignTo: "none", + edgeDistance: "25%", + bleedMargin: 10, + distanceToLabelLine: 5 + }, + labelLine: { + show: !0, + length: 15, + length2: 15, + smooth: !1, + minTurnAngle: 90, + maxSurfaceAngle: 90, + lineStyle: {width: 1, type: "solid"} + }, + itemStyle: {borderWidth: 1, borderJoin: "round"}, + showEmptyCircle: !0, + emptyCircleStyle: {color: "lightgray", opacity: 1}, + labelLayout: {hideOverlap: !0}, + emphasis: {scale: !0, scaleSize: 5}, + avoidLabelOverlap: !0, + animationType: "expansion", + animationDuration: 1e3, + animationTypeUpdate: "transition", + animationEasingUpdate: "cubicInOut", + animationDurationUpdate: 500, + animationEasing: "cubicInOut" + }, e + }(ag); + var hM = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.hasSymbolVisual = !0, n + } + + return n(e, t), e.prototype.getInitialData = function (t, e) { + return nx(null, this, {useEncodeDefaulter: !0}) + }, e.prototype.getProgressive = function () { + var t = this.option.progressive; + return null == t ? this.option.large ? 5e3 : this.get("progressive") : t + }, e.prototype.getProgressiveThreshold = function () { + var t = this.option.progressiveThreshold; + return null == t ? this.option.large ? 1e4 : this.get("progressiveThreshold") : t + }, e.prototype.brushSelector = function (t, e, n) { + return n.point(e.getItemLayout(t)) + }, e.prototype.getZLevelKey = function () { + return this.getData().count() > this.getProgressiveThreshold() ? this.id : "" + }, e.type = "series.scatter", e.dependencies = ["grid", "polar", "geo", "singleAxis", "calendar"], e.defaultOption = { + coordinateSystem: "cartesian2d", + z: 2, + legendHoverLink: !0, + symbolSize: 10, + large: !1, + largeThreshold: 2e3, + itemStyle: {opacity: .8}, + emphasis: {scale: !0}, + clip: !0, + select: {itemStyle: {borderColor: "#212121"}}, + universalTransition: {divideShape: "clone"} + }, e + }(ag), cM = function () { + }, pM = function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n._off = 0, n.hoverDataIdx = -1, n + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new cM + }, e.prototype.reset = function () { + this.notClear = !1, this._off = 0 + }, e.prototype.buildPath = function (t, e) { + var n, i = e.points, r = e.size, o = this.symbolProxy, a = o.shape, s = t.getContext ? t.getContext() : t, + l = s && r[0] < 4, u = this.softClipShape; + if (l) this._ctx = s; else { + for (this._ctx = null, n = this._off; n < i.length;) { + var h = i[n++], c = i[n++]; + isNaN(h) || isNaN(c) || (u && !u.contain(h, c) || (a.x = h - r[0] / 2, a.y = c - r[1] / 2, a.width = r[0], a.height = r[1], o.buildPath(t, a, !0))) + } + this.incremental && (this._off = n, this.notClear = !0) + } + }, e.prototype.afterBrush = function () { + var t, e = this.shape, n = e.points, i = e.size, r = this._ctx, o = this.softClipShape; + if (r) { + for (t = this._off; t < n.length;) { + var a = n[t++], s = n[t++]; + isNaN(a) || isNaN(s) || (o && !o.contain(a, s) || r.fillRect(a - i[0] / 2, s - i[1] / 2, i[0], i[1])) + } + this.incremental && (this._off = t, this.notClear = !0) + } + }, e.prototype.findDataIndex = function (t, e) { + for (var n = this.shape, i = n.points, r = n.size, o = Math.max(r[0], 4), a = Math.max(r[1], 4), s = i.length / 2 - 1; s >= 0; s--) { + var l = 2 * s, u = i[l] - o / 2, h = i[l + 1] - a / 2; + if (t >= u && e >= h && t <= u + o && e <= h + a) return s + } + return -1 + }, e.prototype.contain = function (t, e) { + var n = this.transformCoordToLocal(t, e), i = this.getBoundingRect(); + return t = n[0], e = n[1], i.contain(t, e) ? (this.hoverDataIdx = this.findDataIndex(t, e)) >= 0 : (this.hoverDataIdx = -1, !1) + }, e.prototype.getBoundingRect = function () { + var t = this._rect; + if (!t) { + for (var e = this.shape, n = e.points, i = e.size, r = i[0], o = i[1], a = 1 / 0, s = 1 / 0, l = -1 / 0, u = -1 / 0, h = 0; h < n.length;) { + var c = n[h++], p = n[h++]; + a = Math.min(c, a), l = Math.max(c, l), s = Math.min(p, s), u = Math.max(p, u) + } + t = this._rect = new sr(a - r / 2, s - o / 2, l - a + r, u - s + o) + } + return t + }, e + }(fs), dM = function () { + function t() { + this.group = new Cr + } + + return t.prototype.updateData = function (t, e) { + this._clear(); + var n = this._create(); + n.setShape({points: t.getLayout("points")}), this._setCommon(n, t, e) + }, t.prototype.updateLayout = function (t) { + var e = t.getLayout("points"); + this.group.eachChild((function (t) { + if (null != t.startIndex) { + var n = 2 * (t.endIndex - t.startIndex), i = 4 * t.startIndex * 2; + e = new Float32Array(e.buffer, i, n) + } + t.setShape("points", e), t.reset() + })) + }, t.prototype.incrementalPrepareUpdate = function (t) { + this._clear() + }, t.prototype.incrementalUpdate = function (t, e, n) { + var i = this._newAdded[0], r = e.getLayout("points"), o = i && i.shape.points; + if (o && o.length < 2e4) { + var a = o.length, s = new Float32Array(a + r.length); + s.set(o), s.set(r, a), i.endIndex = t.end, i.setShape({points: s}) + } else { + this._newAdded = []; + var l = this._create(); + l.startIndex = t.start, l.endIndex = t.end, l.incremental = !0, l.setShape({points: r}), this._setCommon(l, e, n) + } + }, t.prototype.eachRendered = function (t) { + this._newAdded[0] && t(this._newAdded[0]) + }, t.prototype._create = function () { + var t = new pM({cursor: "default"}); + return this.group.add(t), this._newAdded.push(t), t + }, t.prototype._setCommon = function (t, e, n) { + var i = e.hostModel; + n = n || {}; + var r = e.getVisual("symbolSize"); + t.setShape("size", r instanceof Array ? r : [r, r]), t.softClipShape = n.clipShape || null, t.symbolProxy = ky(e.getVisual("symbol"), 0, 0, 0, 0), t.setColor = t.symbolProxy.setColor; + var o = t.shape.size[0] < 4; + t.useStyle(i.getModel("itemStyle").getItemStyle(o ? ["color", "shadowBlur", "shadowColor"] : ["color"])); + var a = e.getVisual("style"), s = a && a.fill; + s && t.setColor(s); + var l = Ws(t); + l.seriesIndex = i.seriesIndex, t.on("mousemove", (function (e) { + l.dataIndex = null; + var n = t.hoverDataIdx; + n >= 0 && (l.dataIndex = n + (t.startIndex || 0)) + })) + }, t.prototype.remove = function () { + this._clear() + }, t.prototype._clear = function () { + this._newAdded = [], this.group.removeAll() + }, t + }(), fM = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + var i = t.getData(); + this._updateSymbolDraw(i, t).updateData(i, {clipShape: this._getClipShape(t)}), this._finished = !0 + }, e.prototype.incrementalPrepareRender = function (t, e, n) { + var i = t.getData(); + this._updateSymbolDraw(i, t).incrementalPrepareUpdate(i), this._finished = !1 + }, e.prototype.incrementalRender = function (t, e, n) { + this._symbolDraw.incrementalUpdate(t, e.getData(), {clipShape: this._getClipShape(e)}), this._finished = t.end === e.getData().count() + }, e.prototype.updateTransform = function (t, e, n) { + var i = t.getData(); + if (this.group.dirty(), !this._finished || i.count() > 1e4) return {update: !0}; + var r = xS("").reset(t, e, n); + r.progress && r.progress({start: 0, end: i.count(), count: i.count()}, i), this._symbolDraw.updateLayout(i) + }, e.prototype.eachRendered = function (t) { + this._symbolDraw && this._symbolDraw.eachRendered(t) + }, e.prototype._getClipShape = function (t) { + var e = t.coordinateSystem, n = e && e.getArea && e.getArea(); + return t.get("clip", !0) ? n : null + }, e.prototype._updateSymbolDraw = function (t, e) { + var n = this._symbolDraw, i = e.pipelineContext.large; + return n && i === this._isLargeDraw || (n && n.remove(), n = this._symbolDraw = i ? new dM : new Zw, this._isLargeDraw = i, this.group.removeAll()), this.group.add(n.group), n + }, e.prototype.remove = function (t, e) { + this._symbolDraw && this._symbolDraw.remove(!0), this._symbolDraw = null + }, e.prototype.dispose = function () { + }, e.type = "scatter", e + }(mg), gM = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.type = "grid", e.dependencies = ["xAxis", "yAxis"], e.layoutMode = "box", e.defaultOption = { + show: !1, + z: 0, + left: "10%", + top: 60, + right: "10%", + bottom: 70, + containLabel: !1, + backgroundColor: "rgba(0,0,0,0)", + borderWidth: 1, + borderColor: "#ccc" + }, e + }(Ip), yM = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.getCoordSysModel = function () { + return this.getReferringComponents("grid", Co).models[0] + }, e.type = "cartesian2dAxis", e + }(Ip); + R(yM, h_); + var vM = { + show: !0, + z: 0, + inverse: !1, + name: "", + nameLocation: "end", + nameRotate: null, + nameTruncate: {maxWidth: null, ellipsis: "...", placeholder: "."}, + nameTextStyle: {}, + nameGap: 15, + silent: !1, + triggerEvent: !1, + tooltip: {show: !1}, + axisPointer: {}, + axisLine: { + show: !0, + onZero: !0, + onZeroAxisIndex: null, + lineStyle: {color: "#6E7079", width: 1, type: "solid"}, + symbol: ["none", "none"], + symbolSize: [10, 15] + }, + axisTick: {show: !0, inside: !1, length: 5, lineStyle: {width: 1}}, + axisLabel: {show: !0, inside: !1, rotate: 0, showMinLabel: null, showMaxLabel: null, margin: 8, fontSize: 12}, + splitLine: {show: !0, lineStyle: {color: ["#E0E6F1"], width: 1, type: "solid"}}, + splitArea: {show: !1, areaStyle: {color: ["rgba(250,250,250,0.2)", "rgba(210,219,238,0.2)"]}} + }, mM = C({ + boundaryGap: !0, + deduplication: null, + splitLine: {show: !1}, + axisTick: {alignWithLabel: !1, interval: "auto"}, + axisLabel: {interval: "auto"} + }, vM), xM = C({ + boundaryGap: [0, 0], + axisLine: {show: "auto"}, + axisTick: {show: "auto"}, + splitNumber: 5, + minorTick: {show: !1, splitNumber: 5, length: 3, lineStyle: {}}, + minorSplitLine: {show: !1, lineStyle: {color: "#F4F7FD", width: 1}} + }, vM), _M = { + category: mM, + value: xM, + time: C({ + splitNumber: 6, + axisLabel: {showMinLabel: !1, showMaxLabel: !1, rich: {primary: {fontWeight: "bold"}}}, + splitLine: {show: !1} + }, xM), + log: k({logBase: 10}, xM) + }, bM = {value: 1, category: 1, time: 1, log: 1}; + + function wM(t, e, i, r) { + E(bM, (function (o, a) { + var s = C(C({}, _M[a], !0), r, !0), l = function (t) { + function i() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e + "Axis." + a, n + } + + return n(i, t), i.prototype.mergeDefaultAndTheme = function (t, e) { + var n = _p(this), i = n ? wp(t) : {}; + C(t, e.getTheme().get(a + "Axis")), C(t, this.getDefaultOption()), t.type = SM(t), n && bp(t, i, n) + }, i.prototype.optionUpdated = function () { + "category" === this.option.type && (this.__ordinalMeta = ox.createByAxisModel(this)) + }, i.prototype.getCategories = function (t) { + var e = this.option; + if ("category" === e.type) return t ? e.data : this.__ordinalMeta.categories + }, i.prototype.getOrdinalMeta = function () { + return this.__ordinalMeta + }, i.type = e + "Axis." + a, i.defaultOption = s, i + }(i); + t.registerComponentModel(l) + })), t.registerSubTypeDefaulter(e + "Axis", SM) + } + + function SM(t) { + return t.type || (t.data ? "category" : "value") + } + + var MM = function () { + function t(t) { + this.type = "cartesian", this._dimList = [], this._axes = {}, this.name = t || "" + } + + return t.prototype.getAxis = function (t) { + return this._axes[t] + }, t.prototype.getAxes = function () { + return z(this._dimList, (function (t) { + return this._axes[t] + }), this) + }, t.prototype.getAxesByScale = function (t) { + return t = t.toLowerCase(), B(this.getAxes(), (function (e) { + return e.scale.type === t + })) + }, t.prototype.addAxis = function (t) { + var e = t.dim; + this._axes[e] = t, this._dimList.push(e) + }, t + }(), IM = ["x", "y"]; + + function TM(t) { + return "interval" === t.type || "time" === t.type + } + + var CM = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.type = "cartesian2d", e.dimensions = IM, e + } + + return n(e, t), e.prototype.calcAffineTransform = function () { + this._transform = this._invTransform = null; + var t = this.getAxis("x").scale, e = this.getAxis("y").scale; + if (TM(t) && TM(e)) { + var n = t.getExtent(), i = e.getExtent(), r = this.dataToPoint([n[0], i[0]]), + o = this.dataToPoint([n[1], i[1]]), a = n[1] - n[0], s = i[1] - i[0]; + if (a && s) { + var l = (o[0] - r[0]) / a, u = (o[1] - r[1]) / s, h = r[0] - n[0] * l, c = r[1] - i[0] * u, + p = this._transform = [l, 0, 0, u, h, c]; + this._invTransform = Bi([], p) + } + } + }, e.prototype.getBaseAxis = function () { + return this.getAxesByScale("ordinal")[0] || this.getAxesByScale("time")[0] || this.getAxis("x") + }, e.prototype.containPoint = function (t) { + var e = this.getAxis("x"), n = this.getAxis("y"); + return e.contain(e.toLocalCoord(t[0])) && n.contain(n.toLocalCoord(t[1])) + }, e.prototype.containData = function (t) { + return this.getAxis("x").containData(t[0]) && this.getAxis("y").containData(t[1]) + }, e.prototype.dataToPoint = function (t, e, n) { + n = n || []; + var i = t[0], r = t[1]; + if (this._transform && null != i && isFinite(i) && null != r && isFinite(r)) return Ft(n, t, this._transform); + var o = this.getAxis("x"), a = this.getAxis("y"); + return n[0] = o.toGlobalCoord(o.dataToCoord(i, e)), n[1] = a.toGlobalCoord(a.dataToCoord(r, e)), n + }, e.prototype.clampData = function (t, e) { + var n = this.getAxis("x").scale, i = this.getAxis("y").scale, r = n.getExtent(), o = i.getExtent(), + a = n.parse(t[0]), s = i.parse(t[1]); + return (e = e || [])[0] = Math.min(Math.max(Math.min(r[0], r[1]), a), Math.max(r[0], r[1])), e[1] = Math.min(Math.max(Math.min(o[0], o[1]), s), Math.max(o[0], o[1])), e + }, e.prototype.pointToData = function (t, e) { + var n = []; + if (this._invTransform) return Ft(n, t, this._invTransform); + var i = this.getAxis("x"), r = this.getAxis("y"); + return n[0] = i.coordToData(i.toLocalCoord(t[0]), e), n[1] = r.coordToData(r.toLocalCoord(t[1]), e), n + }, e.prototype.getOtherAxis = function (t) { + return this.getAxis("x" === t.dim ? "y" : "x") + }, e.prototype.getArea = function () { + var t = this.getAxis("x").getGlobalExtent(), e = this.getAxis("y").getGlobalExtent(), + n = Math.min(t[0], t[1]), i = Math.min(e[0], e[1]), r = Math.max(t[0], t[1]) - n, + o = Math.max(e[0], e[1]) - i; + return new sr(n, i, r, o) + }, e + }(MM), DM = function (t) { + function e(e, n, i, r, o) { + var a = t.call(this, e, n, i) || this; + return a.index = 0, a.type = r || "value", a.position = o || "bottom", a + } + + return n(e, t), e.prototype.isHorizontal = function () { + var t = this.position; + return "top" === t || "bottom" === t + }, e.prototype.getGlobalExtent = function (t) { + var e = this.getExtent(); + return e[0] = this.toGlobalCoord(e[0]), e[1] = this.toGlobalCoord(e[1]), t && e[0] > e[1] && e.reverse(), e + }, e.prototype.pointToData = function (t, e) { + return this.coordToData(this.toLocalCoord(t["x" === this.dim ? 0 : 1]), e) + }, e.prototype.setCategorySortInfo = function (t) { + if ("category" !== this.type) return !1; + this.model.option.categorySortInfo = t, this.scale.setSortInfo(t) + }, e + }(G_); + + function AM(t, e, n) { + n = n || {}; + var i = t.coordinateSystem, r = e.axis, o = {}, a = r.getAxesOnZeroOf()[0], s = r.position, + l = a ? "onZero" : s, u = r.dim, h = i.getRect(), c = [h.x, h.x + h.width, h.y, h.y + h.height], + p = {left: 0, right: 1, top: 0, bottom: 1, onZero: 2}, d = e.get("offset") || 0, + f = "x" === u ? [c[2] - d, c[3] + d] : [c[0] - d, c[1] + d]; + if (a) { + var g = a.toGlobalCoord(a.dataToCoord(0)); + f[p.onZero] = Math.max(Math.min(g, f[1]), f[0]) + } + o.position = ["y" === u ? f[p[l]] : c[0], "x" === u ? f[p[l]] : c[3]], o.rotation = Math.PI / 2 * ("x" === u ? 0 : 1); + o.labelDirection = o.tickDirection = o.nameDirection = { + top: -1, + bottom: 1, + left: -1, + right: 1 + }[s], o.labelOffset = a ? f[p[s]] - f[p.onZero] : 0, e.get(["axisTick", "inside"]) && (o.tickDirection = -o.tickDirection), it(n.labelInside, e.get(["axisLabel", "inside"])) && (o.labelDirection = -o.labelDirection); + var y = e.get(["axisLabel", "rotate"]); + return o.labelRotate = "top" === l ? -y : y, o.z2 = 1, o + } + + function kM(t) { + return "cartesian2d" === t.get("coordinateSystem") + } + + function LM(t) { + var e = {xAxisModel: null, yAxisModel: null}; + return E(e, (function (n, i) { + var r = i.replace(/Model$/, ""), o = t.getReferringComponents(r, Co).models[0]; + e[i] = o + })), e + } + + var PM = Math.log; + + function OM(t, e, n) { + var i = vx.prototype, r = i.getTicks.call(n), o = i.getTicks.call(n, !0), a = r.length - 1, + s = i.getInterval.call(n), l = e_(t, e), u = l.extent, h = l.fixMin, c = l.fixMax; + if ("log" === t.type) { + var p = PM(t.base); + u = [PM(u[0]) / p, PM(u[1]) / p] + } + t.setExtent(u[0], u[1]), t.calcNiceExtent({splitNumber: a, fixMin: h, fixMax: c}); + var d = i.getExtent.call(t); + h && (u[0] = d[0]), c && (u[1] = d[1]); + var f = i.getInterval.call(t), g = u[0], y = u[1]; + if (h && c) f = (y - g) / a; else if (h) for (y = u[0] + f * a; y < u[1] && isFinite(y) && isFinite(u[1]);) f = ux(f), y = u[0] + f * a; else if (c) for (g = u[1] - f * a; g > u[0] && isFinite(g) && isFinite(u[0]);) f = ux(f), g = u[1] - f * a; else { + t.getTicks().length - 1 > a && (f = ux(f)); + var v = f * a; + (g = zr((y = Math.ceil(u[1] / f) * f) - v)) < 0 && u[0] >= 0 ? (g = 0, y = zr(v)) : y > 0 && u[1] <= 0 && (y = 0, g = -zr(v)) + } + var m = (r[0].value - o[0].value) / s, x = (r[a].value - o[a].value) / s; + i.setExtent.call(t, g + f * m, y + f * x), i.setInterval.call(t, f), (m || x) && i.setNiceExtent.call(t, g + f, y - f) + } + + var RM = function () { + function t(t, e, n) { + this.type = "grid", this._coordsMap = {}, this._coordsList = [], this._axesMap = {}, this._axesList = [], this.axisPointerEnabled = !0, this.dimensions = IM, this._initCartesian(t, e, n), this.model = t + } + + return t.prototype.getRect = function () { + return this._rect + }, t.prototype.update = function (t, e) { + var n = this._axesMap; + + function i(t) { + var e, n = G(t), i = n.length; + if (i) { + for (var r = [], o = i - 1; o >= 0; o--) { + var a = t[+n[o]], s = a.model, l = a.scale; + sx(l) && s.get("alignTicks") && null == s.get("interval") ? r.push(a) : (n_(l, s), sx(l) && (e = a)) + } + r.length && (e || n_((e = r.pop()).scale, e.model), E(r, (function (t) { + OM(t.scale, t.model, e.scale) + }))) + } + } + + this._updateScale(t, this.model), i(n.x), i(n.y); + var r = {}; + E(n.x, (function (t) { + EM(n, "y", t, r) + })), E(n.y, (function (t) { + EM(n, "x", t, r) + })), this.resize(this.model, e) + }, t.prototype.resize = function (t, e, n) { + var i = t.getBoxLayoutParams(), r = !n && t.get("containLabel"), + o = mp(i, {width: e.getWidth(), height: e.getHeight()}); + this._rect = o; + var a = this._axesList; + + function s() { + E(a, (function (t) { + var e = t.isHorizontal(), n = e ? [0, o.width] : [0, o.height], i = t.inverse ? 1 : 0; + t.setExtent(n[i], n[1 - i]), function (t, e) { + var n = t.getExtent(), i = n[0] + n[1]; + t.toGlobalCoord = "x" === t.dim ? function (t) { + return t + e + } : function (t) { + return i - t + e + }, t.toLocalCoord = "x" === t.dim ? function (t) { + return t - e + } : function (t) { + return i - t + e + } + }(t, e ? o.x : o.y) + })) + } + + s(), r && (E(a, (function (t) { + if (!t.model.get(["axisLabel", "inside"])) { + var e = function (t) { + var e = t.model, n = t.scale; + if (e.get(["axisLabel", "show"]) && !n.isBlank()) { + var i, r, o = n.getExtent(); + r = n instanceof gx ? n.count() : (i = n.getTicks()).length; + var a, s = t.getLabelModel(), l = r_(t), u = 1; + r > 40 && (u = Math.ceil(r / 40)); + for (var h = 0; h < r; h += u) { + var c = l(i ? i[h] : {value: o[0] + h}, h), + p = a_(s.getTextRect(c), s.get("rotate") || 0); + a ? a.union(p) : a = p + } + return a + } + }(t); + if (e) { + var n = t.isHorizontal() ? "height" : "width", i = t.model.get(["axisLabel", "margin"]); + o[n] -= e[n] + i, "top" === t.position ? o.y += e.height + i : "left" === t.position && (o.x += e.width + i) + } + } + })), s()), E(this._coordsList, (function (t) { + t.calcAffineTransform() + })) + }, t.prototype.getAxis = function (t, e) { + var n = this._axesMap[t]; + if (null != n) return n[e || 0] + }, t.prototype.getAxes = function () { + return this._axesList.slice() + }, t.prototype.getCartesian = function (t, e) { + if (null != t && null != e) { + var n = "x" + t + "y" + e; + return this._coordsMap[n] + } + q(t) && (e = t.yAxisIndex, t = t.xAxisIndex); + for (var i = 0, r = this._coordsList; i < r.length; i++) if (r[i].getAxis("x").index === t || r[i].getAxis("y").index === e) return r[i] + }, t.prototype.getCartesians = function () { + return this._coordsList.slice() + }, t.prototype.convertToPixel = function (t, e, n) { + var i = this._findConvertTarget(e); + return i.cartesian ? i.cartesian.dataToPoint(n) : i.axis ? i.axis.toGlobalCoord(i.axis.dataToCoord(n)) : null + }, t.prototype.convertFromPixel = function (t, e, n) { + var i = this._findConvertTarget(e); + return i.cartesian ? i.cartesian.pointToData(n) : i.axis ? i.axis.coordToData(i.axis.toLocalCoord(n)) : null + }, t.prototype._findConvertTarget = function (t) { + var e, n, i = t.seriesModel, r = t.xAxisModel || i && i.getReferringComponents("xAxis", Co).models[0], + o = t.yAxisModel || i && i.getReferringComponents("yAxis", Co).models[0], a = t.gridModel, + s = this._coordsList; + if (i) P(s, e = i.coordinateSystem) < 0 && (e = null); else if (r && o) e = this.getCartesian(r.componentIndex, o.componentIndex); else if (r) n = this.getAxis("x", r.componentIndex); else if (o) n = this.getAxis("y", o.componentIndex); else if (a) { + a.coordinateSystem === this && (e = this._coordsList[0]) + } + return {cartesian: e, axis: n} + }, t.prototype.containPoint = function (t) { + var e = this._coordsList[0]; + if (e) return e.containPoint(t) + }, t.prototype._initCartesian = function (t, e, n) { + var i = this, r = this, o = {left: !1, right: !1, top: !1, bottom: !1}, a = {x: {}, y: {}}, + s = {x: 0, y: 0}; + if (e.eachComponent("xAxis", l("x"), this), e.eachComponent("yAxis", l("y"), this), !s.x || !s.y) return this._axesMap = {}, void (this._axesList = []); + + function l(e) { + return function (n, i) { + if (NM(n, t)) { + var l = n.get("position"); + "x" === e ? "top" !== l && "bottom" !== l && (l = o.bottom ? "top" : "bottom") : "left" !== l && "right" !== l && (l = o.left ? "right" : "left"), o[l] = !0; + var u = new DM(e, i_(n), [0, 0], n.get("type"), l), h = "category" === u.type; + u.onBand = h && n.get("boundaryGap"), u.inverse = n.get("inverse"), n.axis = u, u.model = n, u.grid = r, u.index = i, r._axesList.push(u), a[e][i] = u, s[e]++ + } + } + } + + this._axesMap = a, E(a.x, (function (e, n) { + E(a.y, (function (r, o) { + var a = "x" + n + "y" + o, s = new CM(a); + s.master = i, s.model = t, i._coordsMap[a] = s, i._coordsList.push(s), s.addAxis(e), s.addAxis(r) + })) + })) + }, t.prototype._updateScale = function (t, e) { + function n(t, e) { + E(u_(t, e.dim), (function (n) { + e.scale.unionExtentFromData(t, n) + })) + } + + E(this._axesList, (function (t) { + if (t.scale.setExtent(1 / 0, -1 / 0), "category" === t.type) { + var e = t.model.get("categorySortInfo"); + t.scale.setSortInfo(e) + } + })), t.eachSeries((function (t) { + if (kM(t)) { + var i = LM(t), r = i.xAxisModel, o = i.yAxisModel; + if (!NM(r, e) || !NM(o, e)) return; + var a = this.getCartesian(r.componentIndex, o.componentIndex), s = t.getData(), l = a.getAxis("x"), + u = a.getAxis("y"); + n(s, l), n(s, u) + } + }), this) + }, t.prototype.getTooltipAxes = function (t) { + var e = [], n = []; + return E(this.getCartesians(), (function (i) { + var r = null != t && "auto" !== t ? i.getAxis(t) : i.getBaseAxis(), o = i.getOtherAxis(r); + P(e, r) < 0 && e.push(r), P(n, o) < 0 && n.push(o) + })), {baseAxes: e, otherAxes: n} + }, t.create = function (e, n) { + var i = []; + return e.eachComponent("grid", (function (r, o) { + var a = new t(r, e, n); + a.name = "grid_" + o, a.resize(r, n, !0), r.coordinateSystem = a, i.push(a) + })), e.eachSeries((function (t) { + if (kM(t)) { + var e = LM(t), n = e.xAxisModel, i = e.yAxisModel, r = n.getCoordSysModel(); + 0; + var o = r.coordinateSystem; + t.coordinateSystem = o.getCartesian(n.componentIndex, i.componentIndex) + } + })), i + }, t.dimensions = IM, t + }(); + + function NM(t, e) { + return t.getCoordSysModel() === e + } + + function EM(t, e, n, i) { + n.getAxesOnZeroOf = function () { + return r ? [r] : [] + }; + var r, o = t[e], a = n.model, s = a.get(["axisLine", "onZero"]), l = a.get(["axisLine", "onZeroAxisIndex"]); + if (s) { + if (null != l) zM(o[l]) && (r = o[l]); else for (var u in o) if (o.hasOwnProperty(u) && zM(o[u]) && !i[h(o[u])]) { + r = o[u]; + break + } + r && (i[h(r)] = !0) + } + + function h(t) { + return t.dim + "_" + t.index + } + } + + function zM(t) { + return t && "category" !== t.type && "time" !== t.type && function (t) { + var e = t.scale.getExtent(), n = e[0], i = e[1]; + return !(n > 0 && i > 0 || n < 0 && i < 0) + }(t) + } + + var VM = Math.PI, BM = function () { + function t(t, e) { + this.group = new Cr, this.opt = e, this.axisModel = t, k(e, { + labelOffset: 0, + nameDirection: 1, + tickDirection: 1, + labelDirection: 1, + silent: !0, + handleAutoShown: function () { + return !0 + } + }); + var n = new Cr({x: e.position[0], y: e.position[1], rotation: e.rotation}); + n.updateTransform(), this._transformGroup = n + } + + return t.prototype.hasBuilder = function (t) { + return !!FM[t] + }, t.prototype.add = function (t) { + FM[t](this.opt, this.axisModel, this.group, this._transformGroup) + }, t.prototype.getGroup = function () { + return this.group + }, t.innerTextLayout = function (t, e, n) { + var i, r, o = Ur(e - t); + return Xr(o) ? (r = n > 0 ? "top" : "bottom", i = "center") : Xr(o - VM) ? (r = n > 0 ? "bottom" : "top", i = "center") : (r = "middle", i = o > 0 && o < VM ? n > 0 ? "right" : "left" : n > 0 ? "left" : "right"), { + rotation: o, + textAlign: i, + textVerticalAlign: r + } + }, t.makeAxisEventDataBase = function (t) { + var e = {componentType: t.mainType, componentIndex: t.componentIndex}; + return e[t.mainType + "Index"] = t.componentIndex, e + }, t.isLabelSilent = function (t) { + var e = t.get("tooltip"); + return t.get("silent") || !(t.get("triggerEvent") || e && e.show) + }, t + }(), FM = { + axisLine: function (t, e, n, i) { + var r = e.get(["axisLine", "show"]); + if ("auto" === r && t.handleAutoShown && (r = t.handleAutoShown("axisLine")), r) { + var o = e.axis.getExtent(), a = i.transform, s = [o[0], 0], l = [o[1], 0]; + a && (Ft(s, s, a), Ft(l, l, a)); + var u = A({lineCap: "round"}, e.getModel(["axisLine", "lineStyle"]).getLineStyle()), h = new Eu({ + subPixelOptimize: !0, + shape: {x1: s[0], y1: s[1], x2: l[0], y2: l[1]}, + style: u, + strokeContainThreshold: t.strokeContainThreshold || 5, + silent: !0, + z2: 1 + }); + h.anid = "line", n.add(h); + var c = e.get(["axisLine", "symbol"]); + if (null != c) { + var p = e.get(["axisLine", "symbolSize"]); + X(c) && (c = [c, c]), (X(p) || j(p)) && (p = [p, p]); + var d = Py(e.get(["axisLine", "symbolOffset"]) || 0, p), f = p[0], g = p[1]; + E([{rotate: t.rotation + Math.PI / 2, offset: d[0], r: 0}, { + rotate: t.rotation - Math.PI / 2, + offset: d[1], + r: Math.sqrt((s[0] - l[0]) * (s[0] - l[0]) + (s[1] - l[1]) * (s[1] - l[1])) + }], (function (e, i) { + if ("none" !== c[i] && null != c[i]) { + var r = ky(c[i], -f / 2, -g / 2, f, g, u.stroke, !0), o = e.r + e.offset; + r.attr({ + rotation: e.rotate, + x: s[0] + o * Math.cos(t.rotation), + y: s[1] - o * Math.sin(t.rotation), + silent: !0, + z2: 11 + }), n.add(r) + } + })) + } + } + }, axisTickLabel: function (t, e, n, i) { + var r = function (t, e, n, i) { + var r = n.axis, o = n.getModel("axisTick"), a = o.get("show"); + "auto" === a && i.handleAutoShown && (a = i.handleAutoShown("axisTick")); + if (!a || r.scale.isBlank()) return; + for (var s = o.getModel("lineStyle"), l = i.tickDirection * o.get("length"), u = YM(r.getTicksCoords(), e.transform, l, k(s.getLineStyle(), {stroke: n.get(["axisLine", "lineStyle", "color"])}), "ticks"), h = 0; h < u.length; h++) t.add(u[h]); + return u + }(n, i, e, t), o = function (t, e, n, i) { + var r = n.axis; + if (!it(i.axisLabelShow, n.get(["axisLabel", "show"])) || r.scale.isBlank()) return; + var o = n.getModel("axisLabel"), a = o.get("margin"), s = r.getViewLabels(), + l = (it(i.labelRotate, o.get("rotate")) || 0) * VM / 180, + u = BM.innerTextLayout(i.rotation, l, i.labelDirection), h = n.getCategories && n.getCategories(!0), + c = [], p = BM.isLabelSilent(n), d = n.get("triggerEvent"); + return E(s, (function (s, l) { + var f = "ordinal" === r.scale.type ? r.scale.getRawOrdinalNumber(s.tickValue) : s.tickValue, + g = s.formattedLabel, y = s.rawLabel, v = o; + if (h && h[f]) { + var m = h[f]; + q(m) && m.textStyle && (v = new pc(m.textStyle, o, n.ecModel)) + } + var x = v.getTextColor() || n.get(["axisLine", "lineStyle", "color"]), _ = r.dataToCoord(f), + b = new As({ + x: _, + y: i.labelOffset + i.labelDirection * a, + rotation: u.rotation, + silent: p, + z2: 10 + (s.level || 0), + style: Yh(v, { + text: g, + align: v.getShallow("align", !0) || u.textAlign, + verticalAlign: v.getShallow("verticalAlign", !0) || v.getShallow("baseline", !0) || u.textVerticalAlign, + fill: U(x) ? x("category" === r.type ? y : "value" === r.type ? f + "" : f, l) : x + }) + }); + if (b.anid = "label_" + f, d) { + var w = BM.makeAxisEventDataBase(n); + w.targetType = "axisLabel", w.value = y, Ws(b).eventData = w + } + e.add(b), b.updateTransform(), c.push(b), t.add(b), b.decomposeTransform() + })), c + }(n, i, e, t); + (function (t, e, n) { + if (l_(t.axis)) return; + var i = t.get(["axisLabel", "showMinLabel"]), r = t.get(["axisLabel", "showMaxLabel"]); + n = n || []; + var o = (e = e || [])[0], a = e[1], s = e[e.length - 1], l = e[e.length - 2], u = n[0], h = n[1], + c = n[n.length - 1], p = n[n.length - 2]; + !1 === i ? (GM(o), GM(u)) : WM(o, a) && (i ? (GM(a), GM(h)) : (GM(o), GM(u))); + !1 === r ? (GM(s), GM(c)) : WM(l, s) && (r ? (GM(l), GM(p)) : (GM(s), GM(c))) + }(e, o, r), function (t, e, n, i) { + var r = n.axis, o = n.getModel("minorTick"); + if (!o.get("show") || r.scale.isBlank()) return; + var a = r.getMinorTicksCoords(); + if (!a.length) return; + for (var s = o.getModel("lineStyle"), l = i * o.get("length"), u = k(s.getLineStyle(), k(n.getModel("axisTick").getLineStyle(), {stroke: n.get(["axisLine", "lineStyle", "color"])})), h = 0; h < a.length; h++) for (var c = YM(a[h], e.transform, l, u, "minorticks_" + h), p = 0; p < c.length; p++) t.add(c[p]) + }(n, i, e, t.tickDirection), e.get(["axisLabel", "hideOverlap"])) && yb(db(z(o, (function (t) { + return {label: t, priority: t.z2, defaultAttr: {ignore: t.ignore}} + })))) + }, axisName: function (t, e, n, i) { + var r = it(t.axisName, e.get("name")); + if (r) { + var o, a, s = e.get("nameLocation"), l = t.nameDirection, u = e.getModel("nameTextStyle"), + h = e.get("nameGap") || 0, c = e.axis.getExtent(), p = c[0] > c[1] ? -1 : 1, + d = ["start" === s ? c[0] - p * h : "end" === s ? c[1] + p * h : (c[0] + c[1]) / 2, HM(s) ? t.labelOffset + l * h : 0], + f = e.get("nameRotate"); + null != f && (f = f * VM / 180), HM(s) ? o = BM.innerTextLayout(t.rotation, null != f ? f : t.rotation, l) : (o = function (t, e, n, i) { + var r, o, a = Ur(n - t), s = i[0] > i[1], l = "start" === e && !s || "start" !== e && s; + Xr(a - VM / 2) ? (o = l ? "bottom" : "top", r = "center") : Xr(a - 1.5 * VM) ? (o = l ? "top" : "bottom", r = "center") : (o = "middle", r = a < 1.5 * VM && a > VM / 2 ? l ? "left" : "right" : l ? "right" : "left"); + return {rotation: a, textAlign: r, textVerticalAlign: o} + }(t.rotation, s, f || 0, c), null != (a = t.axisNameAvailableWidth) && (a = Math.abs(a / Math.sin(o.rotation)), !isFinite(a) && (a = null))); + var g = u.getFont(), y = e.get("nameTruncate", !0) || {}, v = y.ellipsis, + m = it(t.nameTruncateMaxWidth, y.maxWidth, a), x = new As({ + x: d[0], + y: d[1], + rotation: o.rotation, + silent: BM.isLabelSilent(e), + style: Yh(u, { + text: r, + font: g, + overflow: "truncate", + width: m, + ellipsis: v, + fill: u.getTextColor() || e.get(["axisLine", "lineStyle", "color"]), + align: u.get("align") || o.textAlign, + verticalAlign: u.get("verticalAlign") || o.textVerticalAlign + }), + z2: 1 + }); + if (Nh({ + el: x, + componentModel: e, + itemName: r + }), x.__fullText = r, x.anid = "name", e.get("triggerEvent")) { + var _ = BM.makeAxisEventDataBase(e); + _.targetType = "axisName", _.name = r, Ws(x).eventData = _ + } + i.add(x), x.updateTransform(), n.add(x), x.decomposeTransform() + } + } + }; + + function GM(t) { + t && (t.ignore = !0) + } + + function WM(t, e) { + var n = t && t.getBoundingRect().clone(), i = e && e.getBoundingRect().clone(); + if (n && i) { + var r = Oi([]); + return zi(r, r, -t.rotation), n.applyTransform(Ni([], r, t.getLocalTransform())), i.applyTransform(Ni([], r, e.getLocalTransform())), n.intersect(i) + } + } + + function HM(t) { + return "middle" === t || "center" === t + } + + function YM(t, e, n, i, r) { + for (var o = [], a = [], s = [], l = 0; l < t.length; l++) { + var u = t[l].coord; + a[0] = u, a[1] = 0, s[0] = u, s[1] = n, e && (Ft(a, a, e), Ft(s, s, e)); + var h = new Eu({ + subPixelOptimize: !0, + shape: {x1: a[0], y1: a[1], x2: s[0], y2: s[1]}, + style: i, + z2: 2, + autoBatch: !0, + silent: !0 + }); + h.anid = r + "_" + t[l].tickValue, o.push(h) + } + return o + } + + function UM(t, e) { + var n = {axesInfo: {}, seriesInvolved: !1, coordSysAxesInfo: {}, coordSysMap: {}}; + return function (t, e, n) { + var i = e.getComponent("tooltip"), r = e.getComponent("axisPointer"), o = r.get("link", !0) || [], a = []; + E(n.getCoordinateSystems(), (function (n) { + if (n.axisPointerEnabled) { + var s = KM(n.model), l = t.coordSysAxesInfo[s] = {}; + t.coordSysMap[s] = n; + var u = n.model.getModel("tooltip", i); + if (E(n.getAxes(), H(d, !1, null)), n.getTooltipAxes && i && u.get("show")) { + var h = "axis" === u.get("trigger"), c = "cross" === u.get(["axisPointer", "type"]), + p = n.getTooltipAxes(u.get(["axisPointer", "axis"])); + (h || c) && E(p.baseAxes, H(d, !c || "cross", h)), c && E(p.otherAxes, H(d, "cross", !1)) + } + } + + function d(i, s, h) { + var c = h.model.getModel("axisPointer", r), p = c.get("show"); + if (p && ("auto" !== p || i || qM(c))) { + null == s && (s = c.get("triggerTooltip")); + var d = (c = i ? function (t, e, n, i, r, o) { + var a = e.getModel("axisPointer"), s = {}; + E(["type", "snap", "lineStyle", "shadowStyle", "label", "animation", "animationDurationUpdate", "animationEasingUpdate", "z"], (function (t) { + s[t] = T(a.get(t)) + })), s.snap = "category" !== t.type && !!o, "cross" === a.get("type") && (s.type = "line"); + var l = s.label || (s.label = {}); + if (null == l.show && (l.show = !1), "cross" === r) { + var u = a.get(["label", "show"]); + if (l.show = null == u || u, !o) { + var h = s.lineStyle = a.get("crossStyle"); + h && k(l, h.textStyle) + } + } + return t.model.getModel("axisPointer", new pc(s, n, i)) + }(h, u, r, e, i, s) : c).get("snap"), f = KM(h.model), g = s || d || "category" === h.type, + y = t.axesInfo[f] = { + key: f, + axis: h, + coordSys: n, + axisPointerModel: c, + triggerTooltip: s, + involveSeries: g, + snap: d, + useHandle: qM(c), + seriesModels: [], + linkGroup: null + }; + l[f] = y, t.seriesInvolved = t.seriesInvolved || g; + var v = function (t, e) { + for (var n = e.model, i = e.dim, r = 0; r < t.length; r++) { + var o = t[r] || {}; + if (XM(o[i + "AxisId"], n.id) || XM(o[i + "AxisIndex"], n.componentIndex) || XM(o[i + "AxisName"], n.name)) return r + } + }(o, h); + if (null != v) { + var m = a[v] || (a[v] = {axesInfo: {}}); + m.axesInfo[f] = y, m.mapper = o[v].mapper, y.linkGroup = m + } + } + } + })) + }(n, t, e), n.seriesInvolved && function (t, e) { + e.eachSeries((function (e) { + var n = e.coordinateSystem, i = e.get(["tooltip", "trigger"], !0), r = e.get(["tooltip", "show"], !0); + n && "none" !== i && !1 !== i && "item" !== i && !1 !== r && !1 !== e.get(["axisPointer", "show"], !0) && E(t.coordSysAxesInfo[KM(n.model)], (function (t) { + var i = t.axis; + n.getAxis(i.dim) === i && (t.seriesModels.push(e), null == t.seriesDataCount && (t.seriesDataCount = 0), t.seriesDataCount += e.getData().count()) + })) + })) + }(n, t), n + } + + function XM(t, e) { + return "all" === t || Y(t) && P(t, e) >= 0 || t === e + } + + function ZM(t) { + var e = jM(t); + if (e) { + var n = e.axisPointerModel, i = e.axis.scale, r = n.option, o = n.get("status"), a = n.get("value"); + null != a && (a = i.parse(a)); + var s = qM(n); + null == o && (r.status = s ? "show" : "hide"); + var l = i.getExtent().slice(); + l[0] > l[1] && l.reverse(), (null == a || a > l[1]) && (a = l[1]), a < l[0] && (a = l[0]), r.value = a, s && (r.status = e.axis.scale.isBlank() ? "hide" : "show") + } + } + + function jM(t) { + var e = (t.ecModel.getComponent("axisPointer") || {}).coordSysAxesInfo; + return e && e.axesInfo[KM(t)] + } + + function qM(t) { + return !!t.get(["handle", "show"]) + } + + function KM(t) { + return t.type + "||" + t.id + } + + var $M = {}, JM = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (e, n, i, r) { + this.axisPointerClass && ZM(e), t.prototype.render.apply(this, arguments), this._doUpdateAxisPointerClass(e, i, !0) + }, e.prototype.updateAxisPointer = function (t, e, n, i) { + this._doUpdateAxisPointerClass(t, n, !1) + }, e.prototype.remove = function (t, e) { + var n = this._axisPointer; + n && n.remove(e) + }, e.prototype.dispose = function (e, n) { + this._disposeAxisPointer(n), t.prototype.dispose.apply(this, arguments) + }, e.prototype._doUpdateAxisPointerClass = function (t, n, i) { + var r = e.getAxisPointerClass(this.axisPointerClass); + if (r) { + var o = function (t) { + var e = jM(t); + return e && e.axisPointerModel + }(t); + o ? (this._axisPointer || (this._axisPointer = new r)).render(t, o, n, i) : this._disposeAxisPointer(n) + } + }, e.prototype._disposeAxisPointer = function (t) { + this._axisPointer && this._axisPointer.dispose(t), this._axisPointer = null + }, e.registerAxisPointerClass = function (t, e) { + $M[t] = e + }, e.getAxisPointerClass = function (t) { + return t && $M[t] + }, e.type = "axis", e + }(fg), QM = So(); + + function tI(t, e, n, i) { + var r = n.axis; + if (!r.scale.isBlank()) { + var o = n.getModel("splitArea"), a = o.getModel("areaStyle"), s = a.get("color"), + l = i.coordinateSystem.getRect(), u = r.getTicksCoords({tickModel: o, clamp: !0}); + if (u.length) { + var h = s.length, c = QM(t).splitAreaColors, p = ft(), d = 0; + if (c) for (var f = 0; f < u.length; f++) { + var g = c.get(u[f].tickValue); + if (null != g) { + d = (g + (h - 1) * f) % h; + break + } + } + var y = r.toGlobalCoord(u[0].coord), v = a.getAreaStyle(); + s = Y(s) ? s : [s]; + for (f = 1; f < u.length; f++) { + var m = r.toGlobalCoord(u[f].coord), x = void 0, _ = void 0, b = void 0, w = void 0; + r.isHorizontal() ? (x = y, _ = l.y, b = m - x, w = l.height, y = x + b) : (x = l.x, _ = y, b = l.width, y = _ + (w = m - _)); + var S = u[f - 1].tickValue; + null != S && p.set(S, d), e.add(new Ts({ + anid: null != S ? "area_" + S : null, + shape: {x: x, y: _, width: b, height: w}, + style: k({fill: s[d]}, v), + autoBatch: !0, + silent: !0 + })), d = (d + 1) % h + } + QM(t).splitAreaColors = p + } + } + } + + function eI(t) { + QM(t).splitAreaColors = null + } + + var nI = ["axisLine", "axisTickLabel", "axisName"], iI = ["splitArea", "splitLine", "minorSplitLine"], + rI = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.axisPointerClass = "CartesianAxisPointer", n + } + + return n(e, t), e.prototype.render = function (e, n, i, r) { + this.group.removeAll(); + var o = this._axisGroup; + if (this._axisGroup = new Cr, this.group.add(this._axisGroup), e.get("show")) { + var a = e.getCoordSysModel(), s = AM(a, e), l = new BM(e, A({ + handleAutoShown: function (t) { + for (var n = a.coordinateSystem.getCartesians(), i = 0; i < n.length; i++) if (sx(n[i].getOtherAxis(e.axis).scale)) return !0; + return !1 + } + }, s)); + E(nI, l.add, l), this._axisGroup.add(l.getGroup()), E(iI, (function (t) { + e.get([t, "show"]) && oI[t](this, this._axisGroup, e, a) + }), this), r && "changeAxisOrder" === r.type && r.isInitSort || Dh(o, this._axisGroup, e), t.prototype.render.call(this, e, n, i, r) + } + }, e.prototype.remove = function () { + eI(this) + }, e.type = "cartesianAxis", e + }(JM), oI = { + splitLine: function (t, e, n, i) { + var r = n.axis; + if (!r.scale.isBlank()) { + var o = n.getModel("splitLine"), a = o.getModel("lineStyle"), s = a.get("color"); + s = Y(s) ? s : [s]; + for (var l = i.coordinateSystem.getRect(), u = r.isHorizontal(), h = 0, c = r.getTicksCoords({tickModel: o}), p = [], d = [], f = a.getLineStyle(), g = 0; g < c.length; g++) { + var y = r.toGlobalCoord(c[g].coord); + u ? (p[0] = y, p[1] = l.y, d[0] = y, d[1] = l.y + l.height) : (p[0] = l.x, p[1] = y, d[0] = l.x + l.width, d[1] = y); + var v = h++ % s.length, m = c[g].tickValue; + e.add(new Eu({ + anid: null != m ? "line_" + c[g].tickValue : null, + subPixelOptimize: !0, + autoBatch: !0, + shape: {x1: p[0], y1: p[1], x2: d[0], y2: d[1]}, + style: k({stroke: s[v]}, f), + silent: !0 + })) + } + } + }, minorSplitLine: function (t, e, n, i) { + var r = n.axis, o = n.getModel("minorSplitLine").getModel("lineStyle"), a = i.coordinateSystem.getRect(), + s = r.isHorizontal(), l = r.getMinorTicksCoords(); + if (l.length) for (var u = [], h = [], c = o.getLineStyle(), p = 0; p < l.length; p++) for (var d = 0; d < l[p].length; d++) { + var f = r.toGlobalCoord(l[p][d].coord); + s ? (u[0] = f, u[1] = a.y, h[0] = f, h[1] = a.y + a.height) : (u[0] = a.x, u[1] = f, h[0] = a.x + a.width, h[1] = f), e.add(new Eu({ + anid: "minor_line_" + l[p][d].tickValue, + subPixelOptimize: !0, + autoBatch: !0, + shape: {x1: u[0], y1: u[1], x2: h[0], y2: h[1]}, + style: c, + silent: !0 + })) + } + }, splitArea: function (t, e, n, i) { + tI(t, e, n, i) + } + }, aI = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "xAxis", e + }(rI), sI = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.type = aI.type, e + } + + return n(e, t), e.type = "yAxis", e + }(rI), lI = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.type = "grid", e + } + + return n(e, t), e.prototype.render = function (t, e) { + this.group.removeAll(), t.get("show") && this.group.add(new Ts({ + shape: t.coordinateSystem.getRect(), + style: k({fill: t.get("backgroundColor")}, t.getItemStyle()), + silent: !0, + z2: -1 + })) + }, e.type = "grid", e + }(fg), uI = {offset: 0}; + + function hI(t) { + t.registerComponentView(lI), t.registerComponentModel(gM), t.registerCoordinateSystem("cartesian2d", RM), wM(t, "x", yM, uI), wM(t, "y", yM, uI), t.registerComponentView(aI), t.registerComponentView(sI), t.registerPreprocessor((function (t) { + t.xAxis && t.yAxis && !t.grid && (t.grid = {}) + })) + } + + function cI(t) { + t.eachSeriesByType("radar", (function (t) { + var e = t.getData(), n = [], i = t.coordinateSystem; + if (i) { + var r = i.getIndicatorAxes(); + E(r, (function (t, o) { + e.each(e.mapDimension(r[o].dim), (function (t, e) { + n[e] = n[e] || []; + var r = i.dataToPoint(t, o); + n[e][o] = pI(r) ? r : dI(i) + })) + })), e.each((function (t) { + var r = F(n[t], (function (t) { + return pI(t) + })) || dI(i); + n[t].push(r.slice()), e.setItemLayout(t, n[t]) + })) + } + })) + } + + function pI(t) { + return !isNaN(t[0]) && !isNaN(t[1]) + } + + function dI(t) { + return [t.cx, t.cy] + } + + function fI(t) { + var e = t.polar; + if (e) { + Y(e) || (e = [e]); + var n = []; + E(e, (function (e, i) { + e.indicator ? (e.type && !e.shape && (e.shape = e.type), t.radar = t.radar || [], Y(t.radar) || (t.radar = [t.radar]), t.radar.push(e)) : n.push(e) + })), t.polar = n + } + E(t.series, (function (t) { + t && "radar" === t.type && t.polarIndex && (t.radarIndex = t.polarIndex) + })) + } + + var gI = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + var i = t.coordinateSystem, r = this.group, o = t.getData(), a = this._data; + + function s(t, e) { + var n = t.getItemVisual(e, "symbol") || "circle"; + if ("none" !== n) { + var i = Ly(t.getItemVisual(e, "symbolSize")), r = ky(n, -1, -1, 2, 2), + o = t.getItemVisual(e, "symbolRotate") || 0; + return r.attr({ + style: {strokeNoScale: !0}, + z2: 100, + scaleX: i[0] / 2, + scaleY: i[1] / 2, + rotation: o * Math.PI / 180 || 0 + }), r + } + } + + function l(e, n, i, r, o, a) { + i.removeAll(); + for (var l = 0; l < n.length - 1; l++) { + var u = s(r, o); + u && (u.__dimIdx = l, e[l] ? (u.setPosition(e[l]), Vh[a ? "initProps" : "updateProps"](u, { + x: n[l][0], + y: n[l][1] + }, t, o)) : u.setPosition(n[l]), i.add(u)) + } + } + + function u(t) { + return z(t, (function (t) { + return [i.cx, i.cy] + })) + } + + o.diff(a).add((function (e) { + var n = o.getItemLayout(e); + if (n) { + var i = new Lu, r = new Ou, a = {shape: {points: n}}; + i.shape.points = u(n), r.shape.points = u(n), rh(i, a, t, e), rh(r, a, t, e); + var s = new Cr, h = new Cr; + s.add(r), s.add(i), s.add(h), l(r.shape.points, n, h, o, e, !0), o.setItemGraphicEl(e, s) + } + })).update((function (e, n) { + var i = a.getItemGraphicEl(n), r = i.childAt(0), s = i.childAt(1), u = i.childAt(2), + h = {shape: {points: o.getItemLayout(e)}}; + h.shape.points && (l(r.shape.points, h.shape.points, u, o, e, !1), uh(s), uh(r), ih(r, h, t), ih(s, h, t), o.setItemGraphicEl(e, i)) + })).remove((function (t) { + r.remove(a.getItemGraphicEl(t)) + })).execute(), o.eachItemGraphicEl((function (t, e) { + var n = o.getItemModel(e), i = t.childAt(0), a = t.childAt(1), s = t.childAt(2), + l = o.getItemVisual(e, "style"), u = l.fill; + r.add(t), i.useStyle(k(n.getModel("lineStyle").getLineStyle(), { + fill: "none", + stroke: u + })), zl(i, n, "lineStyle"), zl(a, n, "areaStyle"); + var h = n.getModel("areaStyle"), c = h.isEmpty() && h.parentModel.isEmpty(); + a.ignore = c, E(["emphasis", "select", "blur"], (function (t) { + var e = n.getModel([t, "areaStyle"]), i = e.isEmpty() && e.parentModel.isEmpty(); + a.ensureState(t).ignore = i && c + })), a.useStyle(k(h.getAreaStyle(), {fill: u, opacity: .7, decal: l.decal})); + var p = n.getModel("emphasis"), d = p.getModel("itemStyle").getItemStyle(); + s.eachChild((function (t) { + if (t instanceof xs) { + var i = t.style; + t.useStyle(A({image: i.image, x: i.x, y: i.y, width: i.width, height: i.height}, l)) + } else t.useStyle(l), t.setColor(u), t.style.strokeNoScale = !0; + t.ensureState("emphasis").style = T(d); + var r = o.getStore().get(o.getDimensionIndex(t.__dimIdx), e); + (null == r || isNaN(r)) && (r = ""), Wh(t, Hh(n), { + labelFetcher: o.hostModel, + labelDataIndex: e, + labelDimIndex: t.__dimIdx, + defaultText: r, + inheritColor: u, + defaultOpacity: l.opacity + }) + })), Ol(t, p.get("focus"), p.get("blurScope"), p.get("disabled")) + })), this._data = o + }, e.prototype.remove = function () { + this.group.removeAll(), this._data = null + }, e.type = "radar", e + }(mg), yI = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.hasSymbolVisual = !0, n + } + + return n(e, t), e.prototype.init = function (e) { + t.prototype.init.apply(this, arguments), this.legendVisualProvider = new lM(W(this.getData, this), W(this.getRawData, this)) + }, e.prototype.getInitialData = function (t, e) { + return sM(this, {generateCoord: "indicator_", generateCoordCount: 1 / 0}) + }, e.prototype.formatTooltip = function (t, e, n) { + var i = this.getData(), r = this.coordinateSystem.getIndicatorAxes(), o = this.getData().getName(t), + a = "" === o ? this.name : o, s = tg(this, t); + return Uf("section", { + header: a, sortBlocks: !0, blocks: z(r, (function (e) { + var n = i.get(i.mapDimension(e.dim), t); + return Uf("nameValue", { + markerType: "subItem", + markerColor: s, + name: e.name, + value: n, + sortParam: n + }) + })) + }) + }, e.prototype.getTooltipPosition = function (t) { + if (null != t) for (var e = this.getData(), n = this.coordinateSystem, i = e.getValues(z(n.dimensions, (function (t) { + return e.mapDimension(t) + })), t), r = 0, o = i.length; r < o; r++) if (!isNaN(i[r])) { + var a = n.getIndicatorAxes(); + return n.coordToPoint(a[r].dataToCoord(i[r]), r) + } + }, e.type = "series.radar", e.dependencies = ["radar"], e.defaultOption = { + z: 2, + colorBy: "data", + coordinateSystem: "radar", + legendHoverLink: !0, + radarIndex: 0, + lineStyle: {width: 2, type: "solid", join: "round"}, + label: {position: "top"}, + symbolSize: 8 + }, e + }(ag), vI = _M.value; + + function mI(t, e) { + return k({show: e}, t) + } + + var xI = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.optionUpdated = function () { + var t = this.get("boundaryGap"), e = this.get("splitNumber"), n = this.get("scale"), + i = this.get("axisLine"), r = this.get("axisTick"), o = this.get("axisLabel"), a = this.get("axisName"), + s = this.get(["axisName", "show"]), l = this.get(["axisName", "formatter"]), + u = this.get("axisNameGap"), h = this.get("triggerEvent"), + c = z(this.get("indicator") || [], (function (c) { + null != c.max && c.max > 0 && !c.min ? c.min = 0 : null != c.min && c.min < 0 && !c.max && (c.max = 0); + var p = a; + null != c.color && (p = k({color: c.color}, a)); + var d = C(T(c), { + boundaryGap: t, + splitNumber: e, + scale: n, + axisLine: i, + axisTick: r, + axisLabel: o, + name: c.text, + showName: s, + nameLocation: "end", + nameGap: u, + nameTextStyle: p, + triggerEvent: h + }, !1); + if (s || (d.name = ""), X(l)) { + var f = d.name; + d.name = l.replace("{value}", null != f ? f : "") + } else U(l) && (d.name = l(d.name, d)); + var g = new pc(d, null, this.ecModel); + return R(g, h_.prototype), g.mainType = "radar", g.componentIndex = this.componentIndex, g + }), this); + this._indicatorModels = c + }, e.prototype.getIndicatorModels = function () { + return this._indicatorModels + }, e.type = "radar", e.defaultOption = { + z: 0, + center: ["50%", "50%"], + radius: "75%", + startAngle: 90, + axisName: {show: !0}, + boundaryGap: [0, 0], + splitNumber: 5, + axisNameGap: 15, + scale: !1, + shape: "polygon", + axisLine: C({lineStyle: {color: "#bbb"}}, vI.axisLine), + axisLabel: mI(vI.axisLabel, !1), + axisTick: mI(vI.axisTick, !1), + splitLine: mI(vI.splitLine, !0), + splitArea: mI(vI.splitArea, !0), + indicator: [] + }, e + }(Ip), _I = ["axisLine", "axisTickLabel", "axisName"], bI = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + this.group.removeAll(), this._buildAxes(t), this._buildSplitLineAndArea(t) + }, e.prototype._buildAxes = function (t) { + var e = t.coordinateSystem; + E(z(e.getIndicatorAxes(), (function (t) { + var n = t.model.get("showName") ? t.name : ""; + return new BM(t.model, { + axisName: n, + position: [e.cx, e.cy], + rotation: t.angle, + labelDirection: -1, + tickDirection: -1, + nameDirection: 1 + }) + })), (function (t) { + E(_I, t.add, t), this.group.add(t.getGroup()) + }), this) + }, e.prototype._buildSplitLineAndArea = function (t) { + var e = t.coordinateSystem, n = e.getIndicatorAxes(); + if (n.length) { + var i = t.get("shape"), r = t.getModel("splitLine"), o = t.getModel("splitArea"), + a = r.getModel("lineStyle"), s = o.getModel("areaStyle"), l = r.get("show"), u = o.get("show"), + h = a.get("color"), c = s.get("color"), p = Y(h) ? h : [h], d = Y(c) ? c : [c], f = [], g = []; + if ("circle" === i) for (var y = n[0].getTicksCoords(), v = e.cx, m = e.cy, x = 0; x < y.length; x++) { + if (l) f[C(f, p, x)].push(new uu({shape: {cx: v, cy: m, r: y[x].coord}})); + if (u && x < y.length - 1) g[C(g, d, x)].push(new Du({ + shape: { + cx: v, + cy: m, + r0: y[x].coord, + r: y[x + 1].coord + } + })) + } else { + var _, b = z(n, (function (t, n) { + var i = t.getTicksCoords(); + return _ = null == _ ? i.length - 1 : Math.min(i.length - 1, _), z(i, (function (t) { + return e.coordToPoint(t.coord, n) + })) + })), w = []; + for (x = 0; x <= _; x++) { + for (var S = [], M = 0; M < n.length; M++) S.push(b[M][x]); + if (S[0] && S.push(S[0].slice()), l) f[C(f, p, x)].push(new Ou({shape: {points: S}})); + if (u && w) g[C(g, d, x - 1)].push(new Lu({shape: {points: S.concat(w)}})); + w = S.slice().reverse() + } + } + var I = a.getLineStyle(), T = s.getAreaStyle(); + E(g, (function (t, e) { + this.group.add(bh(t, {style: k({stroke: "none", fill: d[e % d.length]}, T), silent: !0})) + }), this), E(f, (function (t, e) { + this.group.add(bh(t, {style: k({fill: "none", stroke: p[e % p.length]}, I), silent: !0})) + }), this) + } + + function C(t, e, n) { + var i = n % e.length; + return t[i] = t[i] || [], i + } + }, e.type = "radar", e + }(fg), wI = function (t) { + function e(e, n, i) { + var r = t.call(this, e, n, i) || this; + return r.type = "value", r.angle = 0, r.name = "", r + } + + return n(e, t), e + }(G_), SI = function () { + function t(t, e, n) { + this.dimensions = [], this._model = t, this._indicatorAxes = z(t.getIndicatorModels(), (function (t, e) { + var n = "indicator_" + e, i = new wI(n, new vx); + return i.name = t.get("name"), i.model = t, t.axis = i, this.dimensions.push(n), i + }), this), this.resize(t, n) + } + + return t.prototype.getIndicatorAxes = function () { + return this._indicatorAxes + }, t.prototype.dataToPoint = function (t, e) { + var n = this._indicatorAxes[e]; + return this.coordToPoint(n.dataToCoord(t), e) + }, t.prototype.coordToPoint = function (t, e) { + var n = this._indicatorAxes[e].angle; + return [this.cx + t * Math.cos(n), this.cy - t * Math.sin(n)] + }, t.prototype.pointToData = function (t) { + var e = t[0] - this.cx, n = t[1] - this.cy, i = Math.sqrt(e * e + n * n); + e /= i, n /= i; + for (var r, o = Math.atan2(-n, e), a = 1 / 0, s = -1, l = 0; l < this._indicatorAxes.length; l++) { + var u = this._indicatorAxes[l], h = Math.abs(o - u.angle); + h < a && (r = u, s = l, a = h) + } + return [s, +(r && r.coordToData(i))] + }, t.prototype.resize = function (t, e) { + var n = t.get("center"), i = e.getWidth(), r = e.getHeight(), o = Math.min(i, r) / 2; + this.cx = Er(n[0], i), this.cy = Er(n[1], r), this.startAngle = t.get("startAngle") * Math.PI / 180; + var a = t.get("radius"); + (X(a) || j(a)) && (a = [0, a]), this.r0 = Er(a[0], o), this.r = Er(a[1], o), E(this._indicatorAxes, (function (t, e) { + t.setExtent(this.r0, this.r); + var n = this.startAngle + e * Math.PI * 2 / this._indicatorAxes.length; + n = Math.atan2(Math.sin(n), Math.cos(n)), t.angle = n + }), this) + }, t.prototype.update = function (t, e) { + var n = this._indicatorAxes, i = this._model; + E(n, (function (t) { + t.scale.setExtent(1 / 0, -1 / 0) + })), t.eachSeriesByType("radar", (function (e, r) { + if ("radar" === e.get("coordinateSystem") && t.getComponent("radar", e.get("radarIndex")) === i) { + var o = e.getData(); + E(n, (function (t) { + t.scale.unionExtentFromData(o, o.mapDimension(t.dim)) + })) + } + }), this); + var r = i.get("splitNumber"), o = new vx; + o.setExtent(0, r), o.setInterval(1), E(n, (function (t, e) { + OM(t.scale, t.model, o) + })) + }, t.prototype.convertToPixel = function (t, e, n) { + return console.warn("Not implemented."), null + }, t.prototype.convertFromPixel = function (t, e, n) { + return console.warn("Not implemented."), null + }, t.prototype.containPoint = function (t) { + return console.warn("Not implemented."), !1 + }, t.create = function (e, n) { + var i = []; + return e.eachComponent("radar", (function (r) { + var o = new t(r, e, n); + i.push(o), r.coordinateSystem = o + })), e.eachSeriesByType("radar", (function (t) { + "radar" === t.get("coordinateSystem") && (t.coordinateSystem = i[t.get("radarIndex") || 0]) + })), i + }, t.dimensions = [], t + }(); + + function MI(t) { + t.registerCoordinateSystem("radar", SI), t.registerComponentModel(xI), t.registerComponentView(bI), t.registerVisual({ + seriesType: "radar", + reset: function (t) { + var e = t.getData(); + e.each((function (t) { + e.setItemVisual(t, "legendIcon", "roundRect") + })), e.setVisual("legendIcon", "roundRect") + } + }) + } + + var II = "\0_ec_interaction_mutex"; + + function TI(t, e) { + return !!CI(t)[e] + } + + function CI(t) { + return t[II] || (t[II] = {}) + } + + um({type: "takeGlobalCursor", event: "globalCursorTaken", update: "update"}, xt); + var DI = function (t) { + function e(e) { + var n = t.call(this) || this; + n._zr = e; + var i = W(n._mousedownHandler, n), r = W(n._mousemoveHandler, n), o = W(n._mouseupHandler, n), + a = W(n._mousewheelHandler, n), s = W(n._pinchHandler, n); + return n.enable = function (t, n) { + this.disable(), this._opt = k(T(n) || {}, { + zoomOnMouseWheel: !0, + moveOnMouseMove: !0, + moveOnMouseWheel: !1, + preventDefaultMouseMove: !0 + }), null == t && (t = !0), !0 !== t && "move" !== t && "pan" !== t || (e.on("mousedown", i), e.on("mousemove", r), e.on("mouseup", o)), !0 !== t && "scale" !== t && "zoom" !== t || (e.on("mousewheel", a), e.on("pinch", s)) + }, n.disable = function () { + e.off("mousedown", i), e.off("mousemove", r), e.off("mouseup", o), e.off("mousewheel", a), e.off("pinch", s) + }, n + } + + return n(e, t), e.prototype.isDragging = function () { + return this._dragging + }, e.prototype.isPinching = function () { + return this._pinching + }, e.prototype.setPointerChecker = function (t) { + this.pointerChecker = t + }, e.prototype.dispose = function () { + this.disable() + }, e.prototype._mousedownHandler = function (t) { + if (!(le(t) || t.target && t.target.draggable)) { + var e = t.offsetX, n = t.offsetY; + this.pointerChecker && this.pointerChecker(t, e, n) && (this._x = e, this._y = n, this._dragging = !0) + } + }, e.prototype._mousemoveHandler = function (t) { + if (this._dragging && LI("moveOnMouseMove", t, this._opt) && "pinch" !== t.gestureEvent && !TI(this._zr, "globalPan")) { + var e = t.offsetX, n = t.offsetY, i = this._x, r = this._y, o = e - i, a = n - r; + this._x = e, this._y = n, this._opt.preventDefaultMouseMove && se(t.event), kI(this, "pan", "moveOnMouseMove", t, { + dx: o, + dy: a, + oldX: i, + oldY: r, + newX: e, + newY: n, + isAvailableBehavior: null + }) + } + }, e.prototype._mouseupHandler = function (t) { + le(t) || (this._dragging = !1) + }, e.prototype._mousewheelHandler = function (t) { + var e = LI("zoomOnMouseWheel", t, this._opt), n = LI("moveOnMouseWheel", t, this._opt), i = t.wheelDelta, + r = Math.abs(i), o = t.offsetX, a = t.offsetY; + if (0 !== i && (e || n)) { + if (e) { + var s = r > 3 ? 1.4 : r > 1 ? 1.2 : 1.1; + AI(this, "zoom", "zoomOnMouseWheel", t, { + scale: i > 0 ? s : 1 / s, + originX: o, + originY: a, + isAvailableBehavior: null + }) + } + if (n) { + var l = Math.abs(i); + AI(this, "scrollMove", "moveOnMouseWheel", t, { + scrollDelta: (i > 0 ? 1 : -1) * (l > 3 ? .4 : l > 1 ? .15 : .05), + originX: o, + originY: a, + isAvailableBehavior: null + }) + } + } + }, e.prototype._pinchHandler = function (t) { + TI(this._zr, "globalPan") || AI(this, "zoom", null, t, { + scale: t.pinchScale > 1 ? 1.1 : 1 / 1.1, + originX: t.pinchX, + originY: t.pinchY, + isAvailableBehavior: null + }) + }, e + }(Xt); + + function AI(t, e, n, i, r) { + t.pointerChecker && t.pointerChecker(i, r.originX, r.originY) && (se(i.event), kI(t, e, n, i, r)) + } + + function kI(t, e, n, i, r) { + r.isAvailableBehavior = W(LI, null, n, i), t.trigger(e, r) + } + + function LI(t, e, n) { + var i = n[t]; + return !t || i && (!X(i) || e.event[i + "Key"]) + } + + function PI(t, e, n) { + var i = t.target; + i.x += e, i.y += n, i.dirty() + } + + function OI(t, e, n, i) { + var r = t.target, o = t.zoomLimit, a = t.zoom = t.zoom || 1; + if (a *= e, o) { + var s = o.min || 0, l = o.max || 1 / 0; + a = Math.max(Math.min(l, a), s) + } + var u = a / t.zoom; + t.zoom = a, r.x -= (n - r.x) * (u - 1), r.y -= (i - r.y) * (u - 1), r.scaleX *= u, r.scaleY *= u, r.dirty() + } + + var RI, NI = {axisPointer: 1, tooltip: 1, brush: 1}; + + function EI(t, e, n) { + var i = e.getComponentByElement(t.topTarget), r = i && i.coordinateSystem; + return i && i !== n && !NI.hasOwnProperty(i.mainType) && r && r.model !== n + } + + function zI(t) { + X(t) && (t = (new DOMParser).parseFromString(t, "text/xml")); + var e = t; + for (9 === e.nodeType && (e = e.firstChild); "svg" !== e.nodeName.toLowerCase() || 1 !== e.nodeType;) e = e.nextSibling; + return e + } + + var VI = { + fill: "fill", + stroke: "stroke", + "stroke-width": "lineWidth", + opacity: "opacity", + "fill-opacity": "fillOpacity", + "stroke-opacity": "strokeOpacity", + "stroke-dasharray": "lineDash", + "stroke-dashoffset": "lineDashOffset", + "stroke-linecap": "lineCap", + "stroke-linejoin": "lineJoin", + "stroke-miterlimit": "miterLimit", + "font-family": "fontFamily", + "font-size": "fontSize", + "font-style": "fontStyle", + "font-weight": "fontWeight", + "text-anchor": "textAlign", + visibility: "visibility", + display: "display" + }, BI = G(VI), FI = {"alignment-baseline": "textBaseline", "stop-color": "stopColor"}, GI = G(FI), + WI = function () { + function t() { + this._defs = {}, this._root = null + } + + return t.prototype.parse = function (t, e) { + e = e || {}; + var n = zI(t); + this._defsUsePending = []; + var i = new Cr; + this._root = i; + var r = [], o = n.getAttribute("viewBox") || "", a = parseFloat(n.getAttribute("width") || e.width), + s = parseFloat(n.getAttribute("height") || e.height); + isNaN(a) && (a = null), isNaN(s) && (s = null), jI(n, i, null, !0, !1); + for (var l, u, h = n.firstChild; h;) this._parseNode(h, i, r, null, !1, !1), h = h.nextSibling; + if (function (t, e) { + for (var n = 0; n < e.length; n++) { + var i = e[n]; + i[0].style[i[1]] = t[i[2]] + } + }(this._defs, this._defsUsePending), this._defsUsePending = [], o) { + var c = JI(o); + c.length >= 4 && (l = { + x: parseFloat(c[0] || 0), + y: parseFloat(c[1] || 0), + width: parseFloat(c[2]), + height: parseFloat(c[3]) + }) + } + if (l && null != a && null != s && (u = iT(l, {x: 0, y: 0, width: a, height: s}), !e.ignoreViewBox)) { + var p = i; + (i = new Cr).add(p), p.scaleX = p.scaleY = u.scale, p.x = u.x, p.y = u.y + } + return e.ignoreRootClip || null == a || null == s || i.setClipPath(new Ts({ + shape: { + x: 0, + y: 0, + width: a, + height: s + } + })), {root: i, width: a, height: s, viewBoxRect: l, viewBoxTransform: u, named: r} + }, t.prototype._parseNode = function (t, e, n, i, r, o) { + var a, s = t.nodeName.toLowerCase(), l = i; + if ("defs" === s && (r = !0), "text" === s && (o = !0), "defs" === s || "switch" === s) a = e; else { + if (!r) { + var u = RI[s]; + if (u && mt(RI, s)) { + a = u.call(this, t, e); + var h = t.getAttribute("name"); + if (h) { + var c = {name: h, namedFrom: null, svgNodeTagLower: s, el: a}; + n.push(c), "g" === s && (l = c) + } else i && n.push({name: i.name, namedFrom: i, svgNodeTagLower: s, el: a}); + e.add(a) + } + } + var p = HI[s]; + if (p && mt(HI, s)) { + var d = p.call(this, t), f = t.getAttribute("id"); + f && (this._defs[f] = d) + } + } + if (a && a.isGroup) for (var g = t.firstChild; g;) 1 === g.nodeType ? this._parseNode(g, a, n, l, r, o) : 3 === g.nodeType && o && this._parseText(g, a), g = g.nextSibling + }, t.prototype._parseText = function (t, e) { + var n = new ys({style: {text: t.textContent}, silent: !0, x: this._textX || 0, y: this._textY || 0}); + XI(e, n), jI(t, n, this._defsUsePending, !1, !1), function (t, e) { + var n = e.__selfStyle; + if (n) { + var i = n.textBaseline, r = i; + i && "auto" !== i ? "baseline" === i ? r = "alphabetic" : "before-edge" === i || "text-before-edge" === i ? r = "top" : "after-edge" === i || "text-after-edge" === i ? r = "bottom" : "central" !== i && "mathematical" !== i || (r = "middle") : r = "alphabetic", t.style.textBaseline = r + } + var o = e.__inheritedStyle; + if (o) { + var a = o.textAlign, s = a; + a && ("middle" === a && (s = "center"), t.style.textAlign = s) + } + }(n, e); + var i = n.style, r = i.fontSize; + r && r < 9 && (i.fontSize = 9, n.scaleX *= r / 9, n.scaleY *= r / 9); + var o = (i.fontSize || i.fontFamily) && [i.fontStyle, i.fontWeight, (i.fontSize || 12) + "px", i.fontFamily || "sans-serif"].join(" "); + i.font = o; + var a = n.getBoundingRect(); + return this._textX += a.width, e.add(n), n + }, t.internalField = void (RI = { + g: function (t, e) { + var n = new Cr; + return XI(e, n), jI(t, n, this._defsUsePending, !1, !1), n + }, rect: function (t, e) { + var n = new Ts; + return XI(e, n), jI(t, n, this._defsUsePending, !1, !1), n.setShape({ + x: parseFloat(t.getAttribute("x") || "0"), + y: parseFloat(t.getAttribute("y") || "0"), + width: parseFloat(t.getAttribute("width") || "0"), + height: parseFloat(t.getAttribute("height") || "0") + }), n.silent = !0, n + }, circle: function (t, e) { + var n = new uu; + return XI(e, n), jI(t, n, this._defsUsePending, !1, !1), n.setShape({ + cx: parseFloat(t.getAttribute("cx") || "0"), + cy: parseFloat(t.getAttribute("cy") || "0"), + r: parseFloat(t.getAttribute("r") || "0") + }), n.silent = !0, n + }, line: function (t, e) { + var n = new Eu; + return XI(e, n), jI(t, n, this._defsUsePending, !1, !1), n.setShape({ + x1: parseFloat(t.getAttribute("x1") || "0"), + y1: parseFloat(t.getAttribute("y1") || "0"), + x2: parseFloat(t.getAttribute("x2") || "0"), + y2: parseFloat(t.getAttribute("y2") || "0") + }), n.silent = !0, n + }, ellipse: function (t, e) { + var n = new cu; + return XI(e, n), jI(t, n, this._defsUsePending, !1, !1), n.setShape({ + cx: parseFloat(t.getAttribute("cx") || "0"), + cy: parseFloat(t.getAttribute("cy") || "0"), + rx: parseFloat(t.getAttribute("rx") || "0"), + ry: parseFloat(t.getAttribute("ry") || "0") + }), n.silent = !0, n + }, polygon: function (t, e) { + var n, i = t.getAttribute("points"); + i && (n = ZI(i)); + var r = new Lu({shape: {points: n || []}, silent: !0}); + return XI(e, r), jI(t, r, this._defsUsePending, !1, !1), r + }, polyline: function (t, e) { + var n, i = t.getAttribute("points"); + i && (n = ZI(i)); + var r = new Ou({shape: {points: n || []}, silent: !0}); + return XI(e, r), jI(t, r, this._defsUsePending, !1, !1), r + }, image: function (t, e) { + var n = new xs; + return XI(e, n), jI(t, n, this._defsUsePending, !1, !1), n.setStyle({ + image: t.getAttribute("xlink:href") || t.getAttribute("href"), + x: +t.getAttribute("x"), + y: +t.getAttribute("y"), + width: +t.getAttribute("width"), + height: +t.getAttribute("height") + }), n.silent = !0, n + }, text: function (t, e) { + var n = t.getAttribute("x") || "0", i = t.getAttribute("y") || "0", r = t.getAttribute("dx") || "0", + o = t.getAttribute("dy") || "0"; + this._textX = parseFloat(n) + parseFloat(r), this._textY = parseFloat(i) + parseFloat(o); + var a = new Cr; + return XI(e, a), jI(t, a, this._defsUsePending, !1, !0), a + }, tspan: function (t, e) { + var n = t.getAttribute("x"), i = t.getAttribute("y"); + null != n && (this._textX = parseFloat(n)), null != i && (this._textY = parseFloat(i)); + var r = t.getAttribute("dx") || "0", o = t.getAttribute("dy") || "0", a = new Cr; + return XI(e, a), jI(t, a, this._defsUsePending, !1, !0), this._textX += parseFloat(r), this._textY += parseFloat(o), a + }, path: function (t, e) { + var n = au(t.getAttribute("d") || ""); + return XI(e, n), jI(t, n, this._defsUsePending, !1, !1), n.silent = !0, n + } + }), t + }(), HI = { + lineargradient: function (t) { + var e = parseInt(t.getAttribute("x1") || "0", 10), n = parseInt(t.getAttribute("y1") || "0", 10), + i = parseInt(t.getAttribute("x2") || "10", 10), r = parseInt(t.getAttribute("y2") || "0", 10), + o = new Uu(e, n, i, r); + return YI(t, o), UI(t, o), o + }, radialgradient: function (t) { + var e = parseInt(t.getAttribute("cx") || "0", 10), n = parseInt(t.getAttribute("cy") || "0", 10), + i = parseInt(t.getAttribute("r") || "0", 10), r = new Xu(e, n, i); + return YI(t, r), UI(t, r), r + } + }; + + function YI(t, e) { + "userSpaceOnUse" === t.getAttribute("gradientUnits") && (e.global = !0) + } + + function UI(t, e) { + for (var n = t.firstChild; n;) { + if (1 === n.nodeType && "stop" === n.nodeName.toLocaleLowerCase()) { + var i = n.getAttribute("offset"), r = void 0; + r = i && i.indexOf("%") > 0 ? parseInt(i, 10) / 100 : i ? parseFloat(i) : 0; + var o = {}; + nT(n, o, o); + var a = o.stopColor || n.getAttribute("stop-color") || "#000000"; + e.colorStops.push({offset: r, color: a}) + } + n = n.nextSibling + } + } + + function XI(t, e) { + t && t.__inheritedStyle && (e.__inheritedStyle || (e.__inheritedStyle = {}), k(e.__inheritedStyle, t.__inheritedStyle)) + } + + function ZI(t) { + for (var e = JI(t), n = [], i = 0; i < e.length; i += 2) { + var r = parseFloat(e[i]), o = parseFloat(e[i + 1]); + n.push([r, o]) + } + return n + } + + function jI(t, e, n, i, r) { + var o = e, a = o.__inheritedStyle = o.__inheritedStyle || {}, s = {}; + 1 === t.nodeType && (function (t, e) { + var n = t.getAttribute("transform"); + if (n) { + n = n.replace(/,/g, " "); + var i = [], r = null; + n.replace(QI, (function (t, e, n) { + return i.push(e, n), "" + })); + for (var o = i.length - 1; o > 0; o -= 2) { + var a = i[o], s = i[o - 1], l = JI(a); + switch (r = r || [1, 0, 0, 1, 0, 0], s) { + case"translate": + Ei(r, r, [parseFloat(l[0]), parseFloat(l[1] || "0")]); + break; + case"scale": + Vi(r, r, [parseFloat(l[0]), parseFloat(l[1] || l[0])]); + break; + case"rotate": + zi(r, r, -parseFloat(l[0]) * tT); + break; + case"skewX": + Ni(r, [1, 0, Math.tan(parseFloat(l[0]) * tT), 1, 0, 0], r); + break; + case"skewY": + Ni(r, [1, Math.tan(parseFloat(l[0]) * tT), 0, 1, 0, 0], r); + break; + case"matrix": + r[0] = parseFloat(l[0]), r[1] = parseFloat(l[1]), r[2] = parseFloat(l[2]), r[3] = parseFloat(l[3]), r[4] = parseFloat(l[4]), r[5] = parseFloat(l[5]) + } + } + e.setLocalTransform(r) + } + }(t, e), nT(t, a, s), i || function (t, e, n) { + for (var i = 0; i < BI.length; i++) { + var r = BI[i]; + null != (o = t.getAttribute(r)) && (e[VI[r]] = o) + } + for (i = 0; i < GI.length; i++) { + var o; + r = GI[i]; + null != (o = t.getAttribute(r)) && (n[FI[r]] = o) + } + }(t, a, s)), o.style = o.style || {}, null != a.fill && (o.style.fill = KI(o, "fill", a.fill, n)), null != a.stroke && (o.style.stroke = KI(o, "stroke", a.stroke, n)), E(["lineWidth", "opacity", "fillOpacity", "strokeOpacity", "miterLimit", "fontSize"], (function (t) { + null != a[t] && (o.style[t] = parseFloat(a[t])) + })), E(["lineDashOffset", "lineCap", "lineJoin", "fontWeight", "fontFamily", "fontStyle", "textAlign"], (function (t) { + null != a[t] && (o.style[t] = a[t]) + })), r && (o.__selfStyle = s), a.lineDash && (o.style.lineDash = z(JI(a.lineDash), (function (t) { + return parseFloat(t) + }))), "hidden" !== a.visibility && "collapse" !== a.visibility || (o.invisible = !0), "none" === a.display && (o.ignore = !0) + } + + var qI = /^url\(\s*#(.*?)\)/; + + function KI(t, e, n, i) { + var r = n && n.match(qI); + if (!r) return "none" === n && (n = null), n; + var o = ut(r[1]); + i.push([t, e, o]) + } + + var $I = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g; + + function JI(t) { + return t.match($I) || [] + } + + var QI = /(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.eE,]*)\)/g, tT = Math.PI / 180; + var eT = /([^\s:;]+)\s*:\s*([^:;]+)/g; + + function nT(t, e, n) { + var i, r = t.getAttribute("style"); + if (r) for (eT.lastIndex = 0; null != (i = eT.exec(r));) { + var o = i[1], a = mt(VI, o) ? VI[o] : null; + a && (e[a] = i[2]); + var s = mt(FI, o) ? FI[o] : null; + s && (n[s] = i[2]) + } + } + + function iT(t, e) { + var n = e.width / t.width, i = e.height / t.height, r = Math.min(n, i); + return { + scale: r, + x: -(t.x + t.width / 2) * r + (e.x + e.width / 2), + y: -(t.y + t.height / 2) * r + (e.y + e.height / 2) + } + } + + var rT = ft(["rect", "circle", "line", "ellipse", "polygon", "polyline", "path", "text", "tspan", "g"]), + oT = function () { + function t(t, e) { + this.type = "geoSVG", this._usedGraphicMap = ft(), this._freedGraphics = [], this._mapName = t, this._parsedXML = zI(e) + } + + return t.prototype.load = function () { + var t = this._firstGraphic; + if (!t) { + t = this._firstGraphic = this._buildGraphic(this._parsedXML), this._freedGraphics.push(t), this._boundingRect = this._firstGraphic.boundingRect.clone(); + var e = function (t) { + var e = [], n = ft(); + return E(t, (function (t) { + if (null == t.namedFrom) { + var i = new w_(t.name, t.el); + e.push(i), n.set(t.name, i) + } + })), {regions: e, regionsMap: n} + }(t.named), n = e.regions, i = e.regionsMap; + this._regions = n, this._regionsMap = i + } + return {boundingRect: this._boundingRect, regions: this._regions, regionsMap: this._regionsMap} + }, t.prototype._buildGraphic = function (t) { + var e, n, i, r; + try { + lt(null != (n = (e = t && (i = t, r = { + ignoreViewBox: !0, + ignoreRootClip: !0 + }, (new WI).parse(i, r)) || {}).root)) + } catch (t) { + throw new Error("Invalid svg format\n" + t.message) + } + var o = new Cr; + o.add(n), o.isGeoSVGGraphicRoot = !0; + var a = e.width, s = e.height, l = e.viewBoxRect, u = this._boundingRect; + if (!u) { + var h = void 0, c = void 0, p = void 0, d = void 0; + if (null != a ? (h = 0, p = a) : l && (h = l.x, p = l.width), null != s ? (c = 0, d = s) : l && (c = l.y, d = l.height), null == h || null == c) { + var f = n.getBoundingRect(); + null == h && (h = f.x, p = f.width), null == c && (c = f.y, d = f.height) + } + u = this._boundingRect = new sr(h, c, p, d) + } + if (l) { + var g = iT(l, u); + n.scaleX = n.scaleY = g.scale, n.x = g.x, n.y = g.y + } + o.setClipPath(new Ts({shape: u.plain()})); + var y = []; + return E(e.named, (function (t) { + var e; + null != rT.get(t.svgNodeTagLower) && (y.push(t), (e = t.el).silent = !1, e.isGroup && e.traverse((function (t) { + t.silent = !1 + }))) + })), {root: o, boundingRect: u, named: y} + }, t.prototype.useGraphic = function (t) { + var e = this._usedGraphicMap, n = e.get(t); + return n || (n = this._freedGraphics.pop() || this._buildGraphic(this._parsedXML), e.set(t, n), n) + }, t.prototype.freeGraphic = function (t) { + var e = this._usedGraphicMap, n = e.get(t); + n && (e.removeKey(t), this._freedGraphics.push(n)) + }, t + }(); + for (var aT = [126, 25], sT = "南海诸岛", lT = [[[0, 3.5], [7, 11.2], [15, 11.9], [30, 7], [42, .7], [52, .7], [56, 7.7], [59, .7], [64, .7], [64, 0], [5, 0], [0, 3.5]], [[13, 16.1], [19, 14.7], [16, 21.7], [11, 23.1], [13, 16.1]], [[12, 32.2], [14, 38.5], [15, 38.5], [13, 32.2], [12, 32.2]], [[16, 47.6], [12, 53.2], [13, 53.2], [18, 47.6], [16, 47.6]], [[6, 64.4], [8, 70], [9, 70], [8, 64.4], [6, 64.4]], [[23, 82.6], [29, 79.8], [30, 79.8], [25, 82.6], [23, 82.6]], [[37, 70.7], [43, 62.3], [44, 62.3], [39, 70.7], [37, 70.7]], [[48, 51.1], [51, 45.5], [53, 45.5], [50, 51.1], [48, 51.1]], [[51, 35], [51, 28.7], [53, 28.7], [53, 35], [51, 35]], [[52, 22.4], [55, 17.5], [56, 17.5], [53, 22.4], [52, 22.4]], [[58, 12.6], [62, 7], [63, 7], [60, 12.6], [58, 12.6]], [[0, 3.5], [0, 93.1], [64, 93.1], [64, 0], [63, 0], [63, 92.4], [1, 92.4], [1, 3.5], [0, 3.5]]], uT = 0; uT < lT.length; uT++) for (var hT = 0; hT < lT[uT].length; hT++) lT[uT][hT][0] /= 10.5, lT[uT][hT][1] /= -14, lT[uT][hT][0] += aT[0], lT[uT][hT][1] += aT[1]; + var cT = {"南海诸岛": [32, 80], "广东": [0, -10], "香港": [10, 5], "澳门": [-10, 10], "天津": [5, 5]}; + var pT = [[[123.45165252685547, 25.73527164402261], [123.49731445312499, 25.73527164402261], [123.49731445312499, 25.750734064600884], [123.45165252685547, 25.750734064600884], [123.45165252685547, 25.73527164402261]]]; + var dT = function () { + function t(t, e, n) { + var i; + this.type = "geoJSON", this._parsedMap = ft(), this._mapName = t, this._specialAreas = n, this._geoJSON = X(i = e) ? "undefined" != typeof JSON && JSON.parse ? JSON.parse(i) : new Function("return (" + i + ");")() : i + } + + return t.prototype.load = function (t, e) { + e = e || "name"; + var n = this._parsedMap.get(e); + if (!n) { + var i = this._parseToRegions(e); + n = this._parsedMap.set(e, {regions: i, boundingRect: fT(i)}) + } + var r = ft(), o = []; + return E(n.regions, (function (e) { + var n = e.name; + t && mt(t, n) && (e = e.cloneShallow(n = t[n])), o.push(e), r.set(n, e) + })), {regions: o, boundingRect: n.boundingRect || new sr(0, 0, 0, 0), regionsMap: r} + }, t.prototype._parseToRegions = function (t) { + var e, n = this._mapName, i = this._geoJSON; + try { + e = i ? I_(i, t) : [] + } catch (t) { + throw new Error("Invalid geoJson format\n" + t.message) + } + return function (t, e) { + if ("china" === t) { + for (var n = 0; n < e.length; n++) if (e[n].name === sT) return; + e.push(new b_(sT, z(lT, (function (t) { + return {type: "polygon", exterior: t} + })), aT)) + } + }(n, e), E(e, (function (t) { + var e = t.name; + !function (t, e) { + if ("china" === t) { + var n = cT[e.name]; + if (n) { + var i = e.getCenter(); + i[0] += n[0] / 10.5, i[1] += -n[1] / 14, e.setCenter(i) + } + } + }(n, t), function (t, e) { + "china" === t && "台湾" === e.name && e.geometries.push({type: "polygon", exterior: pT[0]}) + }(n, t); + var i = this._specialAreas && this._specialAreas[e]; + i && t.transformTo(i.left, i.top, i.width, i.height) + }), this), e + }, t.prototype.getMapForUser = function () { + return {geoJson: this._geoJSON, geoJSON: this._geoJSON, specialAreas: this._specialAreas} + }, t + }(); + + function fT(t) { + for (var e, n = 0; n < t.length; n++) { + var i = t[n].getBoundingRect(); + (e = e || i.clone()).union(i) + } + return e + } + + var gT = ft(), yT = function (t, e, n) { + if (e.svg) { + var i = new oT(t, e.svg); + gT.set(t, i) + } else { + var r = e.geoJson || e.geoJSON; + r && !e.features ? n = e.specialAreas : r = e; + i = new dT(t, r, n); + gT.set(t, i) + } + }, vT = function (t) { + return gT.get(t) + }, mT = function (t) { + var e = gT.get(t); + return e && "geoJSON" === e.type && e.getMapForUser() + }, xT = function (t, e, n) { + var i = gT.get(t); + if (i) return i.load(e, n) + }, _T = ["rect", "circle", "line", "ellipse", "polygon", "polyline", "path"], bT = ft(_T), + wT = ft(_T.concat(["g"])), ST = ft(_T.concat(["g"])), MT = So(); + + function IT(t) { + var e = t.getItemStyle(), n = t.get("areaColor"); + return null != n && (e.fill = n), e + } + + function TT(t) { + var e = t.style; + e && (e.stroke = e.stroke || e.fill, e.fill = null) + } + + var CT = function () { + function t(t) { + var e = new Cr; + this.uid = fc("ec_map_draw"), this._controller = new DI(t.getZr()), this._controllerHost = {target: e}, this.group = e, e.add(this._regionsGroup = new Cr), e.add(this._svgGroup = new Cr) + } + + return t.prototype.draw = function (t, e, n, i, r) { + var o = "geo" === t.mainType, a = t.getData && t.getData(); + o && e.eachComponent({mainType: "series", subType: "map"}, (function (e) { + a || e.getHostGeoModel() !== t || (a = e.getData()) + })); + var s = t.coordinateSystem, l = this._regionsGroup, u = this.group, h = s.getTransformInfo(), c = h.raw, + p = h.roam; + !l.childAt(0) || r ? (u.x = p.x, u.y = p.y, u.scaleX = p.scaleX, u.scaleY = p.scaleY, u.dirty()) : ih(u, p, t); + var d = a && a.getVisual("visualMeta") && a.getVisual("visualMeta").length > 0, f = { + api: n, + geo: s, + mapOrGeoModel: t, + data: a, + isVisualEncodedByVisualMap: d, + isGeo: o, + transformInfoRaw: c + }; + "geoJSON" === s.resourceType ? this._buildGeoJSON(f) : "geoSVG" === s.resourceType && this._buildSVG(f), this._updateController(t, e, n), this._updateMapSelectHandler(t, l, n, i) + }, t.prototype._buildGeoJSON = function (t) { + var e = this._regionsGroupByName = ft(), n = ft(), i = this._regionsGroup, r = t.transformInfoRaw, + o = t.mapOrGeoModel, a = t.data, s = t.geo.projection, l = s && s.stream; + + function u(t, e) { + return e && (t = e(t)), t && [t[0] * r.scaleX + r.x, t[1] * r.scaleY + r.y] + } + + function h(t) { + for (var e = [], n = !l && s && s.project, i = 0; i < t.length; ++i) { + var r = u(t[i], n); + r && e.push(r) + } + return e + } + + function c(t) { + return {shape: {points: h(t)}} + } + + i.removeAll(), E(t.geo.regions, (function (r) { + var h = r.name, p = e.get(h), d = n.get(h) || {}, f = d.dataIdx, g = d.regionModel; + p || (p = e.set(h, new Cr), i.add(p), f = a ? a.indexOfName(h) : null, g = t.isGeo ? o.getRegionModel(h) : a ? a.getItemModel(f) : null, n.set(h, { + dataIdx: f, + regionModel: g + })); + var y = [], v = []; + E(r.geometries, (function (t) { + if ("polygon" === t.type) { + var e = [t.exterior].concat(t.interiors || []); + l && (e = OT(e, l)), E(e, (function (t) { + y.push(new Lu(c(t))) + })) + } else { + var n = t.points; + l && (n = OT(n, l, !0)), E(n, (function (t) { + v.push(new Ou(c(t))) + })) + } + })); + var m = u(r.getCenter(), s && s.project); + + function x(e, n) { + if (e.length) { + var i = new Hu({culling: !0, segmentIgnoreThreshold: 1, shape: {paths: e}}); + p.add(i), DT(t, i, f, g), AT(t, i, h, g, o, f, m), n && (TT(i), E(i.states, TT)) + } + } + + x(y), x(v, !0) + })), e.each((function (e, i) { + var r = n.get(i), a = r.dataIdx, s = r.regionModel; + kT(t, e, i, s, o, a), LT(t, e, i, s, o), PT(t, e, i, s, o) + }), this) + }, t.prototype._buildSVG = function (t) { + var e = t.geo.map, n = t.transformInfoRaw; + this._svgGroup.x = n.x, this._svgGroup.y = n.y, this._svgGroup.scaleX = n.scaleX, this._svgGroup.scaleY = n.scaleY, this._svgResourceChanged(e) && (this._freeSVG(), this._useSVG(e)); + var i = this._svgDispatcherMap = ft(), r = !1; + E(this._svgGraphicRecord.named, (function (e) { + var n = e.name, o = t.mapOrGeoModel, a = t.data, s = e.svgNodeTagLower, l = e.el, + u = a ? a.indexOfName(n) : null, h = o.getRegionModel(n); + (null != bT.get(s) && l instanceof da && DT(t, l, u, h), l instanceof da && (l.culling = !0), l.z2EmphasisLift = 0, e.namedFrom) || (null != ST.get(s) && AT(t, l, n, h, o, u, null), kT(t, l, n, h, o, u), LT(t, l, n, h, o), null != wT.get(s) && ("self" === PT(t, l, n, h, o) && (r = !0), (i.get(n) || i.set(n, [])).push(l))) + }), this), this._enableBlurEntireSVG(r, t) + }, t.prototype._enableBlurEntireSVG = function (t, e) { + if (t && e.isGeo) { + var n = e.mapOrGeoModel.getModel(["blur", "itemStyle"]).getItemStyle().opacity; + this._svgGraphicRecord.root.traverse((function (t) { + if (!t.isGroup) { + yl(t); + var e = t.ensureState("blur").style || {}; + null == e.opacity && null != n && (e.opacity = n), t.ensureState("emphasis") + } + })) + } + }, t.prototype.remove = function () { + this._regionsGroup.removeAll(), this._regionsGroupByName = null, this._svgGroup.removeAll(), this._freeSVG(), this._controller.dispose(), this._controllerHost = null + }, t.prototype.findHighDownDispatchers = function (t, e) { + if (null == t) return []; + var n = e.coordinateSystem; + if ("geoJSON" === n.resourceType) { + var i = this._regionsGroupByName; + if (i) { + var r = i.get(t); + return r ? [r] : [] + } + } else if ("geoSVG" === n.resourceType) return this._svgDispatcherMap && this._svgDispatcherMap.get(t) || [] + }, t.prototype._svgResourceChanged = function (t) { + return this._svgMapName !== t + }, t.prototype._useSVG = function (t) { + var e = vT(t); + if (e && "geoSVG" === e.type) { + var n = e.useGraphic(this.uid); + this._svgGroup.add(n.root), this._svgGraphicRecord = n, this._svgMapName = t + } + }, t.prototype._freeSVG = function () { + var t = this._svgMapName; + if (null != t) { + var e = vT(t); + e && "geoSVG" === e.type && e.freeGraphic(this.uid), this._svgGraphicRecord = null, this._svgDispatcherMap = null, this._svgGroup.removeAll(), this._svgMapName = null + } + }, t.prototype._updateController = function (t, e, n) { + var i = t.coordinateSystem, r = this._controller, o = this._controllerHost; + o.zoomLimit = t.get("scaleLimit"), o.zoom = i.getZoom(), r.enable(t.get("roam") || !1); + var a = t.mainType; + + function s() { + var e = {type: "geoRoam", componentType: a}; + return e[a + "Id"] = t.id, e + } + + r.off("pan").on("pan", (function (t) { + this._mouseDownFlag = !1, PI(o, t.dx, t.dy), n.dispatchAction(A(s(), { + dx: t.dx, + dy: t.dy, + animation: {duration: 0} + })) + }), this), r.off("zoom").on("zoom", (function (t) { + this._mouseDownFlag = !1, OI(o, t.scale, t.originX, t.originY), n.dispatchAction(A(s(), { + zoom: t.scale, + originX: t.originX, + originY: t.originY, + animation: {duration: 0} + })) + }), this), r.setPointerChecker((function (e, r, o) { + return i.containPoint([r, o]) && !EI(e, n, t) + })) + }, t.prototype.resetForLabelLayout = function () { + this.group.traverse((function (t) { + var e = t.getTextContent(); + e && (e.ignore = MT(e).ignore) + })) + }, t.prototype._updateMapSelectHandler = function (t, e, n, i) { + var r = this; + e.off("mousedown"), e.off("click"), t.get("selectedMode") && (e.on("mousedown", (function () { + r._mouseDownFlag = !0 + })), e.on("click", (function (t) { + r._mouseDownFlag && (r._mouseDownFlag = !1) + }))) + }, t + }(); + + function DT(t, e, n, i) { + var r = i.getModel("itemStyle"), o = i.getModel(["emphasis", "itemStyle"]), + a = i.getModel(["blur", "itemStyle"]), s = i.getModel(["select", "itemStyle"]), l = IT(r), u = IT(o), + h = IT(s), c = IT(a), p = t.data; + if (p) { + var d = p.getItemVisual(n, "style"), f = p.getItemVisual(n, "decal"); + t.isVisualEncodedByVisualMap && d.fill && (l.fill = d.fill), f && (l.decal = nv(f, t.api)) + } + e.setStyle(l), e.style.strokeNoScale = !0, e.ensureState("emphasis").style = u, e.ensureState("select").style = h, e.ensureState("blur").style = c, yl(e) + } + + function AT(t, e, n, i, r, o, a) { + var s = t.data, l = t.isGeo, u = s && isNaN(s.get(s.mapDimension("value"), o)), h = s && s.getItemLayout(o); + if (l || u || h && h.showLabel) { + var c = l ? n : o, p = void 0; + (!s || o >= 0) && (p = r); + var d = a ? {normal: {align: "center", verticalAlign: "middle"}} : null; + Wh(e, Hh(i), {labelFetcher: p, labelDataIndex: c, defaultText: n}, d); + var f = e.getTextContent(); + if (f && (MT(f).ignore = f.ignore, e.textConfig && a)) { + var g = e.getBoundingRect().clone(); + e.textConfig.layoutRect = g, e.textConfig.position = [(a[0] - g.x) / g.width * 100 + "%", (a[1] - g.y) / g.height * 100 + "%"] + } + e.disableLabelAnimation = !0 + } else e.removeTextContent(), e.removeTextConfig(), e.disableLabelAnimation = null + } + + function kT(t, e, n, i, r, o) { + t.data ? t.data.setItemGraphicEl(o, e) : Ws(e).eventData = { + componentType: "geo", + componentIndex: r.componentIndex, + geoIndex: r.componentIndex, + name: n, + region: i && i.option || {} + } + } + + function LT(t, e, n, i, r) { + t.data || Nh({el: e, componentModel: r, itemName: n, itemTooltipOption: i.get("tooltip")}) + } + + function PT(t, e, n, i, r) { + e.highDownSilentOnTouch = !!r.get("selectedMode"); + var o = i.getModel("emphasis"), a = o.get("focus"); + return Ol(e, a, o.get("blurScope"), o.get("disabled")), t.isGeo && function (t, e, n) { + var i = Ws(t); + i.componentMainType = e.mainType, i.componentIndex = e.componentIndex, i.componentHighDownName = n + }(e, r, n), a + } + + function OT(t, e, n) { + var i, r = []; + + function o() { + i = [] + } + + function a() { + i.length && (r.push(i), i = []) + } + + var s = e({ + polygonStart: o, polygonEnd: a, lineStart: o, lineEnd: a, point: function (t, e) { + isFinite(t) && isFinite(e) && i.push([t, e]) + }, sphere: function () { + } + }); + return !n && s.polygonStart(), E(t, (function (t) { + s.lineStart(); + for (var e = 0; e < t.length; e++) s.point(t[e][0], t[e][1]); + s.lineEnd() + })), !n && s.polygonEnd(), r + } + + var RT = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n, i) { + if (!i || "mapToggleSelect" !== i.type || i.from !== this.uid) { + var r = this.group; + if (r.removeAll(), !t.getHostGeoModel()) { + if (this._mapDraw && i && "geoRoam" === i.type && this._mapDraw.resetForLabelLayout(), i && "geoRoam" === i.type && "series" === i.componentType && i.seriesId === t.id) (o = this._mapDraw) && r.add(o.group); else if (t.needsDrawMap) { + var o = this._mapDraw || new CT(n); + r.add(o.group), o.draw(t, e, n, this, i), this._mapDraw = o + } else this._mapDraw && this._mapDraw.remove(), this._mapDraw = null; + t.get("showLegendSymbol") && e.getComponent("legend") && this._renderSymbols(t, e, n) + } + } + }, e.prototype.remove = function () { + this._mapDraw && this._mapDraw.remove(), this._mapDraw = null, this.group.removeAll() + }, e.prototype.dispose = function () { + this._mapDraw && this._mapDraw.remove(), this._mapDraw = null + }, e.prototype._renderSymbols = function (t, e, n) { + var i = t.originalData, r = this.group; + i.each(i.mapDimension("value"), (function (e, n) { + if (!isNaN(e)) { + var o = i.getItemLayout(n); + if (o && o.point) { + var a = o.point, s = o.offset, l = new uu({ + style: {fill: t.getData().getVisual("style").fill}, + shape: {cx: a[0] + 9 * s, cy: a[1], r: 3}, + silent: !0, + z2: 8 + (s ? 0 : 11) + }); + if (!s) { + var u = t.mainSeries.getData(), h = i.getName(n), c = u.indexOfName(h), + p = i.getItemModel(n), d = p.getModel("label"), f = u.getItemGraphicEl(c); + Wh(l, Hh(p), { + labelFetcher: { + getFormattedLabel: function (e, n) { + return t.getFormattedLabel(c, n) + } + }, defaultText: h + }), l.disableLabelAnimation = !0, d.get("position") || l.setTextConfig({position: "bottom"}), f.onHoverStateChange = function (t) { + fl(l, t) + } + } + r.add(l) + } + } + })) + }, e.type = "map", e + }(mg), NT = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.needsDrawMap = !1, n.seriesGroup = [], n.getTooltipPosition = function (t) { + if (null != t) { + var e = this.getData().getName(t), n = this.coordinateSystem, i = n.getRegion(e); + return i && n.dataToPoint(i.getCenter()) + } + }, n + } + + return n(e, t), e.prototype.getInitialData = function (t) { + for (var e = sM(this, { + coordDimensions: ["value"], + encodeDefaulter: H(Hp, this) + }), n = ft(), i = [], r = 0, o = e.count(); r < o; r++) { + var a = e.getName(r); + n.set(a, !0) + } + return E(xT(this.getMapType(), this.option.nameMap, this.option.nameProperty).regions, (function (t) { + var e = t.name; + n.get(e) || i.push(e) + })), e.appendValues([], i), e + }, e.prototype.getHostGeoModel = function () { + var t = this.option.geoIndex; + return null != t ? this.ecModel.getComponent("geo", t) : null + }, e.prototype.getMapType = function () { + return (this.getHostGeoModel() || this).option.map + }, e.prototype.getRawValue = function (t) { + var e = this.getData(); + return e.get(e.mapDimension("value"), t) + }, e.prototype.getRegionModel = function (t) { + var e = this.getData(); + return e.getItemModel(e.indexOfName(t)) + }, e.prototype.formatTooltip = function (t, e, n) { + for (var i = this.getData(), r = this.getRawValue(t), o = i.getName(t), a = this.seriesGroup, s = [], l = 0; l < a.length; l++) { + var u = a[l].originalData.indexOfName(o), h = i.mapDimension("value"); + isNaN(a[l].originalData.get(h, u)) || s.push(a[l].name) + } + return Uf("section", { + header: s.join(", "), + noHeader: !s.length, + blocks: [Uf("nameValue", {name: o, value: r})] + }) + }, e.prototype.setZoom = function (t) { + this.option.zoom = t + }, e.prototype.setCenter = function (t) { + this.option.center = t + }, e.prototype.getLegendIcon = function (t) { + var e = t.icon || "roundRect", n = ky(e, 0, 0, t.itemWidth, t.itemHeight, t.itemStyle.fill); + return n.setStyle(t.itemStyle), n.style.stroke = "none", e.indexOf("empty") > -1 && (n.style.stroke = n.style.fill, n.style.fill = "#fff", n.style.lineWidth = 2), n + }, e.type = "series.map", e.dependencies = ["geo"], e.layoutMode = "box", e.defaultOption = { + z: 2, + coordinateSystem: "geo", + map: "", + left: "center", + top: "center", + aspectScale: null, + showLegendSymbol: !0, + boundingCoords: null, + center: null, + zoom: 1, + scaleLimit: null, + selectedMode: !0, + label: {show: !1, color: "#000"}, + itemStyle: {borderWidth: .5, borderColor: "#444", areaColor: "#eee"}, + emphasis: {label: {show: !0, color: "rgb(100,0,0)"}, itemStyle: {areaColor: "rgba(255,215,0,0.8)"}}, + select: {label: {show: !0, color: "rgb(100,0,0)"}, itemStyle: {color: "rgba(255,215,0,0.8)"}}, + nameProperty: "name" + }, e + }(ag); + + function ET(t) { + var e = {}; + t.eachSeriesByType("map", (function (t) { + var n = t.getHostGeoModel(), i = n ? "o" + n.id : "i" + t.getMapType(); + (e[i] = e[i] || []).push(t) + })), E(e, (function (t, e) { + for (var n, i, r, o = (n = z(t, (function (t) { + return t.getData() + })), i = t[0].get("mapValueCalculation"), r = {}, E(n, (function (t) { + t.each(t.mapDimension("value"), (function (e, n) { + var i = "ec-" + t.getName(n); + r[i] = r[i] || [], isNaN(e) || r[i].push(e) + })) + })), n[0].map(n[0].mapDimension("value"), (function (t, e) { + for (var o = "ec-" + n[0].getName(e), a = 0, s = 1 / 0, l = -1 / 0, u = r[o].length, h = 0; h < u; h++) s = Math.min(s, r[o][h]), l = Math.max(l, r[o][h]), a += r[o][h]; + return 0 === u ? NaN : "min" === i ? s : "max" === i ? l : "average" === i ? a / u : a + }))), a = 0; a < t.length; a++) t[a].originalData = t[a].getData(); + for (a = 0; a < t.length; a++) t[a].seriesGroup = t, t[a].needsDrawMap = 0 === a && !t[a].getHostGeoModel(), t[a].setData(o.cloneShallow()), t[a].mainSeries = t[0] + })) + } + + function zT(t) { + var e = {}; + t.eachSeriesByType("map", (function (n) { + var i = n.getMapType(); + if (!n.getHostGeoModel() && !e[i]) { + var r = {}; + E(n.seriesGroup, (function (e) { + var n = e.coordinateSystem, i = e.originalData; + e.get("showLegendSymbol") && t.getComponent("legend") && i.each(i.mapDimension("value"), (function (t, e) { + var o = i.getName(e), a = n.getRegion(o); + if (a && !isNaN(t)) { + var s = r[o] || 0, l = n.dataToPoint(a.getCenter()); + r[o] = s + 1, i.setItemLayout(e, {point: l, offset: s}) + } + })) + })); + var o = n.getData(); + o.each((function (t) { + var e = o.getName(t), n = o.getItemLayout(t) || {}; + n.showLabel = !r[e], o.setItemLayout(t, n) + })), e[i] = !0 + } + })) + } + + var VT = Ft, BT = function (t) { + function e(e) { + var n = t.call(this) || this; + return n.type = "view", n.dimensions = ["x", "y"], n._roamTransformable = new qi, n._rawTransformable = new qi, n.name = e, n + } + + return n(e, t), e.prototype.setBoundingRect = function (t, e, n, i) { + return this._rect = new sr(t, e, n, i), this._rect + }, e.prototype.getBoundingRect = function () { + return this._rect + }, e.prototype.setViewRect = function (t, e, n, i) { + this._transformTo(t, e, n, i), this._viewRect = new sr(t, e, n, i) + }, e.prototype._transformTo = function (t, e, n, i) { + var r = this.getBoundingRect(), o = this._rawTransformable; + o.transform = r.calculateTransform(new sr(t, e, n, i)); + var a = o.parent; + o.parent = null, o.decomposeTransform(), o.parent = a, this._updateTransform() + }, e.prototype.setCenter = function (t) { + t && (this._center = t, this._updateCenterAndZoom()) + }, e.prototype.setZoom = function (t) { + t = t || 1; + var e = this.zoomLimit; + e && (null != e.max && (t = Math.min(e.max, t)), null != e.min && (t = Math.max(e.min, t))), this._zoom = t, this._updateCenterAndZoom() + }, e.prototype.getDefaultCenter = function () { + var t = this.getBoundingRect(); + return [t.x + t.width / 2, t.y + t.height / 2] + }, e.prototype.getCenter = function () { + return this._center || this.getDefaultCenter() + }, e.prototype.getZoom = function () { + return this._zoom || 1 + }, e.prototype.getRoamTransform = function () { + return this._roamTransformable.getLocalTransform() + }, e.prototype._updateCenterAndZoom = function () { + var t = this._rawTransformable.getLocalTransform(), e = this._roamTransformable, + n = this.getDefaultCenter(), i = this.getCenter(), r = this.getZoom(); + i = Ft([], i, t), n = Ft([], n, t), e.originX = i[0], e.originY = i[1], e.x = n[0] - i[0], e.y = n[1] - i[1], e.scaleX = e.scaleY = r, this._updateTransform() + }, e.prototype._updateTransform = function () { + var t = this._roamTransformable, e = this._rawTransformable; + e.parent = t, t.updateTransform(), e.updateTransform(), Ri(this.transform || (this.transform = []), e.transform || [1, 0, 0, 1, 0, 0]), this._rawTransform = e.getLocalTransform(), this.invTransform = this.invTransform || [], Bi(this.invTransform, this.transform), this.decomposeTransform() + }, e.prototype.getTransformInfo = function () { + var t = this._rawTransformable, e = this._roamTransformable, n = new qi; + return n.transform = e.transform, n.decomposeTransform(), { + roam: { + x: n.x, + y: n.y, + scaleX: n.scaleX, + scaleY: n.scaleY + }, raw: {x: t.x, y: t.y, scaleX: t.scaleX, scaleY: t.scaleY} + } + }, e.prototype.getViewRect = function () { + return this._viewRect + }, e.prototype.getViewRectAfterRoam = function () { + var t = this.getBoundingRect().clone(); + return t.applyTransform(this.transform), t + }, e.prototype.dataToPoint = function (t, e, n) { + var i = e ? this._rawTransform : this.transform; + return n = n || [], i ? VT(n, t, i) : St(n, t) + }, e.prototype.pointToData = function (t) { + var e = this.invTransform; + return e ? VT([], t, e) : [t[0], t[1]] + }, e.prototype.convertToPixel = function (t, e, n) { + var i = FT(e); + return i === this ? i.dataToPoint(n) : null + }, e.prototype.convertFromPixel = function (t, e, n) { + var i = FT(e); + return i === this ? i.pointToData(n) : null + }, e.prototype.containPoint = function (t) { + return this.getViewRectAfterRoam().contain(t[0], t[1]) + }, e.dimensions = ["x", "y"], e + }(qi); + + function FT(t) { + var e = t.seriesModel; + return e ? e.coordinateSystem : null + } + + var GT = {geoJSON: {aspectScale: .75, invertLongitute: !0}, geoSVG: {aspectScale: 1, invertLongitute: !1}}, + WT = ["lng", "lat"], HT = function (t) { + function e(e, n, i) { + var r = t.call(this, e) || this; + r.dimensions = WT, r.type = "geo", r._nameCoordMap = ft(), r.map = n; + var o, a = i.projection, s = xT(n, i.nameMap, i.nameProperty), l = vT(n), + u = (r.resourceType = l ? l.type : null, r.regions = s.regions), h = GT[l.type]; + if (r._regionsMap = s.regionsMap, r.regions = s.regions, r.projection = a, a) for (var c = 0; c < u.length; c++) { + var p = u[c].getBoundingRect(a); + (o = o || p.clone()).union(p) + } else o = s.boundingRect; + return r.setBoundingRect(o.x, o.y, o.width, o.height), r.aspectScale = a ? 1 : rt(i.aspectScale, h.aspectScale), r._invertLongitute = !a && h.invertLongitute, r + } + + return n(e, t), e.prototype._transformTo = function (t, e, n, i) { + var r = this.getBoundingRect(), o = this._invertLongitute; + r = r.clone(), o && (r.y = -r.y - r.height); + var a = this._rawTransformable; + a.transform = r.calculateTransform(new sr(t, e, n, i)); + var s = a.parent; + a.parent = null, a.decomposeTransform(), a.parent = s, o && (a.scaleY = -a.scaleY), this._updateTransform() + }, e.prototype.getRegion = function (t) { + return this._regionsMap.get(t) + }, e.prototype.getRegionByCoord = function (t) { + for (var e = this.regions, n = 0; n < e.length; n++) { + var i = e[n]; + if ("geoJSON" === i.type && i.contain(t)) return e[n] + } + }, e.prototype.addGeoCoord = function (t, e) { + this._nameCoordMap.set(t, e) + }, e.prototype.getGeoCoord = function (t) { + var e = this._regionsMap.get(t); + return this._nameCoordMap.get(t) || e && e.getCenter() + }, e.prototype.dataToPoint = function (t, e, n) { + if (X(t) && (t = this.getGeoCoord(t)), t) { + var i = this.projection; + return i && (t = i.project(t)), t && this.projectedToPoint(t) + } + }, e.prototype.pointToData = function (t) { + var e = this.projection; + return e && (t = e.unproject(t)), t && this.pointToProjected(t) + }, e.prototype.pointToProjected = function (e) { + return t.prototype.pointToData.call(this, e) + }, e.prototype.projectedToPoint = function (e, n, i) { + return t.prototype.dataToPoint.call(this, e, n, i) + }, e.prototype.convertToPixel = function (t, e, n) { + var i = YT(e); + return i === this ? i.dataToPoint(n) : null + }, e.prototype.convertFromPixel = function (t, e, n) { + var i = YT(e); + return i === this ? i.pointToData(n) : null + }, e + }(BT); + + function YT(t) { + var e = t.geoModel, n = t.seriesModel; + return e ? e.coordinateSystem : n ? n.coordinateSystem || (n.getReferringComponents("geo", Co).models[0] || {}).coordinateSystem : null + } + + function UT(t, e) { + var n = t.get("boundingCoords"); + if (null != n) { + var i = n[0], r = n[1]; + if (isFinite(i[0]) && isFinite(i[1]) && isFinite(r[0]) && isFinite(r[1])) { + var o = this.projection; + if (o) { + var a = i[0], s = i[1], l = r[0], u = r[1]; + i = [1 / 0, 1 / 0], r = [-1 / 0, -1 / 0]; + var h = function (t, e, n, a) { + for (var s = n - t, l = a - e, u = 0; u <= 100; u++) { + var h = u / 100, c = o.project([t + s * h, e + l * h]); + Gt(i, i, c), Wt(r, r, c) + } + }; + h(a, s, l, s), h(l, s, l, u), h(l, u, a, u), h(a, u, l, s) + } + this.setBoundingRect(i[0], i[1], r[0] - i[0], r[1] - i[1]) + } else 0 + } + var c, p, d, f = this.getBoundingRect(), g = t.get("layoutCenter"), y = t.get("layoutSize"), v = e.getWidth(), + m = e.getHeight(), x = f.width / f.height * this.aspectScale, _ = !1; + if (g && y && (c = [Er(g[0], v), Er(g[1], m)], p = Er(y, Math.min(v, m)), isNaN(c[0]) || isNaN(c[1]) || isNaN(p) || (_ = !0)), _) d = {}, x > 1 ? (d.width = p, d.height = p / x) : (d.height = p, d.width = p * x), d.y = c[1] - d.height / 2, d.x = c[0] - d.width / 2; else { + var b = t.getBoxLayoutParams(); + b.aspect = x, d = mp(b, {width: v, height: m}) + } + this.setViewRect(d.x, d.y, d.width, d.height), this.setCenter(t.get("center")), this.setZoom(t.get("zoom")) + } + + R(HT, BT); + var XT = new (function () { + function t() { + this.dimensions = WT + } + + return t.prototype.create = function (t, e) { + var n = []; + + function i(t) { + return { + nameProperty: t.get("nameProperty"), + aspectScale: t.get("aspectScale"), + projection: t.get("projection") + } + } + + t.eachComponent("geo", (function (t, r) { + var o = t.get("map"), a = new HT(o + r, o, A({nameMap: t.get("nameMap")}, i(t))); + a.zoomLimit = t.get("scaleLimit"), n.push(a), t.coordinateSystem = a, a.model = t, a.resize = UT, a.resize(t, e) + })), t.eachSeries((function (t) { + if ("geo" === t.get("coordinateSystem")) { + var e = t.get("geoIndex") || 0; + t.coordinateSystem = n[e] + } + })); + var r = {}; + return t.eachSeriesByType("map", (function (t) { + if (!t.getHostGeoModel()) { + var e = t.getMapType(); + r[e] = r[e] || [], r[e].push(t) + } + })), E(r, (function (t, r) { + var o = z(t, (function (t) { + return t.get("nameMap") + })), a = new HT(r, r, A({nameMap: D(o)}, i(t[0]))); + a.zoomLimit = it.apply(null, z(t, (function (t) { + return t.get("scaleLimit") + }))), n.push(a), a.resize = UT, a.resize(t[0], e), E(t, (function (t) { + t.coordinateSystem = a, function (t, e) { + E(e.get("geoCoord"), (function (e, n) { + t.addGeoCoord(n, e) + })) + }(a, t) + })) + })), n + }, t.prototype.getFilledRegions = function (t, e, n, i) { + for (var r = (t || []).slice(), o = ft(), a = 0; a < r.length; a++) o.set(r[a].name, r[a]); + return E(xT(e, n, i).regions, (function (t) { + var e = t.name; + !o.get(e) && r.push({name: e}) + })), r + }, t + }()), ZT = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function (t, e, n) { + var i = vT(t.map); + if (i && "geoJSON" === i.type) { + var r = t.itemStyle = t.itemStyle || {}; + "color" in r || (r.color = "#eee") + } + this.mergeDefaultAndTheme(t, n), co(t, "label", ["show"]) + }, e.prototype.optionUpdated = function () { + var t = this, e = this.option; + e.regions = XT.getFilledRegions(e.regions, e.map, e.nameMap, e.nameProperty); + var n = {}; + this._optionModelMap = V(e.regions || [], (function (e, i) { + var r = i.name; + return r && (e.set(r, new pc(i, t, t.ecModel)), i.selected && (n[r] = !0)), e + }), ft()), e.selectedMap || (e.selectedMap = n) + }, e.prototype.getRegionModel = function (t) { + return this._optionModelMap.get(t) || new pc(null, this, this.ecModel) + }, e.prototype.getFormattedLabel = function (t, e) { + var n = this.getRegionModel(t), + i = "normal" === e ? n.get(["label", "formatter"]) : n.get(["emphasis", "label", "formatter"]), + r = {name: t}; + return U(i) ? (r.status = e, i(r)) : X(i) ? i.replace("{a}", null != t ? t : "") : void 0 + }, e.prototype.setZoom = function (t) { + this.option.zoom = t + }, e.prototype.setCenter = function (t) { + this.option.center = t + }, e.prototype.select = function (t) { + var e = this.option, n = e.selectedMode; + n && ("multiple" !== n && (e.selectedMap = null), (e.selectedMap || (e.selectedMap = {}))[t] = !0) + }, e.prototype.unSelect = function (t) { + var e = this.option.selectedMap; + e && (e[t] = !1) + }, e.prototype.toggleSelected = function (t) { + this[this.isSelected(t) ? "unSelect" : "select"](t) + }, e.prototype.isSelected = function (t) { + var e = this.option.selectedMap; + return !(!e || !e[t]) + }, e.type = "geo", e.layoutMode = "box", e.defaultOption = { + z: 0, + show: !0, + left: "center", + top: "center", + aspectScale: null, + silent: !1, + map: "", + boundingCoords: null, + center: null, + zoom: 1, + scaleLimit: null, + label: {show: !1, color: "#000"}, + itemStyle: {borderWidth: .5, borderColor: "#444"}, + emphasis: {label: {show: !0, color: "rgb(100,0,0)"}, itemStyle: {color: "rgba(255,215,0,0.8)"}}, + select: {label: {show: !0, color: "rgb(100,0,0)"}, itemStyle: {color: "rgba(255,215,0,0.8)"}}, + regions: [] + }, e + }(Ip); + + function jT(t, e) { + return t.pointToProjected ? t.pointToProjected(e) : t.pointToData(e) + } + + function qT(t, e, n) { + var i = t.getZoom(), r = t.getCenter(), o = e.zoom, + a = t.projectedToPoint ? t.projectedToPoint(r) : t.dataToPoint(r); + if (null != e.dx && null != e.dy && (a[0] -= e.dx, a[1] -= e.dy, t.setCenter(jT(t, a))), null != o) { + if (n) { + var s = n.min || 0, l = n.max || 1 / 0; + o = Math.max(Math.min(i * o, l), s) / i + } + t.scaleX *= o, t.scaleY *= o; + var u = (e.originX - t.x) * (o - 1), h = (e.originY - t.y) * (o - 1); + t.x -= u, t.y -= h, t.updateTransform(), t.setCenter(jT(t, a)), t.setZoom(o * i) + } + return {center: t.getCenter(), zoom: t.getZoom()} + } + + var KT = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.focusBlurEnabled = !0, n + } + + return n(e, t), e.prototype.init = function (t, e) { + this._api = e + }, e.prototype.render = function (t, e, n, i) { + if (this._model = t, !t.get("show")) return this._mapDraw && this._mapDraw.remove(), void (this._mapDraw = null); + this._mapDraw || (this._mapDraw = new CT(n)); + var r = this._mapDraw; + r.draw(t, e, n, this, i), r.group.on("click", this._handleRegionClick, this), r.group.silent = t.get("silent"), this.group.add(r.group), this.updateSelectStatus(t, e, n) + }, e.prototype._handleRegionClick = function (t) { + var e; + my(t.target, (function (t) { + return null != (e = Ws(t).eventData) + }), !0), e && this._api.dispatchAction({type: "geoToggleSelect", geoId: this._model.id, name: e.name}) + }, e.prototype.updateSelectStatus = function (t, e, n) { + var i = this; + this._mapDraw.group.traverse((function (t) { + var e = Ws(t).eventData; + if (e) return i._model.isSelected(e.name) ? n.enterSelect(t) : n.leaveSelect(t), !0 + })) + }, e.prototype.findHighDownDispatchers = function (t) { + return this._mapDraw && this._mapDraw.findHighDownDispatchers(t, this._model) + }, e.prototype.dispose = function () { + this._mapDraw && this._mapDraw.remove() + }, e.type = "geo", e + }(fg); + + function $T(t, e, n) { + yT(t, e, n) + } + + function JT(t) { + function e(e, n) { + n.update = "geo:updateSelectStatus", t.registerAction(n, (function (t, n) { + var i = {}, r = []; + return n.eachComponent({mainType: "geo", query: t}, (function (n) { + n[e](t.name), E(n.coordinateSystem.regions, (function (t) { + i[t.name] = n.isSelected(t.name) || !1 + })); + var o = []; + E(i, (function (t, e) { + i[e] && o.push(e) + })), r.push({geoIndex: n.componentIndex, name: o}) + })), {selected: i, allSelected: r, name: t.name} + })) + } + + t.registerCoordinateSystem("geo", XT), t.registerComponentModel(ZT), t.registerComponentView(KT), t.registerImpl("registerMap", $T), t.registerImpl("getMap", (function (t) { + return mT(t) + })), e("toggleSelected", {type: "geoToggleSelect", event: "geoselectchanged"}), e("select", { + type: "geoSelect", + event: "geoselected" + }), e("unSelect", {type: "geoUnSelect", event: "geounselected"}), t.registerAction({ + type: "geoRoam", + event: "geoRoam", + update: "updateTransform" + }, (function (t, e) { + var n = t.componentType || "series"; + e.eachComponent({mainType: n, query: t}, (function (e) { + var i = e.coordinateSystem; + if ("geo" === i.type) { + var r = qT(i, t, e.get("scaleLimit")); + e.setCenter && e.setCenter(r.center), e.setZoom && e.setZoom(r.zoom), "series" === n && E(e.seriesGroup, (function (t) { + t.setCenter(r.center), t.setZoom(r.zoom) + })) + } + })) + })) + } + + function QT(t, e) { + var n = t.isExpand ? t.children : [], i = t.parentNode.children, r = t.hierNode.i ? i[t.hierNode.i - 1] : null; + if (n.length) { + !function (t) { + var e = t.children, n = e.length, i = 0, r = 0; + for (; --n >= 0;) { + var o = e[n]; + o.hierNode.prelim += i, o.hierNode.modifier += i, r += o.hierNode.change, i += o.hierNode.shift + r + } + }(t); + var o = (n[0].hierNode.prelim + n[n.length - 1].hierNode.prelim) / 2; + r ? (t.hierNode.prelim = r.hierNode.prelim + e(t, r), t.hierNode.modifier = t.hierNode.prelim - o) : t.hierNode.prelim = o + } else r && (t.hierNode.prelim = r.hierNode.prelim + e(t, r)); + t.parentNode.hierNode.defaultAncestor = function (t, e, n, i) { + if (e) { + for (var r = t, o = t, a = o.parentNode.children[0], s = e, l = r.hierNode.modifier, u = o.hierNode.modifier, h = a.hierNode.modifier, c = s.hierNode.modifier; s = iC(s), o = rC(o), s && o;) { + r = iC(r), a = rC(a), r.hierNode.ancestor = t; + var p = s.hierNode.prelim + c - o.hierNode.prelim - u + i(s, o); + p > 0 && (aC(oC(s, t, n), t, p), u += p, l += p), c += s.hierNode.modifier, u += o.hierNode.modifier, l += r.hierNode.modifier, h += a.hierNode.modifier + } + s && !iC(r) && (r.hierNode.thread = s, r.hierNode.modifier += c - l), o && !rC(a) && (a.hierNode.thread = o, a.hierNode.modifier += u - h, n = t) + } + return n + }(t, r, t.parentNode.hierNode.defaultAncestor || i[0], e) + } + + function tC(t) { + var e = t.hierNode.prelim + t.parentNode.hierNode.modifier; + t.setLayout({x: e}, !0), t.hierNode.modifier += t.parentNode.hierNode.modifier + } + + function eC(t) { + return arguments.length ? t : sC + } + + function nC(t, e) { + return t -= Math.PI / 2, {x: e * Math.cos(t), y: e * Math.sin(t)} + } + + function iC(t) { + var e = t.children; + return e.length && t.isExpand ? e[e.length - 1] : t.hierNode.thread + } + + function rC(t) { + var e = t.children; + return e.length && t.isExpand ? e[0] : t.hierNode.thread + } + + function oC(t, e, n) { + return t.hierNode.ancestor.parentNode === e.parentNode ? t.hierNode.ancestor : n + } + + function aC(t, e, n) { + var i = n / (e.hierNode.i - t.hierNode.i); + e.hierNode.change -= i, e.hierNode.shift += n, e.hierNode.modifier += n, e.hierNode.prelim += n, t.hierNode.change += i + } + + function sC(t, e) { + return t.parentNode === e.parentNode ? 1 : 2 + } + + var lC = function () { + this.parentPoint = [], this.childPoints = [] + }, uC = function (t) { + function e(e) { + return t.call(this, e) || this + } + + return n(e, t), e.prototype.getDefaultStyle = function () { + return {stroke: "#000", fill: null} + }, e.prototype.getDefaultShape = function () { + return new lC + }, e.prototype.buildPath = function (t, e) { + var n = e.childPoints, i = n.length, r = e.parentPoint, o = n[0], a = n[i - 1]; + if (1 === i) return t.moveTo(r[0], r[1]), void t.lineTo(o[0], o[1]); + var s = e.orient, l = "TB" === s || "BT" === s ? 0 : 1, u = 1 - l, h = Er(e.forkPosition, 1), c = []; + c[l] = r[l], c[u] = r[u] + (a[u] - r[u]) * h, t.moveTo(r[0], r[1]), t.lineTo(c[0], c[1]), t.moveTo(o[0], o[1]), c[l] = o[l], t.lineTo(c[0], c[1]), c[l] = a[l], t.lineTo(c[0], c[1]), t.lineTo(a[0], a[1]); + for (var p = 1; p < i - 1; p++) { + var d = n[p]; + t.moveTo(d[0], d[1]), c[l] = d[l], t.lineTo(c[0], c[1]) + } + }, e + }(fs), hC = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n._mainGroup = new Cr, n + } + + return n(e, t), e.prototype.init = function (t, e) { + this._controller = new DI(e.getZr()), this._controllerHost = {target: this.group}, this.group.add(this._mainGroup) + }, e.prototype.render = function (t, e, n) { + var i = t.getData(), r = t.layoutInfo, o = this._mainGroup; + "radial" === t.get("layout") ? (o.x = r.x + r.width / 2, o.y = r.y + r.height / 2) : (o.x = r.x, o.y = r.y), this._updateViewCoordSys(t), this._updateController(t, e, n); + var a = this._data; + i.diff(a).add((function (e) { + cC(i, e) && pC(i, e, null, o, t) + })).update((function (e, n) { + var r = a.getItemGraphicEl(n); + cC(i, e) ? pC(i, e, r, o, t) : r && gC(a, n, r, o, t) + })).remove((function (e) { + var n = a.getItemGraphicEl(e); + n && gC(a, e, n, o, t) + })).execute(), this._nodeScaleRatio = t.get("nodeScaleRatio"), this._updateNodeAndLinkScale(t), !0 === t.get("expandAndCollapse") && i.eachItemGraphicEl((function (e, i) { + e.off("click").on("click", (function () { + n.dispatchAction({type: "treeExpandAndCollapse", seriesId: t.id, dataIndex: i}) + })) + })), this._data = i + }, e.prototype._updateViewCoordSys = function (t) { + var e = t.getData(), n = []; + e.each((function (t) { + var i = e.getItemLayout(t); + !i || isNaN(i.x) || isNaN(i.y) || n.push([+i.x, +i.y]) + })); + var i = [], r = []; + Ma(n, i, r); + var o = this._min, a = this._max; + r[0] - i[0] == 0 && (i[0] = o ? o[0] : i[0] - 1, r[0] = a ? a[0] : r[0] + 1), r[1] - i[1] == 0 && (i[1] = o ? o[1] : i[1] - 1, r[1] = a ? a[1] : r[1] + 1); + var s = t.coordinateSystem = new BT; + s.zoomLimit = t.get("scaleLimit"), s.setBoundingRect(i[0], i[1], r[0] - i[0], r[1] - i[1]), s.setCenter(t.get("center")), s.setZoom(t.get("zoom")), this.group.attr({ + x: s.x, + y: s.y, + scaleX: s.scaleX, + scaleY: s.scaleY + }), this._min = i, this._max = r + }, e.prototype._updateController = function (t, e, n) { + var i = this, r = this._controller, o = this._controllerHost, a = this.group; + r.setPointerChecker((function (e, i, r) { + var o = a.getBoundingRect(); + return o.applyTransform(a.transform), o.contain(i, r) && !EI(e, n, t) + })), r.enable(t.get("roam")), o.zoomLimit = t.get("scaleLimit"), o.zoom = t.coordinateSystem.getZoom(), r.off("pan").off("zoom").on("pan", (function (e) { + PI(o, e.dx, e.dy), n.dispatchAction({seriesId: t.id, type: "treeRoam", dx: e.dx, dy: e.dy}) + })).on("zoom", (function (e) { + OI(o, e.scale, e.originX, e.originY), n.dispatchAction({ + seriesId: t.id, + type: "treeRoam", + zoom: e.scale, + originX: e.originX, + originY: e.originY + }), i._updateNodeAndLinkScale(t), n.updateLabelLayout() + })) + }, e.prototype._updateNodeAndLinkScale = function (t) { + var e = t.getData(), n = this._getNodeGlobalScale(t); + e.eachItemGraphicEl((function (t, e) { + t.setSymbolScale(n) + })) + }, e.prototype._getNodeGlobalScale = function (t) { + var e = t.coordinateSystem; + if ("view" !== e.type) return 1; + var n = this._nodeScaleRatio, i = e.scaleX || 1; + return ((e.getZoom() - 1) * n + 1) / i + }, e.prototype.dispose = function () { + this._controller && this._controller.dispose(), this._controllerHost = null + }, e.prototype.remove = function () { + this._mainGroup.removeAll(), this._data = null + }, e.type = "tree", e + }(mg); + + function cC(t, e) { + var n = t.getItemLayout(e); + return n && !isNaN(n.x) && !isNaN(n.y) + } + + function pC(t, e, n, i, r) { + var o = !n, a = t.tree.getNodeByDataIndex(e), s = a.getModel(), l = a.getVisual("style").fill, + u = !1 === a.isExpand && 0 !== a.children.length ? l : "#fff", h = t.tree.root, + c = a.parentNode === h ? a : a.parentNode || a, p = t.getItemGraphicEl(c.dataIndex), d = c.getLayout(), + f = p ? {x: p.__oldX, y: p.__oldY, rawX: p.__radialOldRawX, rawY: p.__radialOldRawY} : d, g = a.getLayout(); + o ? ((n = new Ww(t, e, null, { + symbolInnerColor: u, + useNameLabel: !0 + })).x = f.x, n.y = f.y) : n.updateData(t, e, null, { + symbolInnerColor: u, + useNameLabel: !0 + }), n.__radialOldRawX = n.__radialRawX, n.__radialOldRawY = n.__radialRawY, n.__radialRawX = g.rawX, n.__radialRawY = g.rawY, i.add(n), t.setItemGraphicEl(e, n), n.__oldX = n.x, n.__oldY = n.y, ih(n, { + x: g.x, + y: g.y + }, r); + var y = n.getSymbolPath(); + if ("radial" === r.get("layout")) { + var v = h.children[0], m = v.getLayout(), x = v.children.length, _ = void 0, b = void 0; + if (g.x === m.x && !0 === a.isExpand) { + var w = { + x: (v.children[0].getLayout().x + v.children[x - 1].getLayout().x) / 2, + y: (v.children[0].getLayout().y + v.children[x - 1].getLayout().y) / 2 + }; + (_ = Math.atan2(w.y - m.y, w.x - m.x)) < 0 && (_ = 2 * Math.PI + _), (b = w.x < m.x) && (_ -= Math.PI) + } else (_ = Math.atan2(g.y - m.y, g.x - m.x)) < 0 && (_ = 2 * Math.PI + _), 0 === a.children.length || 0 !== a.children.length && !1 === a.isExpand ? (b = g.x < m.x) && (_ -= Math.PI) : (b = g.x > m.x) || (_ -= Math.PI); + var S = b ? "left" : "right", M = s.getModel("label"), I = M.get("rotate"), T = I * (Math.PI / 180), + C = y.getTextContent(); + C && (y.setTextConfig({ + position: M.get("position") || S, + rotation: null == I ? -_ : T, + origin: "center" + }), C.setStyle("verticalAlign", "middle")) + } + var D = s.get(["emphasis", "focus"]), + A = "ancestor" === D ? a.getAncestorsIndices() : "descendant" === D ? a.getDescendantIndices() : null; + A && (Ws(n).focus = A), function (t, e, n, i, r, o, a, s) { + var l = e.getModel(), u = t.get("edgeShape"), h = t.get("layout"), c = t.getOrient(), + p = t.get(["lineStyle", "curveness"]), d = t.get("edgeForkPosition"), + f = l.getModel("lineStyle").getLineStyle(), g = i.__edge; + if ("curve" === u) e.parentNode && e.parentNode !== n && (g || (g = i.__edge = new Fu({shape: yC(h, c, p, r, r)})), ih(g, {shape: yC(h, c, p, o, a)}, t)); else if ("polyline" === u) if ("orthogonal" === h) { + if (e !== n && e.children && 0 !== e.children.length && !0 === e.isExpand) { + for (var y = e.children, v = [], m = 0; m < y.length; m++) { + var x = y[m].getLayout(); + v.push([x.x, x.y]) + } + g || (g = i.__edge = new uC({ + shape: { + parentPoint: [a.x, a.y], + childPoints: [[a.x, a.y]], + orient: c, + forkPosition: d + } + })), ih(g, {shape: {parentPoint: [a.x, a.y], childPoints: v}}, t) + } + } else 0; + g && (g.useStyle(k({strokeNoScale: !0, fill: null}, f)), zl(g, l, "lineStyle"), yl(g), s.add(g)) + }(r, a, h, n, f, d, g, i), n.__edge && (n.onHoverStateChange = function (e) { + if ("blur" !== e) { + var i = a.parentNode && t.getItemGraphicEl(a.parentNode.dataIndex); + i && 1 === i.hoverState || fl(n.__edge, e) + } + }) + } + + function dC(t, e, n, i, r) { + var o = fC(e.tree.root, t), a = o.source, s = o.sourceLayout, l = e.getItemGraphicEl(t.dataIndex); + if (l) { + var u = e.getItemGraphicEl(a.dataIndex).__edge, + h = l.__edge || (!1 === a.isExpand || 1 === a.children.length ? u : void 0), c = i.get("edgeShape"), + p = i.get("layout"), d = i.get("orient"), f = i.get(["lineStyle", "curveness"]); + h && ("curve" === c ? ah(h, {shape: yC(p, d, f, s, s), style: {opacity: 0}}, i, { + cb: function () { + n.remove(h) + }, removeOpt: r + }) : "polyline" === c && "orthogonal" === i.get("layout") && ah(h, { + shape: { + parentPoint: [s.x, s.y], + childPoints: [[s.x, s.y]] + }, style: {opacity: 0} + }, i, { + cb: function () { + n.remove(h) + }, removeOpt: r + })) + } + } + + function fC(t, e) { + for (var n, i = e.parentNode === t ? e : e.parentNode || e; null == (n = i.getLayout());) i = i.parentNode === t ? i : i.parentNode || i; + return {source: i, sourceLayout: n} + } + + function gC(t, e, n, i, r) { + var o = t.tree.getNodeByDataIndex(e), a = fC(t.tree.root, o).sourceLayout, + s = {duration: r.get("animationDurationUpdate"), easing: r.get("animationEasingUpdate")}; + ah(n, {x: a.x + 1, y: a.y + 1}, r, { + cb: function () { + i.remove(n), t.setItemGraphicEl(e, null) + }, removeOpt: s + }), n.fadeOut(null, {fadeLabel: !0, animation: s}), o.children.forEach((function (e) { + dC(e, t, i, r, s) + })), dC(o, t, i, r, s) + } + + function yC(t, e, n, i, r) { + var o, a, s, l, u, h, c, p; + if ("radial" === t) { + u = i.rawX, c = i.rawY, h = r.rawX, p = r.rawY; + var d = nC(u, c), f = nC(u, c + (p - c) * n), g = nC(h, p + (c - p) * n), y = nC(h, p); + return { + x1: d.x || 0, + y1: d.y || 0, + x2: y.x || 0, + y2: y.y || 0, + cpx1: f.x || 0, + cpy1: f.y || 0, + cpx2: g.x || 0, + cpy2: g.y || 0 + } + } + return u = i.x, c = i.y, h = r.x, p = r.y, "LR" !== e && "RL" !== e || (o = u + (h - u) * n, a = c, s = h + (u - h) * n, l = p), "TB" !== e && "BT" !== e || (o = u, a = c + (p - c) * n, s = h, l = p + (c - p) * n), { + x1: u, + y1: c, + x2: h, + y2: p, + cpx1: o, + cpy1: a, + cpx2: s, + cpy2: l + } + } + + var vC = So(); + + function mC(t) { + var e = t.mainData, n = t.datas; + n || (n = {main: e}, t.datasAttr = {main: "data"}), t.datas = t.mainData = null, MC(e, n, t), E(n, (function (n) { + E(e.TRANSFERABLE_METHODS, (function (e) { + n.wrapMethod(e, H(xC, t)) + })) + })), e.wrapMethod("cloneShallow", H(bC, t)), E(e.CHANGABLE_METHODS, (function (n) { + e.wrapMethod(n, H(_C, t)) + })), lt(n[e.dataType] === e) + } + + function xC(t, e) { + if (vC(i = this).mainData === i) { + var n = A({}, vC(this).datas); + n[this.dataType] = e, MC(e, n, t) + } else IC(e, this.dataType, vC(this).mainData, t); + var i; + return e + } + + function _C(t, e) { + return t.struct && t.struct.update(), e + } + + function bC(t, e) { + return E(vC(e).datas, (function (n, i) { + n !== e && IC(n.cloneShallow(), i, e, t) + })), e + } + + function wC(t) { + var e = vC(this).mainData; + return null == t || null == e ? e : vC(e).datas[t] + } + + function SC() { + var t = vC(this).mainData; + return null == t ? [{data: t}] : z(G(vC(t).datas), (function (e) { + return {type: e, data: vC(t).datas[e]} + })) + } + + function MC(t, e, n) { + vC(t).datas = {}, E(e, (function (e, i) { + IC(e, i, t, n) + })) + } + + function IC(t, e, n, i) { + vC(n).datas[e] = t, vC(t).mainData = n, t.dataType = e, i.struct && (t[i.structAttr] = i.struct, i.struct[i.datasAttr[e]] = t), t.getLinkedData = wC, t.getLinkedDataAll = SC + } + + var TC = function () { + function t(t, e) { + this.depth = 0, this.height = 0, this.dataIndex = -1, this.children = [], this.viewChildren = [], this.isExpand = !1, this.name = t || "", this.hostTree = e + } + + return t.prototype.isRemoved = function () { + return this.dataIndex < 0 + }, t.prototype.eachNode = function (t, e, n) { + U(t) && (n = e, e = t, t = null), X(t = t || {}) && (t = {order: t}); + var i, r = t.order || "preorder", o = this[t.attr || "children"]; + "preorder" === r && (i = e.call(n, this)); + for (var a = 0; !i && a < o.length; a++) o[a].eachNode(t, e, n); + "postorder" === r && e.call(n, this) + }, t.prototype.updateDepthAndHeight = function (t) { + var e = 0; + this.depth = t; + for (var n = 0; n < this.children.length; n++) { + var i = this.children[n]; + i.updateDepthAndHeight(t + 1), i.height > e && (e = i.height) + } + this.height = e + 1 + }, t.prototype.getNodeById = function (t) { + if (this.getId() === t) return this; + for (var e = 0, n = this.children, i = n.length; e < i; e++) { + var r = n[e].getNodeById(t); + if (r) return r + } + }, t.prototype.contains = function (t) { + if (t === this) return !0; + for (var e = 0, n = this.children, i = n.length; e < i; e++) { + var r = n[e].contains(t); + if (r) return r + } + }, t.prototype.getAncestors = function (t) { + for (var e = [], n = t ? this : this.parentNode; n;) e.push(n), n = n.parentNode; + return e.reverse(), e + }, t.prototype.getAncestorsIndices = function () { + for (var t = [], e = this; e;) t.push(e.dataIndex), e = e.parentNode; + return t.reverse(), t + }, t.prototype.getDescendantIndices = function () { + var t = []; + return this.eachNode((function (e) { + t.push(e.dataIndex) + })), t + }, t.prototype.getValue = function (t) { + var e = this.hostTree.data; + return e.getStore().get(e.getDimensionIndex(t || "value"), this.dataIndex) + }, t.prototype.setLayout = function (t, e) { + this.dataIndex >= 0 && this.hostTree.data.setItemLayout(this.dataIndex, t, e) + }, t.prototype.getLayout = function () { + return this.hostTree.data.getItemLayout(this.dataIndex) + }, t.prototype.getModel = function (t) { + if (!(this.dataIndex < 0)) return this.hostTree.data.getItemModel(this.dataIndex).getModel(t) + }, t.prototype.getLevelModel = function () { + return (this.hostTree.levelModels || [])[this.depth] + }, t.prototype.setVisual = function (t, e) { + this.dataIndex >= 0 && this.hostTree.data.setItemVisual(this.dataIndex, t, e) + }, t.prototype.getVisual = function (t) { + return this.hostTree.data.getItemVisual(this.dataIndex, t) + }, t.prototype.getRawIndex = function () { + return this.hostTree.data.getRawIndex(this.dataIndex) + }, t.prototype.getId = function () { + return this.hostTree.data.getId(this.dataIndex) + }, t.prototype.getChildIndex = function () { + if (this.parentNode) { + for (var t = this.parentNode.children, e = 0; e < t.length; ++e) if (t[e] === this) return e; + return -1 + } + return -1 + }, t.prototype.isAncestorOf = function (t) { + for (var e = t.parentNode; e;) { + if (e === this) return !0; + e = e.parentNode + } + return !1 + }, t.prototype.isDescendantOf = function (t) { + return t !== this && t.isAncestorOf(this) + }, t + }(), CC = function () { + function t(t) { + this.type = "tree", this._nodes = [], this.hostModel = t + } + + return t.prototype.eachNode = function (t, e, n) { + this.root.eachNode(t, e, n) + }, t.prototype.getNodeByDataIndex = function (t) { + var e = this.data.getRawIndex(t); + return this._nodes[e] + }, t.prototype.getNodeById = function (t) { + return this.root.getNodeById(t) + }, t.prototype.update = function () { + for (var t = this.data, e = this._nodes, n = 0, i = e.length; n < i; n++) e[n].dataIndex = -1; + for (n = 0, i = t.count(); n < i; n++) e[t.getRawIndex(n)].dataIndex = n + }, t.prototype.clearLayouts = function () { + this.data.clearItemLayouts() + }, t.createTree = function (e, n, i) { + var r = new t(n), o = [], a = 1; + !function t(e, n) { + var i = e.value; + a = Math.max(a, Y(i) ? i.length : 1), o.push(e); + var s = new TC(xo(e.name, ""), r); + n ? function (t, e) { + var n = e.children; + if (t.parentNode === e) return; + n.push(t), t.parentNode = e + }(s, n) : r.root = s, r._nodes.push(s); + var l = e.children; + if (l) for (var u = 0; u < l.length; u++) t(l[u], s) + }(e), r.root.updateDepthAndHeight(0); + var s = jm(o, {coordDimensions: ["value"], dimensionsCount: a}).dimensions, l = new Zm(s, n); + return l.initData(o), i && i(l), mC({mainData: l, struct: r, structAttr: "tree"}), r.update(), r + }, t + }(); + + function DC(t, e, n) { + if (t && P(e, t.type) >= 0) { + var i = n.getData().tree.root, r = t.targetNode; + if (X(r) && (r = i.getNodeById(r)), r && i.contains(r)) return {node: r}; + var o = t.targetNodeId; + if (null != o && (r = i.getNodeById(o))) return {node: r} + } + } + + function AC(t) { + for (var e = []; t;) (t = t.parentNode) && e.push(t); + return e.reverse() + } + + function kC(t, e) { + return P(AC(t), e) >= 0 + } + + function LC(t, e) { + for (var n = []; t;) { + var i = t.dataIndex; + n.push({name: t.name, dataIndex: i, value: e.getRawValue(i)}), t = t.parentNode + } + return n.reverse(), n + } + + var PC = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.hasSymbolVisual = !0, e.ignoreStyleOnData = !0, e + } + + return n(e, t), e.prototype.getInitialData = function (t) { + var e = {name: t.name, children: t.data}, n = t.leaves || {}, i = new pc(n, this, this.ecModel), + r = CC.createTree(e, this, (function (t) { + t.wrapMethod("getItemModel", (function (t, e) { + var n = r.getNodeByDataIndex(e); + return n && n.children.length && n.isExpand || (t.parentModel = i), t + })) + })); + var o = 0; + r.eachNode("preorder", (function (t) { + t.depth > o && (o = t.depth) + })); + var a = t.expandAndCollapse && t.initialTreeDepth >= 0 ? t.initialTreeDepth : o; + return r.root.eachNode("preorder", (function (t) { + var e = t.hostTree.data.getRawDataItem(t.dataIndex); + t.isExpand = e && null != e.collapsed ? !e.collapsed : t.depth <= a + })), r.data + }, e.prototype.getOrient = function () { + var t = this.get("orient"); + return "horizontal" === t ? t = "LR" : "vertical" === t && (t = "TB"), t + }, e.prototype.setZoom = function (t) { + this.option.zoom = t + }, e.prototype.setCenter = function (t) { + this.option.center = t + }, e.prototype.formatTooltip = function (t, e, n) { + for (var i = this.getData().tree, r = i.root.children[0], o = i.getNodeByDataIndex(t), a = o.getValue(), s = o.name; o && o !== r;) s = o.parentNode.name + "." + s, o = o.parentNode; + return Uf("nameValue", {name: s, value: a, noValue: isNaN(a) || null == a}) + }, e.prototype.getDataParams = function (e) { + var n = t.prototype.getDataParams.apply(this, arguments), i = this.getData().tree.getNodeByDataIndex(e); + return n.treeAncestors = LC(i, this), n + }, e.type = "series.tree", e.layoutMode = "box", e.defaultOption = { + z: 2, + coordinateSystem: "view", + left: "12%", + top: "12%", + right: "12%", + bottom: "12%", + layout: "orthogonal", + edgeShape: "curve", + edgeForkPosition: "50%", + roam: !1, + nodeScaleRatio: .4, + center: null, + zoom: 1, + orient: "LR", + symbol: "emptyCircle", + symbolSize: 7, + expandAndCollapse: !0, + initialTreeDepth: 2, + lineStyle: {color: "#ccc", width: 1.5, curveness: .5}, + itemStyle: {color: "lightsteelblue", borderWidth: 1.5}, + label: {show: !0}, + animationEasing: "linear", + animationDuration: 700, + animationDurationUpdate: 500 + }, e + }(ag); + + function OC(t, e) { + for (var n, i = [t]; n = i.pop();) if (e(n), n.isExpand) { + var r = n.children; + if (r.length) for (var o = r.length - 1; o >= 0; o--) i.push(r[o]) + } + } + + function RC(t, e) { + t.eachSeriesByType("tree", (function (t) { + !function (t, e) { + var n = function (t, e) { + return mp(t.getBoxLayoutParams(), {width: e.getWidth(), height: e.getHeight()}) + }(t, e); + t.layoutInfo = n; + var i = t.get("layout"), r = 0, o = 0, a = null; + "radial" === i ? (r = 2 * Math.PI, o = Math.min(n.height, n.width) / 2, a = eC((function (t, e) { + return (t.parentNode === e.parentNode ? 1 : 2) / t.depth + }))) : (r = n.width, o = n.height, a = eC()); + var s = t.getData().tree.root, l = s.children[0]; + if (l) { + !function (t) { + var e = t; + e.hierNode = { + defaultAncestor: null, + ancestor: e, + prelim: 0, + modifier: 0, + change: 0, + shift: 0, + i: 0, + thread: null + }; + for (var n, i, r = [e]; n = r.pop();) if (i = n.children, n.isExpand && i.length) for (var o = i.length - 1; o >= 0; o--) { + var a = i[o]; + a.hierNode = { + defaultAncestor: null, + ancestor: a, + prelim: 0, + modifier: 0, + change: 0, + shift: 0, + i: o, + thread: null + }, r.push(a) + } + }(s), function (t, e, n) { + for (var i, r = [t], o = []; i = r.pop();) if (o.push(i), i.isExpand) { + var a = i.children; + if (a.length) for (var s = 0; s < a.length; s++) r.push(a[s]) + } + for (; i = o.pop();) e(i, n) + }(l, QT, a), s.hierNode.modifier = -l.hierNode.prelim, OC(l, tC); + var u = l, h = l, c = l; + OC(l, (function (t) { + var e = t.getLayout().x; + e < u.getLayout().x && (u = t), e > h.getLayout().x && (h = t), t.depth > c.depth && (c = t) + })); + var p = u === h ? 1 : a(u, h) / 2, d = p - u.getLayout().x, f = 0, g = 0, y = 0, v = 0; + if ("radial" === i) f = r / (h.getLayout().x + p + d), g = o / (c.depth - 1 || 1), OC(l, (function (t) { + y = (t.getLayout().x + d) * f, v = (t.depth - 1) * g; + var e = nC(y, v); + t.setLayout({x: e.x, y: e.y, rawX: y, rawY: v}, !0) + })); else { + var m = t.getOrient(); + "RL" === m || "LR" === m ? (g = o / (h.getLayout().x + p + d), f = r / (c.depth - 1 || 1), OC(l, (function (t) { + v = (t.getLayout().x + d) * g, y = "LR" === m ? (t.depth - 1) * f : r - (t.depth - 1) * f, t.setLayout({ + x: y, + y: v + }, !0) + }))) : "TB" !== m && "BT" !== m || (f = r / (h.getLayout().x + p + d), g = o / (c.depth - 1 || 1), OC(l, (function (t) { + y = (t.getLayout().x + d) * f, v = "TB" === m ? (t.depth - 1) * g : o - (t.depth - 1) * g, t.setLayout({ + x: y, + y: v + }, !0) + }))) + } + } + }(t, e) + })) + } + + function NC(t) { + t.eachSeriesByType("tree", (function (t) { + var e = t.getData(); + e.tree.eachNode((function (t) { + var n = t.getModel().getModel("itemStyle").getItemStyle(); + A(e.ensureUniqueItemVisual(t.dataIndex, "style"), n) + })) + })) + } + + var EC = ["treemapZoomToNode", "treemapRender", "treemapMove"]; + + function zC(t) { + var e = t.getData().tree, n = {}; + e.eachNode((function (e) { + for (var i = e; i && i.depth > 1;) i = i.parentNode; + var r = td(t.ecModel, i.name || i.dataIndex + "", n); + e.setVisual("decal", r) + })) + } + + var VC = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.preventUsingHoverLayer = !0, n + } + + return n(e, t), e.prototype.getInitialData = function (t, e) { + var n = {name: t.name, children: t.data}; + BC(n); + var i = t.levels || [], r = this.designatedVisualItemStyle = {}, o = new pc({itemStyle: r}, this, e), + a = z((i = t.levels = function (t, e) { + var n, i, r = ho(e.get("color")), o = ho(e.get(["aria", "decal", "decals"])); + if (!r) return; + E(t = t || [], (function (t) { + var e = new pc(t), r = e.get("color"), o = e.get("decal"); + (e.get(["itemStyle", "color"]) || r && "none" !== r) && (n = !0), (e.get(["itemStyle", "decal"]) || o && "none" !== o) && (i = !0) + })); + var a = t[0] || (t[0] = {}); + n || (a.color = r.slice()); + !i && o && (a.decal = o.slice()); + return t + }(i, e)) || [], (function (t) { + return new pc(t, o, e) + }), this), s = CC.createTree(n, this, (function (t) { + t.wrapMethod("getItemModel", (function (t, e) { + var n = s.getNodeByDataIndex(e), i = n ? a[n.depth] : null; + return t.parentModel = i || o, t + })) + })); + return s.data + }, e.prototype.optionUpdated = function () { + this.resetViewRoot() + }, e.prototype.formatTooltip = function (t, e, n) { + var i = this.getData(), r = this.getRawValue(t); + return Uf("nameValue", {name: i.getName(t), value: r}) + }, e.prototype.getDataParams = function (e) { + var n = t.prototype.getDataParams.apply(this, arguments), i = this.getData().tree.getNodeByDataIndex(e); + return n.treeAncestors = LC(i, this), n.treePathInfo = n.treeAncestors, n + }, e.prototype.setLayoutInfo = function (t) { + this.layoutInfo = this.layoutInfo || {}, A(this.layoutInfo, t) + }, e.prototype.mapIdToIndex = function (t) { + var e = this._idIndexMap; + e || (e = this._idIndexMap = ft(), this._idIndexMapCount = 0); + var n = e.get(t); + return null == n && e.set(t, n = this._idIndexMapCount++), n + }, e.prototype.getViewRoot = function () { + return this._viewRoot + }, e.prototype.resetViewRoot = function (t) { + t ? this._viewRoot = t : t = this._viewRoot; + var e = this.getRawData().tree.root; + t && (t === e || e.contains(t)) || (this._viewRoot = e) + }, e.prototype.enableAriaDecal = function () { + zC(this) + }, e.type = "series.treemap", e.layoutMode = "box", e.defaultOption = { + progressive: 0, + left: "center", + top: "middle", + width: "80%", + height: "80%", + sort: !0, + clipWindow: "origin", + squareRatio: .5 * (1 + Math.sqrt(5)), + leafDepth: null, + drillDownIcon: "▶", + zoomToNodeRatio: .1024, + roam: !0, + nodeClick: "zoomToNode", + animation: !0, + animationDurationUpdate: 900, + animationEasing: "quinticInOut", + breadcrumb: { + show: !0, + height: 22, + left: "center", + top: "bottom", + emptyItemWidth: 25, + itemStyle: {color: "rgba(0,0,0,0.7)", textStyle: {color: "#fff"}} + }, + label: {show: !0, distance: 0, padding: 5, position: "inside", color: "#fff", overflow: "truncate"}, + upperLabel: {show: !1, position: [0, "50%"], height: 20, overflow: "truncate", verticalAlign: "middle"}, + itemStyle: { + color: null, + colorAlpha: null, + colorSaturation: null, + borderWidth: 0, + gapWidth: 0, + borderColor: "#fff", + borderColorSaturation: null + }, + emphasis: {upperLabel: {show: !0, position: [0, "50%"], overflow: "truncate", verticalAlign: "middle"}}, + visualDimension: 0, + visualMin: null, + visualMax: null, + color: [], + colorAlpha: null, + colorSaturation: null, + colorMappingBy: "index", + visibleMin: 10, + childrenVisibleMin: null, + levels: [] + }, e + }(ag); + + function BC(t) { + var e = 0; + E(t.children, (function (t) { + BC(t); + var n = t.value; + Y(n) && (n = n[0]), e += n + })); + var n = t.value; + Y(n) && (n = n[0]), (null == n || isNaN(n)) && (n = e), n < 0 && (n = 0), Y(t.value) ? t.value[0] = n : t.value = n + } + + var FC = function () { + function t(t) { + this.group = new Cr, t.add(this.group) + } + + return t.prototype.render = function (t, e, n, i) { + var r = t.getModel("breadcrumb"), o = this.group; + if (o.removeAll(), r.get("show") && n) { + var a = r.getModel("itemStyle"), s = a.getModel("textStyle"), l = { + pos: {left: r.get("left"), right: r.get("right"), top: r.get("top"), bottom: r.get("bottom")}, + box: {width: e.getWidth(), height: e.getHeight()}, + emptyItemWidth: r.get("emptyItemWidth"), + totalWidth: 0, + renderList: [] + }; + this._prepare(n, l, s), this._renderContent(t, l, a, s, i), xp(o, l.pos, l.box) + } + }, t.prototype._prepare = function (t, e, n) { + for (var i = t; i; i = i.parentNode) { + var r = xo(i.getModel().get("name"), ""), o = n.getTextRect(r), + a = Math.max(o.width + 16, e.emptyItemWidth); + e.totalWidth += a + 8, e.renderList.push({node: i, text: r, width: a}) + } + }, t.prototype._renderContent = function (t, e, n, i, r) { + for (var o, a, s, l, u, h, c, p, d, f = 0, g = e.emptyItemWidth, y = t.get(["breadcrumb", "height"]), v = (o = e.pos, a = e.box, l = a.width, u = a.height, h = Er(o.left, l), c = Er(o.top, u), p = Er(o.right, l), d = Er(o.bottom, u), (isNaN(h) || isNaN(parseFloat(o.left))) && (h = 0), (isNaN(p) || isNaN(parseFloat(o.right))) && (p = l), (isNaN(c) || isNaN(parseFloat(o.top))) && (c = 0), (isNaN(d) || isNaN(parseFloat(o.bottom))) && (d = u), s = np(s || 0), { + width: Math.max(p - h - s[1] - s[3], 0), + height: Math.max(d - c - s[0] - s[2], 0) + }), m = e.totalWidth, x = e.renderList, _ = x.length - 1; _ >= 0; _--) { + var b = x[_], w = b.node, S = b.width, M = b.text; + m > v.width && (m -= S - g, S = g, M = null); + var I = new Lu({ + shape: {points: GC(f, 0, S, y, _ === x.length - 1, 0 === _)}, + style: k(n.getItemStyle(), {lineJoin: "bevel"}), + textContent: new As({style: {text: M, fill: i.getTextColor(), font: i.getFont()}}), + textConfig: {position: "inside"}, + z2: 1e5, + onclick: H(r, w) + }); + I.disableLabelAnimation = !0, this.group.add(I), WC(I, t, w), f += S + 8 + } + }, t.prototype.remove = function () { + this.group.removeAll() + }, t + }(); + + function GC(t, e, n, i, r, o) { + var a = [[r ? t : t - 5, e], [t + n, e], [t + n, e + i], [r ? t : t - 5, e + i]]; + return !o && a.splice(2, 0, [t + n + 5, e + i / 2]), !r && a.push([t, e + i / 2]), a + } + + function WC(t, e, n) { + Ws(t).eventData = { + componentType: "series", + componentSubType: "treemap", + componentIndex: e.componentIndex, + seriesIndex: e.seriesIndex, + seriesName: e.name, + seriesType: "treemap", + selfType: "breadcrumb", + nodeData: {dataIndex: n && n.dataIndex, name: n && n.name}, + treePathInfo: n && LC(n, e) + } + } + + var HC = function () { + function t() { + this._storage = [], this._elExistsMap = {} + } + + return t.prototype.add = function (t, e, n, i, r) { + return !this._elExistsMap[t.id] && (this._elExistsMap[t.id] = !0, this._storage.push({ + el: t, + target: e, + duration: n, + delay: i, + easing: r + }), !0) + }, t.prototype.finished = function (t) { + return this._finishedCallback = t, this + }, t.prototype.start = function () { + for (var t = this, e = this._storage.length, n = function () { + --e <= 0 && (t._storage.length = 0, t._elExistsMap = {}, t._finishedCallback && t._finishedCallback()) + }, i = 0, r = this._storage.length; i < r; i++) { + var o = this._storage[i]; + o.el.animateTo(o.target, { + duration: o.duration, + delay: o.delay, + easing: o.easing, + setToFinal: !0, + done: n, + aborted: n + }) + } + return this + }, t + }(); + var YC = Cr, UC = Ts, XC = "label", ZC = "upperLabel", + jC = Wo([["fill", "color"], ["stroke", "strokeColor"], ["lineWidth", "strokeWidth"], ["shadowBlur"], ["shadowOffsetX"], ["shadowOffsetY"], ["shadowColor"]]), + qC = function (t) { + var e = jC(t); + return e.stroke = e.fill = e.lineWidth = null, e + }, KC = So(), $C = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n._state = "ready", n._storage = {nodeGroup: [], background: [], content: []}, n + } + + return n(e, t), e.prototype.render = function (t, e, n, i) { + if (!(P(e.findComponents({mainType: "series", subType: "treemap", query: i}), t) < 0)) { + this.seriesModel = t, this.api = n, this.ecModel = e; + var r = DC(i, ["treemapZoomToNode", "treemapRootToNode"], t), o = i && i.type, a = t.layoutInfo, + s = !this._oldTree, l = this._storage, u = "treemapRootToNode" === o && r && l ? { + rootNodeGroup: l.nodeGroup[r.node.getRawIndex()], + direction: i.direction + } : null, h = this._giveContainerGroup(a), c = t.get("animation"), p = this._doRender(h, t, u); + !c || s || o && "treemapZoomToNode" !== o && "treemapRootToNode" !== o ? p.renderFinally() : this._doAnimation(h, p, t, u), this._resetController(n), this._renderBreadcrumb(t, n, r) + } + }, e.prototype._giveContainerGroup = function (t) { + var e = this._containerGroup; + return e || (e = this._containerGroup = new YC, this._initEvents(e), this.group.add(e)), e.x = t.x, e.y = t.y, e + }, e.prototype._doRender = function (t, e, n) { + var i = e.getData().tree, r = this._oldTree, o = {nodeGroup: [], background: [], content: []}, + a = {nodeGroup: [], background: [], content: []}, s = this._storage, l = []; + + function u(t, i, r, u) { + return function (t, e, n, i, r, o, a, s, l, u) { + if (!a) return; + var h = a.getLayout(), c = t.getData(), p = a.getModel(); + if (c.setItemGraphicEl(a.dataIndex, null), !h || !h.isInView) return; + var d = h.width, f = h.height, g = h.borderWidth, y = h.invisible, v = a.getRawIndex(), + m = s && s.getRawIndex(), x = a.viewChildren, _ = h.upperHeight, b = x && x.length, + w = p.getModel("itemStyle"), S = p.getModel(["emphasis", "itemStyle"]), + M = p.getModel(["blur", "itemStyle"]), I = p.getModel(["select", "itemStyle"]), + T = w.get("borderRadius") || 0, C = G("nodeGroup", YC); + if (!C) return; + if (l.add(C), C.x = h.x || 0, C.y = h.y || 0, C.markRedraw(), KC(C).nodeWidth = d, KC(C).nodeHeight = f, h.isAboveViewRoot) return C; + var D = G("background", UC, u, 20); + D && E(C, D, b && h.upperLabelHeight); + var k = p.getModel("emphasis"), L = k.get("focus"), P = k.get("blurScope"), O = k.get("disabled"), + R = "ancestor" === L ? a.getAncestorsIndices() : "descendant" === L ? a.getDescendantIndices() : L; + if (b) Bl(C) && Vl(C, !1), D && (Vl(D, !O), c.setItemGraphicEl(a.dataIndex, D), Rl(D, R, P)); else { + var N = G("content", UC, u, 30); + N && z(C, N), D.disableMorphing = !0, D && Bl(D) && Vl(D, !1), Vl(C, !O), c.setItemGraphicEl(a.dataIndex, C), Rl(C, R, P) + } + return C; + + function E(e, n, i) { + var r = Ws(n); + if (r.dataIndex = a.dataIndex, r.seriesIndex = t.seriesIndex, n.setShape({ + x: 0, + y: 0, + width: d, + height: f, + r: T + }), y) V(n); else { + n.invisible = !1; + var o = a.getVisual("style"), s = o.stroke, l = qC(w); + l.fill = s; + var u = jC(S); + u.fill = S.get("borderColor"); + var h = jC(M); + h.fill = M.get("borderColor"); + var c = jC(I); + if (c.fill = I.get("borderColor"), i) { + var p = d - 2 * g; + B(n, s, o.opacity, {x: g, y: 0, width: p, height: _}) + } else n.removeTextContent(); + n.setStyle(l), n.ensureState("emphasis").style = u, n.ensureState("blur").style = h, n.ensureState("select").style = c, yl(n) + } + e.add(n) + } + + function z(e, n) { + var i = Ws(n); + i.dataIndex = a.dataIndex, i.seriesIndex = t.seriesIndex; + var r = Math.max(d - 2 * g, 0), o = Math.max(f - 2 * g, 0); + if (n.culling = !0, n.setShape({x: g, y: g, width: r, height: o, r: T}), y) V(n); else { + n.invisible = !1; + var s = a.getVisual("style"), l = s.fill, u = qC(w); + u.fill = l, u.decal = s.decal; + var h = jC(S), c = jC(M), p = jC(I); + B(n, l, s.opacity, null), n.setStyle(u), n.ensureState("emphasis").style = h, n.ensureState("blur").style = c, n.ensureState("select").style = p, yl(n) + } + e.add(n) + } + + function V(t) { + !t.invisible && o.push(t) + } + + function B(e, n, i, r) { + var o = p.getModel(r ? ZC : XC), s = xo(p.get("name"), null), l = o.getShallow("show"); + Wh(e, Hh(p, r ? ZC : XC), { + defaultText: l ? s : null, + inheritColor: n, + defaultOpacity: i, + labelFetcher: t, + labelDataIndex: a.dataIndex + }); + var u = e.getTextContent(); + if (u) { + var c = u.style, d = st(c.padding || 0); + r && (e.setTextConfig({layoutRect: r}), u.disableLabelLayout = !0), u.beforeUpdate = function () { + var t = Math.max((r ? r.width : e.shape.width) - d[1] - d[3], 0), + n = Math.max((r ? r.height : e.shape.height) - d[0] - d[2], 0); + c.width === t && c.height === n || u.setStyle({width: t, height: n}) + }, c.truncateMinChar = 2, c.lineOverflow = "truncate", F(c, r, h); + var f = u.getState("emphasis"); + F(f ? f.style : null, r, h) + } + } + + function F(e, n, i) { + var r = e ? e.text : null; + if (!n && i.isLeafRoot && null != r) { + var o = t.get("drillDownIcon", !0); + e.text = o ? o + " " + r : r + } + } + + function G(t, i, o, a) { + var s = null != m && n[t][m], l = r[t]; + return s ? (n[t][m] = null, W(l, s)) : y || ((s = new i) instanceof da && (s.z2 = function (t, e) { + return 100 * t + e + }(o, a)), H(l, s)), e[t][v] = s + } + + function W(t, e) { + var n = t[v] = {}; + e instanceof YC ? (n.oldX = e.x, n.oldY = e.y) : n.oldShape = A({}, e.shape) + } + + function H(t, e) { + var n = t[v] = {}, o = a.parentNode, s = e instanceof Cr; + if (o && (!i || "drillDown" === i.direction)) { + var l = 0, u = 0, h = r.background[o.getRawIndex()]; + !i && h && h.oldShape && (l = h.oldShape.width, u = h.oldShape.height), s ? (n.oldX = 0, n.oldY = u) : n.oldShape = { + x: l, + y: u, + width: 0, + height: 0 + } + } + n.fadein = !s + } + }(e, a, s, n, o, l, t, i, r, u) + } + + !function t(e, n, i, r, o) { + r ? (n = e, E(e, (function (t, e) { + !t.isRemoved() && s(e, e) + }))) : new Sm(n, e, a, a).add(s).update(s).remove(H(s, null)).execute(); + + function a(t) { + return t.getId() + } + + function s(a, s) { + var l = null != a ? e[a] : null, h = null != s ? n[s] : null, c = u(l, h, i, o); + c && t(l && l.viewChildren || [], h && h.viewChildren || [], c, r, o + 1) + } + }(i.root ? [i.root] : [], r && r.root ? [r.root] : [], t, i === r || !r, 0); + var h = function (t) { + var e = {nodeGroup: [], background: [], content: []}; + return t && E(t, (function (t, n) { + var i = e[n]; + E(t, (function (t) { + t && (i.push(t), KC(t).willDelete = !0) + })) + })), e + }(s); + return this._oldTree = i, this._storage = a, { + lastsForAnimation: o, + willDeleteEls: h, + renderFinally: function () { + E(h, (function (t) { + E(t, (function (t) { + t.parent && t.parent.remove(t) + })) + })), E(l, (function (t) { + t.invisible = !0, t.dirty() + })) + } + } + }, e.prototype._doAnimation = function (t, e, n, i) { + var r = n.get("animationDurationUpdate"), o = n.get("animationEasing"), a = (U(r) ? 0 : r) || 0, + s = (U(o) ? null : o) || "cubicOut", l = new HC; + E(e.willDeleteEls, (function (t, e) { + E(t, (function (t, n) { + if (!t.invisible) { + var r, o = t.parent, u = KC(o); + if (i && "drillDown" === i.direction) r = o === i.rootNodeGroup ? { + shape: { + x: 0, + y: 0, + width: u.nodeWidth, + height: u.nodeHeight + }, style: {opacity: 0} + } : {style: {opacity: 0}}; else { + var h = 0, c = 0; + u.willDelete || (h = u.nodeWidth / 2, c = u.nodeHeight / 2), r = "nodeGroup" === e ? { + x: h, + y: c, + style: {opacity: 0} + } : {shape: {x: h, y: c, width: 0, height: 0}, style: {opacity: 0}} + } + r && l.add(t, r, a, 0, s) + } + })) + })), E(this._storage, (function (t, n) { + E(t, (function (t, i) { + var r = e.lastsForAnimation[n][i], o = {}; + r && (t instanceof Cr ? null != r.oldX && (o.x = t.x, o.y = t.y, t.x = r.oldX, t.y = r.oldY) : (r.oldShape && (o.shape = A({}, t.shape), t.setShape(r.oldShape)), r.fadein ? (t.setStyle("opacity", 0), o.style = {opacity: 1}) : 1 !== t.style.opacity && (o.style = {opacity: 1})), l.add(t, o, a, 0, s)) + })) + }), this), this._state = "animating", l.finished(W((function () { + this._state = "ready", e.renderFinally() + }), this)).start() + }, e.prototype._resetController = function (t) { + var e = this._controller; + e || ((e = this._controller = new DI(t.getZr())).enable(this.seriesModel.get("roam")), e.on("pan", W(this._onPan, this)), e.on("zoom", W(this._onZoom, this))); + var n = new sr(0, 0, t.getWidth(), t.getHeight()); + e.setPointerChecker((function (t, e, i) { + return n.contain(e, i) + })) + }, e.prototype._clearController = function () { + var t = this._controller; + t && (t.dispose(), t = null) + }, e.prototype._onPan = function (t) { + if ("animating" !== this._state && (Math.abs(t.dx) > 3 || Math.abs(t.dy) > 3)) { + var e = this.seriesModel.getData().tree.root; + if (!e) return; + var n = e.getLayout(); + if (!n) return; + this.api.dispatchAction({ + type: "treemapMove", + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: {x: n.x + t.dx, y: n.y + t.dy, width: n.width, height: n.height} + }) + } + }, e.prototype._onZoom = function (t) { + var e = t.originX, n = t.originY; + if ("animating" !== this._state) { + var i = this.seriesModel.getData().tree.root; + if (!i) return; + var r = i.getLayout(); + if (!r) return; + var o = new sr(r.x, r.y, r.width, r.height), a = this.seriesModel.layoutInfo, s = [1, 0, 0, 1, 0, 0]; + Ei(s, s, [-(e -= a.x), -(n -= a.y)]), Vi(s, s, [t.scale, t.scale]), Ei(s, s, [e, n]), o.applyTransform(s), this.api.dispatchAction({ + type: "treemapRender", + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: {x: o.x, y: o.y, width: o.width, height: o.height} + }) + } + }, e.prototype._initEvents = function (t) { + var e = this; + t.on("click", (function (t) { + if ("ready" === e._state) { + var n = e.seriesModel.get("nodeClick", !0); + if (n) { + var i = e.findTarget(t.offsetX, t.offsetY); + if (i) { + var r = i.node; + if (r.getLayout().isLeafRoot) e._rootToNode(i); else if ("zoomToNode" === n) e._zoomToNode(i); else if ("link" === n) { + var o = r.hostTree.data.getItemModel(r.dataIndex), a = o.get("link", !0), + s = o.get("target", !0) || "blank"; + a && pp(a, s) + } + } + } + } + }), this) + }, e.prototype._renderBreadcrumb = function (t, e, n) { + var i = this; + n || (n = null != t.get("leafDepth", !0) ? {node: t.getViewRoot()} : this.findTarget(e.getWidth() / 2, e.getHeight() / 2)) || (n = {node: t.getData().tree.root}), (this._breadcrumb || (this._breadcrumb = new FC(this.group))).render(t, e, n.node, (function (e) { + "animating" !== i._state && (kC(t.getViewRoot(), e) ? i._rootToNode({node: e}) : i._zoomToNode({node: e})) + })) + }, e.prototype.remove = function () { + this._clearController(), this._containerGroup && this._containerGroup.removeAll(), this._storage = { + nodeGroup: [], + background: [], + content: [] + }, this._state = "ready", this._breadcrumb && this._breadcrumb.remove() + }, e.prototype.dispose = function () { + this._clearController() + }, e.prototype._zoomToNode = function (t) { + this.api.dispatchAction({ + type: "treemapZoomToNode", + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: t.node + }) + }, e.prototype._rootToNode = function (t) { + this.api.dispatchAction({ + type: "treemapRootToNode", + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: t.node + }) + }, e.prototype.findTarget = function (t, e) { + var n; + return this.seriesModel.getViewRoot().eachNode({attr: "viewChildren", order: "preorder"}, (function (i) { + var r = this._storage.background[i.getRawIndex()]; + if (r) { + var o = r.transformCoordToLocal(t, e), a = r.shape; + if (!(a.x <= o[0] && o[0] <= a.x + a.width && a.y <= o[1] && o[1] <= a.y + a.height)) return !1; + n = {node: i, offsetX: o[0], offsetY: o[1]} + } + }), this), n + }, e.type = "treemap", e + }(mg); + var JC = E, QC = q, tD = -1, eD = function () { + function t(e) { + var n = e.mappingMethod, i = e.type, r = this.option = T(e); + this.type = i, this.mappingMethod = n, this._normalizeData = cD[n]; + var o = t.visualHandlers[i]; + this.applyVisual = o.applyVisual, this.getColorMapper = o.getColorMapper, this._normalizedToVisual = o._normalizedToVisual[n], "piecewise" === n ? (nD(r), function (t) { + var e = t.pieceList; + t.hasSpecialVisual = !1, E(e, (function (e, n) { + e.originIndex = n, null != e.visual && (t.hasSpecialVisual = !0) + })) + }(r)) : "category" === n ? r.categories ? function (t) { + var e = t.categories, n = t.categoryMap = {}, i = t.visual; + if (JC(e, (function (t, e) { + n[t] = e + })), !Y(i)) { + var r = []; + q(i) ? JC(i, (function (t, e) { + var i = n[e]; + r[null != i ? i : tD] = t + })) : r[-1] = i, i = hD(t, r) + } + for (var o = e.length - 1; o >= 0; o--) null == i[o] && (delete n[e[o]], e.pop()) + }(r) : nD(r, !0) : (lt("linear" !== n || r.dataExtent), nD(r)) + } + + return t.prototype.mapValueToVisual = function (t) { + var e = this._normalizeData(t); + return this._normalizedToVisual(e, t) + }, t.prototype.getNormalizer = function () { + return W(this._normalizeData, this) + }, t.listVisualTypes = function () { + return G(t.visualHandlers) + }, t.isValidType = function (e) { + return t.visualHandlers.hasOwnProperty(e) + }, t.eachVisual = function (t, e, n) { + q(t) ? E(t, e, n) : e.call(n, t) + }, t.mapVisual = function (e, n, i) { + var r, o = Y(e) ? [] : q(e) ? {} : (r = !0, null); + return t.eachVisual(e, (function (t, e) { + var a = n.call(i, t, e); + r ? o = a : o[e] = a + })), o + }, t.retrieveVisuals = function (e) { + var n, i = {}; + return e && JC(t.visualHandlers, (function (t, r) { + e.hasOwnProperty(r) && (i[r] = e[r], n = !0) + })), n ? i : null + }, t.prepareVisualTypes = function (t) { + if (Y(t)) t = t.slice(); else { + if (!QC(t)) return []; + var e = []; + JC(t, (function (t, n) { + e.push(n) + })), t = e + } + return t.sort((function (t, e) { + return "color" === e && "color" !== t && 0 === t.indexOf("color") ? 1 : -1 + })), t + }, t.dependsOn = function (t, e) { + return "color" === e ? !(!t || 0 !== t.indexOf(e)) : t === e + }, t.findPieceIndex = function (t, e, n) { + for (var i, r = 1 / 0, o = 0, a = e.length; o < a; o++) { + var s = e[o].value; + if (null != s) { + if (s === t || X(s) && s === t + "") return o; + n && c(s, o) + } + } + for (o = 0, a = e.length; o < a; o++) { + var l = e[o], u = l.interval, h = l.close; + if (u) { + if (u[0] === -1 / 0) { + if (pD(h[1], t, u[1])) return o + } else if (u[1] === 1 / 0) { + if (pD(h[0], u[0], t)) return o + } else if (pD(h[0], u[0], t) && pD(h[1], t, u[1])) return o; + n && c(u[0], o), n && c(u[1], o) + } + } + if (n) return t === 1 / 0 ? e.length - 1 : t === -1 / 0 ? 0 : i; + + function c(e, n) { + var o = Math.abs(e - t); + o < r && (r = o, i = n) + } + }, t.visualHandlers = { + color: { + applyVisual: oD("color"), getColorMapper: function () { + var t = this.option; + return W("category" === t.mappingMethod ? function (t, e) { + return !e && (t = this._normalizeData(t)), aD.call(this, t) + } : function (e, n, i) { + var r = !!i; + return !n && (e = this._normalizeData(e)), i = Mn(e, t.parsedVisual, i), r ? i : kn(i, "rgba") + }, this) + }, _normalizedToVisual: { + linear: function (t) { + return kn(Mn(t, this.option.parsedVisual), "rgba") + }, category: aD, piecewise: function (t, e) { + var n = uD.call(this, e); + return null == n && (n = kn(Mn(t, this.option.parsedVisual), "rgba")), n + }, fixed: sD + } + }, + colorHue: iD((function (t, e) { + return Dn(t, e) + })), + colorSaturation: iD((function (t, e) { + return Dn(t, null, e) + })), + colorLightness: iD((function (t, e) { + return Dn(t, null, null, e) + })), + colorAlpha: iD((function (t, e) { + return An(t, e) + })), + decal: { + applyVisual: oD("decal"), + _normalizedToVisual: {linear: null, category: aD, piecewise: null, fixed: null} + }, + opacity: {applyVisual: oD("opacity"), _normalizedToVisual: lD([0, 1])}, + liftZ: { + applyVisual: oD("liftZ"), + _normalizedToVisual: {linear: sD, category: sD, piecewise: sD, fixed: sD} + }, + symbol: { + applyVisual: function (t, e, n) { + n("symbol", this.mapValueToVisual(t)) + }, _normalizedToVisual: { + linear: rD, category: aD, piecewise: function (t, e) { + var n = uD.call(this, e); + return null == n && (n = rD.call(this, t)), n + }, fixed: sD + } + }, + symbolSize: {applyVisual: oD("symbolSize"), _normalizedToVisual: lD([0, 1])} + }, t + }(); + + function nD(t, e) { + var n = t.visual, i = []; + q(n) ? JC(n, (function (t) { + i.push(t) + })) : null != n && i.push(n); + e || 1 !== i.length || {color: 1, symbol: 1}.hasOwnProperty(t.type) || (i[1] = i[0]), hD(t, i) + } + + function iD(t) { + return { + applyVisual: function (e, n, i) { + var r = this.mapValueToVisual(e); + i("color", t(n("color"), r)) + }, _normalizedToVisual: lD([0, 1]) + } + } + + function rD(t) { + var e = this.option.visual; + return e[Math.round(Nr(t, [0, 1], [0, e.length - 1], !0))] || {} + } + + function oD(t) { + return function (e, n, i) { + i(t, this.mapValueToVisual(e)) + } + } + + function aD(t) { + var e = this.option.visual; + return e[this.option.loop && t !== tD ? t % e.length : t] + } + + function sD() { + return this.option.visual[0] + } + + function lD(t) { + return { + linear: function (e) { + return Nr(e, t, this.option.visual, !0) + }, category: aD, piecewise: function (e, n) { + var i = uD.call(this, n); + return null == i && (i = Nr(e, t, this.option.visual, !0)), i + }, fixed: sD + } + } + + function uD(t) { + var e = this.option, n = e.pieceList; + if (e.hasSpecialVisual) { + var i = n[eD.findPieceIndex(t, n)]; + if (i && i.visual) return i.visual[this.type] + } + } + + function hD(t, e) { + return t.visual = e, "color" === t.type && (t.parsedVisual = z(e, (function (t) { + return bn(t) + }))), e + } + + var cD = { + linear: function (t) { + return Nr(t, this.option.dataExtent, [0, 1], !0) + }, piecewise: function (t) { + var e = this.option.pieceList, n = eD.findPieceIndex(t, e, !0); + if (null != n) return Nr(n, [0, e.length - 1], [0, 1], !0) + }, category: function (t) { + var e = this.option.categories ? this.option.categoryMap[t] : t; + return null == e ? tD : e + }, fixed: xt + }; + + function pD(t, e, n) { + return t ? e <= n : e < n + } + + var dD = So(), fD = { + seriesType: "treemap", reset: function (t) { + var e = t.getData().tree.root; + e.isRemoved() || gD(e, {}, t.getViewRoot().getAncestors(), t) + } + }; + + function gD(t, e, n, i) { + var r = t.getModel(), o = t.getLayout(), a = t.hostTree.data; + if (o && !o.invisible && o.isInView) { + var s, l = r.getModel("itemStyle"), u = function (t, e, n) { + var i = A({}, e), r = n.designatedVisualItemStyle; + return E(["color", "colorAlpha", "colorSaturation"], (function (n) { + r[n] = e[n]; + var o = t.get(n); + r[n] = null, null != o && (i[n] = o) + })), i + }(l, e, i), h = a.ensureUniqueItemVisual(t.dataIndex, "style"), c = l.get("borderColor"), + p = l.get("borderColorSaturation"); + null != p && (c = function (t, e) { + return null != e ? Dn(e, null, null, t) : null + }(p, s = yD(u))), h.stroke = c; + var d = t.viewChildren; + if (d && d.length) { + var f = function (t, e, n, i, r, o) { + if (!o || !o.length) return; + var a = mD(e, "color") || null != r.color && "none" !== r.color && (mD(e, "colorAlpha") || mD(e, "colorSaturation")); + if (!a) return; + var s = e.get("visualMin"), l = e.get("visualMax"), u = n.dataExtent.slice(); + null != s && s < u[0] && (u[0] = s), null != l && l > u[1] && (u[1] = l); + var h = e.get("colorMappingBy"), c = {type: a.name, dataExtent: u, visual: a.range}; + "color" !== c.type || "index" !== h && "id" !== h ? c.mappingMethod = "linear" : (c.mappingMethod = "category", c.loop = !0); + var p = new eD(c); + return dD(p).drColorMappingBy = h, p + }(0, r, o, 0, u, d); + E(d, (function (t, e) { + if (t.depth >= n.length || t === n[t.depth]) { + var o = function (t, e, n, i, r, o) { + var a = A({}, e); + if (r) { + var s = r.type, l = "color" === s && dD(r).drColorMappingBy, + u = "index" === l ? i : "id" === l ? o.mapIdToIndex(n.getId()) : n.getValue(t.get("visualDimension")); + a[s] = r.mapValueToVisual(u) + } + return a + }(r, u, t, e, f, i); + gD(t, o, n, i) + } + })) + } else s = yD(u), h.fill = s + } + } + + function yD(t) { + var e = vD(t, "color"); + if (e) { + var n = vD(t, "colorAlpha"), i = vD(t, "colorSaturation"); + return i && (e = Dn(e, null, null, i)), n && (e = An(e, n)), e + } + } + + function vD(t, e) { + var n = t[e]; + if (null != n && "none" !== n) return n + } + + function mD(t, e) { + var n = t.get(e); + return Y(n) && n.length ? {name: e, range: n} : null + } + + var xD = Math.max, _D = Math.min, bD = it, wD = E, SD = ["itemStyle", "borderWidth"], + MD = ["itemStyle", "gapWidth"], ID = ["upperLabel", "show"], TD = ["upperLabel", "height"], CD = { + seriesType: "treemap", reset: function (t, e, n, i) { + var r = n.getWidth(), o = n.getHeight(), a = t.option, + s = mp(t.getBoxLayoutParams(), {width: n.getWidth(), height: n.getHeight()}), l = a.size || [], + u = Er(bD(s.width, l[0]), r), h = Er(bD(s.height, l[1]), o), c = i && i.type, + p = DC(i, ["treemapZoomToNode", "treemapRootToNode"], t), + d = "treemapRender" === c || "treemapMove" === c ? i.rootRect : null, f = t.getViewRoot(), g = AC(f); + if ("treemapMove" !== c) { + var y = "treemapZoomToNode" === c ? function (t, e, n, i, r) { + var o, a = (e || {}).node, s = [i, r]; + if (!a || a === n) return s; + var l = i * r, u = l * t.option.zoomToNodeRatio; + for (; o = a.parentNode;) { + for (var h = 0, c = o.children, p = 0, d = c.length; p < d; p++) h += c[p].getValue(); + var f = a.getValue(); + if (0 === f) return s; + u *= h / f; + var g = o.getModel(), y = g.get(SD); + (u += 4 * y * y + (3 * y + Math.max(y, PD(g))) * Math.pow(u, .5)) > Yr && (u = Yr), a = o + } + u < l && (u = l); + var v = Math.pow(u / l, .5); + return [i * v, r * v] + }(t, p, f, u, h) : d ? [d.width, d.height] : [u, h], v = a.sort; + v && "asc" !== v && "desc" !== v && (v = "desc"); + var m = {squareRatio: a.squareRatio, sort: v, leafDepth: a.leafDepth}; + f.hostTree.clearLayouts(); + var x = {x: 0, y: 0, width: y[0], height: y[1], area: y[0] * y[1]}; + f.setLayout(x), DD(f, m, !1, 0), x = f.getLayout(), wD(g, (function (t, e) { + var n = (g[e + 1] || f).getValue(); + t.setLayout(A({dataExtent: [n, n], borderWidth: 0, upperHeight: 0}, x)) + })) + } + var _ = t.getData().tree.root; + _.setLayout(function (t, e, n) { + if (e) return {x: e.x, y: e.y}; + var i = {x: 0, y: 0}; + if (!n) return i; + var r = n.node, o = r.getLayout(); + if (!o) return i; + var a = [o.width / 2, o.height / 2], s = r; + for (; s;) { + var l = s.getLayout(); + a[0] += l.x, a[1] += l.y, s = s.parentNode + } + return {x: t.width / 2 - a[0], y: t.height / 2 - a[1]} + }(s, d, p), !0), t.setLayoutInfo(s), LD(_, new sr(-s.x, -s.y, r, o), g, f, 0) + } + }; + + function DD(t, e, n, i) { + var r, o; + if (!t.isRemoved()) { + var a = t.getLayout(); + r = a.width, o = a.height; + var s = t.getModel(), l = s.get(SD), u = s.get(MD) / 2, h = PD(s), c = Math.max(l, h), p = l - u, d = c - u; + t.setLayout({borderWidth: l, upperHeight: c, upperLabelHeight: h}, !0); + var f = (r = xD(r - 2 * p, 0)) * (o = xD(o - p - d, 0)), g = function (t, e, n, i, r, o) { + var a = t.children || [], s = i.sort; + "asc" !== s && "desc" !== s && (s = null); + var l = null != i.leafDepth && i.leafDepth <= o; + if (r && !l) return t.viewChildren = []; + !function (t, e) { + e && t.sort((function (t, n) { + var i = "asc" === e ? t.getValue() - n.getValue() : n.getValue() - t.getValue(); + return 0 === i ? "asc" === e ? t.dataIndex - n.dataIndex : n.dataIndex - t.dataIndex : i + })) + }(a = B(a, (function (t) { + return !t.isRemoved() + })), s); + var u = function (t, e, n) { + for (var i = 0, r = 0, o = e.length; r < o; r++) i += e[r].getValue(); + var a, s = t.get("visualDimension"); + e && e.length ? "value" === s && n ? (a = [e[e.length - 1].getValue(), e[0].getValue()], "asc" === n && a.reverse()) : (a = [1 / 0, -1 / 0], wD(e, (function (t) { + var e = t.getValue(s); + e < a[0] && (a[0] = e), e > a[1] && (a[1] = e) + }))) : a = [NaN, NaN]; + return {sum: i, dataExtent: a} + }(e, a, s); + if (0 === u.sum) return t.viewChildren = []; + if (u.sum = function (t, e, n, i, r) { + if (!i) return n; + for (var o = t.get("visibleMin"), a = r.length, s = a, l = a - 1; l >= 0; l--) { + var u = r["asc" === i ? a - l - 1 : l].getValue(); + u / n * e < o && (s = l, n -= u) + } + return "asc" === i ? r.splice(0, a - s) : r.splice(s, a - s), n + }(e, n, u.sum, s, a), 0 === u.sum) return t.viewChildren = []; + for (var h = 0, c = a.length; h < c; h++) { + var p = a[h].getValue() / u.sum * n; + a[h].setLayout({area: p}) + } + l && (a.length && t.setLayout({isLeafRoot: !0}, !0), a.length = 0); + return t.viewChildren = a, t.setLayout({dataExtent: u.dataExtent}, !0), a + }(t, s, f, e, n, i); + if (g.length) { + var y = {x: p, y: d, width: r, height: o}, v = _D(r, o), m = 1 / 0, x = []; + x.area = 0; + for (var _ = 0, b = g.length; _ < b;) { + var w = g[_]; + x.push(w), x.area += w.getLayout().area; + var S = AD(x, v, e.squareRatio); + S <= m ? (_++, m = S) : (x.area -= x.pop().getLayout().area, kD(x, v, y, u, !1), v = _D(y.width, y.height), x.length = x.area = 0, m = 1 / 0) + } + if (x.length && kD(x, v, y, u, !0), !n) { + var M = s.get("childrenVisibleMin"); + null != M && f < M && (n = !0) + } + for (_ = 0, b = g.length; _ < b; _++) DD(g[_], e, n, i + 1) + } + } + } + + function AD(t, e, n) { + for (var i = 0, r = 1 / 0, o = 0, a = void 0, s = t.length; o < s; o++) (a = t[o].getLayout().area) && (a < r && (r = a), a > i && (i = a)); + var l = t.area * t.area, u = e * e * n; + return l ? xD(u * i / l, l / (u * r)) : 1 / 0 + } + + function kD(t, e, n, i, r) { + var o = e === n.width ? 0 : 1, a = 1 - o, s = ["x", "y"], l = ["width", "height"], u = n[s[o]], + h = e ? t.area / e : 0; + (r || h > n[l[a]]) && (h = n[l[a]]); + for (var c = 0, p = t.length; c < p; c++) { + var d = t[c], f = {}, g = h ? d.getLayout().area / h : 0, y = f[l[a]] = xD(h - 2 * i, 0), + v = n[s[o]] + n[l[o]] - u, m = c === p - 1 || v < g ? v : g, x = f[l[o]] = xD(m - 2 * i, 0); + f[s[a]] = n[s[a]] + _D(i, y / 2), f[s[o]] = u + _D(i, x / 2), u += m, d.setLayout(f, !0) + } + n[s[a]] += h, n[l[a]] -= h + } + + function LD(t, e, n, i, r) { + var o = t.getLayout(), a = n[r], s = a && a === t; + if (!(a && !s || r === n.length && t !== i)) { + t.setLayout({isInView: !0, invisible: !s && !e.intersect(o), isAboveViewRoot: s}, !0); + var l = new sr(e.x - o.x, e.y - o.y, e.width, e.height); + wD(t.viewChildren || [], (function (t) { + LD(t, l, n, i, r + 1) + })) + } + } + + function PD(t) { + return t.get(ID) ? t.get(TD) : 0 + } + + function OD(t) { + var e = t.findComponents({mainType: "legend"}); + e && e.length && t.eachSeriesByType("graph", (function (t) { + var n = t.getCategoriesData(), i = t.getGraph().data, r = n.mapArray(n.getName); + i.filterSelf((function (t) { + var n = i.getItemModel(t).getShallow("category"); + if (null != n) { + j(n) && (n = r[n]); + for (var o = 0; o < e.length; o++) if (!e[o].isSelected(n)) return !1 + } + return !0 + })) + })) + } + + function RD(t) { + var e = {}; + t.eachSeriesByType("graph", (function (t) { + var n = t.getCategoriesData(), i = t.getData(), r = {}; + n.each((function (i) { + var o = n.getName(i); + r["ec-" + o] = i; + var a = n.getItemModel(i), s = a.getModel("itemStyle").getItemStyle(); + s.fill || (s.fill = t.getColorFromPalette(o, e)), n.setItemVisual(i, "style", s); + for (var l = ["symbol", "symbolSize", "symbolKeepAspect"], u = 0; u < l.length; u++) { + var h = a.getShallow(l[u], !0); + null != h && n.setItemVisual(i, l[u], h) + } + })), n.count() && i.each((function (t) { + var e = i.getItemModel(t).getShallow("category"); + if (null != e) { + X(e) && (e = r["ec-" + e]); + var o = n.getItemVisual(e, "style"); + A(i.ensureUniqueItemVisual(t, "style"), o); + for (var a = ["symbol", "symbolSize", "symbolKeepAspect"], s = 0; s < a.length; s++) i.setItemVisual(t, a[s], n.getItemVisual(e, a[s])) + } + })) + })) + } + + function ND(t) { + return t instanceof Array || (t = [t, t]), t + } + + function ED(t) { + t.eachSeriesByType("graph", (function (t) { + var e = t.getGraph(), n = t.getEdgeData(), i = ND(t.get("edgeSymbol")), r = ND(t.get("edgeSymbolSize")); + n.setVisual("fromSymbol", i && i[0]), n.setVisual("toSymbol", i && i[1]), n.setVisual("fromSymbolSize", r && r[0]), n.setVisual("toSymbolSize", r && r[1]), n.setVisual("style", t.getModel("lineStyle").getLineStyle()), n.each((function (t) { + var i = n.getItemModel(t), r = e.getEdgeByIndex(t), o = ND(i.getShallow("symbol", !0)), + a = ND(i.getShallow("symbolSize", !0)), s = i.getModel("lineStyle").getLineStyle(), + l = n.ensureUniqueItemVisual(t, "style"); + switch (A(l, s), l.stroke) { + case"source": + var u = r.node1.getVisual("style"); + l.stroke = u && u.fill; + break; + case"target": + u = r.node2.getVisual("style"); + l.stroke = u && u.fill + } + o[0] && r.setVisual("fromSymbol", o[0]), o[1] && r.setVisual("toSymbol", o[1]), a[0] && r.setVisual("fromSymbolSize", a[0]), a[1] && r.setVisual("toSymbolSize", a[1]) + })) + })) + } + + var zD = "--\x3e", VD = function (t) { + return t.get("autoCurveness") || null + }, BD = function (t, e) { + var n = VD(t), i = 20, r = []; + if (j(n)) i = n; else if (Y(n)) return void (t.__curvenessList = n); + e > i && (i = e); + var o = i % 2 ? i + 2 : i + 3; + r = []; + for (var a = 0; a < o; a++) r.push((a % 2 ? a + 1 : a) / 10 * (a % 2 ? -1 : 1)); + t.__curvenessList = r + }, FD = function (t, e, n) { + var i = [t.id, t.dataIndex].join("."), r = [e.id, e.dataIndex].join("."); + return [n.uid, i, r].join(zD) + }, GD = function (t) { + var e = t.split(zD); + return [e[0], e[2], e[1]].join(zD) + }, WD = function (t, e) { + var n = e.__edgeMap; + return n[t] ? n[t].length : 0 + }; + + function HD(t, e, n, i) { + var r = VD(e), o = Y(r); + if (!r) return null; + var a = function (t, e) { + var n = FD(t.node1, t.node2, e); + return e.__edgeMap[n] + }(t, e); + if (!a) return null; + for (var s = -1, l = 0; l < a.length; l++) if (a[l] === n) { + s = l; + break + } + var u = function (t, e) { + return WD(FD(t.node1, t.node2, e), e) + WD(FD(t.node2, t.node1, e), e) + }(t, e); + BD(e, u), t.lineStyle = t.lineStyle || {}; + var h = FD(t.node1, t.node2, e), c = e.__curvenessList, p = o || u % 2 ? 0 : 1; + if (a.isForward) return c[p + s]; + var d = GD(h), f = WD(d, e), g = c[s + f + p]; + return i ? o ? r && 0 === r[0] ? (f + p) % 2 ? g : -g : ((f % 2 ? 0 : 1) + p) % 2 ? g : -g : (f + p) % 2 ? g : -g : c[s + f + p] + } + + function YD(t) { + var e = t.coordinateSystem; + if (!e || "view" === e.type) { + var n = t.getGraph(); + n.eachNode((function (t) { + var e = t.getModel(); + t.setLayout([+e.get("x"), +e.get("y")]) + })), UD(n, t) + } + } + + function UD(t, e) { + t.eachEdge((function (t, n) { + var i = ot(t.getModel().get(["lineStyle", "curveness"]), -HD(t, e, n, !0), 0), r = Mt(t.node1.getLayout()), + o = Mt(t.node2.getLayout()), a = [r, o]; + +i && a.push([(r[0] + o[0]) / 2 - (r[1] - o[1]) * i, (r[1] + o[1]) / 2 - (o[0] - r[0]) * i]), t.setLayout(a) + })) + } + + function XD(t, e) { + t.eachSeriesByType("graph", (function (t) { + var e = t.get("layout"), n = t.coordinateSystem; + if (n && "view" !== n.type) { + var i = t.getData(), r = []; + E(n.dimensions, (function (t) { + r = r.concat(i.mapDimensionsAll(t)) + })); + for (var o = 0; o < i.count(); o++) { + for (var a = [], s = !1, l = 0; l < r.length; l++) { + var u = i.get(r[l], o); + isNaN(u) || (s = !0), a.push(u) + } + s ? i.setItemLayout(o, n.dataToPoint(a)) : i.setItemLayout(o, [NaN, NaN]) + } + UD(i.graph, t) + } else e && "none" !== e || YD(t) + })) + } + + function ZD(t) { + var e = t.coordinateSystem; + if ("view" !== e.type) return 1; + var n = t.option.nodeScaleRatio, i = e.scaleX; + return ((e.getZoom() - 1) * n + 1) / i + } + + function jD(t) { + var e = t.getVisual("symbolSize"); + return e instanceof Array && (e = (e[0] + e[1]) / 2), +e + } + + var qD = Math.PI, KD = []; + + function $D(t, e) { + var n = t.coordinateSystem; + if (!n || "view" === n.type) { + var i = n.getBoundingRect(), r = t.getData(), o = r.graph, a = i.width / 2 + i.x, s = i.height / 2 + i.y, + l = Math.min(i.width, i.height) / 2, u = r.count(); + r.setLayout({cx: a, cy: s}), u && (JD[e](t, o, r, l, a, s, u), o.eachEdge((function (e, n) { + var i, r = ot(e.getModel().get(["lineStyle", "curveness"]), HD(e, t, n), 0), + o = Mt(e.node1.getLayout()), l = Mt(e.node2.getLayout()), u = (o[0] + l[0]) / 2, + h = (o[1] + l[1]) / 2; + +r && (i = [a * (r *= 3) + u * (1 - r), s * r + h * (1 - r)]), e.setLayout([o, l, i]) + }))) + } + } + + var JD = { + value: function (t, e, n, i, r, o, a) { + var s = 0, l = n.getSum("value"), u = 2 * Math.PI / (l || a); + e.eachNode((function (t) { + var e = t.getValue("value"), n = u * (l ? e : 1) / 2; + s += n, t.setLayout([i * Math.cos(s) + r, i * Math.sin(s) + o]), s += n + })) + }, symbolSize: function (t, e, n, i, r, o, a) { + var s = 0; + KD.length = a; + var l = ZD(t); + e.eachNode((function (t) { + var e = jD(t); + isNaN(e) && (e = 2), e < 0 && (e = 0), e *= l; + var n = Math.asin(e / 2 / i); + isNaN(n) && (n = qD / 2), KD[t.dataIndex] = n, s += 2 * n + })); + var u = (2 * qD - s) / a / 2, h = 0; + e.eachNode((function (t) { + var e = u + KD[t.dataIndex]; + h += e, t.setLayout([i * Math.cos(h) + r, i * Math.sin(h) + o]), h += e + })) + } + }; + + function QD(t) { + t.eachSeriesByType("graph", (function (t) { + "circular" === t.get("layout") && $D(t, "symbolSize") + })) + } + + var tA = Ct; + + function eA(t) { + t.eachSeriesByType("graph", (function (t) { + var e = t.coordinateSystem; + if (!e || "view" === e.type) if ("force" === t.get("layout")) { + var n = t.preservedPoints || {}, i = t.getGraph(), r = i.data, o = i.edgeData, a = t.getModel("force"), + s = a.get("initLayout"); + t.preservedPoints ? r.each((function (t) { + var e = r.getId(t); + r.setItemLayout(t, n[e] || [NaN, NaN]) + })) : s && "none" !== s ? "circular" === s && $D(t, "value") : YD(t); + var l = r.getDataExtent("value"), u = o.getDataExtent("value"), h = a.get("repulsion"), + c = a.get("edgeLength"), p = Y(h) ? h : [h, h], d = Y(c) ? c : [c, c]; + d = [d[1], d[0]]; + var f = r.mapArray("value", (function (t, e) { + var n = r.getItemLayout(e), i = Nr(t, l, p); + return isNaN(i) && (i = (p[0] + p[1]) / 2), { + w: i, + rep: i, + fixed: r.getItemModel(e).get("fixed"), + p: !n || isNaN(n[0]) || isNaN(n[1]) ? null : n + } + })), g = o.mapArray("value", (function (e, n) { + var r = i.getEdgeByIndex(n), o = Nr(e, u, d); + isNaN(o) && (o = (d[0] + d[1]) / 2); + var a = r.getModel(), s = ot(r.getModel().get(["lineStyle", "curveness"]), -HD(r, t, n, !0), 0); + return { + n1: f[r.node1.dataIndex], + n2: f[r.node2.dataIndex], + d: o, + curveness: s, + ignoreForceLayout: a.get("ignoreForceLayout") + } + })), y = e.getBoundingRect(), v = function (t, e, n) { + for (var i = t, r = e, o = n.rect, a = o.width, s = o.height, l = [o.x + a / 2, o.y + s / 2], u = null == n.gravity ? .1 : n.gravity, h = 0; h < i.length; h++) { + var c = i[h]; + c.p || (c.p = wt(a * (Math.random() - .5) + l[0], s * (Math.random() - .5) + l[1])), c.pp = Mt(c.p), c.edges = null + } + var p, d, f = null == n.friction ? .6 : n.friction, g = f; + return { + warmUp: function () { + g = .8 * f + }, setFixed: function (t) { + i[t].fixed = !0 + }, setUnfixed: function (t) { + i[t].fixed = !1 + }, beforeStep: function (t) { + p = t + }, afterStep: function (t) { + d = t + }, step: function (t) { + p && p(i, r); + for (var e = [], n = i.length, o = 0; o < r.length; o++) { + var a = r[o]; + if (!a.ignoreForceLayout) { + var s = a.n1; + Dt(e, (y = a.n2).p, s.p); + var h = At(e) - a.d, c = y.w / (s.w + y.w); + isNaN(c) && (c = 0), Rt(e, e), !s.fixed && tA(s.p, s.p, e, c * h * g), !y.fixed && tA(y.p, y.p, e, -(1 - c) * h * g) + } + } + for (o = 0; o < n; o++) (x = i[o]).fixed || (Dt(e, l, x.p), tA(x.p, x.p, e, u * g)); + for (o = 0; o < n; o++) { + s = i[o]; + for (var f = o + 1; f < n; f++) { + var y; + Dt(e, (y = i[f]).p, s.p), 0 === (h = At(e)) && (It(e, Math.random() - .5, Math.random() - .5), h = 1); + var v = (s.rep + y.rep) / h / h; + !s.fixed && tA(s.pp, s.pp, e, v), !y.fixed && tA(y.pp, y.pp, e, -v) + } + } + var m = []; + for (o = 0; o < n; o++) { + var x; + (x = i[o]).fixed || (Dt(m, x.p, x.pp), tA(x.p, x.p, m, g), St(x.pp, x.p)) + } + var _ = (g *= .992) < .01; + d && d(i, r, _), t && t(_) + } + } + }(f, g, {rect: y, gravity: a.get("gravity"), friction: a.get("friction")}); + v.beforeStep((function (t, e) { + for (var n = 0, r = t.length; n < r; n++) t[n].fixed && St(t[n].p, i.getNodeByIndex(n).getLayout()) + })), v.afterStep((function (t, e, o) { + for (var a = 0, s = t.length; a < s; a++) t[a].fixed || i.getNodeByIndex(a).setLayout(t[a].p), n[r.getId(a)] = t[a].p; + for (a = 0, s = e.length; a < s; a++) { + var l = e[a], u = i.getEdgeByIndex(a), h = l.n1.p, c = l.n2.p, p = u.getLayout(); + (p = p ? p.slice() : [])[0] = p[0] || [], p[1] = p[1] || [], St(p[0], h), St(p[1], c), +l.curveness && (p[2] = [(h[0] + c[0]) / 2 - (h[1] - c[1]) * l.curveness, (h[1] + c[1]) / 2 - (c[0] - h[0]) * l.curveness]), u.setLayout(p) + } + })), t.forceLayout = v, t.preservedPoints = n, v.step() + } else t.forceLayout = null + })) + } + + function nA(t, e) { + var n = []; + return t.eachSeriesByType("graph", (function (t) { + var i = t.get("coordinateSystem"); + if (!i || "view" === i) { + var r = t.getData(), o = [], a = []; + Ma(r.mapArray((function (t) { + var e = r.getItemModel(t); + return [+e.get("x"), +e.get("y")] + })), o, a), a[0] - o[0] == 0 && (a[0] += 1, o[0] -= 1), a[1] - o[1] == 0 && (a[1] += 1, o[1] -= 1); + var s = (a[0] - o[0]) / (a[1] - o[1]), l = function (t, e, n) { + return mp(A(t.getBoxLayoutParams(), {aspect: n}), {width: e.getWidth(), height: e.getHeight()}) + }(t, e, s); + isNaN(s) && (o = [l.x, l.y], a = [l.x + l.width, l.y + l.height]); + var u = a[0] - o[0], h = a[1] - o[1], c = l.width, p = l.height, d = t.coordinateSystem = new BT; + d.zoomLimit = t.get("scaleLimit"), d.setBoundingRect(o[0], o[1], u, h), d.setViewRect(l.x, l.y, c, p), d.setCenter(t.get("center")), d.setZoom(t.get("zoom")), n.push(d) + } + })), n + } + + var iA = Eu.prototype, rA = Fu.prototype, oA = function () { + this.x1 = 0, this.y1 = 0, this.x2 = 0, this.y2 = 0, this.percent = 1 + }; + !function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + n(e, t) + }(oA); + + function aA(t) { + return isNaN(+t.cpx1) || isNaN(+t.cpy1) + } + + var sA = function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n.type = "ec-line", n + } + + return n(e, t), e.prototype.getDefaultStyle = function () { + return {stroke: "#000", fill: null} + }, e.prototype.getDefaultShape = function () { + return new oA + }, e.prototype.buildPath = function (t, e) { + aA(e) ? iA.buildPath.call(this, t, e) : rA.buildPath.call(this, t, e) + }, e.prototype.pointAt = function (t) { + return aA(this.shape) ? iA.pointAt.call(this, t) : rA.pointAt.call(this, t) + }, e.prototype.tangentAt = function (t) { + var e = this.shape, n = aA(e) ? [e.x2 - e.x1, e.y2 - e.y1] : rA.tangentAt.call(this, t); + return Rt(n, n) + }, e + }(fs), lA = ["fromSymbol", "toSymbol"]; + + function uA(t) { + return "_" + t + "Type" + } + + function hA(t, e, n) { + var i = e.getItemVisual(n, t); + if (i && "none" !== i) { + var r = e.getItemVisual(n, t + "Size"), o = e.getItemVisual(n, t + "Rotate"), + a = e.getItemVisual(n, t + "Offset"), s = e.getItemVisual(n, t + "KeepAspect"), l = Ly(r), + u = Py(a || 0, l), h = ky(i, -l[0] / 2 + u[0], -l[1] / 2 + u[1], l[0], l[1], null, s); + return h.__specifiedRotation = null == o || isNaN(o) ? void 0 : +o * Math.PI / 180 || 0, h.name = t, h + } + } + + function cA(t, e) { + t.x1 = e[0][0], t.y1 = e[0][1], t.x2 = e[1][0], t.y2 = e[1][1], t.percent = 1; + var n = e[2]; + n ? (t.cpx1 = n[0], t.cpy1 = n[1]) : (t.cpx1 = NaN, t.cpy1 = NaN) + } + + var pA = function (t) { + function e(e, n, i) { + var r = t.call(this) || this; + return r._createLine(e, n, i), r + } + + return n(e, t), e.prototype._createLine = function (t, e, n) { + var i = t.hostModel, r = function (t) { + var e = new sA({name: "line", subPixelOptimize: !0}); + return cA(e.shape, t), e + }(t.getItemLayout(e)); + r.shape.percent = 0, rh(r, {shape: {percent: 1}}, i, e), this.add(r), E(lA, (function (n) { + var i = hA(n, t, e); + this.add(i), this[uA(n)] = t.getItemVisual(e, n) + }), this), this._updateCommonStl(t, e, n) + }, e.prototype.updateData = function (t, e, n) { + var i = t.hostModel, r = this.childOfName("line"), o = t.getItemLayout(e), a = {shape: {}}; + cA(a.shape, o), ih(r, a, i, e), E(lA, (function (n) { + var i = t.getItemVisual(e, n), r = uA(n); + if (this[r] !== i) { + this.remove(this.childOfName(n)); + var o = hA(n, t, e); + this.add(o) + } + this[r] = i + }), this), this._updateCommonStl(t, e, n) + }, e.prototype.getLinePath = function () { + return this.childAt(0) + }, e.prototype._updateCommonStl = function (t, e, n) { + var i = t.hostModel, r = this.childOfName("line"), o = n && n.emphasisLineStyle, a = n && n.blurLineStyle, + s = n && n.selectLineStyle, l = n && n.labelStatesModels, u = n && n.emphasisDisabled, h = n && n.focus, + c = n && n.blurScope; + if (!n || t.hasItemOption) { + var p = t.getItemModel(e), d = p.getModel("emphasis"); + o = d.getModel("lineStyle").getLineStyle(), a = p.getModel(["blur", "lineStyle"]).getLineStyle(), s = p.getModel(["select", "lineStyle"]).getLineStyle(), u = d.get("disabled"), h = d.get("focus"), c = d.get("blurScope"), l = Hh(p) + } + var f = t.getItemVisual(e, "style"), g = f.stroke; + r.useStyle(f), r.style.fill = null, r.style.strokeNoScale = !0, r.ensureState("emphasis").style = o, r.ensureState("blur").style = a, r.ensureState("select").style = s, E(lA, (function (t) { + var e = this.childOfName(t); + if (e) { + e.setColor(g), e.style.opacity = f.opacity; + for (var n = 0; n < js.length; n++) { + var i = js[n], o = r.getState(i); + if (o) { + var a = o.style || {}, s = e.ensureState(i), l = s.style || (s.style = {}); + null != a.stroke && (l[e.__isEmptyBrush ? "stroke" : "fill"] = a.stroke), null != a.opacity && (l.opacity = a.opacity) + } + } + e.markRedraw() + } + }), this); + var y = i.getRawValue(e); + Wh(this, l, { + labelDataIndex: e, + labelFetcher: { + getFormattedLabel: function (e, n) { + return i.getFormattedLabel(e, n, t.dataType) + } + }, + inheritColor: g || "#000", + defaultOpacity: f.opacity, + defaultText: (null == y ? t.getName(e) : isFinite(y) ? zr(y) : y) + "" + }); + var v = this.getTextContent(); + if (v) { + var m = l.normal; + v.__align = v.style.align, v.__verticalAlign = v.style.verticalAlign, v.__position = m.get("position") || "middle"; + var x = m.get("distance"); + Y(x) || (x = [x, x]), v.__labelDistance = x + } + this.setTextConfig({position: null, local: !0, inside: !1}), Ol(this, h, c, u) + }, e.prototype.highlight = function () { + xl(this) + }, e.prototype.downplay = function () { + _l(this) + }, e.prototype.updateLayout = function (t, e) { + this.setLinePoints(t.getItemLayout(e)) + }, e.prototype.setLinePoints = function (t) { + var e = this.childOfName("line"); + cA(e.shape, t), e.dirty() + }, e.prototype.beforeUpdate = function () { + var t = this, e = t.childOfName("fromSymbol"), n = t.childOfName("toSymbol"), i = t.getTextContent(); + if (e || n || i && !i.ignore) { + for (var r = 1, o = this.parent; o;) o.scaleX && (r /= o.scaleX), o = o.parent; + var a = t.childOfName("line"); + if (this.__dirty || a.__dirty) { + var s = a.shape.percent, l = a.pointAt(0), u = a.pointAt(s), h = Dt([], u, l); + if (Rt(h, h), e && (e.setPosition(l), S(e, 0), e.scaleX = e.scaleY = r * s, e.markRedraw()), n && (n.setPosition(u), S(n, 1), n.scaleX = n.scaleY = r * s, n.markRedraw()), i && !i.ignore) { + i.x = i.y = 0, i.originX = i.originY = 0; + var c = void 0, p = void 0, d = i.__labelDistance, f = d[0] * r, g = d[1] * r, y = s / 2, + v = a.tangentAt(y), m = [v[1], -v[0]], x = a.pointAt(y); + m[1] > 0 && (m[0] = -m[0], m[1] = -m[1]); + var _ = v[0] < 0 ? -1 : 1; + if ("start" !== i.__position && "end" !== i.__position) { + var b = -Math.atan2(v[1], v[0]); + u[0] < l[0] && (b = Math.PI + b), i.rotation = b + } + var w = void 0; + switch (i.__position) { + case"insideStartTop": + case"insideMiddleTop": + case"insideEndTop": + case"middle": + w = -g, p = "bottom"; + break; + case"insideStartBottom": + case"insideMiddleBottom": + case"insideEndBottom": + w = g, p = "top"; + break; + default: + w = 0, p = "middle" + } + switch (i.__position) { + case"end": + i.x = h[0] * f + u[0], i.y = h[1] * g + u[1], c = h[0] > .8 ? "left" : h[0] < -.8 ? "right" : "center", p = h[1] > .8 ? "top" : h[1] < -.8 ? "bottom" : "middle"; + break; + case"start": + i.x = -h[0] * f + l[0], i.y = -h[1] * g + l[1], c = h[0] > .8 ? "right" : h[0] < -.8 ? "left" : "center", p = h[1] > .8 ? "bottom" : h[1] < -.8 ? "top" : "middle"; + break; + case"insideStartTop": + case"insideStart": + case"insideStartBottom": + i.x = f * _ + l[0], i.y = l[1] + w, c = v[0] < 0 ? "right" : "left", i.originX = -f * _, i.originY = -w; + break; + case"insideMiddleTop": + case"insideMiddle": + case"insideMiddleBottom": + case"middle": + i.x = x[0], i.y = x[1] + w, c = "center", i.originY = -w; + break; + case"insideEndTop": + case"insideEnd": + case"insideEndBottom": + i.x = -f * _ + u[0], i.y = u[1] + w, c = v[0] >= 0 ? "right" : "left", i.originX = f * _, i.originY = -w + } + i.scaleX = i.scaleY = r, i.setStyle({ + verticalAlign: i.__verticalAlign || p, + align: i.__align || c + }) + } + } + } + + function S(t, e) { + var n = t.__specifiedRotation; + if (null == n) { + var i = a.tangentAt(e); + t.attr("rotation", (1 === e ? -1 : 1) * Math.PI / 2 - Math.atan2(i[1], i[0])) + } else t.attr("rotation", n) + } + }, e + }(Cr), dA = function () { + function t(t) { + this.group = new Cr, this._LineCtor = t || pA + } + + return t.prototype.updateData = function (t) { + var e = this; + this._progressiveEls = null; + var n = this, i = n.group, r = n._lineData; + n._lineData = t, r || i.removeAll(); + var o = fA(t); + t.diff(r).add((function (n) { + e._doAdd(t, n, o) + })).update((function (n, i) { + e._doUpdate(r, t, i, n, o) + })).remove((function (t) { + i.remove(r.getItemGraphicEl(t)) + })).execute() + }, t.prototype.updateLayout = function () { + var t = this._lineData; + t && t.eachItemGraphicEl((function (e, n) { + e.updateLayout(t, n) + }), this) + }, t.prototype.incrementalPrepareUpdate = function (t) { + this._seriesScope = fA(t), this._lineData = null, this.group.removeAll() + }, t.prototype.incrementalUpdate = function (t, e) { + function n(t) { + t.isGroup || function (t) { + return t.animators && t.animators.length > 0 + }(t) || (t.incremental = !0, t.ensureState("emphasis").hoverLayer = !0) + } + + this._progressiveEls = []; + for (var i = t.start; i < t.end; i++) { + if (yA(e.getItemLayout(i))) { + var r = new this._LineCtor(e, i, this._seriesScope); + r.traverse(n), this.group.add(r), e.setItemGraphicEl(i, r), this._progressiveEls.push(r) + } + } + }, t.prototype.remove = function () { + this.group.removeAll() + }, t.prototype.eachRendered = function (t) { + zh(this._progressiveEls || this.group, t) + }, t.prototype._doAdd = function (t, e, n) { + if (yA(t.getItemLayout(e))) { + var i = new this._LineCtor(t, e, n); + t.setItemGraphicEl(e, i), this.group.add(i) + } + }, t.prototype._doUpdate = function (t, e, n, i, r) { + var o = t.getItemGraphicEl(n); + yA(e.getItemLayout(i)) ? (o ? o.updateData(e, i, r) : o = new this._LineCtor(e, i, r), e.setItemGraphicEl(i, o), this.group.add(o)) : this.group.remove(o) + }, t + }(); + + function fA(t) { + var e = t.hostModel, n = e.getModel("emphasis"); + return { + lineStyle: e.getModel("lineStyle").getLineStyle(), + emphasisLineStyle: n.getModel(["lineStyle"]).getLineStyle(), + blurLineStyle: e.getModel(["blur", "lineStyle"]).getLineStyle(), + selectLineStyle: e.getModel(["select", "lineStyle"]).getLineStyle(), + emphasisDisabled: n.get("disabled"), + blurScope: n.get("blurScope"), + focus: n.get("focus"), + labelStatesModels: Hh(e) + } + } + + function gA(t) { + return isNaN(t[0]) || isNaN(t[1]) + } + + function yA(t) { + return t && !gA(t[0]) && !gA(t[1]) + } + + var vA = [], mA = [], xA = [], _A = Ke, bA = Vt, wA = Math.abs; + + function SA(t, e, n) { + for (var i, r = t[0], o = t[1], a = t[2], s = 1 / 0, l = n * n, u = .1, h = .1; h <= .9; h += .1) { + vA[0] = _A(r[0], o[0], a[0], h), vA[1] = _A(r[1], o[1], a[1], h), (d = wA(bA(vA, e) - l)) < s && (s = d, i = h) + } + for (var c = 0; c < 32; c++) { + var p = i + u; + mA[0] = _A(r[0], o[0], a[0], i), mA[1] = _A(r[1], o[1], a[1], i), xA[0] = _A(r[0], o[0], a[0], p), xA[1] = _A(r[1], o[1], a[1], p); + var d = bA(mA, e) - l; + if (wA(d) < .01) break; + var f = bA(xA, e) - l; + u /= 2, d < 0 ? f >= 0 ? i += u : i -= u : f >= 0 ? i -= u : i += u + } + return i + } + + function MA(t, e) { + var n = [], i = Qe, r = [[], [], []], o = [[], []], a = []; + e /= 2, t.eachEdge((function (t, s) { + var l = t.getLayout(), u = t.getVisual("fromSymbol"), h = t.getVisual("toSymbol"); + l.__original || (l.__original = [Mt(l[0]), Mt(l[1])], l[2] && l.__original.push(Mt(l[2]))); + var c = l.__original; + if (null != l[2]) { + if (St(r[0], c[0]), St(r[1], c[2]), St(r[2], c[1]), u && "none" !== u) { + var p = jD(t.node1), d = SA(r, c[0], p * e); + i(r[0][0], r[1][0], r[2][0], d, n), r[0][0] = n[3], r[1][0] = n[4], i(r[0][1], r[1][1], r[2][1], d, n), r[0][1] = n[3], r[1][1] = n[4] + } + if (h && "none" !== h) { + p = jD(t.node2), d = SA(r, c[1], p * e); + i(r[0][0], r[1][0], r[2][0], d, n), r[1][0] = n[1], r[2][0] = n[2], i(r[0][1], r[1][1], r[2][1], d, n), r[1][1] = n[1], r[2][1] = n[2] + } + St(l[0], r[0]), St(l[1], r[2]), St(l[2], r[1]) + } else { + if (St(o[0], c[0]), St(o[1], c[1]), Dt(a, o[1], o[0]), Rt(a, a), u && "none" !== u) { + p = jD(t.node1); + Ct(o[0], o[0], a, p * e) + } + if (h && "none" !== h) { + p = jD(t.node2); + Ct(o[1], o[1], a, -p * e) + } + St(l[0], o[0]), St(l[1], o[1]) + } + })) + } + + function IA(t) { + return "view" === t.type + } + + var TA = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function (t, e) { + var n = new Zw, i = new dA, r = this.group; + this._controller = new DI(e.getZr()), this._controllerHost = {target: r}, r.add(n.group), r.add(i.group), this._symbolDraw = n, this._lineDraw = i, this._firstRender = !0 + }, e.prototype.render = function (t, e, n) { + var i = this, r = t.coordinateSystem; + this._model = t; + var o = this._symbolDraw, a = this._lineDraw, s = this.group; + if (IA(r)) { + var l = {x: r.x, y: r.y, scaleX: r.scaleX, scaleY: r.scaleY}; + this._firstRender ? s.attr(l) : ih(s, l, t) + } + MA(t.getGraph(), ZD(t)); + var u = t.getData(); + o.updateData(u); + var h = t.getEdgeData(); + a.updateData(h), this._updateNodeAndLinkScale(), this._updateController(t, e, n), clearTimeout(this._layoutTimeout); + var c = t.forceLayout, p = t.get(["force", "layoutAnimation"]); + c && this._startForceLayoutIteration(c, p), u.graph.eachNode((function (t) { + var e = t.dataIndex, n = t.getGraphicEl(), r = t.getModel(); + if (n) { + n.off("drag").off("dragend"); + var o = r.get("draggable"); + o && n.on("drag", (function () { + c && (c.warmUp(), !i._layouting && i._startForceLayoutIteration(c, p), c.setFixed(e), u.setItemLayout(e, [n.x, n.y])) + })).on("dragend", (function () { + c && c.setUnfixed(e) + })), n.setDraggable(o && !!c), "adjacency" === r.get(["emphasis", "focus"]) && (Ws(n).focus = t.getAdjacentDataIndices()) + } + })), u.graph.eachEdge((function (t) { + var e = t.getGraphicEl(), n = t.getModel().get(["emphasis", "focus"]); + e && "adjacency" === n && (Ws(e).focus = { + edge: [t.dataIndex], + node: [t.node1.dataIndex, t.node2.dataIndex] + }) + })); + var d = "circular" === t.get("layout") && t.get(["circular", "rotateLabel"]), f = u.getLayout("cx"), + g = u.getLayout("cy"); + u.eachItemGraphicEl((function (t, e) { + var n = u.getItemModel(e).get(["label", "rotate"]) || 0, i = t.getSymbolPath(); + if (d) { + var r = u.getItemLayout(e), o = Math.atan2(r[1] - g, r[0] - f); + o < 0 && (o = 2 * Math.PI + o); + var a = r[0] < f; + a && (o -= Math.PI); + var s = a ? "left" : "right"; + i.setTextConfig({rotation: -o, position: s, origin: "center"}); + var l = i.ensureState("emphasis"); + A(l.textConfig || (l.textConfig = {}), {position: s}) + } else i.setTextConfig({rotation: n *= Math.PI / 180}) + })), this._firstRender = !1 + }, e.prototype.dispose = function () { + this._controller && this._controller.dispose(), this._controllerHost = null + }, e.prototype._startForceLayoutIteration = function (t, e) { + var n = this; + !function i() { + t.step((function (t) { + n.updateLayout(n._model), (n._layouting = !t) && (e ? n._layoutTimeout = setTimeout(i, 16) : i()) + })) + }() + }, e.prototype._updateController = function (t, e, n) { + var i = this, r = this._controller, o = this._controllerHost, a = this.group; + r.setPointerChecker((function (e, i, r) { + var o = a.getBoundingRect(); + return o.applyTransform(a.transform), o.contain(i, r) && !EI(e, n, t) + })), IA(t.coordinateSystem) ? (r.enable(t.get("roam")), o.zoomLimit = t.get("scaleLimit"), o.zoom = t.coordinateSystem.getZoom(), r.off("pan").off("zoom").on("pan", (function (e) { + PI(o, e.dx, e.dy), n.dispatchAction({seriesId: t.id, type: "graphRoam", dx: e.dx, dy: e.dy}) + })).on("zoom", (function (e) { + OI(o, e.scale, e.originX, e.originY), n.dispatchAction({ + seriesId: t.id, + type: "graphRoam", + zoom: e.scale, + originX: e.originX, + originY: e.originY + }), i._updateNodeAndLinkScale(), MA(t.getGraph(), ZD(t)), i._lineDraw.updateLayout(), n.updateLabelLayout() + }))) : r.disable() + }, e.prototype._updateNodeAndLinkScale = function () { + var t = this._model, e = t.getData(), n = ZD(t); + e.eachItemGraphicEl((function (t, e) { + t && t.setSymbolScale(n) + })) + }, e.prototype.updateLayout = function (t) { + MA(t.getGraph(), ZD(t)), this._symbolDraw.updateLayout(), this._lineDraw.updateLayout() + }, e.prototype.remove = function (t, e) { + this._symbolDraw && this._symbolDraw.remove(), this._lineDraw && this._lineDraw.remove() + }, e.type = "graph", e + }(mg); + + function CA(t) { + return "_EC_" + t + } + + var DA = function () { + function t(t) { + this.type = "graph", this.nodes = [], this.edges = [], this._nodesMap = {}, this._edgesMap = {}, this._directed = t || !1 + } + + return t.prototype.isDirected = function () { + return this._directed + }, t.prototype.addNode = function (t, e) { + t = null == t ? "" + e : "" + t; + var n = this._nodesMap; + if (!n[CA(t)]) { + var i = new AA(t, e); + return i.hostGraph = this, this.nodes.push(i), n[CA(t)] = i, i + } + }, t.prototype.getNodeByIndex = function (t) { + var e = this.data.getRawIndex(t); + return this.nodes[e] + }, t.prototype.getNodeById = function (t) { + return this._nodesMap[CA(t)] + }, t.prototype.addEdge = function (t, e, n) { + var i = this._nodesMap, r = this._edgesMap; + if (j(t) && (t = this.nodes[t]), j(e) && (e = this.nodes[e]), t instanceof AA || (t = i[CA(t)]), e instanceof AA || (e = i[CA(e)]), t && e) { + var o = t.id + "-" + e.id, a = new kA(t, e, n); + return a.hostGraph = this, this._directed && (t.outEdges.push(a), e.inEdges.push(a)), t.edges.push(a), t !== e && e.edges.push(a), this.edges.push(a), r[o] = a, a + } + }, t.prototype.getEdgeByIndex = function (t) { + var e = this.edgeData.getRawIndex(t); + return this.edges[e] + }, t.prototype.getEdge = function (t, e) { + t instanceof AA && (t = t.id), e instanceof AA && (e = e.id); + var n = this._edgesMap; + return this._directed ? n[t + "-" + e] : n[t + "-" + e] || n[e + "-" + t] + }, t.prototype.eachNode = function (t, e) { + for (var n = this.nodes, i = n.length, r = 0; r < i; r++) n[r].dataIndex >= 0 && t.call(e, n[r], r) + }, t.prototype.eachEdge = function (t, e) { + for (var n = this.edges, i = n.length, r = 0; r < i; r++) n[r].dataIndex >= 0 && n[r].node1.dataIndex >= 0 && n[r].node2.dataIndex >= 0 && t.call(e, n[r], r) + }, t.prototype.breadthFirstTraverse = function (t, e, n, i) { + if (e instanceof AA || (e = this._nodesMap[CA(e)]), e) { + for (var r = "out" === n ? "outEdges" : "in" === n ? "inEdges" : "edges", o = 0; o < this.nodes.length; o++) this.nodes[o].__visited = !1; + if (!t.call(i, e, null)) for (var a = [e]; a.length;) { + var s = a.shift(), l = s[r]; + for (o = 0; o < l.length; o++) { + var u = l[o], h = u.node1 === s ? u.node2 : u.node1; + if (!h.__visited) { + if (t.call(i, h, s)) return; + a.push(h), h.__visited = !0 + } + } + } + } + }, t.prototype.update = function () { + for (var t = this.data, e = this.edgeData, n = this.nodes, i = this.edges, r = 0, o = n.length; r < o; r++) n[r].dataIndex = -1; + for (r = 0, o = t.count(); r < o; r++) n[t.getRawIndex(r)].dataIndex = r; + e.filterSelf((function (t) { + var n = i[e.getRawIndex(t)]; + return n.node1.dataIndex >= 0 && n.node2.dataIndex >= 0 + })); + for (r = 0, o = i.length; r < o; r++) i[r].dataIndex = -1; + for (r = 0, o = e.count(); r < o; r++) i[e.getRawIndex(r)].dataIndex = r + }, t.prototype.clone = function () { + for (var e = new t(this._directed), n = this.nodes, i = this.edges, r = 0; r < n.length; r++) e.addNode(n[r].id, n[r].dataIndex); + for (r = 0; r < i.length; r++) { + var o = i[r]; + e.addEdge(o.node1.id, o.node2.id, o.dataIndex) + } + return e + }, t + }(), AA = function () { + function t(t, e) { + this.inEdges = [], this.outEdges = [], this.edges = [], this.dataIndex = -1, this.id = null == t ? "" : t, this.dataIndex = null == e ? -1 : e + } + + return t.prototype.degree = function () { + return this.edges.length + }, t.prototype.inDegree = function () { + return this.inEdges.length + }, t.prototype.outDegree = function () { + return this.outEdges.length + }, t.prototype.getModel = function (t) { + if (!(this.dataIndex < 0)) return this.hostGraph.data.getItemModel(this.dataIndex).getModel(t) + }, t.prototype.getAdjacentDataIndices = function () { + for (var t = {edge: [], node: []}, e = 0; e < this.edges.length; e++) { + var n = this.edges[e]; + n.dataIndex < 0 || (t.edge.push(n.dataIndex), t.node.push(n.node1.dataIndex, n.node2.dataIndex)) + } + return t + }, t + }(), kA = function () { + function t(t, e, n) { + this.dataIndex = -1, this.node1 = t, this.node2 = e, this.dataIndex = null == n ? -1 : n + } + + return t.prototype.getModel = function (t) { + if (!(this.dataIndex < 0)) return this.hostGraph.edgeData.getItemModel(this.dataIndex).getModel(t) + }, t.prototype.getAdjacentDataIndices = function () { + return {edge: [this.dataIndex], node: [this.node1.dataIndex, this.node2.dataIndex]} + }, t + }(); + + function LA(t, e) { + return { + getValue: function (n) { + var i = this[t][e]; + return i.getStore().get(i.getDimensionIndex(n || "value"), this.dataIndex) + }, setVisual: function (n, i) { + this.dataIndex >= 0 && this[t][e].setItemVisual(this.dataIndex, n, i) + }, getVisual: function (n) { + return this[t][e].getItemVisual(this.dataIndex, n) + }, setLayout: function (n, i) { + this.dataIndex >= 0 && this[t][e].setItemLayout(this.dataIndex, n, i) + }, getLayout: function () { + return this[t][e].getItemLayout(this.dataIndex) + }, getGraphicEl: function () { + return this[t][e].getItemGraphicEl(this.dataIndex) + }, getRawIndex: function () { + return this[t][e].getRawIndex(this.dataIndex) + } + } + } + + function PA(t, e, n, i, r) { + for (var o = new DA(i), a = 0; a < t.length; a++) o.addNode(it(t[a].id, t[a].name, a), a); + var s = [], l = [], u = 0; + for (a = 0; a < e.length; a++) { + var h = e[a], c = h.source, p = h.target; + o.addEdge(c, p, u) && (l.push(h), s.push(it(xo(h.id, null), c + " > " + p)), u++) + } + var d, f = n.get("coordinateSystem"); + if ("cartesian2d" === f || "polar" === f) d = nx(t, n); else { + var g = ud.get(f), y = g && g.dimensions || []; + P(y, "value") < 0 && y.concat(["value"]); + var v = jm(t, {coordDimensions: y, encodeDefine: n.getEncode()}).dimensions; + (d = new Zm(v, n)).initData(t) + } + var m = new Zm(["value"], n); + return m.initData(l, s), r && r(d, m), mC({ + mainData: d, + struct: o, + structAttr: "graph", + datas: {node: d, edge: m}, + datasAttr: {node: "data", edge: "edgeData"} + }), o.update(), o + } + + R(AA, LA("hostGraph", "data")), R(kA, LA("hostGraph", "edgeData")); + var OA = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.hasSymbolVisual = !0, n + } + + return n(e, t), e.prototype.init = function (e) { + t.prototype.init.apply(this, arguments); + var n = this; + + function i() { + return n._categoriesData + } + + this.legendVisualProvider = new lM(i, i), this.fillDataTextStyle(e.edges || e.links), this._updateCategoriesData() + }, e.prototype.mergeOption = function (e) { + t.prototype.mergeOption.apply(this, arguments), this.fillDataTextStyle(e.edges || e.links), this._updateCategoriesData() + }, e.prototype.mergeDefaultAndTheme = function (e) { + t.prototype.mergeDefaultAndTheme.apply(this, arguments), co(e, "edgeLabel", ["show"]) + }, e.prototype.getInitialData = function (t, e) { + var n, i = t.edges || t.links || [], r = t.data || t.nodes || [], o = this; + if (r && i) { + VD(n = this) && (n.__curvenessList = [], n.__edgeMap = {}, BD(n)); + var a = PA(r, i, this, !0, (function (t, e) { + t.wrapMethod("getItemModel", (function (t) { + var e = o._categoriesModels[t.getShallow("category")]; + return e && (e.parentModel = t.parentModel, t.parentModel = e), t + })); + var n = pc.prototype.getModel; + + function i(t, e) { + var i = n.call(this, t, e); + return i.resolveParentPath = r, i + } + + function r(t) { + if (t && ("label" === t[0] || "label" === t[1])) { + var e = t.slice(); + return "label" === t[0] ? e[0] = "edgeLabel" : "label" === t[1] && (e[1] = "edgeLabel"), e + } + return t + } + + e.wrapMethod("getItemModel", (function (t) { + return t.resolveParentPath = r, t.getModel = i, t + })) + })); + return E(a.edges, (function (t) { + !function (t, e, n, i) { + if (VD(n)) { + var r = FD(t, e, n), o = n.__edgeMap, a = o[GD(r)]; + o[r] && !a ? o[r].isForward = !0 : a && o[r] && (a.isForward = !0, o[r].isForward = !1), o[r] = o[r] || [], o[r].push(i) + } + }(t.node1, t.node2, this, t.dataIndex) + }), this), a.data + } + }, e.prototype.getGraph = function () { + return this.getData().graph + }, e.prototype.getEdgeData = function () { + return this.getGraph().edgeData + }, e.prototype.getCategoriesData = function () { + return this._categoriesData + }, e.prototype.formatTooltip = function (t, e, n) { + if ("edge" === n) { + var i = this.getData(), r = this.getDataParams(t, n), o = i.graph.getEdgeByIndex(t), + a = i.getName(o.node1.dataIndex), s = i.getName(o.node2.dataIndex), l = []; + return null != a && l.push(a), null != s && l.push(s), Uf("nameValue", { + name: l.join(" > "), + value: r.value, + noValue: null == r.value + }) + } + return ig({series: this, dataIndex: t, multipleSeries: e}) + }, e.prototype._updateCategoriesData = function () { + var t = z(this.option.categories || [], (function (t) { + return null != t.value ? t : A({value: 0}, t) + })), e = new Zm(["value"], this); + e.initData(t), this._categoriesData = e, this._categoriesModels = e.mapArray((function (t) { + return e.getItemModel(t) + })) + }, e.prototype.setZoom = function (t) { + this.option.zoom = t + }, e.prototype.setCenter = function (t) { + this.option.center = t + }, e.prototype.isAnimationEnabled = function () { + return t.prototype.isAnimationEnabled.call(this) && !("force" === this.get("layout") && this.get(["force", "layoutAnimation"])) + }, e.type = "series.graph", e.dependencies = ["grid", "polar", "geo", "singleAxis", "calendar"], e.defaultOption = { + z: 2, + coordinateSystem: "view", + legendHoverLink: !0, + layout: null, + circular: {rotateLabel: !1}, + force: { + initLayout: null, + repulsion: [0, 50], + gravity: .1, + friction: .6, + edgeLength: 30, + layoutAnimation: !0 + }, + left: "center", + top: "center", + symbol: "circle", + symbolSize: 10, + edgeSymbol: ["none", "none"], + edgeSymbolSize: 10, + edgeLabel: {position: "middle", distance: 5}, + draggable: !1, + roam: !1, + center: null, + zoom: 1, + nodeScaleRatio: .6, + label: {show: !1, formatter: "{b}"}, + itemStyle: {}, + lineStyle: {color: "#aaa", width: 1, opacity: .5}, + emphasis: {scale: !0, label: {show: !0}}, + select: {itemStyle: {borderColor: "#212121"}} + }, e + }(ag), RA = {type: "graphRoam", event: "graphRoam", update: "none"}; + var NA = function () { + this.angle = 0, this.width = 10, this.r = 10, this.x = 0, this.y = 0 + }, EA = function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n.type = "pointer", n + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new NA + }, e.prototype.buildPath = function (t, e) { + var n = Math.cos, i = Math.sin, r = e.r, o = e.width, a = e.angle, + s = e.x - n(a) * o * (o >= r / 3 ? 1 : 2), l = e.y - i(a) * o * (o >= r / 3 ? 1 : 2); + a = e.angle - Math.PI / 2, t.moveTo(s, l), t.lineTo(e.x + n(a) * o, e.y + i(a) * o), t.lineTo(e.x + n(e.angle) * r, e.y + i(e.angle) * r), t.lineTo(e.x - n(a) * o, e.y - i(a) * o), t.lineTo(s, l) + }, e + }(fs); + + function zA(t, e) { + var n = null == t ? "" : t + ""; + return e && (X(e) ? n = e.replace("{value}", n) : U(e) && (n = e(t))), n + } + + var VA = 2 * Math.PI, BA = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + this.group.removeAll(); + var i = t.get(["axisLine", "lineStyle", "color"]), r = function (t, e) { + var n = t.get("center"), i = e.getWidth(), r = e.getHeight(), o = Math.min(i, r); + return {cx: Er(n[0], e.getWidth()), cy: Er(n[1], e.getHeight()), r: Er(t.get("radius"), o / 2)} + }(t, n); + this._renderMain(t, e, n, i, r), this._data = t.getData() + }, e.prototype.dispose = function () { + }, e.prototype._renderMain = function (t, e, n, i, r) { + for (var o = this.group, a = t.get("clockwise"), s = -t.get("startAngle") / 180 * Math.PI, l = -t.get("endAngle") / 180 * Math.PI, u = t.getModel("axisLine"), h = u.get("roundCap") ? TS : Tu, c = u.get("show"), p = u.getModel("lineStyle"), d = p.get("width"), f = (l - s) % VA || l === s ? (l - s) % VA : VA, g = s, y = 0; c && y < i.length; y++) { + var v = new h({ + shape: { + startAngle: g, + endAngle: l = s + f * Math.min(Math.max(i[y][0], 0), 1), + cx: r.cx, + cy: r.cy, + clockwise: a, + r0: r.r - d, + r: r.r + }, silent: !0 + }); + v.setStyle({fill: i[y][1]}), v.setStyle(p.getLineStyle(["color", "width"])), o.add(v), g = l + } + var m = function (t) { + if (t <= 0) return i[0][1]; + var e; + for (e = 0; e < i.length; e++) if (i[e][0] >= t && (0 === e ? 0 : i[e - 1][0]) < t) return i[e][1]; + return i[e - 1][1] + }; + if (!a) { + var x = s; + s = l, l = x + } + this._renderTicks(t, e, n, m, r, s, l, a, d), this._renderTitleAndDetail(t, e, n, m, r), this._renderAnchor(t, r), this._renderPointer(t, e, n, m, r, s, l, a, d) + }, e.prototype._renderTicks = function (t, e, n, i, r, o, a, s, l) { + for (var u, h, c = this.group, p = r.cx, d = r.cy, f = r.r, g = +t.get("min"), y = +t.get("max"), v = t.getModel("splitLine"), m = t.getModel("axisTick"), x = t.getModel("axisLabel"), _ = t.get("splitNumber"), b = m.get("splitNumber"), w = Er(v.get("length"), f), S = Er(m.get("length"), f), M = o, I = (a - o) / _, T = I / b, C = v.getModel("lineStyle").getLineStyle(), D = m.getModel("lineStyle").getLineStyle(), A = v.get("distance"), k = 0; k <= _; k++) { + if (u = Math.cos(M), h = Math.sin(M), v.get("show")) { + var L = new Eu({ + shape: { + x1: u * (f - (P = A ? A + l : l)) + p, + y1: h * (f - P) + d, + x2: u * (f - w - P) + p, + y2: h * (f - w - P) + d + }, style: C, silent: !0 + }); + "auto" === C.stroke && L.setStyle({stroke: i(k / _)}), c.add(L) + } + if (x.get("show")) { + var P = x.get("distance") + A, O = zA(zr(k / _ * (y - g) + g), x.get("formatter")), R = i(k / _); + c.add(new As({ + style: Yh(x, { + text: O, + x: u * (f - w - P) + p, + y: h * (f - w - P) + d, + verticalAlign: h < -.8 ? "top" : h > .8 ? "bottom" : "middle", + align: u < -.4 ? "left" : u > .4 ? "right" : "center" + }, {inheritColor: R}), silent: !0 + })) + } + if (m.get("show") && k !== _) { + P = (P = m.get("distance")) ? P + l : l; + for (var N = 0; N <= b; N++) { + u = Math.cos(M), h = Math.sin(M); + var E = new Eu({ + shape: { + x1: u * (f - P) + p, + y1: h * (f - P) + d, + x2: u * (f - S - P) + p, + y2: h * (f - S - P) + d + }, silent: !0, style: D + }); + "auto" === D.stroke && E.setStyle({stroke: i((k + N / b) / _)}), c.add(E), M += T + } + M -= T + } else M += I + } + }, e.prototype._renderPointer = function (t, e, n, i, r, o, a, s, l) { + var u = this.group, h = this._data, c = this._progressEls, p = [], d = t.get(["pointer", "show"]), + f = t.getModel("progress"), g = f.get("show"), y = t.getData(), v = y.mapDimension("value"), + m = +t.get("min"), x = +t.get("max"), _ = [m, x], b = [o, a]; + + function w(e, n) { + var i, o = y.getItemModel(e).getModel("pointer"), a = Er(o.get("width"), r.r), + s = Er(o.get("length"), r.r), l = t.get(["pointer", "icon"]), u = o.get("offsetCenter"), + h = Er(u[0], r.r), c = Er(u[1], r.r), p = o.get("keepAspect"); + return (i = l ? ky(l, h - a / 2, c - s, a, s, null, p) : new EA({ + shape: { + angle: -Math.PI / 2, + width: a, + r: s, + x: h, + y: c + } + })).rotation = -(n + Math.PI / 2), i.x = r.cx, i.y = r.cy, i + } + + function S(t, e) { + var n = f.get("roundCap") ? TS : Tu, i = f.get("overlap"), a = i ? f.get("width") : l / y.count(), + u = i ? r.r - a : r.r - (t + 1) * a, h = i ? r.r : r.r - t * a, + c = new n({shape: {startAngle: o, endAngle: e, cx: r.cx, cy: r.cy, clockwise: s, r0: u, r: h}}); + return i && (c.z2 = x - y.get(v, t) % x), c + } + + (g || d) && (y.diff(h).add((function (e) { + var n = y.get(v, e); + if (d) { + var i = w(e, o); + rh(i, {rotation: -((isNaN(+n) ? b[0] : Nr(n, _, b, !0)) + Math.PI / 2)}, t), u.add(i), y.setItemGraphicEl(e, i) + } + if (g) { + var r = S(e, o), a = f.get("clip"); + rh(r, {shape: {endAngle: Nr(n, _, b, a)}}, t), u.add(r), Hs(t.seriesIndex, y.dataType, e, r), p[e] = r + } + })).update((function (e, n) { + var i = y.get(v, e); + if (d) { + var r = h.getItemGraphicEl(n), a = r ? r.rotation : o, s = w(e, a); + s.rotation = a, ih(s, {rotation: -((isNaN(+i) ? b[0] : Nr(i, _, b, !0)) + Math.PI / 2)}, t), u.add(s), y.setItemGraphicEl(e, s) + } + if (g) { + var l = c[n], m = S(e, l ? l.shape.endAngle : o), x = f.get("clip"); + ih(m, {shape: {endAngle: Nr(i, _, b, x)}}, t), u.add(m), Hs(t.seriesIndex, y.dataType, e, m), p[e] = m + } + })).execute(), y.each((function (t) { + var e = y.getItemModel(t), n = e.getModel("emphasis"), r = n.get("focus"), o = n.get("blurScope"), + a = n.get("disabled"); + if (d) { + var s = y.getItemGraphicEl(t), l = y.getItemVisual(t, "style"), u = l.fill; + if (s instanceof xs) { + var h = s.style; + s.useStyle(A({image: h.image, x: h.x, y: h.y, width: h.width, height: h.height}, l)) + } else s.useStyle(l), "pointer" !== s.type && s.setColor(u); + s.setStyle(e.getModel(["pointer", "itemStyle"]).getItemStyle()), "auto" === s.style.fill && s.setStyle("fill", i(Nr(y.get(v, t), _, [0, 1], !0))), s.z2EmphasisLift = 0, zl(s, e), Ol(s, r, o, a) + } + if (g) { + var c = p[t]; + c.useStyle(y.getItemVisual(t, "style")), c.setStyle(e.getModel(["progress", "itemStyle"]).getItemStyle()), c.z2EmphasisLift = 0, zl(c, e), Ol(c, r, o, a) + } + })), this._progressEls = p) + }, e.prototype._renderAnchor = function (t, e) { + var n = t.getModel("anchor"); + if (n.get("show")) { + var i = n.get("size"), r = n.get("icon"), o = n.get("offsetCenter"), a = n.get("keepAspect"), + s = ky(r, e.cx - i / 2 + Er(o[0], e.r), e.cy - i / 2 + Er(o[1], e.r), i, i, null, a); + s.z2 = n.get("showAbove") ? 1 : 0, s.setStyle(n.getModel("itemStyle").getItemStyle()), this.group.add(s) + } + }, e.prototype._renderTitleAndDetail = function (t, e, n, i, r) { + var o = this, a = t.getData(), s = a.mapDimension("value"), l = +t.get("min"), u = +t.get("max"), + h = new Cr, c = [], p = [], d = t.isAnimationEnabled(), f = t.get(["pointer", "showAbove"]); + a.diff(this._data).add((function (t) { + c[t] = new As({silent: !0}), p[t] = new As({silent: !0}) + })).update((function (t, e) { + c[t] = o._titleEls[e], p[t] = o._detailEls[e] + })).execute(), a.each((function (e) { + var n = a.getItemModel(e), o = a.get(s, e), g = new Cr, y = i(Nr(o, [l, u], [0, 1], !0)), + v = n.getModel("title"); + if (v.get("show")) { + var m = v.get("offsetCenter"), x = r.cx + Er(m[0], r.r), _ = r.cy + Er(m[1], r.r); + (D = c[e]).attr({ + z2: f ? 0 : 2, + style: Yh(v, { + x: x, + y: _, + text: a.getName(e), + align: "center", + verticalAlign: "middle" + }, {inheritColor: y}) + }), g.add(D) + } + var b = n.getModel("detail"); + if (b.get("show")) { + var w = b.get("offsetCenter"), S = r.cx + Er(w[0], r.r), M = r.cy + Er(w[1], r.r), + I = Er(b.get("width"), r.r), T = Er(b.get("height"), r.r), + C = t.get(["progress", "show"]) ? a.getItemVisual(e, "style").fill : y, D = p[e], + A = b.get("formatter"); + D.attr({ + z2: f ? 0 : 2, + style: Yh(b, { + x: S, + y: M, + text: zA(o, A), + width: isNaN(I) ? null : I, + height: isNaN(T) ? null : T, + align: "center", + verticalAlign: "middle" + }, {inheritColor: C}) + }), Jh(D, {normal: b}, o, (function (t) { + return zA(t, A) + })), d && Qh(D, e, a, t, { + getFormattedLabel: function (t, e, n, i, r, a) { + return zA(a ? a.interpolatedValue : o, A) + } + }), g.add(D) + } + h.add(g) + })), this.group.add(h), this._titleEls = c, this._detailEls = p + }, e.type = "gauge", e + }(mg), FA = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.visualStyleAccessPath = "itemStyle", n + } + + return n(e, t), e.prototype.getInitialData = function (t, e) { + return sM(this, ["value"]) + }, e.type = "series.gauge", e.defaultOption = { + z: 2, + colorBy: "data", + center: ["50%", "50%"], + legendHoverLink: !0, + radius: "75%", + startAngle: 225, + endAngle: -45, + clockwise: !0, + min: 0, + max: 100, + splitNumber: 10, + axisLine: {show: !0, roundCap: !1, lineStyle: {color: [[1, "#E6EBF8"]], width: 10}}, + progress: {show: !1, overlap: !0, width: 10, roundCap: !1, clip: !0}, + splitLine: {show: !0, length: 10, distance: 10, lineStyle: {color: "#63677A", width: 3, type: "solid"}}, + axisTick: { + show: !0, + splitNumber: 5, + length: 6, + distance: 10, + lineStyle: {color: "#63677A", width: 1, type: "solid"} + }, + axisLabel: {show: !0, distance: 15, color: "#464646", fontSize: 12}, + pointer: { + icon: null, + offsetCenter: [0, 0], + show: !0, + showAbove: !0, + length: "60%", + width: 6, + keepAspect: !1 + }, + anchor: { + show: !1, + showAbove: !1, + size: 6, + icon: "circle", + offsetCenter: [0, 0], + keepAspect: !1, + itemStyle: {color: "#fff", borderWidth: 0, borderColor: "#5470c6"} + }, + title: {show: !0, offsetCenter: [0, "20%"], color: "#464646", fontSize: 16, valueAnimation: !1}, + detail: { + show: !0, + backgroundColor: "rgba(0,0,0,0)", + borderWidth: 0, + borderColor: "#ccc", + width: 100, + height: null, + padding: [5, 10], + offsetCenter: [0, "40%"], + color: "#464646", + fontSize: 30, + fontWeight: "bold", + lineHeight: 30, + valueAnimation: !1 + } + }, e + }(ag); + var GA = ["itemStyle", "opacity"], WA = function (t) { + function e(e, n) { + var i = t.call(this) || this, r = i, o = new Ou, a = new As; + return r.setTextContent(a), i.setTextGuideLine(o), i.updateData(e, n, !0), i + } + + return n(e, t), e.prototype.updateData = function (t, e, n) { + var i = this, r = t.hostModel, o = t.getItemModel(e), a = t.getItemLayout(e), s = o.getModel("emphasis"), + l = o.get(GA); + l = null == l ? 1 : l, n || uh(i), i.useStyle(t.getItemVisual(e, "style")), i.style.lineJoin = "round", n ? (i.setShape({points: a.points}), i.style.opacity = 0, rh(i, {style: {opacity: l}}, r, e)) : ih(i, { + style: {opacity: l}, + shape: {points: a.points} + }, r, e), zl(i, o), this._updateLabel(t, e), Ol(this, s.get("focus"), s.get("blurScope"), s.get("disabled")) + }, e.prototype._updateLabel = function (t, e) { + var n = this, i = this.getTextGuideLine(), r = n.getTextContent(), o = t.hostModel, a = t.getItemModel(e), + s = t.getItemLayout(e).label, l = t.getItemVisual(e, "style"), u = l.fill; + Wh(r, Hh(a), { + labelFetcher: t.hostModel, + labelDataIndex: e, + defaultOpacity: l.opacity, + defaultText: t.getName(e) + }, {normal: {align: s.textAlign, verticalAlign: s.verticalAlign}}), n.setTextConfig({ + local: !0, + inside: !!s.inside, + insideStroke: u, + outsideFill: u + }); + var h = s.linePoints; + i.setShape({points: h}), n.textGuideLineConfig = {anchor: h ? new Ji(h[0][0], h[0][1]) : null}, ih(r, { + style: { + x: s.x, + y: s.y + } + }, o, e), r.attr({rotation: s.rotation, originX: s.x, originY: s.y, z2: 10}), cb(n, pb(a), {stroke: u}) + }, e + }(Lu), HA = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.ignoreLabelLineUpdate = !0, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + var i = t.getData(), r = this._data, o = this.group; + i.diff(r).add((function (t) { + var e = new WA(i, t); + i.setItemGraphicEl(t, e), o.add(e) + })).update((function (t, e) { + var n = r.getItemGraphicEl(e); + n.updateData(i, t), o.add(n), i.setItemGraphicEl(t, n) + })).remove((function (e) { + lh(r.getItemGraphicEl(e), t, e) + })).execute(), this._data = i + }, e.prototype.remove = function () { + this.group.removeAll(), this._data = null + }, e.prototype.dispose = function () { + }, e.type = "funnel", e + }(mg), YA = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function (e) { + t.prototype.init.apply(this, arguments), this.legendVisualProvider = new lM(W(this.getData, this), W(this.getRawData, this)), this._defaultLabelLine(e) + }, e.prototype.getInitialData = function (t, e) { + return sM(this, {coordDimensions: ["value"], encodeDefaulter: H(Hp, this)}) + }, e.prototype._defaultLabelLine = function (t) { + co(t, "labelLine", ["show"]); + var e = t.labelLine, n = t.emphasis.labelLine; + e.show = e.show && t.label.show, n.show = n.show && t.emphasis.label.show + }, e.prototype.getDataParams = function (e) { + var n = this.getData(), i = t.prototype.getDataParams.call(this, e), r = n.mapDimension("value"), + o = n.getSum(r); + return i.percent = o ? +(n.get(r, e) / o * 100).toFixed(2) : 0, i.$vars.push("percent"), i + }, e.type = "series.funnel", e.defaultOption = { + z: 2, + legendHoverLink: !0, + colorBy: "data", + left: 80, + top: 60, + right: 80, + bottom: 60, + minSize: "0%", + maxSize: "100%", + sort: "descending", + orient: "vertical", + gap: 0, + funnelAlign: "center", + label: {show: !0, position: "outer"}, + labelLine: {show: !0, length: 20, lineStyle: {width: 1}}, + itemStyle: {borderColor: "#fff", borderWidth: 1}, + emphasis: {label: {show: !0}}, + select: {itemStyle: {borderColor: "#212121"}} + }, e + }(ag); + + function UA(t, e) { + t.eachSeriesByType("funnel", (function (t) { + var n = t.getData(), i = n.mapDimension("value"), r = t.get("sort"), o = function (t, e) { + return mp(t.getBoxLayoutParams(), {width: e.getWidth(), height: e.getHeight()}) + }(t, e), a = t.get("orient"), s = o.width, l = o.height, u = function (t, e) { + for (var n = t.mapDimension("value"), i = t.mapArray(n, (function (t) { + return t + })), r = [], o = "ascending" === e, a = 0, s = t.count(); a < s; a++) r[a] = a; + return U(e) ? r.sort(e) : "none" !== e && r.sort((function (t, e) { + return o ? i[t] - i[e] : i[e] - i[t] + })), r + }(n, r), h = o.x, c = o.y, + p = "horizontal" === a ? [Er(t.get("minSize"), l), Er(t.get("maxSize"), l)] : [Er(t.get("minSize"), s), Er(t.get("maxSize"), s)], + d = n.getDataExtent(i), f = t.get("min"), g = t.get("max"); + null == f && (f = Math.min(d[0], 0)), null == g && (g = d[1]); + var y = t.get("funnelAlign"), v = t.get("gap"), + m = (("horizontal" === a ? s : l) - v * (n.count() - 1)) / n.count(), x = function (t, e) { + if ("horizontal" === a) { + var r = Nr(n.get(i, t) || 0, [f, g], p, !0), o = void 0; + switch (y) { + case"top": + o = c; + break; + case"center": + o = c + (l - r) / 2; + break; + case"bottom": + o = c + (l - r) + } + return [[e, o], [e, o + r]] + } + var u, d = Nr(n.get(i, t) || 0, [f, g], p, !0); + switch (y) { + case"left": + u = h; + break; + case"center": + u = h + (s - d) / 2; + break; + case"right": + u = h + s - d + } + return [[u, e], [u + d, e]] + }; + "ascending" === r && (m = -m, v = -v, "horizontal" === a ? h += s : c += l, u = u.reverse()); + for (var _ = 0; _ < u.length; _++) { + var b = u[_], w = u[_ + 1], S = n.getItemModel(b); + if ("horizontal" === a) { + var M = S.get(["itemStyle", "width"]); + null == M ? M = m : (M = Er(M, s), "ascending" === r && (M = -M)); + var I = x(b, h), T = x(w, h + M); + h += M + v, n.setItemLayout(b, {points: I.concat(T.slice().reverse())}) + } else { + var C = S.get(["itemStyle", "height"]); + null == C ? C = m : (C = Er(C, l), "ascending" === r && (C = -C)); + I = x(b, c), T = x(w, c + C); + c += C + v, n.setItemLayout(b, {points: I.concat(T.slice().reverse())}) + } + } + !function (t) { + var e = t.hostModel.get("orient"); + t.each((function (n) { + var i, r, o, a, s = t.getItemModel(n), l = s.getModel("label").get("position"), + u = s.getModel("labelLine"), h = t.getItemLayout(n), c = h.points, + p = "inner" === l || "inside" === l || "center" === l || "insideLeft" === l || "insideRight" === l; + if (p) "insideLeft" === l ? (r = (c[0][0] + c[3][0]) / 2 + 5, o = (c[0][1] + c[3][1]) / 2, i = "left") : "insideRight" === l ? (r = (c[1][0] + c[2][0]) / 2 - 5, o = (c[1][1] + c[2][1]) / 2, i = "right") : (r = (c[0][0] + c[1][0] + c[2][0] + c[3][0]) / 4, o = (c[0][1] + c[1][1] + c[2][1] + c[3][1]) / 4, i = "center"), a = [[r, o], [r, o]]; else { + var d = void 0, f = void 0, g = void 0, y = void 0, v = u.get("length"); + "left" === l ? (d = (c[3][0] + c[0][0]) / 2, f = (c[3][1] + c[0][1]) / 2, r = (g = d - v) - 5, i = "right") : "right" === l ? (d = (c[1][0] + c[2][0]) / 2, f = (c[1][1] + c[2][1]) / 2, r = (g = d + v) + 5, i = "left") : "top" === l ? (d = (c[3][0] + c[0][0]) / 2, o = (y = (f = (c[3][1] + c[0][1]) / 2) - v) - 5, i = "center") : "bottom" === l ? (d = (c[1][0] + c[2][0]) / 2, o = (y = (f = (c[1][1] + c[2][1]) / 2) + v) + 5, i = "center") : "rightTop" === l ? (d = "horizontal" === e ? c[3][0] : c[1][0], f = "horizontal" === e ? c[3][1] : c[1][1], "horizontal" === e ? (o = (y = f - v) - 5, i = "center") : (r = (g = d + v) + 5, i = "top")) : "rightBottom" === l ? (d = c[2][0], f = c[2][1], "horizontal" === e ? (o = (y = f + v) + 5, i = "center") : (r = (g = d + v) + 5, i = "bottom")) : "leftTop" === l ? (d = c[0][0], f = "horizontal" === e ? c[0][1] : c[1][1], "horizontal" === e ? (o = (y = f - v) - 5, i = "center") : (r = (g = d - v) - 5, i = "right")) : "leftBottom" === l ? (d = "horizontal" === e ? c[1][0] : c[3][0], f = "horizontal" === e ? c[1][1] : c[2][1], "horizontal" === e ? (o = (y = f + v) + 5, i = "center") : (r = (g = d - v) - 5, i = "right")) : (d = (c[1][0] + c[2][0]) / 2, f = (c[1][1] + c[2][1]) / 2, "horizontal" === e ? (o = (y = f + v) + 5, i = "center") : (r = (g = d + v) + 5, i = "left")), "horizontal" === e ? r = g = d : o = y = f, a = [[d, f], [g, y]] + } + h.label = {linePoints: a, x: r, y: o, verticalAlign: "middle", textAlign: i, inside: p} + })) + }(n) + })) + } + + var XA = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n._dataGroup = new Cr, n._initialized = !1, n + } + + return n(e, t), e.prototype.init = function () { + this.group.add(this._dataGroup) + }, e.prototype.render = function (t, e, n, i) { + this._progressiveEls = null; + var r = this._dataGroup, o = t.getData(), a = this._data, s = t.coordinateSystem, l = s.dimensions, + u = qA(t); + if (o.diff(a).add((function (t) { + KA(jA(o, r, t, l, s), o, t, u) + })).update((function (e, n) { + var i = a.getItemGraphicEl(n), r = ZA(o, e, l, s); + o.setItemGraphicEl(e, i), ih(i, {shape: {points: r}}, t, e), uh(i), KA(i, o, e, u) + })).remove((function (t) { + var e = a.getItemGraphicEl(t); + r.remove(e) + })).execute(), !this._initialized) { + this._initialized = !0; + var h = function (t, e, n) { + var i = t.model, r = t.getRect(), + o = new Ts({shape: {x: r.x, y: r.y, width: r.width, height: r.height}}), + a = "horizontal" === i.get("layout") ? "width" : "height"; + return o.setShape(a, 0), rh(o, {shape: {width: r.width, height: r.height}}, e, n), o + }(s, t, (function () { + setTimeout((function () { + r.removeClipPath() + })) + })); + r.setClipPath(h) + } + this._data = o + }, e.prototype.incrementalPrepareRender = function (t, e, n) { + this._initialized = !0, this._data = null, this._dataGroup.removeAll() + }, e.prototype.incrementalRender = function (t, e, n) { + for (var i = e.getData(), r = e.coordinateSystem, o = r.dimensions, a = qA(e), s = this._progressiveEls = [], l = t.start; l < t.end; l++) { + var u = jA(i, this._dataGroup, l, o, r); + u.incremental = !0, KA(u, i, l, a), s.push(u) + } + }, e.prototype.remove = function () { + this._dataGroup && this._dataGroup.removeAll(), this._data = null + }, e.type = "parallel", e + }(mg); + + function ZA(t, e, n, i) { + for (var r, o = [], a = 0; a < n.length; a++) { + var s = n[a], l = t.get(t.mapDimension(s), e); + r = l, ("category" === i.getAxis(s).type ? null == r : null == r || isNaN(r)) || o.push(i.dataToPoint(l, s)) + } + return o + } + + function jA(t, e, n, i, r) { + var o = ZA(t, n, i, r), a = new Ou({shape: {points: o}, z2: 10}); + return e.add(a), t.setItemGraphicEl(n, a), a + } + + function qA(t) { + var e = t.get("smooth", !0); + return !0 === e && (e = .3), nt(e = to(e)) && (e = 0), {smooth: e} + } + + function KA(t, e, n, i) { + t.useStyle(e.getItemVisual(n, "style")), t.style.fill = null, t.setShape("smooth", i.smooth); + var r = e.getItemModel(n), o = r.getModel("emphasis"); + zl(t, r, "lineStyle"), Ol(t, o.get("focus"), o.get("blurScope"), o.get("disabled")) + } + + var $A = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.visualStyleAccessPath = "lineStyle", n.visualDrawType = "stroke", n + } + + return n(e, t), e.prototype.getInitialData = function (t, e) { + return nx(null, this, {useEncodeDefaulter: W(JA, null, this)}) + }, e.prototype.getRawIndicesByActiveState = function (t) { + var e = this.coordinateSystem, n = this.getData(), i = []; + return e.eachActiveState(n, (function (e, r) { + t === e && i.push(n.getRawIndex(r)) + })), i + }, e.type = "series.parallel", e.dependencies = ["parallel"], e.defaultOption = { + z: 2, + coordinateSystem: "parallel", + parallelIndex: 0, + label: {show: !1}, + inactiveOpacity: .05, + activeOpacity: 1, + lineStyle: {width: 1, opacity: .45, type: "solid"}, + emphasis: {label: {show: !1}}, + progressive: 500, + smooth: !1, + animationEasing: "linear" + }, e + }(ag); + + function JA(t) { + var e = t.ecModel.getComponent("parallel", t.get("parallelIndex")); + if (e) { + var n = {}; + return E(e.dimensions, (function (t) { + var e = +t.replace("dim", ""); + n[t] = e + })), n + } + } + + var QA = ["lineStyle", "opacity"], tk = { + seriesType: "parallel", reset: function (t, e) { + var n = t.coordinateSystem, i = { + normal: t.get(["lineStyle", "opacity"]), + active: t.get("activeOpacity"), + inactive: t.get("inactiveOpacity") + }; + return { + progress: function (t, e) { + n.eachActiveState(e, (function (t, n) { + var r = i[t]; + if ("normal" === t && e.hasItemOption) { + var o = e.getItemModel(n).get(QA, !0); + null != o && (r = o) + } + e.ensureUniqueItemVisual(n, "style").opacity = r + }), t.start, t.end) + } + } + } + }; + + function ek(t) { + !function (t) { + if (t.parallel) return; + var e = !1; + E(t.series, (function (t) { + t && "parallel" === t.type && (e = !0) + })), e && (t.parallel = [{}]) + }(t), function (t) { + E(ho(t.parallelAxis), (function (e) { + if (q(e)) { + var n = e.parallelIndex || 0, i = ho(t.parallel)[n]; + i && i.parallelAxisDefault && C(e, i.parallelAxisDefault, !1) + } + })) + }(t) + } + + var nk = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + this._model = t, this._api = n, this._handlers || (this._handlers = {}, E(ik, (function (t, e) { + n.getZr().on(e, this._handlers[e] = W(t, this)) + }), this)), Dg(this, "_throttledDispatchExpand", t.get("axisExpandRate"), "fixRate") + }, e.prototype.dispose = function (t, e) { + Ag(this, "_throttledDispatchExpand"), E(this._handlers, (function (t, n) { + e.getZr().off(n, t) + })), this._handlers = null + }, e.prototype._throttledDispatchExpand = function (t) { + this._dispatchExpand(t) + }, e.prototype._dispatchExpand = function (t) { + t && this._api.dispatchAction(A({type: "parallelAxisExpand"}, t)) + }, e.type = "parallel", e + }(fg), ik = { + mousedown: function (t) { + rk(this, "click") && (this._mouseDownPoint = [t.offsetX, t.offsetY]) + }, mouseup: function (t) { + var e = this._mouseDownPoint; + if (rk(this, "click") && e) { + var n = [t.offsetX, t.offsetY]; + if (Math.pow(e[0] - n[0], 2) + Math.pow(e[1] - n[1], 2) > 5) return; + var i = this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX, t.offsetY]); + "none" !== i.behavior && this._dispatchExpand({axisExpandWindow: i.axisExpandWindow}) + } + this._mouseDownPoint = null + }, mousemove: function (t) { + if (!this._mouseDownPoint && rk(this, "mousemove")) { + var e = this._model, n = e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX, t.offsetY]), + i = n.behavior; + "jump" === i && this._throttledDispatchExpand.debounceNextCall(e.get("axisExpandDebounce")), this._throttledDispatchExpand("none" === i ? null : { + axisExpandWindow: n.axisExpandWindow, + animation: "jump" === i ? null : {duration: 0} + }) + } + } + }; + + function rk(t, e) { + var n = t._model; + return n.get("axisExpandable") && n.get("axisExpandTriggerOn") === e + } + + var ok = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function () { + t.prototype.init.apply(this, arguments), this.mergeOption({}) + }, e.prototype.mergeOption = function (t) { + var e = this.option; + t && C(e, t, !0), this._initDimensions() + }, e.prototype.contains = function (t, e) { + var n = t.get("parallelIndex"); + return null != n && e.getComponent("parallel", n) === this + }, e.prototype.setAxisExpand = function (t) { + E(["axisExpandable", "axisExpandCenter", "axisExpandCount", "axisExpandWidth", "axisExpandWindow"], (function (e) { + t.hasOwnProperty(e) && (this.option[e] = t[e]) + }), this) + }, e.prototype._initDimensions = function () { + var t = this.dimensions = [], e = this.parallelAxisIndex = []; + E(B(this.ecModel.queryComponents({mainType: "parallelAxis"}), (function (t) { + return (t.get("parallelIndex") || 0) === this.componentIndex + }), this), (function (n) { + t.push("dim" + n.get("dim")), e.push(n.componentIndex) + })) + }, e.type = "parallel", e.dependencies = ["parallelAxis"], e.layoutMode = "box", e.defaultOption = { + z: 0, + left: 80, + top: 60, + right: 80, + bottom: 60, + layout: "horizontal", + axisExpandable: !1, + axisExpandCenter: null, + axisExpandCount: 0, + axisExpandWidth: 50, + axisExpandRate: 17, + axisExpandDebounce: 50, + axisExpandSlideTriggerArea: [-.15, .05, .4], + axisExpandTriggerOn: "click", + parallelAxisDefault: null + }, e + }(Ip), ak = function (t) { + function e(e, n, i, r, o) { + var a = t.call(this, e, n, i) || this; + return a.type = r || "value", a.axisIndex = o, a + } + + return n(e, t), e.prototype.isHorizontal = function () { + return "horizontal" !== this.coordinateSystem.getModel().get("layout") + }, e + }(G_); + + function sk(t, e, n, i, r, o) { + t = t || 0; + var a = n[1] - n[0]; + if (null != r && (r = uk(r, [0, a])), null != o && (o = Math.max(o, null != r ? r : 0)), "all" === i) { + var s = Math.abs(e[1] - e[0]); + s = uk(s, [0, a]), r = o = uk(s, [r, o]), i = 0 + } + e[0] = uk(e[0], n), e[1] = uk(e[1], n); + var l = lk(e, i); + e[i] += t; + var u, h = r || 0, c = n.slice(); + return l.sign < 0 ? c[0] += h : c[1] -= h, e[i] = uk(e[i], c), u = lk(e, i), null != r && (u.sign !== l.sign || u.span < r) && (e[1 - i] = e[i] + l.sign * r), u = lk(e, i), null != o && u.span > o && (e[1 - i] = e[i] + u.sign * o), e + } + + function lk(t, e) { + var n = t[e] - t[1 - e]; + return {span: Math.abs(n), sign: n > 0 ? -1 : n < 0 ? 1 : e ? -1 : 1} + } + + function uk(t, e) { + return Math.min(null != e[1] ? e[1] : 1 / 0, Math.max(null != e[0] ? e[0] : -1 / 0, t)) + } + + var hk = E, ck = Math.min, pk = Math.max, dk = Math.floor, fk = Math.ceil, gk = zr, yk = Math.PI, vk = function () { + function t(t, e, n) { + this.type = "parallel", this._axesMap = ft(), this._axesLayout = {}, this.dimensions = t.dimensions, this._model = t, this._init(t, e, n) + } + + return t.prototype._init = function (t, e, n) { + var i = t.dimensions, r = t.parallelAxisIndex; + hk(i, (function (t, n) { + var i = r[n], o = e.getComponent("parallelAxis", i), + a = this._axesMap.set(t, new ak(t, i_(o), [0, 0], o.get("type"), i)), s = "category" === a.type; + a.onBand = s && o.get("boundaryGap"), a.inverse = o.get("inverse"), o.axis = a, a.model = o, a.coordinateSystem = o.coordinateSystem = this + }), this) + }, t.prototype.update = function (t, e) { + this._updateAxesFromSeries(this._model, t) + }, t.prototype.containPoint = function (t) { + var e = this._makeLayoutInfo(), n = e.axisBase, i = e.layoutBase, r = e.pixelDimIndex, o = t[1 - r], + a = t[r]; + return o >= n && o <= n + e.axisLength && a >= i && a <= i + e.layoutLength + }, t.prototype.getModel = function () { + return this._model + }, t.prototype._updateAxesFromSeries = function (t, e) { + e.eachSeries((function (n) { + if (t.contains(n, e)) { + var i = n.getData(); + hk(this.dimensions, (function (t) { + var e = this._axesMap.get(t); + e.scale.unionExtentFromData(i, i.mapDimension(t)), n_(e.scale, e.model) + }), this) + } + }), this) + }, t.prototype.resize = function (t, e) { + this._rect = mp(t.getBoxLayoutParams(), {width: e.getWidth(), height: e.getHeight()}), this._layoutAxes() + }, t.prototype.getRect = function () { + return this._rect + }, t.prototype._makeLayoutInfo = function () { + var t, e = this._model, n = this._rect, i = ["x", "y"], r = ["width", "height"], o = e.get("layout"), + a = "horizontal" === o ? 0 : 1, s = n[r[a]], l = [0, s], u = this.dimensions.length, + h = mk(e.get("axisExpandWidth"), l), c = mk(e.get("axisExpandCount") || 0, [0, u]), + p = e.get("axisExpandable") && u > 3 && u > c && c > 1 && h > 0 && s > 0, d = e.get("axisExpandWindow"); + d ? (t = mk(d[1] - d[0], l), d[1] = d[0] + t) : (t = mk(h * (c - 1), l), (d = [h * (e.get("axisExpandCenter") || dk(u / 2)) - t / 2])[1] = d[0] + t); + var f = (s - t) / (u - c); + f < 3 && (f = 0); + var g = [dk(gk(d[0] / h, 1)) + 1, fk(gk(d[1] / h, 1)) - 1], y = f / h * d[0]; + return { + layout: o, + pixelDimIndex: a, + layoutBase: n[i[a]], + layoutLength: s, + axisBase: n[i[1 - a]], + axisLength: n[r[1 - a]], + axisExpandable: p, + axisExpandWidth: h, + axisCollapseWidth: f, + axisExpandWindow: d, + axisCount: u, + winInnerIndices: g, + axisExpandWindow0Pos: y + } + }, t.prototype._layoutAxes = function () { + var t = this._rect, e = this._axesMap, n = this.dimensions, i = this._makeLayoutInfo(), r = i.layout; + e.each((function (t) { + var e = [0, i.axisLength], n = t.inverse ? 1 : 0; + t.setExtent(e[n], e[1 - n]) + })), hk(n, (function (e, n) { + var o = (i.axisExpandable ? _k : xk)(n, i), + a = {horizontal: {x: o.position, y: i.axisLength}, vertical: {x: 0, y: o.position}}, + s = {horizontal: yk / 2, vertical: 0}, l = [a[r].x + t.x, a[r].y + t.y], u = s[r], + h = [1, 0, 0, 1, 0, 0]; + zi(h, h, u), Ei(h, h, l), this._axesLayout[e] = { + position: l, + rotation: u, + transform: h, + axisNameAvailableWidth: o.axisNameAvailableWidth, + axisLabelShow: o.axisLabelShow, + nameTruncateMaxWidth: o.nameTruncateMaxWidth, + tickDirection: 1, + labelDirection: 1 + } + }), this) + }, t.prototype.getAxis = function (t) { + return this._axesMap.get(t) + }, t.prototype.dataToPoint = function (t, e) { + return this.axisCoordToPoint(this._axesMap.get(e).dataToCoord(t), e) + }, t.prototype.eachActiveState = function (t, e, n, i) { + null == n && (n = 0), null == i && (i = t.count()); + var r = this._axesMap, o = this.dimensions, a = [], s = []; + E(o, (function (e) { + a.push(t.mapDimension(e)), s.push(r.get(e).model) + })); + for (var l = this.hasAxisBrushed(), u = n; u < i; u++) { + var h = void 0; + if (l) { + h = "active"; + for (var c = t.getValues(a, u), p = 0, d = o.length; p < d; p++) { + if ("inactive" === s[p].getActiveState(c[p])) { + h = "inactive"; + break + } + } + } else h = "normal"; + e(h, u) + } + }, t.prototype.hasAxisBrushed = function () { + for (var t = this.dimensions, e = this._axesMap, n = !1, i = 0, r = t.length; i < r; i++) "normal" !== e.get(t[i]).model.getActiveState() && (n = !0); + return n + }, t.prototype.axisCoordToPoint = function (t, e) { + return Ih([t, 0], this._axesLayout[e].transform) + }, t.prototype.getAxisLayout = function (t) { + return T(this._axesLayout[t]) + }, t.prototype.getSlidedAxisExpandWindow = function (t) { + var e = this._makeLayoutInfo(), n = e.pixelDimIndex, i = e.axisExpandWindow.slice(), r = i[1] - i[0], + o = [0, e.axisExpandWidth * (e.axisCount - 1)]; + if (!this.containPoint(t)) return {behavior: "none", axisExpandWindow: i}; + var a, s = t[n] - e.layoutBase - e.axisExpandWindow0Pos, l = "slide", u = e.axisCollapseWidth, + h = this._model.get("axisExpandSlideTriggerArea"), c = null != h[0]; + if (u) c && u && s < r * h[0] ? (l = "jump", a = s - r * h[2]) : c && u && s > r * (1 - h[0]) ? (l = "jump", a = s - r * (1 - h[2])) : (a = s - r * h[1]) >= 0 && (a = s - r * (1 - h[1])) <= 0 && (a = 0), (a *= e.axisExpandWidth / u) ? sk(a, i, o, "all") : l = "none"; else { + var p = i[1] - i[0]; + (i = [pk(0, o[1] * s / p - p / 2)])[1] = ck(o[1], i[0] + p), i[0] = i[1] - p + } + return {axisExpandWindow: i, behavior: l} + }, t + }(); + + function mk(t, e) { + return ck(pk(t, e[0]), e[1]) + } + + function xk(t, e) { + var n = e.layoutLength / (e.axisCount - 1); + return {position: n * t, axisNameAvailableWidth: n, axisLabelShow: !0} + } + + function _k(t, e) { + var n, i, r = e.layoutLength, o = e.axisExpandWidth, a = e.axisCount, s = e.axisCollapseWidth, + l = e.winInnerIndices, u = s, h = !1; + return t < l[0] ? (n = t * s, i = s) : t <= l[1] ? (n = e.axisExpandWindow0Pos + t * o - e.axisExpandWindow[0], u = o, h = !0) : (n = r - (a - 1 - t) * s, i = s), { + position: n, + axisNameAvailableWidth: u, + axisLabelShow: h, + nameTruncateMaxWidth: i + } + } + + var bk = { + create: function (t, e) { + var n = []; + return t.eachComponent("parallel", (function (i, r) { + var o = new vk(i, t, e); + o.name = "parallel_" + r, o.resize(i, e), i.coordinateSystem = o, o.model = i, n.push(o) + })), t.eachSeries((function (t) { + if ("parallel" === t.get("coordinateSystem")) { + var e = t.getReferringComponents("parallel", Co).models[0]; + t.coordinateSystem = e.coordinateSystem + } + })), n + } + }, wk = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.activeIntervals = [], n + } + + return n(e, t), e.prototype.getAreaSelectStyle = function () { + return Wo([["fill", "color"], ["lineWidth", "borderWidth"], ["stroke", "borderColor"], ["width", "width"], ["opacity", "opacity"]])(this.getModel("areaSelectStyle")) + }, e.prototype.setActiveIntervals = function (t) { + var e = this.activeIntervals = T(t); + if (e) for (var n = e.length - 1; n >= 0; n--) Vr(e[n]) + }, e.prototype.getActiveState = function (t) { + var e = this.activeIntervals; + if (!e.length) return "normal"; + if (null == t || isNaN(+t)) return "inactive"; + if (1 === e.length) { + var n = e[0]; + if (n[0] <= t && t <= n[1]) return "active" + } else for (var i = 0, r = e.length; i < r; i++) if (e[i][0] <= t && t <= e[i][1]) return "active"; + return "inactive" + }, e + }(Ip); + R(wk, h_); + var Sk = !0, Mk = Math.min, Ik = Math.max, Tk = Math.pow, Ck = "globalPan", + Dk = {w: [0, 0], e: [0, 1], n: [1, 0], s: [1, 1]}, + Ak = {w: "ew", e: "ew", n: "ns", s: "ns", ne: "nesw", sw: "nesw", nw: "nwse", se: "nwse"}, kk = { + brushStyle: {lineWidth: 2, stroke: "rgba(210,219,238,0.3)", fill: "#D2DBEE"}, + transformable: !0, + brushMode: "single", + removeOnClick: !1 + }, Lk = 0, Pk = function (t) { + function e(e) { + var n = t.call(this) || this; + return n._track = [], n._covers = [], n._handlers = {}, n._zr = e, n.group = new Cr, n._uid = "brushController_" + Lk++, E(oL, (function (t, e) { + this._handlers[e] = W(t, this) + }), n), n + } + + return n(e, t), e.prototype.enableBrush = function (t) { + return this._brushType && this._doDisableBrush(), t.brushType && this._doEnableBrush(t), this + }, e.prototype._doEnableBrush = function (t) { + var e = this._zr; + this._enableGlobalPan || function (t, e, n) { + CI(t)[e] = n + }(e, Ck, this._uid), E(this._handlers, (function (t, n) { + e.on(n, t) + })), this._brushType = t.brushType, this._brushOption = C(T(kk), t, !0) + }, e.prototype._doDisableBrush = function () { + var t = this._zr; + !function (t, e, n) { + var i = CI(t); + i[e] === n && (i[e] = null) + }(t, Ck, this._uid), E(this._handlers, (function (e, n) { + t.off(n, e) + })), this._brushType = this._brushOption = null + }, e.prototype.setPanels = function (t) { + if (t && t.length) { + var e = this._panels = {}; + E(t, (function (t) { + e[t.panelId] = T(t) + })) + } else this._panels = null; + return this + }, e.prototype.mount = function (t) { + t = t || {}, this._enableGlobalPan = t.enableGlobalPan; + var e = this.group; + return this._zr.add(e), e.attr({ + x: t.x || 0, + y: t.y || 0, + rotation: t.rotation || 0, + scaleX: t.scaleX || 1, + scaleY: t.scaleY || 1 + }), this._transform = e.getLocalTransform(), this + }, e.prototype.updateCovers = function (t) { + t = z(t, (function (t) { + return C(T(kk), t, !0) + })); + var e = this._covers, n = this._covers = [], i = this, r = this._creatingCover; + return new Sm(e, t, (function (t, e) { + return o(t.__brushOption, e) + }), o).add(a).update(a).remove((function (t) { + e[t] !== r && i.group.remove(e[t]) + })).execute(), this; + + function o(t, e) { + return (null != t.id ? t.id : "\0-brush-index-" + e) + "-" + t.brushType + } + + function a(o, a) { + var s = t[o]; + if (null != a && e[a] === r) n[o] = e[a]; else { + var l = n[o] = null != a ? (e[a].__brushOption = s, e[a]) : Rk(i, Ok(i, s)); + zk(i, l) + } + } + }, e.prototype.unmount = function () { + return this.enableBrush(!1), Gk(this), this._zr.remove(this.group), this + }, e.prototype.dispose = function () { + this.unmount(), this.off() + }, e + }(Xt); + + function Ok(t, e) { + var n = sL[e.brushType].createCover(t, e); + return n.__brushOption = e, Ek(n, e), t.group.add(n), n + } + + function Rk(t, e) { + var n = Vk(e); + return n.endCreating && (n.endCreating(t, e), Ek(e, e.__brushOption)), e + } + + function Nk(t, e) { + var n = e.__brushOption; + Vk(e).updateCoverShape(t, e, n.range, n) + } + + function Ek(t, e) { + var n = e.z; + null == n && (n = 1e4), t.traverse((function (t) { + t.z = n, t.z2 = n + })) + } + + function zk(t, e) { + Vk(e).updateCommon(t, e), Nk(t, e) + } + + function Vk(t) { + return sL[t.__brushOption.brushType] + } + + function Bk(t, e, n) { + var i, r = t._panels; + if (!r) return Sk; + var o = t._transform; + return E(r, (function (t) { + t.isTargetByCursor(e, n, o) && (i = t) + })), i + } + + function Fk(t, e) { + var n = t._panels; + if (!n) return Sk; + var i = e.__brushOption.panelId; + return null != i ? n[i] : Sk + } + + function Gk(t) { + var e = t._covers, n = e.length; + return E(e, (function (e) { + t.group.remove(e) + }), t), e.length = 0, !!n + } + + function Wk(t, e) { + var n = z(t._covers, (function (t) { + var e = t.__brushOption, n = T(e.range); + return {brushType: e.brushType, panelId: e.panelId, range: n} + })); + t.trigger("brush", {areas: n, isEnd: !!e.isEnd, removeOnClick: !!e.removeOnClick}) + } + + function Hk(t) { + var e = t.length - 1; + return e < 0 && (e = 0), [t[0], t[e]] + } + + function Yk(t, e, n, i) { + var r = new Cr; + return r.add(new Ts({ + name: "main", + style: jk(n), + silent: !0, + draggable: !0, + cursor: "move", + drift: H($k, t, e, r, ["n", "s", "w", "e"]), + ondragend: H(Wk, e, {isEnd: !0}) + })), E(i, (function (n) { + r.add(new Ts({ + name: n.join(""), + style: {opacity: 0}, + draggable: !0, + silent: !0, + invisible: !0, + drift: H($k, t, e, r, n), + ondragend: H(Wk, e, {isEnd: !0}) + })) + })), r + } + + function Uk(t, e, n, i) { + var r = i.brushStyle.lineWidth || 0, o = Ik(r, 6), a = n[0][0], s = n[1][0], l = a - r / 2, u = s - r / 2, + h = n[0][1], c = n[1][1], p = h - o + r / 2, d = c - o + r / 2, f = h - a, g = c - s, y = f + r, v = g + r; + Zk(t, e, "main", a, s, f, g), i.transformable && (Zk(t, e, "w", l, u, o, v), Zk(t, e, "e", p, u, o, v), Zk(t, e, "n", l, u, y, o), Zk(t, e, "s", l, d, y, o), Zk(t, e, "nw", l, u, o, o), Zk(t, e, "ne", p, u, o, o), Zk(t, e, "sw", l, d, o, o), Zk(t, e, "se", p, d, o, o)) + } + + function Xk(t, e) { + var n = e.__brushOption, i = n.transformable, r = e.childAt(0); + r.useStyle(jk(n)), r.attr({ + silent: !i, + cursor: i ? "move" : "default" + }), E([["w"], ["e"], ["n"], ["s"], ["s", "e"], ["s", "w"], ["n", "e"], ["n", "w"]], (function (n) { + var r = e.childOfName(n.join("")), o = 1 === n.length ? Kk(t, n[0]) : function (t, e) { + var n = [Kk(t, e[0]), Kk(t, e[1])]; + return ("e" === n[0] || "w" === n[0]) && n.reverse(), n.join("") + }(t, n); + r && r.attr({silent: !i, invisible: !i, cursor: i ? Ak[o] + "-resize" : null}) + })) + } + + function Zk(t, e, n, i, r, o, a) { + var s = e.childOfName(n); + s && s.setShape(function (t) { + var e = Mk(t[0][0], t[1][0]), n = Mk(t[0][1], t[1][1]), i = Ik(t[0][0], t[1][0]), r = Ik(t[0][1], t[1][1]); + return {x: e, y: n, width: i - e, height: r - n} + }(tL(t, e, [[i, r], [i + o, r + a]]))) + } + + function jk(t) { + return k({strokeNoScale: !0}, t.brushStyle) + } + + function qk(t, e, n, i) { + var r = [Mk(t, n), Mk(e, i)], o = [Ik(t, n), Ik(e, i)]; + return [[r[0], o[0]], [r[1], o[1]]] + } + + function Kk(t, e) { + return {left: "w", right: "e", top: "n", bottom: "s"}[Th({ + w: "left", + e: "right", + n: "top", + s: "bottom" + }[e], function (t) { + return Mh(t.group) + }(t))] + } + + function $k(t, e, n, i, r, o) { + var a = n.__brushOption, s = t.toRectRange(a.range), l = Qk(e, r, o); + E(i, (function (t) { + var e = Dk[t]; + s[e[0]][e[1]] += l[e[0]] + })), a.range = t.fromRectRange(qk(s[0][0], s[1][0], s[0][1], s[1][1])), zk(e, n), Wk(e, {isEnd: !1}) + } + + function Jk(t, e, n, i) { + var r = e.__brushOption.range, o = Qk(t, n, i); + E(r, (function (t) { + t[0] += o[0], t[1] += o[1] + })), zk(t, e), Wk(t, {isEnd: !1}) + } + + function Qk(t, e, n) { + var i = t.group, r = i.transformCoordToLocal(e, n), o = i.transformCoordToLocal(0, 0); + return [r[0] - o[0], r[1] - o[1]] + } + + function tL(t, e, n) { + var i = Fk(t, e); + return i && i !== Sk ? i.clipPath(n, t._transform) : T(n) + } + + function eL(t) { + var e = t.event; + e.preventDefault && e.preventDefault() + } + + function nL(t, e, n) { + return t.childOfName("main").contain(e, n) + } + + function iL(t, e, n, i) { + var r, o = t._creatingCover, a = t._creatingPanel, s = t._brushOption; + if (t._track.push(n.slice()), function (t) { + var e = t._track; + if (!e.length) return !1; + var n = e[e.length - 1], i = e[0], r = n[0] - i[0], o = n[1] - i[1]; + return Tk(r * r + o * o, .5) > 6 + }(t) || o) { + if (a && !o) { + "single" === s.brushMode && Gk(t); + var l = T(s); + l.brushType = rL(l.brushType, a), l.panelId = a === Sk ? null : a.panelId, o = t._creatingCover = Ok(t, l), t._covers.push(o) + } + if (o) { + var u = sL[rL(t._brushType, a)]; + o.__brushOption.range = u.getCreatingRange(tL(t, o, t._track)), i && (Rk(t, o), u.updateCommon(t, o)), Nk(t, o), r = {isEnd: i} + } + } else i && "single" === s.brushMode && s.removeOnClick && Bk(t, e, n) && Gk(t) && (r = { + isEnd: i, + removeOnClick: !0 + }); + return r + } + + function rL(t, e) { + return "auto" === t ? e.defaultBrushType : t + } + + var oL = { + mousedown: function (t) { + if (this._dragging) aL(this, t); else if (!t.target || !t.target.draggable) { + eL(t); + var e = this.group.transformCoordToLocal(t.offsetX, t.offsetY); + this._creatingCover = null, (this._creatingPanel = Bk(this, t, e)) && (this._dragging = !0, this._track = [e.slice()]) + } + }, mousemove: function (t) { + var e = t.offsetX, n = t.offsetY, i = this.group.transformCoordToLocal(e, n); + if (function (t, e, n) { + if (t._brushType && !function (t, e, n) { + var i = t._zr; + return e < 0 || e > i.getWidth() || n < 0 || n > i.getHeight() + }(t, e.offsetX, e.offsetY)) { + var i = t._zr, r = t._covers, o = Bk(t, e, n); + if (!t._dragging) for (var a = 0; a < r.length; a++) { + var s = r[a].__brushOption; + if (o && (o === Sk || s.panelId === o.panelId) && sL[s.brushType].contain(r[a], n[0], n[1])) return + } + o && i.setCursorStyle("crosshair") + } + }(this, t, i), this._dragging) { + eL(t); + var r = iL(this, t, i, !1); + r && Wk(this, r) + } + }, mouseup: function (t) { + aL(this, t) + } + }; + + function aL(t, e) { + if (t._dragging) { + eL(e); + var n = e.offsetX, i = e.offsetY, r = t.group.transformCoordToLocal(n, i), o = iL(t, e, r, !0); + t._dragging = !1, t._track = [], t._creatingCover = null, o && Wk(t, o) + } + } + + var sL = { + lineX: lL(0), lineY: lL(1), rect: { + createCover: function (t, e) { + function n(t) { + return t + } + + return Yk({ + toRectRange: n, + fromRectRange: n + }, t, e, [["w"], ["e"], ["n"], ["s"], ["s", "e"], ["s", "w"], ["n", "e"], ["n", "w"]]) + }, getCreatingRange: function (t) { + var e = Hk(t); + return qk(e[1][0], e[1][1], e[0][0], e[0][1]) + }, updateCoverShape: function (t, e, n, i) { + Uk(t, e, n, i) + }, updateCommon: Xk, contain: nL + }, polygon: { + createCover: function (t, e) { + var n = new Cr; + return n.add(new Ou({name: "main", style: jk(e), silent: !0})), n + }, getCreatingRange: function (t) { + return t + }, endCreating: function (t, e) { + e.remove(e.childAt(0)), e.add(new Lu({ + name: "main", + draggable: !0, + drift: H(Jk, t, e), + ondragend: H(Wk, t, {isEnd: !0}) + })) + }, updateCoverShape: function (t, e, n, i) { + e.childAt(0).setShape({points: tL(t, e, n)}) + }, updateCommon: Xk, contain: nL + } + }; + + function lL(t) { + return { + createCover: function (e, n) { + return Yk({ + toRectRange: function (e) { + var n = [e, [0, 100]]; + return t && n.reverse(), n + }, fromRectRange: function (e) { + return e[t] + } + }, e, n, [[["w"], ["e"]], [["n"], ["s"]]][t]) + }, getCreatingRange: function (e) { + var n = Hk(e); + return [Mk(n[0][t], n[1][t]), Ik(n[0][t], n[1][t])] + }, updateCoverShape: function (e, n, i, r) { + var o, a = Fk(e, n); + if (a !== Sk && a.getLinearBrushOtherExtent) o = a.getLinearBrushOtherExtent(t); else { + var s = e._zr; + o = [0, [s.getWidth(), s.getHeight()][1 - t]] + } + var l = [i, o]; + t && l.reverse(), Uk(e, n, l, r) + }, updateCommon: Xk, contain: nL + } + } + + function uL(t) { + return t = pL(t), function (e) { + return Ah(e, t) + } + } + + function hL(t, e) { + return t = pL(t), function (n) { + var i = null != e ? e : n, r = i ? t.width : t.height, o = i ? t.x : t.y; + return [o, o + (r || 0)] + } + } + + function cL(t, e, n) { + var i = pL(t); + return function (t, r) { + return i.contain(r[0], r[1]) && !EI(t, e, n) + } + } + + function pL(t) { + return sr.create(t) + } + + var dL = ["axisLine", "axisTickLabel", "axisName"], fL = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function (e, n) { + t.prototype.init.apply(this, arguments), (this._brushController = new Pk(n.getZr())).on("brush", W(this._onBrush, this)) + }, e.prototype.render = function (t, e, n, i) { + if (!function (t, e, n) { + return n && "axisAreaSelect" === n.type && e.findComponents({ + mainType: "parallelAxis", + query: n + })[0] === t + }(t, e, i)) { + this.axisModel = t, this.api = n, this.group.removeAll(); + var r = this._axisGroup; + if (this._axisGroup = new Cr, this.group.add(this._axisGroup), t.get("show")) { + var o = function (t, e) { + return e.getComponent("parallel", t.get("parallelIndex")) + }(t, e), a = o.coordinateSystem, s = t.getAreaSelectStyle(), l = s.width, u = t.axis.dim, + h = A({strokeContainThreshold: l}, a.getAxisLayout(u)), c = new BM(t, h); + E(dL, c.add, c), this._axisGroup.add(c.getGroup()), this._refreshBrushController(h, s, t, o, l, n), Dh(r, this._axisGroup, t) + } + } + }, e.prototype._refreshBrushController = function (t, e, n, i, r, o) { + var a = n.axis.getExtent(), s = a[1] - a[0], l = Math.min(30, .1 * Math.abs(s)), + u = sr.create({x: a[0], y: -r / 2, width: s, height: r}); + u.x -= l, u.width += 2 * l, this._brushController.mount({ + enableGlobalPan: !0, + rotation: t.rotation, + x: t.position[0], + y: t.position[1] + }).setPanels([{ + panelId: "pl", + clipPath: uL(u), + isTargetByCursor: cL(u, o, i), + getLinearBrushOtherExtent: hL(u, 0) + }]).enableBrush({brushType: "lineX", brushStyle: e, removeOnClick: !0}).updateCovers(function (t) { + var e = t.axis; + return z(t.activeIntervals, (function (t) { + return { + brushType: "lineX", + panelId: "pl", + range: [e.dataToCoord(t[0], !0), e.dataToCoord(t[1], !0)] + } + })) + }(n)) + }, e.prototype._onBrush = function (t) { + var e = t.areas, n = this.axisModel, i = n.axis, r = z(e, (function (t) { + return [i.coordToData(t.range[0], !0), i.coordToData(t.range[1], !0)] + })); + (!n.option.realtime === t.isEnd || t.removeOnClick) && this.api.dispatchAction({ + type: "axisAreaSelect", + parallelAxisId: n.id, + intervals: r + }) + }, e.prototype.dispose = function () { + this._brushController.dispose() + }, e.type = "parallelAxis", e + }(fg); + var gL = {type: "axisAreaSelect", event: "axisAreaSelected"}; + var yL = { + type: "value", + areaSelectStyle: { + width: 20, + borderWidth: 1, + borderColor: "rgba(160,197,232)", + color: "rgba(160,197,232)", + opacity: .3 + }, + realtime: !0, + z: 10 + }; + + function vL(t) { + t.registerComponentView(nk), t.registerComponentModel(ok), t.registerCoordinateSystem("parallel", bk), t.registerPreprocessor(ek), t.registerComponentModel(wk), t.registerComponentView(fL), wM(t, "parallel", wk, yL), function (t) { + t.registerAction(gL, (function (t, e) { + e.eachComponent({mainType: "parallelAxis", query: t}, (function (e) { + e.axis.model.setActiveIntervals(t.intervals) + })) + })), t.registerAction("parallelAxisExpand", (function (t, e) { + e.eachComponent({mainType: "parallel", query: t}, (function (e) { + e.setAxisExpand(t) + })) + })) + }(t) + } + + var mL = function () { + this.x1 = 0, this.y1 = 0, this.x2 = 0, this.y2 = 0, this.cpx1 = 0, this.cpy1 = 0, this.cpx2 = 0, this.cpy2 = 0, this.extent = 0 + }, xL = function (t) { + function e(e) { + return t.call(this, e) || this + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new mL + }, e.prototype.buildPath = function (t, e) { + var n = e.extent; + t.moveTo(e.x1, e.y1), t.bezierCurveTo(e.cpx1, e.cpy1, e.cpx2, e.cpy2, e.x2, e.y2), "vertical" === e.orient ? (t.lineTo(e.x2 + n, e.y2), t.bezierCurveTo(e.cpx2 + n, e.cpy2, e.cpx1 + n, e.cpy1, e.x1 + n, e.y1)) : (t.lineTo(e.x2, e.y2 + n), t.bezierCurveTo(e.cpx2, e.cpy2 + n, e.cpx1, e.cpy1 + n, e.x1, e.y1 + n)), t.closePath() + }, e.prototype.highlight = function () { + xl(this) + }, e.prototype.downplay = function () { + _l(this) + }, e + }(fs), _L = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n._focusAdjacencyDisabled = !1, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + var i = this, r = t.getGraph(), o = this.group, a = t.layoutInfo, s = a.width, l = a.height, + u = t.getData(), h = t.getData("edge"), c = t.get("orient"); + this._model = t, o.removeAll(), o.x = a.x, o.y = a.y, r.eachEdge((function (e) { + var n = new xL, i = Ws(n); + i.dataIndex = e.dataIndex, i.seriesIndex = t.seriesIndex, i.dataType = "edge"; + var r, a, u, p, d, f, g, y, v = e.getModel(), m = v.getModel("lineStyle"), x = m.get("curveness"), + _ = e.node1.getLayout(), b = e.node1.getModel(), w = b.get("localX"), S = b.get("localY"), + M = e.node2.getLayout(), I = e.node2.getModel(), T = I.get("localX"), C = I.get("localY"), + D = e.getLayout(); + switch (n.shape.extent = Math.max(1, D.dy), n.shape.orient = c, "vertical" === c ? (r = (null != w ? w * s : _.x) + D.sy, a = (null != S ? S * l : _.y) + _.dy, u = (null != T ? T * s : M.x) + D.ty, d = r, f = a * (1 - x) + (p = null != C ? C * l : M.y) * x, g = u, y = a * x + p * (1 - x)) : (r = (null != w ? w * s : _.x) + _.dx, a = (null != S ? S * l : _.y) + D.sy, d = r * (1 - x) + (u = null != T ? T * s : M.x) * x, f = a, g = r * x + u * (1 - x), y = p = (null != C ? C * l : M.y) + D.ty), n.setShape({ + x1: r, + y1: a, + x2: u, + y2: p, + cpx1: d, + cpy1: f, + cpx2: g, + cpy2: y + }), n.useStyle(m.getItemStyle()), n.style.fill) { + case"source": + n.style.fill = e.node1.getVisual("color"), n.style.decal = e.node1.getVisual("style").decal; + break; + case"target": + n.style.fill = e.node2.getVisual("color"), n.style.decal = e.node2.getVisual("style").decal; + break; + case"gradient": + var A = e.node1.getVisual("color"), k = e.node2.getVisual("color"); + X(A) && X(k) && (n.style.fill = new Uu(0, 0, +("horizontal" === c), +("vertical" === c), [{ + color: A, + offset: 0 + }, {color: k, offset: 1}])) + } + var L = v.getModel("emphasis"); + zl(n, v, "lineStyle", (function (t) { + return t.getItemStyle() + })), o.add(n), h.setItemGraphicEl(e.dataIndex, n); + var P = L.get("focus"); + Ol(n, "adjacency" === P ? e.getAdjacentDataIndices() : P, L.get("blurScope"), L.get("disabled")), Ws(n).dataType = "edge" + })), r.eachNode((function (e) { + var n = e.getLayout(), i = e.getModel(), r = i.get("localX"), a = i.get("localY"), + h = i.getModel("emphasis"), c = new Ts({ + shape: { + x: null != r ? r * s : n.x, + y: null != a ? a * l : n.y, + width: n.dx, + height: n.dy + }, style: i.getModel("itemStyle").getItemStyle(), z2: 10 + }); + Wh(c, Hh(i), { + labelFetcher: t, + labelDataIndex: e.dataIndex, + defaultText: e.id + }), c.disableLabelAnimation = !0, c.setStyle("fill", e.getVisual("color")), c.setStyle("decal", e.getVisual("style").decal), zl(c, i), o.add(c), u.setItemGraphicEl(e.dataIndex, c), Ws(c).dataType = "node"; + var p = h.get("focus"); + Ol(c, "adjacency" === p ? e.getAdjacentDataIndices() : p, h.get("blurScope"), h.get("disabled")) + })), u.eachItemGraphicEl((function (e, r) { + u.getItemModel(r).get("draggable") && (e.drift = function (e, o) { + i._focusAdjacencyDisabled = !0, this.shape.x += e, this.shape.y += o, this.dirty(), n.dispatchAction({ + type: "dragNode", + seriesId: t.id, + dataIndex: u.getRawIndex(r), + localX: this.shape.x / s, + localY: this.shape.y / l + }) + }, e.ondragend = function () { + i._focusAdjacencyDisabled = !1 + }, e.draggable = !0, e.cursor = "move") + })), !this._data && t.isAnimationEnabled() && o.setClipPath(function (t, e, n) { + var i = new Ts({shape: {x: t.x - 10, y: t.y - 10, width: 0, height: t.height + 20}}); + return rh(i, {shape: {width: t.width + 20}}, e, n), i + }(o.getBoundingRect(), t, (function () { + o.removeClipPath() + }))), this._data = t.getData() + }, e.prototype.dispose = function () { + }, e.type = "sankey", e + }(mg); + var bL = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.getInitialData = function (t, e) { + var n = t.edges || t.links, i = t.data || t.nodes, r = t.levels; + this.levelModels = []; + for (var o = this.levelModels, a = 0; a < r.length; a++) null != r[a].depth && r[a].depth >= 0 && (o[r[a].depth] = new pc(r[a], this, e)); + if (i && n) return PA(i, n, this, !0, (function (t, e) { + t.wrapMethod("getItemModel", (function (t, e) { + var n = t.parentModel, i = n.getData().getItemLayout(e); + if (i) { + var r = i.depth, o = n.levelModels[r]; + o && (t.parentModel = o) + } + return t + })), e.wrapMethod("getItemModel", (function (t, e) { + var n = t.parentModel, i = n.getGraph().getEdgeByIndex(e).node1.getLayout(); + if (i) { + var r = i.depth, o = n.levelModels[r]; + o && (t.parentModel = o) + } + return t + })) + })).data + }, e.prototype.setNodePosition = function (t, e) { + var n = (this.option.data || this.option.nodes)[t]; + n.localX = e[0], n.localY = e[1] + }, e.prototype.getGraph = function () { + return this.getData().graph + }, e.prototype.getEdgeData = function () { + return this.getGraph().edgeData + }, e.prototype.formatTooltip = function (t, e, n) { + function i(t) { + return isNaN(t) || null == t + } + + if ("edge" === n) { + var r = this.getDataParams(t, n), o = r.data, a = r.value; + return Uf("nameValue", {name: o.source + " -- " + o.target, value: a, noValue: i(a)}) + } + var s = this.getGraph().getNodeByIndex(t).getLayout().value, l = this.getDataParams(t, n).data.name; + return Uf("nameValue", {name: null != l ? l + "" : null, value: s, noValue: i(s)}) + }, e.prototype.optionUpdated = function () { + }, e.prototype.getDataParams = function (e, n) { + var i = t.prototype.getDataParams.call(this, e, n); + if (null == i.value && "node" === n) { + var r = this.getGraph().getNodeByIndex(e).getLayout().value; + i.value = r + } + return i + }, e.type = "series.sankey", e.defaultOption = { + z: 2, + coordinateSystem: "view", + left: "5%", + top: "5%", + right: "20%", + bottom: "5%", + orient: "horizontal", + nodeWidth: 20, + nodeGap: 8, + draggable: !0, + layoutIterations: 32, + label: {show: !0, position: "right", fontSize: 12}, + levels: [], + nodeAlign: "justify", + lineStyle: {color: "#314656", opacity: .2, curveness: .5}, + emphasis: {label: {show: !0}, lineStyle: {opacity: .5}}, + select: {itemStyle: {borderColor: "#212121"}}, + animationEasing: "linear", + animationDuration: 1e3 + }, e + }(ag); + + function wL(t, e) { + t.eachSeriesByType("sankey", (function (t) { + var n = t.get("nodeWidth"), i = t.get("nodeGap"), r = function (t, e) { + return mp(t.getBoxLayoutParams(), {width: e.getWidth(), height: e.getHeight()}) + }(t, e); + t.layoutInfo = r; + var o = r.width, a = r.height, s = t.getGraph(), l = s.nodes, u = s.edges; + !function (t) { + E(t, (function (t) { + var e = PL(t.outEdges, LL), n = PL(t.inEdges, LL), i = t.getValue() || 0, r = Math.max(e, n, i); + t.setLayout({value: r}, !0) + })) + }(l), function (t, e, n, i, r, o, a, s, l) { + (function (t, e, n, i, r, o, a) { + for (var s = [], l = [], u = [], h = [], c = 0, p = 0; p < e.length; p++) s[p] = 1; + for (p = 0; p < t.length; p++) l[p] = t[p].inEdges.length, 0 === l[p] && u.push(t[p]); + var d = -1; + for (; u.length;) { + for (var f = 0; f < u.length; f++) { + var g = u[f], y = g.hostGraph.data.getRawDataItem(g.dataIndex), + v = null != y.depth && y.depth >= 0; + v && y.depth > d && (d = y.depth), g.setLayout({depth: v ? y.depth : c}, !0), "vertical" === o ? g.setLayout({dy: n}, !0) : g.setLayout({dx: n}, !0); + for (var m = 0; m < g.outEdges.length; m++) { + var x = g.outEdges[m]; + s[e.indexOf(x)] = 0; + var _ = x.node2; + 0 == --l[t.indexOf(_)] && h.indexOf(_) < 0 && h.push(_) + } + } + ++c, u = h, h = [] + } + for (p = 0; p < s.length; p++) if (1 === s[p]) throw new Error("Sankey is a DAG, the original data has cycle!"); + var b = d > c - 1 ? d : c - 1; + a && "left" !== a && function (t, e, n, i) { + if ("right" === e) { + for (var r = [], o = t, a = 0; o.length;) { + for (var s = 0; s < o.length; s++) { + var l = o[s]; + l.setLayout({skNodeHeight: a}, !0); + for (var u = 0; u < l.inEdges.length; u++) { + var h = l.inEdges[u]; + r.indexOf(h.node1) < 0 && r.push(h.node1) + } + } + o = r, r = [], ++a + } + E(t, (function (t) { + SL(t) || t.setLayout({depth: Math.max(0, i - t.getLayout().skNodeHeight)}, !0) + })) + } else "justify" === e && function (t, e) { + E(t, (function (t) { + SL(t) || t.outEdges.length || t.setLayout({depth: e}, !0) + })) + }(t, i) + }(t, a, 0, b); + !function (t, e, n) { + E(t, (function (t) { + var i = t.getLayout().depth * e; + "vertical" === n ? t.setLayout({y: i}, !0) : t.setLayout({x: i}, !0) + })) + }(t, "vertical" === o ? (r - n) / b : (i - n) / b, o) + })(t, e, n, r, o, s, l), function (t, e, n, i, r, o, a) { + var s = function (t, e) { + var n = [], i = "vertical" === e ? "y" : "x", r = Lo(t, (function (t) { + return t.getLayout()[i] + })); + return r.keys.sort((function (t, e) { + return t - e + })), E(r.keys, (function (t) { + n.push(r.buckets.get(t)) + })), n + }(t, a); + (function (t, e, n, i, r, o) { + var a = 1 / 0; + E(t, (function (t) { + var e = t.length, s = 0; + E(t, (function (t) { + s += t.getLayout().value + })); + var l = "vertical" === o ? (i - (e - 1) * r) / s : (n - (e - 1) * r) / s; + l < a && (a = l) + })), E(t, (function (t) { + E(t, (function (t, e) { + var n = t.getLayout().value * a; + "vertical" === o ? (t.setLayout({x: e}, !0), t.setLayout({dx: n}, !0)) : (t.setLayout({y: e}, !0), t.setLayout({dy: n}, !0)) + })) + })), E(e, (function (t) { + var e = +t.getValue() * a; + t.setLayout({dy: e}, !0) + })) + })(s, e, n, i, r, a), ML(s, r, n, i, a); + for (var l = 1; o > 0; o--) IL(s, l *= .99, a), ML(s, r, n, i, a), OL(s, l, a), ML(s, r, n, i, a) + }(t, e, o, r, i, a, s), function (t, e) { + var n = "vertical" === e ? "x" : "y"; + E(t, (function (t) { + t.outEdges.sort((function (t, e) { + return t.node2.getLayout()[n] - e.node2.getLayout()[n] + })), t.inEdges.sort((function (t, e) { + return t.node1.getLayout()[n] - e.node1.getLayout()[n] + })) + })), E(t, (function (t) { + var e = 0, n = 0; + E(t.outEdges, (function (t) { + t.setLayout({sy: e}, !0), e += t.getLayout().dy + })), E(t.inEdges, (function (t) { + t.setLayout({ty: n}, !0), n += t.getLayout().dy + })) + })) + }(t, s) + }(l, u, n, i, o, a, 0 !== B(l, (function (t) { + return 0 === t.getLayout().value + })).length ? 0 : t.get("layoutIterations"), t.get("orient"), t.get("nodeAlign")) + })) + } + + function SL(t) { + var e = t.hostGraph.data.getRawDataItem(t.dataIndex); + return null != e.depth && e.depth >= 0 + } + + function ML(t, e, n, i, r) { + var o = "vertical" === r ? "x" : "y"; + E(t, (function (t) { + var a, s, l; + t.sort((function (t, e) { + return t.getLayout()[o] - e.getLayout()[o] + })); + for (var u = 0, h = t.length, c = "vertical" === r ? "dx" : "dy", p = 0; p < h; p++) (l = u - (s = t[p]).getLayout()[o]) > 0 && (a = s.getLayout()[o] + l, "vertical" === r ? s.setLayout({x: a}, !0) : s.setLayout({y: a}, !0)), u = s.getLayout()[o] + s.getLayout()[c] + e; + if ((l = u - e - ("vertical" === r ? i : n)) > 0) { + a = s.getLayout()[o] - l, "vertical" === r ? s.setLayout({x: a}, !0) : s.setLayout({y: a}, !0), u = a; + for (p = h - 2; p >= 0; --p) (l = (s = t[p]).getLayout()[o] + s.getLayout()[c] + e - u) > 0 && (a = s.getLayout()[o] - l, "vertical" === r ? s.setLayout({x: a}, !0) : s.setLayout({y: a}, !0)), u = s.getLayout()[o] + } + })) + } + + function IL(t, e, n) { + E(t.slice().reverse(), (function (t) { + E(t, (function (t) { + if (t.outEdges.length) { + var i = PL(t.outEdges, TL, n) / PL(t.outEdges, LL); + if (isNaN(i)) { + var r = t.outEdges.length; + i = r ? PL(t.outEdges, CL, n) / r : 0 + } + if ("vertical" === n) { + var o = t.getLayout().x + (i - kL(t, n)) * e; + t.setLayout({x: o}, !0) + } else { + var a = t.getLayout().y + (i - kL(t, n)) * e; + t.setLayout({y: a}, !0) + } + } + })) + })) + } + + function TL(t, e) { + return kL(t.node2, e) * t.getValue() + } + + function CL(t, e) { + return kL(t.node2, e) + } + + function DL(t, e) { + return kL(t.node1, e) * t.getValue() + } + + function AL(t, e) { + return kL(t.node1, e) + } + + function kL(t, e) { + return "vertical" === e ? t.getLayout().x + t.getLayout().dx / 2 : t.getLayout().y + t.getLayout().dy / 2 + } + + function LL(t) { + return t.getValue() + } + + function PL(t, e, n) { + for (var i = 0, r = t.length, o = -1; ++o < r;) { + var a = +e(t[o], n); + isNaN(a) || (i += a) + } + return i + } + + function OL(t, e, n) { + E(t, (function (t) { + E(t, (function (t) { + if (t.inEdges.length) { + var i = PL(t.inEdges, DL, n) / PL(t.inEdges, LL); + if (isNaN(i)) { + var r = t.inEdges.length; + i = r ? PL(t.inEdges, AL, n) / r : 0 + } + if ("vertical" === n) { + var o = t.getLayout().x + (i - kL(t, n)) * e; + t.setLayout({x: o}, !0) + } else { + var a = t.getLayout().y + (i - kL(t, n)) * e; + t.setLayout({y: a}, !0) + } + } + })) + })) + } + + function RL(t) { + t.eachSeriesByType("sankey", (function (t) { + var e = t.getGraph().nodes; + if (e.length) { + var n = 1 / 0, i = -1 / 0; + E(e, (function (t) { + var e = t.getLayout().value; + e < n && (n = e), e > i && (i = e) + })), E(e, (function (e) { + var r = new eD({ + type: "color", + mappingMethod: "linear", + dataExtent: [n, i], + visual: t.get("color") + }).mapValueToVisual(e.getLayout().value), o = e.getModel().get(["itemStyle", "color"]); + null != o ? (e.setVisual("color", o), e.setVisual("style", {fill: o})) : (e.setVisual("color", r), e.setVisual("style", {fill: r})) + })) + } + })) + } + + var NL = function () { + function t() { + } + + return t.prototype.getInitialData = function (t, e) { + var n, i, r = e.getComponent("xAxis", this.get("xAxisIndex")), + o = e.getComponent("yAxis", this.get("yAxisIndex")), a = r.get("type"), s = o.get("type"); + "category" === a ? (t.layout = "horizontal", n = r.getOrdinalMeta(), i = !0) : "category" === s ? (t.layout = "vertical", n = o.getOrdinalMeta(), i = !0) : t.layout = t.layout || "horizontal"; + var l = ["x", "y"], u = "horizontal" === t.layout ? 0 : 1, h = this._baseAxisDim = l[u], c = l[1 - u], + p = [r, o], d = p[u].get("type"), f = p[1 - u].get("type"), g = t.data; + if (g && i) { + var y = []; + E(g, (function (t, e) { + var n; + Y(t) ? (n = t.slice(), t.unshift(e)) : Y(t.value) ? ((n = A({}, t)).value = n.value.slice(), t.value.unshift(e)) : n = t, y.push(n) + })), t.data = y + } + var v = this.defaultValueDimensions, m = [{ + name: h, + type: Tm(d), + ordinalMeta: n, + otherDims: {tooltip: !1, itemName: 0}, + dimsDef: ["base"] + }, {name: c, type: Tm(f), dimsDef: v.slice()}]; + return sM(this, {coordDimensions: m, dimensionsCount: v.length + 1, encodeDefaulter: H(Wp, m, this)}) + }, t.prototype.getBaseAxis = function () { + var t = this._baseAxisDim; + return this.ecModel.getComponent(t + "Axis", this.get(t + "AxisIndex")).axis + }, t + }(), EL = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.defaultValueDimensions = [{name: "min", defaultTooltip: !0}, { + name: "Q1", + defaultTooltip: !0 + }, {name: "median", defaultTooltip: !0}, {name: "Q3", defaultTooltip: !0}, { + name: "max", + defaultTooltip: !0 + }], n.visualDrawType = "stroke", n + } + + return n(e, t), e.type = "series.boxplot", e.dependencies = ["xAxis", "yAxis", "grid"], e.defaultOption = { + z: 2, + coordinateSystem: "cartesian2d", + legendHoverLink: !0, + layout: null, + boxWidth: [7, 50], + itemStyle: {color: "#fff", borderWidth: 1}, + emphasis: { + scale: !0, + itemStyle: { + borderWidth: 2, + shadowBlur: 5, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: "rgba(0,0,0,0.2)" + } + }, + animationDuration: 800 + }, e + }(ag); + R(EL, NL, !0); + var zL = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + var i = t.getData(), r = this.group, o = this._data; + this._data || r.removeAll(); + var a = "horizontal" === t.get("layout") ? 1 : 0; + i.diff(o).add((function (t) { + if (i.hasValue(t)) { + var e = FL(i.getItemLayout(t), i, t, a, !0); + i.setItemGraphicEl(t, e), r.add(e) + } + })).update((function (t, e) { + var n = o.getItemGraphicEl(e); + if (i.hasValue(t)) { + var s = i.getItemLayout(t); + n ? (uh(n), GL(s, n, i, t)) : n = FL(s, i, t, a), r.add(n), i.setItemGraphicEl(t, n) + } else r.remove(n) + })).remove((function (t) { + var e = o.getItemGraphicEl(t); + e && r.remove(e) + })).execute(), this._data = i + }, e.prototype.remove = function (t) { + var e = this.group, n = this._data; + this._data = null, n && n.eachItemGraphicEl((function (t) { + t && e.remove(t) + })) + }, e.type = "boxplot", e + }(mg), VL = function () { + }, BL = function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n.type = "boxplotBoxPath", n + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new VL + }, e.prototype.buildPath = function (t, e) { + var n = e.points, i = 0; + for (t.moveTo(n[i][0], n[i][1]), i++; i < 4; i++) t.lineTo(n[i][0], n[i][1]); + for (t.closePath(); i < n.length; i++) t.moveTo(n[i][0], n[i][1]), i++, t.lineTo(n[i][0], n[i][1]) + }, e + }(fs); + + function FL(t, e, n, i, r) { + var o = t.ends, a = new BL({shape: {points: r ? WL(o, i, t) : o}}); + return GL(t, a, e, n, r), a + } + + function GL(t, e, n, i, r) { + var o = n.hostModel; + (0, Vh[r ? "initProps" : "updateProps"])(e, {shape: {points: t.ends}}, o, i), e.useStyle(n.getItemVisual(i, "style")), e.style.strokeNoScale = !0, e.z2 = 100; + var a = n.getItemModel(i), s = a.getModel("emphasis"); + zl(e, a), Ol(e, s.get("focus"), s.get("blurScope"), s.get("disabled")) + } + + function WL(t, e, n) { + return z(t, (function (t) { + return (t = t.slice())[e] = n.initBaseline, t + })) + } + + function HL(t, e) { + } + + var YL = E; + + function UL(t) { + var e = function (t) { + var e = [], n = []; + return t.eachSeriesByType("boxplot", (function (t) { + var i = t.getBaseAxis(), r = P(n, i); + r < 0 && (r = n.length, n[r] = i, e[r] = {axis: i, seriesModels: []}), e[r].seriesModels.push(t) + })), e + }(t); + YL(e, (function (t) { + var e = t.seriesModels; + e.length && (!function (t) { + var e, n = t.axis, i = t.seriesModels, r = i.length, o = t.boxWidthList = [], a = t.boxOffsetList = [], + s = []; + if ("category" === n.type) e = n.getBandWidth(); else { + var l = 0; + YL(i, (function (t) { + l = Math.max(l, t.getData().count()) + })); + var u = n.getExtent(); + e = Math.abs(u[1] - u[0]) / l + } + YL(i, (function (t) { + var n = t.get("boxWidth"); + Y(n) || (n = [n, n]), s.push([Er(n[0], e) || 0, Er(n[1], e) || 0]) + })); + var h = .8 * e - 2, c = h / r * .3, p = (h - c * (r - 1)) / r, d = p / 2 - h / 2; + YL(i, (function (t, e) { + a.push(d), d += c + p, o.push(Math.min(Math.max(p, s[e][0]), s[e][1])) + })) + }(t), YL(e, (function (e, n) { + !function (t, e, n) { + var i = t.coordinateSystem, r = t.getData(), o = n / 2, + a = "horizontal" === t.get("layout") ? 0 : 1, s = 1 - a, l = ["x", "y"], + u = r.mapDimension(l[a]), h = r.mapDimensionsAll(l[s]); + if (null == u || h.length < 5) return; + for (var c = 0; c < r.count(); c++) { + var p = r.get(u, c), d = x(p, h[2], c), f = x(p, h[0], c), g = x(p, h[1], c), y = x(p, h[3], c), + v = x(p, h[4], c), m = []; + _(m, g, !1), _(m, y, !0), m.push(f, g, v, y), b(m, f), b(m, v), b(m, d), r.setItemLayout(c, { + initBaseline: d[s], + ends: m + }) + } + + function x(t, n, o) { + var l, u = r.get(n, o), h = []; + return h[a] = t, h[s] = u, isNaN(t) || isNaN(u) ? l = [NaN, NaN] : (l = i.dataToPoint(h))[a] += e, l + } + + function _(t, e, n) { + var i = e.slice(), r = e.slice(); + i[a] += o, r[a] -= o, n ? t.push(i, r) : t.push(r, i) + } + + function b(t, e) { + var n = e.slice(), i = e.slice(); + n[a] -= o, i[a] += o, t.push(n, i) + } + }(e, t.boxOffsetList[n], t.boxWidthList[n]) + }))) + })) + } + + var XL = { + type: "echarts:boxplot", transform: function (t) { + var e = t.upstream; + if (e.sourceFormat !== Lp) { + var n = ""; + 0, ao(n) + } + var i = function (t, e) { + for (var n = [], i = [], r = (e = e || {}).boundIQR, o = "none" === r || 0 === r, a = 0; a < t.length; a++) { + var s = Vr(t[a].slice()), l = Jr(s, .25), u = Jr(s, .5), h = Jr(s, .75), c = s[0], + p = s[s.length - 1], d = (null == r ? 1.5 : r) * (h - l), f = o ? c : Math.max(c, l - d), + g = o ? p : Math.min(p, h + d), y = e.itemNameFormatter, + v = U(y) ? y({value: a}) : X(y) ? y.replace("{value}", a + "") : a + ""; + n.push([v, f, l, u, h, g]); + for (var m = 0; m < s.length; m++) { + var x = s[m]; + if (x < f || x > g) { + var _ = [v, x]; + i.push(_) + } + } + } + return {boxData: n, outliers: i} + }(e.getRawData(), t.config); + return [{dimensions: ["ItemName", "Low", "Q1", "Q2", "Q3", "High"], data: i.boxData}, {data: i.outliers}] + } + }; + var ZL = ["color", "borderColor"], jL = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + this.group.removeClipPath(), this._progressiveEls = null, this._updateDrawMode(t), this._isLargeDraw ? this._renderLarge(t) : this._renderNormal(t) + }, e.prototype.incrementalPrepareRender = function (t, e, n) { + this._clear(), this._updateDrawMode(t) + }, e.prototype.incrementalRender = function (t, e, n, i) { + this._progressiveEls = [], this._isLargeDraw ? this._incrementalRenderLarge(t, e) : this._incrementalRenderNormal(t, e) + }, e.prototype.eachRendered = function (t) { + zh(this._progressiveEls || this.group, t) + }, e.prototype._updateDrawMode = function (t) { + var e = t.pipelineContext.large; + null != this._isLargeDraw && e === this._isLargeDraw || (this._isLargeDraw = e, this._clear()) + }, e.prototype._renderNormal = function (t) { + var e = t.getData(), n = this._data, i = this.group, r = e.getLayout("isSimpleBox"), o = t.get("clip", !0), + a = t.coordinateSystem, s = a.getArea && a.getArea(); + this._data || i.removeAll(), e.diff(n).add((function (n) { + if (e.hasValue(n)) { + var a = e.getItemLayout(n); + if (o && JL(s, a)) return; + var l = $L(a, n, !0); + rh(l, {shape: {points: a.ends}}, t, n), QL(l, e, n, r), i.add(l), e.setItemGraphicEl(n, l) + } + })).update((function (a, l) { + var u = n.getItemGraphicEl(l); + if (e.hasValue(a)) { + var h = e.getItemLayout(a); + o && JL(s, h) ? i.remove(u) : (u ? (ih(u, {shape: {points: h.ends}}, t, a), uh(u)) : u = $L(h), QL(u, e, a, r), i.add(u), e.setItemGraphicEl(a, u)) + } else i.remove(u) + })).remove((function (t) { + var e = n.getItemGraphicEl(t); + e && i.remove(e) + })).execute(), this._data = e + }, e.prototype._renderLarge = function (t) { + this._clear(), iP(t, this.group); + var e = t.get("clip", !0) ? aS(t.coordinateSystem, !1, t) : null; + e ? this.group.setClipPath(e) : this.group.removeClipPath() + }, e.prototype._incrementalRenderNormal = function (t, e) { + for (var n, i = e.getData(), r = i.getLayout("isSimpleBox"); null != (n = t.next());) { + var o = $L(i.getItemLayout(n)); + QL(o, i, n, r), o.incremental = !0, this.group.add(o), this._progressiveEls.push(o) + } + }, e.prototype._incrementalRenderLarge = function (t, e) { + iP(e, this.group, this._progressiveEls, !0) + }, e.prototype.remove = function (t) { + this._clear() + }, e.prototype._clear = function () { + this.group.removeAll(), this._data = null + }, e.type = "candlestick", e + }(mg), qL = function () { + }, KL = function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n.type = "normalCandlestickBox", n + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new qL + }, e.prototype.buildPath = function (t, e) { + var n = e.points; + this.__simpleBox ? (t.moveTo(n[4][0], n[4][1]), t.lineTo(n[6][0], n[6][1])) : (t.moveTo(n[0][0], n[0][1]), t.lineTo(n[1][0], n[1][1]), t.lineTo(n[2][0], n[2][1]), t.lineTo(n[3][0], n[3][1]), t.closePath(), t.moveTo(n[4][0], n[4][1]), t.lineTo(n[5][0], n[5][1]), t.moveTo(n[6][0], n[6][1]), t.lineTo(n[7][0], n[7][1])) + }, e + }(fs); + + function $L(t, e, n) { + var i = t.ends; + return new KL({shape: {points: n ? tP(i, t) : i}, z2: 100}) + } + + function JL(t, e) { + for (var n = !0, i = 0; i < e.ends.length; i++) if (t.contain(e.ends[i][0], e.ends[i][1])) { + n = !1; + break + } + return n + } + + function QL(t, e, n, i) { + var r = e.getItemModel(n); + t.useStyle(e.getItemVisual(n, "style")), t.style.strokeNoScale = !0, t.__simpleBox = i, zl(t, r) + } + + function tP(t, e) { + return z(t, (function (t) { + return (t = t.slice())[1] = e.initBaseline, t + })) + } + + var eP = function () { + }, nP = function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n.type = "largeCandlestickBox", n + } + + return n(e, t), e.prototype.getDefaultShape = function () { + return new eP + }, e.prototype.buildPath = function (t, e) { + for (var n = e.points, i = 0; i < n.length;) if (this.__sign === n[i++]) { + var r = n[i++]; + t.moveTo(r, n[i++]), t.lineTo(r, n[i++]) + } else i += 3 + }, e + }(fs); + + function iP(t, e, n, i) { + var r = t.getData().getLayout("largePoints"), o = new nP({shape: {points: r}, __sign: 1}); + e.add(o); + var a = new nP({shape: {points: r}, __sign: -1}); + e.add(a), rP(1, o, t), rP(-1, a, t), i && (o.incremental = !0, a.incremental = !0), n && n.push(o, a) + } + + function rP(t, e, n, i) { + var r = n.get(["itemStyle", t > 0 ? "borderColor" : "borderColor0"]) || n.get(["itemStyle", t > 0 ? "color" : "color0"]), + o = n.getModel("itemStyle").getItemStyle(ZL); + e.useStyle(o), e.style.fill = null, e.style.stroke = r + } + + var oP = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.defaultValueDimensions = [{name: "open", defaultTooltip: !0}, { + name: "close", + defaultTooltip: !0 + }, {name: "lowest", defaultTooltip: !0}, {name: "highest", defaultTooltip: !0}], n + } + + return n(e, t), e.prototype.getShadowDim = function () { + return "open" + }, e.prototype.brushSelector = function (t, e, n) { + var i = e.getItemLayout(t); + return i && n.rect(i.brushRect) + }, e.type = "series.candlestick", e.dependencies = ["xAxis", "yAxis", "grid"], e.defaultOption = { + z: 2, + coordinateSystem: "cartesian2d", + legendHoverLink: !0, + layout: null, + clip: !0, + itemStyle: { + color: "#eb5454", + color0: "#47b262", + borderColor: "#eb5454", + borderColor0: "#47b262", + borderWidth: 1 + }, + emphasis: {scale: !0, itemStyle: {borderWidth: 2}}, + barMaxWidth: null, + barMinWidth: null, + barWidth: null, + large: !0, + largeThreshold: 600, + progressive: 3e3, + progressiveThreshold: 1e4, + progressiveChunkMode: "mod", + animationEasing: "linear", + animationDuration: 300 + }, e + }(ag); + + function aP(t) { + t && Y(t.series) && E(t.series, (function (t) { + q(t) && "k" === t.type && (t.type = "candlestick") + })) + } + + R(oP, NL, !0); + var sP = ["itemStyle", "borderColor"], lP = ["itemStyle", "borderColor0"], uP = ["itemStyle", "color"], + hP = ["itemStyle", "color0"], cP = { + seriesType: "candlestick", plan: gg(), performRawSeries: !0, reset: function (t, e) { + function n(t, e) { + return e.get(t > 0 ? uP : hP) + } + + function i(t, e) { + return e.get(t > 0 ? sP : lP) + } + + if (!e.isSeriesFiltered(t)) return !t.pipelineContext.large && { + progress: function (t, e) { + for (var r; null != (r = t.next());) { + var o = e.getItemModel(r), a = e.getItemLayout(r).sign, s = o.getItemStyle(); + s.fill = n(a, o), s.stroke = i(a, o) || s.fill, A(e.ensureUniqueItemVisual(r, "style"), s) + } + } + } + } + }, pP = { + seriesType: "candlestick", plan: gg(), reset: function (t) { + var e = t.coordinateSystem, n = t.getData(), i = function (t, e) { + var n, i = t.getBaseAxis(), + r = "category" === i.type ? i.getBandWidth() : (n = i.getExtent(), Math.abs(n[1] - n[0]) / e.count()), + o = Er(rt(t.get("barMaxWidth"), r), r), a = Er(rt(t.get("barMinWidth"), 1), r), + s = t.get("barWidth"); + return null != s ? Er(s, r) : Math.max(Math.min(r / 2, o), a) + }(t, n), r = ["x", "y"], o = n.getDimensionIndex(n.mapDimension(r[0])), + a = z(n.mapDimensionsAll(r[1]), n.getDimensionIndex, n), s = a[0], l = a[1], u = a[2], h = a[3]; + if (n.setLayout({candleWidth: i, isSimpleBox: i <= 1.3}), !(o < 0 || a.length < 4)) return { + progress: t.pipelineContext.large ? function (t, n) { + var i, r, a = _x(4 * t.count), c = 0, p = [], d = [], f = n.getStore(); + for (; null != (r = t.next());) { + var g = f.get(o, r), y = f.get(s, r), v = f.get(l, r), m = f.get(u, r), x = f.get(h, r); + isNaN(g) || isNaN(m) || isNaN(x) ? (a[c++] = NaN, c += 3) : (a[c++] = dP(f, r, y, v, l), p[0] = g, p[1] = m, i = e.dataToPoint(p, null, d), a[c++] = i ? i[0] : NaN, a[c++] = i ? i[1] : NaN, p[1] = x, i = e.dataToPoint(p, null, d), a[c++] = i ? i[1] : NaN) + } + n.setLayout("largePoints", a) + } : function (t, n) { + var r, a = n.getStore(); + for (; null != (r = t.next());) { + var c = a.get(o, r), p = a.get(s, r), d = a.get(l, r), f = a.get(u, r), g = a.get(h, r), + y = Math.min(p, d), v = Math.max(p, d), m = S(y, c), x = S(v, c), _ = S(f, c), b = S(g, c), + w = []; + M(w, x, 0), M(w, m, 1), w.push(T(b), T(x), T(_), T(m)), n.setItemLayout(r, { + sign: dP(a, r, p, d, l), + initBaseline: p > d ? x[1] : m[1], + ends: w, + brushRect: I(f, g, c) + }) + } + + function S(t, n) { + var i = []; + return i[0] = n, i[1] = t, isNaN(n) || isNaN(t) ? [NaN, NaN] : e.dataToPoint(i) + } + + function M(t, e, n) { + var r = e.slice(), o = e.slice(); + r[0] = Sh(r[0] + i / 2, 1, !1), o[0] = Sh(o[0] - i / 2, 1, !0), n ? t.push(r, o) : t.push(o, r) + } + + function I(t, e, n) { + var r = S(t, n), o = S(e, n); + return r[0] -= i / 2, o[0] -= i / 2, {x: r[0], y: r[1], width: i, height: o[1] - r[1]} + } + + function T(t) { + return t[0] = Sh(t[0], 1), t + } + } + } + } + }; + + function dP(t, e, n, i, r) { + return n > i ? -1 : n < i ? 1 : e > 0 ? t.get(r, e - 1) <= i ? 1 : -1 : 1 + } + + function fP(t, e) { + var n = e.rippleEffectColor || e.color; + t.eachChild((function (t) { + t.attr({ + z: e.z, + zlevel: e.zlevel, + style: {stroke: "stroke" === e.brushType ? n : null, fill: "fill" === e.brushType ? n : null} + }) + })) + } + + var gP = function (t) { + function e(e, n) { + var i = t.call(this) || this, r = new Ww(e, n), o = new Cr; + return i.add(r), i.add(o), i.updateData(e, n), i + } + + return n(e, t), e.prototype.stopEffectAnimation = function () { + this.childAt(1).removeAll() + }, e.prototype.startEffectAnimation = function (t) { + for (var e = t.symbolType, n = t.color, i = t.rippleNumber, r = this.childAt(1), o = 0; o < i; o++) { + var a = ky(e, -1, -1, 2, 2, n); + a.attr({style: {strokeNoScale: !0}, z2: 99, silent: !0, scaleX: .5, scaleY: .5}); + var s = -o / i * t.period + t.effectOffset; + a.animate("", !0).when(t.period, { + scaleX: t.rippleScale / 2, + scaleY: t.rippleScale / 2 + }).delay(s).start(), a.animateStyle(!0).when(t.period, {opacity: 0}).delay(s).start(), r.add(a) + } + fP(r, t) + }, e.prototype.updateEffectAnimation = function (t) { + for (var e = this._effectCfg, n = this.childAt(1), i = ["symbolType", "period", "rippleScale", "rippleNumber"], r = 0; r < i.length; r++) { + var o = i[r]; + if (e[o] !== t[o]) return this.stopEffectAnimation(), void this.startEffectAnimation(t) + } + fP(n, t) + }, e.prototype.highlight = function () { + xl(this) + }, e.prototype.downplay = function () { + _l(this) + }, e.prototype.getSymbolType = function () { + var t = this.childAt(0); + return t && t.getSymbolType() + }, e.prototype.updateData = function (t, e) { + var n = this, i = t.hostModel; + this.childAt(0).updateData(t, e); + var r = this.childAt(1), o = t.getItemModel(e), a = t.getItemVisual(e, "symbol"), + s = Ly(t.getItemVisual(e, "symbolSize")), l = t.getItemVisual(e, "style"), u = l && l.fill, + h = o.getModel("emphasis"); + r.setScale(s), r.traverse((function (t) { + t.setStyle("fill", u) + })); + var c = Py(t.getItemVisual(e, "symbolOffset"), s); + c && (r.x = c[0], r.y = c[1]); + var p = t.getItemVisual(e, "symbolRotate"); + r.rotation = (p || 0) * Math.PI / 180 || 0; + var d = {}; + d.showEffectOn = i.get("showEffectOn"), d.rippleScale = o.get(["rippleEffect", "scale"]), d.brushType = o.get(["rippleEffect", "brushType"]), d.period = 1e3 * o.get(["rippleEffect", "period"]), d.effectOffset = e / t.count(), d.z = i.getShallow("z") || 0, d.zlevel = i.getShallow("zlevel") || 0, d.symbolType = a, d.color = u, d.rippleEffectColor = o.get(["rippleEffect", "color"]), d.rippleNumber = o.get(["rippleEffect", "number"]), "render" === d.showEffectOn ? (this._effectCfg ? this.updateEffectAnimation(d) : this.startEffectAnimation(d), this._effectCfg = d) : (this._effectCfg = null, this.stopEffectAnimation(), this.onHoverStateChange = function (t) { + "emphasis" === t ? "render" !== d.showEffectOn && n.startEffectAnimation(d) : "normal" === t && "render" !== d.showEffectOn && n.stopEffectAnimation() + }), this._effectCfg = d, Ol(this, h.get("focus"), h.get("blurScope"), h.get("disabled")) + }, e.prototype.fadeOut = function (t) { + t && t() + }, e + }(Cr), yP = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function () { + this._symbolDraw = new Zw(gP) + }, e.prototype.render = function (t, e, n) { + var i = t.getData(), r = this._symbolDraw; + r.updateData(i, {clipShape: this._getClipShape(t)}), this.group.add(r.group) + }, e.prototype._getClipShape = function (t) { + var e = t.coordinateSystem, n = e && e.getArea && e.getArea(); + return t.get("clip", !0) ? n : null + }, e.prototype.updateTransform = function (t, e, n) { + var i = t.getData(); + this.group.dirty(); + var r = xS("").reset(t, e, n); + r.progress && r.progress({start: 0, end: i.count(), count: i.count()}, i), this._symbolDraw.updateLayout() + }, e.prototype._updateGroupTransform = function (t) { + var e = t.coordinateSystem; + e && e.getRoamTransform && (this.group.transform = Fi(e.getRoamTransform()), this.group.decomposeTransform()) + }, e.prototype.remove = function (t, e) { + this._symbolDraw && this._symbolDraw.remove(!0) + }, e.type = "effectScatter", e + }(mg), vP = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.hasSymbolVisual = !0, n + } + + return n(e, t), e.prototype.getInitialData = function (t, e) { + return nx(null, this, {useEncodeDefaulter: !0}) + }, e.prototype.brushSelector = function (t, e, n) { + return n.point(e.getItemLayout(t)) + }, e.type = "series.effectScatter", e.dependencies = ["grid", "polar"], e.defaultOption = { + coordinateSystem: "cartesian2d", + z: 2, + legendHoverLink: !0, + effectType: "ripple", + progressive: 0, + showEffectOn: "render", + clip: !0, + rippleEffect: {period: 4, scale: 2.5, brushType: "fill", number: 3}, + universalTransition: {divideShape: "clone"}, + symbolSize: 10 + }, e + }(ag); + var mP = function (t) { + function e(e, n, i) { + var r = t.call(this) || this; + return r.add(r.createLine(e, n, i)), r._updateEffectSymbol(e, n), r + } + + return n(e, t), e.prototype.createLine = function (t, e, n) { + return new pA(t, e, n) + }, e.prototype._updateEffectSymbol = function (t, e) { + var n = t.getItemModel(e).getModel("effect"), i = n.get("symbolSize"), r = n.get("symbol"); + Y(i) || (i = [i, i]); + var o = t.getItemVisual(e, "style"), a = n.get("color") || o && o.stroke, s = this.childAt(1); + this._symbolType !== r && (this.remove(s), (s = ky(r, -.5, -.5, 1, 1, a)).z2 = 100, s.culling = !0, this.add(s)), s && (s.setStyle("shadowColor", a), s.setStyle(n.getItemStyle(["color"])), s.scaleX = i[0], s.scaleY = i[1], s.setColor(a), this._symbolType = r, this._symbolScale = i, this._updateEffectAnimation(t, n, e)) + }, e.prototype._updateEffectAnimation = function (t, e, n) { + var i = this.childAt(1); + if (i) { + var r = this, o = t.getItemLayout(n), a = 1e3 * e.get("period"), s = e.get("loop"), + l = e.get("constantSpeed"), u = it(e.get("delay"), (function (e) { + return e / t.count() * a / 3 + })); + if (i.ignore = !0, this._updateAnimationPoints(i, o), l > 0 && (a = this._getLineLength(i) / l * 1e3), (a !== this._period || s !== this._loop) && (i.stopAnimation(), a > 0)) { + var h = void 0; + h = U(u) ? u(n) : u, i.__t > 0 && (h = -a * i.__t), i.__t = 0; + var c = i.animate("", s).when(a, {__t: 1}).delay(h).during((function () { + r._updateSymbolPosition(i) + })); + s || c.done((function () { + r.remove(i) + })), c.start() + } + this._period = a, this._loop = s + } + }, e.prototype._getLineLength = function (t) { + return Et(t.__p1, t.__cp1) + Et(t.__cp1, t.__p2) + }, e.prototype._updateAnimationPoints = function (t, e) { + t.__p1 = e[0], t.__p2 = e[1], t.__cp1 = e[2] || [(e[0][0] + e[1][0]) / 2, (e[0][1] + e[1][1]) / 2] + }, e.prototype.updateData = function (t, e, n) { + this.childAt(0).updateData(t, e, n), this._updateEffectSymbol(t, e) + }, e.prototype._updateSymbolPosition = function (t) { + var e = t.__p1, n = t.__p2, i = t.__cp1, r = t.__t, o = [t.x, t.y], a = o.slice(), s = Ke, l = $e; + o[0] = s(e[0], i[0], n[0], r), o[1] = s(e[1], i[1], n[1], r); + var u = l(e[0], i[0], n[0], r), h = l(e[1], i[1], n[1], r); + t.rotation = -Math.atan2(h, u) - Math.PI / 2, "line" !== this._symbolType && "rect" !== this._symbolType && "roundRect" !== this._symbolType || (void 0 !== t.__lastT && t.__lastT < t.__t ? (t.scaleY = 1.05 * Et(a, o), 1 === r && (o[0] = a[0] + (o[0] - a[0]) / 2, o[1] = a[1] + (o[1] - a[1]) / 2)) : 1 === t.__lastT ? t.scaleY = 2 * Et(e, o) : t.scaleY = this._symbolScale[1]), t.__lastT = t.__t, t.ignore = !1, t.x = o[0], t.y = o[1] + }, e.prototype.updateLayout = function (t, e) { + this.childAt(0).updateLayout(t, e); + var n = t.getItemModel(e).getModel("effect"); + this._updateEffectAnimation(t, n, e) + }, e + }(Cr), xP = function (t) { + function e(e, n, i) { + var r = t.call(this) || this; + return r._createPolyline(e, n, i), r + } + + return n(e, t), e.prototype._createPolyline = function (t, e, n) { + var i = t.getItemLayout(e), r = new Ou({shape: {points: i}}); + this.add(r), this._updateCommonStl(t, e, n) + }, e.prototype.updateData = function (t, e, n) { + var i = t.hostModel; + ih(this.childAt(0), {shape: {points: t.getItemLayout(e)}}, i, e), this._updateCommonStl(t, e, n) + }, e.prototype._updateCommonStl = function (t, e, n) { + var i = this.childAt(0), r = t.getItemModel(e), o = n && n.emphasisLineStyle, a = n && n.focus, + s = n && n.blurScope, l = n && n.emphasisDisabled; + if (!n || t.hasItemOption) { + var u = r.getModel("emphasis"); + o = u.getModel("lineStyle").getLineStyle(), l = u.get("disabled"), a = u.get("focus"), s = u.get("blurScope") + } + i.useStyle(t.getItemVisual(e, "style")), i.style.fill = null, i.style.strokeNoScale = !0, i.ensureState("emphasis").style = o, Ol(this, a, s, l) + }, e.prototype.updateLayout = function (t, e) { + this.childAt(0).setShape("points", t.getItemLayout(e)) + }, e + }(Cr), _P = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e._lastFrame = 0, e._lastFramePercent = 0, e + } + + return n(e, t), e.prototype.createLine = function (t, e, n) { + return new xP(t, e, n) + }, e.prototype._updateAnimationPoints = function (t, e) { + this._points = e; + for (var n = [0], i = 0, r = 1; r < e.length; r++) { + var o = e[r - 1], a = e[r]; + i += Et(o, a), n.push(i) + } + if (0 !== i) { + for (r = 0; r < n.length; r++) n[r] /= i; + this._offsets = n, this._length = i + } else this._length = 0 + }, e.prototype._getLineLength = function () { + return this._length + }, e.prototype._updateSymbolPosition = function (t) { + var e = t.__t, n = this._points, i = this._offsets, r = n.length; + if (i) { + var o, a = this._lastFrame; + if (e < this._lastFramePercent) { + for (o = Math.min(a + 1, r - 1); o >= 0 && !(i[o] <= e); o--) ; + o = Math.min(o, r - 2) + } else { + for (o = a; o < r && !(i[o] > e); o++) ; + o = Math.min(o - 1, r - 2) + } + var s = (e - i[o]) / (i[o + 1] - i[o]), l = n[o], u = n[o + 1]; + t.x = l[0] * (1 - s) + s * u[0], t.y = l[1] * (1 - s) + s * u[1]; + var h = u[0] - l[0], c = u[1] - l[1]; + t.rotation = -Math.atan2(c, h) - Math.PI / 2, this._lastFrame = o, this._lastFramePercent = e, t.ignore = !1 + } + }, e + }(mP), bP = function () { + this.polyline = !1, this.curveness = 0, this.segs = [] + }, wP = function (t) { + function e(e) { + var n = t.call(this, e) || this; + return n._off = 0, n.hoverDataIdx = -1, n + } + + return n(e, t), e.prototype.reset = function () { + this.notClear = !1, this._off = 0 + }, e.prototype.getDefaultStyle = function () { + return {stroke: "#000", fill: null} + }, e.prototype.getDefaultShape = function () { + return new bP + }, e.prototype.buildPath = function (t, e) { + var n, i = e.segs, r = e.curveness; + if (e.polyline) for (n = this._off; n < i.length;) { + var o = i[n++]; + if (o > 0) { + t.moveTo(i[n++], i[n++]); + for (var a = 1; a < o; a++) t.lineTo(i[n++], i[n++]) + } + } else for (n = this._off; n < i.length;) { + var s = i[n++], l = i[n++], u = i[n++], h = i[n++]; + if (t.moveTo(s, l), r > 0) { + var c = (s + u) / 2 - (l - h) * r, p = (l + h) / 2 - (u - s) * r; + t.quadraticCurveTo(c, p, u, h) + } else t.lineTo(u, h) + } + this.incremental && (this._off = n, this.notClear = !0) + }, e.prototype.findDataIndex = function (t, e) { + var n = this.shape, i = n.segs, r = n.curveness, o = this.style.lineWidth; + if (n.polyline) for (var a = 0, s = 0; s < i.length;) { + var l = i[s++]; + if (l > 0) for (var u = i[s++], h = i[s++], c = 1; c < l; c++) { + if (qa(u, h, p = i[s++], d = i[s++], o, t, e)) return a + } + a++ + } else for (a = 0, s = 0; s < i.length;) { + u = i[s++], h = i[s++]; + var p = i[s++], d = i[s++]; + if (r > 0) { + if ($a(u, h, (u + p) / 2 - (h - d) * r, (h + d) / 2 - (p - u) * r, p, d, o, t, e)) return a + } else if (qa(u, h, p, d, o, t, e)) return a; + a++ + } + return -1 + }, e.prototype.contain = function (t, e) { + var n = this.transformCoordToLocal(t, e), i = this.getBoundingRect(); + return t = n[0], e = n[1], i.contain(t, e) ? (this.hoverDataIdx = this.findDataIndex(t, e)) >= 0 : (this.hoverDataIdx = -1, !1) + }, e.prototype.getBoundingRect = function () { + var t = this._rect; + if (!t) { + for (var e = this.shape.segs, n = 1 / 0, i = 1 / 0, r = -1 / 0, o = -1 / 0, a = 0; a < e.length;) { + var s = e[a++], l = e[a++]; + n = Math.min(s, n), r = Math.max(s, r), i = Math.min(l, i), o = Math.max(l, o) + } + t = this._rect = new sr(n, i, r, o) + } + return t + }, e + }(fs), SP = function () { + function t() { + this.group = new Cr + } + + return t.prototype.updateData = function (t) { + this._clear(); + var e = this._create(); + e.setShape({segs: t.getLayout("linesPoints")}), this._setCommon(e, t) + }, t.prototype.incrementalPrepareUpdate = function (t) { + this.group.removeAll(), this._clear() + }, t.prototype.incrementalUpdate = function (t, e) { + var n = this._newAdded[0], i = e.getLayout("linesPoints"), r = n && n.shape.segs; + if (r && r.length < 2e4) { + var o = r.length, a = new Float32Array(o + i.length); + a.set(r), a.set(i, o), n.setShape({segs: a}) + } else { + this._newAdded = []; + var s = this._create(); + s.incremental = !0, s.setShape({segs: i}), this._setCommon(s, e), s.__startIndex = t.start + } + }, t.prototype.remove = function () { + this._clear() + }, t.prototype.eachRendered = function (t) { + this._newAdded[0] && t(this._newAdded[0]) + }, t.prototype._create = function () { + var t = new wP({cursor: "default"}); + return this._newAdded.push(t), this.group.add(t), t + }, t.prototype._setCommon = function (t, e, n) { + var i = e.hostModel; + t.setShape({ + polyline: i.get("polyline"), + curveness: i.get(["lineStyle", "curveness"]) + }), t.useStyle(i.getModel("lineStyle").getLineStyle()), t.style.strokeNoScale = !0; + var r = e.getVisual("style"); + r && r.stroke && t.setStyle("stroke", r.stroke), t.setStyle("fill", null); + var o = Ws(t); + o.seriesIndex = i.seriesIndex, t.on("mousemove", (function (e) { + o.dataIndex = null; + var n = t.hoverDataIdx; + n > 0 && (o.dataIndex = n + t.__startIndex) + })) + }, t.prototype._clear = function () { + this._newAdded = [], this.group.removeAll() + }, t + }(), MP = { + seriesType: "lines", plan: gg(), reset: function (t) { + var e = t.coordinateSystem; + if (e) { + var n = t.get("polyline"), i = t.pipelineContext.large; + return { + progress: function (r, o) { + var a = []; + if (i) { + var s = void 0, l = r.end - r.start; + if (n) { + for (var u = 0, h = r.start; h < r.end; h++) u += t.getLineCoordsCount(h); + s = new Float32Array(l + 2 * u) + } else s = new Float32Array(4 * l); + var c = 0, p = []; + for (h = r.start; h < r.end; h++) { + var d = t.getLineCoords(h, a); + n && (s[c++] = d); + for (var f = 0; f < d; f++) p = e.dataToPoint(a[f], !1, p), s[c++] = p[0], s[c++] = p[1] + } + o.setLayout("linesPoints", s) + } else for (h = r.start; h < r.end; h++) { + var g = o.getItemModel(h), y = (d = t.getLineCoords(h, a), []); + if (n) for (var v = 0; v < d; v++) y.push(e.dataToPoint(a[v])); else { + y[0] = e.dataToPoint(a[0]), y[1] = e.dataToPoint(a[1]); + var m = g.get(["lineStyle", "curveness"]); + +m && (y[2] = [(y[0][0] + y[1][0]) / 2 - (y[0][1] - y[1][1]) * m, (y[0][1] + y[1][1]) / 2 - (y[1][0] - y[0][0]) * m]) + } + o.setItemLayout(h, y) + } + } + } + } + } + }, IP = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + var i = t.getData(), r = this._updateLineDraw(i, t), o = t.get("zlevel"), + a = t.get(["effect", "trailLength"]), s = n.getZr(), l = "svg" === s.painter.getType(); + l || s.painter.getLayer(o).clear(!0), null == this._lastZlevel || l || s.configLayer(this._lastZlevel, {motionBlur: !1}), this._showEffect(t) && a > 0 && (l || s.configLayer(o, { + motionBlur: !0, + lastFrameAlpha: Math.max(Math.min(a / 10 + .9, 1), 0) + })), r.updateData(i); + var u = t.get("clip", !0) && aS(t.coordinateSystem, !1, t); + u ? this.group.setClipPath(u) : this.group.removeClipPath(), this._lastZlevel = o, this._finished = !0 + }, e.prototype.incrementalPrepareRender = function (t, e, n) { + var i = t.getData(); + this._updateLineDraw(i, t).incrementalPrepareUpdate(i), this._clearLayer(n), this._finished = !1 + }, e.prototype.incrementalRender = function (t, e, n) { + this._lineDraw.incrementalUpdate(t, e.getData()), this._finished = t.end === e.getData().count() + }, e.prototype.eachRendered = function (t) { + this._lineDraw && this._lineDraw.eachRendered(t) + }, e.prototype.updateTransform = function (t, e, n) { + var i = t.getData(), r = t.pipelineContext; + if (!this._finished || r.large || r.progressiveRender) return {update: !0}; + var o = MP.reset(t, e, n); + o.progress && o.progress({ + start: 0, + end: i.count(), + count: i.count() + }, i), this._lineDraw.updateLayout(), this._clearLayer(n) + }, e.prototype._updateLineDraw = function (t, e) { + var n = this._lineDraw, i = this._showEffect(e), r = !!e.get("polyline"), o = e.pipelineContext.large; + return n && i === this._hasEffet && r === this._isPolyline && o === this._isLargeDraw || (n && n.remove(), n = this._lineDraw = o ? new SP : new dA(r ? i ? _P : xP : i ? mP : pA), this._hasEffet = i, this._isPolyline = r, this._isLargeDraw = o), this.group.add(n.group), n + }, e.prototype._showEffect = function (t) { + return !!t.get(["effect", "show"]) + }, e.prototype._clearLayer = function (t) { + var e = t.getZr(); + "svg" === e.painter.getType() || null == this._lastZlevel || e.painter.getLayer(this._lastZlevel).clear(!0) + }, e.prototype.remove = function (t, e) { + this._lineDraw && this._lineDraw.remove(), this._lineDraw = null, this._clearLayer(e) + }, e.prototype.dispose = function (t, e) { + this.remove(t, e) + }, e.type = "lines", e + }(mg), TP = "undefined" == typeof Uint32Array ? Array : Uint32Array, + CP = "undefined" == typeof Float64Array ? Array : Float64Array; + + function DP(t) { + var e = t.data; + e && e[0] && e[0][0] && e[0][0].coord && (t.data = z(e, (function (t) { + var e = {coords: [t[0].coord, t[1].coord]}; + return t[0].name && (e.fromName = t[0].name), t[1].name && (e.toName = t[1].name), D([e, t[0], t[1]]) + }))) + } + + var AP = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.visualStyleAccessPath = "lineStyle", n.visualDrawType = "stroke", n + } + + return n(e, t), e.prototype.init = function (e) { + e.data = e.data || [], DP(e); + var n = this._processFlatCoordsArray(e.data); + this._flatCoords = n.flatCoords, this._flatCoordsOffset = n.flatCoordsOffset, n.flatCoords && (e.data = new Float32Array(n.count)), t.prototype.init.apply(this, arguments) + }, e.prototype.mergeOption = function (e) { + if (DP(e), e.data) { + var n = this._processFlatCoordsArray(e.data); + this._flatCoords = n.flatCoords, this._flatCoordsOffset = n.flatCoordsOffset, n.flatCoords && (e.data = new Float32Array(n.count)) + } + t.prototype.mergeOption.apply(this, arguments) + }, e.prototype.appendData = function (t) { + var e = this._processFlatCoordsArray(t.data); + e.flatCoords && (this._flatCoords ? (this._flatCoords = gt(this._flatCoords, e.flatCoords), this._flatCoordsOffset = gt(this._flatCoordsOffset, e.flatCoordsOffset)) : (this._flatCoords = e.flatCoords, this._flatCoordsOffset = e.flatCoordsOffset), t.data = new Float32Array(e.count)), this.getRawData().appendData(t.data) + }, e.prototype._getCoordsFromItemModel = function (t) { + var e = this.getData().getItemModel(t), n = e.option instanceof Array ? e.option : e.getShallow("coords"); + return n + }, e.prototype.getLineCoordsCount = function (t) { + return this._flatCoordsOffset ? this._flatCoordsOffset[2 * t + 1] : this._getCoordsFromItemModel(t).length + }, e.prototype.getLineCoords = function (t, e) { + if (this._flatCoordsOffset) { + for (var n = this._flatCoordsOffset[2 * t], i = this._flatCoordsOffset[2 * t + 1], r = 0; r < i; r++) e[r] = e[r] || [], e[r][0] = this._flatCoords[n + 2 * r], e[r][1] = this._flatCoords[n + 2 * r + 1]; + return i + } + var o = this._getCoordsFromItemModel(t); + for (r = 0; r < o.length; r++) e[r] = e[r] || [], e[r][0] = o[r][0], e[r][1] = o[r][1]; + return o.length + }, e.prototype._processFlatCoordsArray = function (t) { + var e = 0; + if (this._flatCoords && (e = this._flatCoords.length), j(t[0])) { + for (var n = t.length, i = new TP(n), r = new CP(n), o = 0, a = 0, s = 0, l = 0; l < n;) { + s++; + var u = t[l++]; + i[a++] = o + e, i[a++] = u; + for (var h = 0; h < u; h++) { + var c = t[l++], p = t[l++]; + r[o++] = c, r[o++] = p + } + } + return {flatCoordsOffset: new Uint32Array(i.buffer, 0, a), flatCoords: r, count: s} + } + return {flatCoordsOffset: null, flatCoords: null, count: t.length} + }, e.prototype.getInitialData = function (t, e) { + var n = new Zm(["value"], this); + return n.hasItemOption = !1, n.initData(t.data, [], (function (t, e, i, r) { + if (t instanceof Array) return NaN; + n.hasItemOption = !0; + var o = t.value; + return null != o ? o instanceof Array ? o[r] : o : void 0 + })), n + }, e.prototype.formatTooltip = function (t, e, n) { + var i = this.getData().getItemModel(t), r = i.get("name"); + if (r) return r; + var o = i.get("fromName"), a = i.get("toName"), s = []; + return null != o && s.push(o), null != a && s.push(a), Uf("nameValue", {name: s.join(" > ")}) + }, e.prototype.preventIncremental = function () { + return !!this.get(["effect", "show"]) + }, e.prototype.getProgressive = function () { + var t = this.option.progressive; + return null == t ? this.option.large ? 1e4 : this.get("progressive") : t + }, e.prototype.getProgressiveThreshold = function () { + var t = this.option.progressiveThreshold; + return null == t ? this.option.large ? 2e4 : this.get("progressiveThreshold") : t + }, e.prototype.getZLevelKey = function () { + var t = this.getModel("effect"), e = t.get("trailLength"); + return this.getData().count() > this.getProgressiveThreshold() ? this.id : t.get("show") && e > 0 ? e + "" : "" + }, e.type = "series.lines", e.dependencies = ["grid", "polar", "geo", "calendar"], e.defaultOption = { + coordinateSystem: "geo", + z: 2, + legendHoverLink: !0, + xAxisIndex: 0, + yAxisIndex: 0, + symbol: ["none", "none"], + symbolSize: [10, 10], + geoIndex: 0, + effect: {show: !1, period: 4, constantSpeed: 0, symbol: "circle", symbolSize: 3, loop: !0, trailLength: .2}, + large: !1, + largeThreshold: 2e3, + polyline: !1, + clip: !0, + label: {show: !1, position: "end"}, + lineStyle: {opacity: .5} + }, e + }(ag); + + function kP(t) { + return t instanceof Array || (t = [t, t]), t + } + + var LP = { + seriesType: "lines", reset: function (t) { + var e = kP(t.get("symbol")), n = kP(t.get("symbolSize")), i = t.getData(); + return i.setVisual("fromSymbol", e && e[0]), i.setVisual("toSymbol", e && e[1]), i.setVisual("fromSymbolSize", n && n[0]), i.setVisual("toSymbolSize", n && n[1]), { + dataEach: i.hasItemOption ? function (t, e) { + var n = t.getItemModel(e), i = kP(n.getShallow("symbol", !0)), + r = kP(n.getShallow("symbolSize", !0)); + i[0] && t.setItemVisual(e, "fromSymbol", i[0]), i[1] && t.setItemVisual(e, "toSymbol", i[1]), r[0] && t.setItemVisual(e, "fromSymbolSize", r[0]), r[1] && t.setItemVisual(e, "toSymbolSize", r[1]) + } : null + } + } + }; + var PP = function () { + function t() { + this.blurSize = 30, this.pointSize = 20, this.maxOpacity = 1, this.minOpacity = 0, this._gradientPixels = { + inRange: null, + outOfRange: null + }; + var t = h.createCanvas(); + this.canvas = t + } + + return t.prototype.update = function (t, e, n, i, r, o) { + var a = this._getBrush(), s = this._getGradient(r, "inRange"), l = this._getGradient(r, "outOfRange"), + u = this.pointSize + this.blurSize, h = this.canvas, c = h.getContext("2d"), p = t.length; + h.width = e, h.height = n; + for (var d = 0; d < p; ++d) { + var f = t[d], g = f[0], y = f[1], v = i(f[2]); + c.globalAlpha = v, c.drawImage(a, g - u, y - u) + } + if (!h.width || !h.height) return h; + for (var m = c.getImageData(0, 0, h.width, h.height), x = m.data, _ = 0, b = x.length, w = this.minOpacity, S = this.maxOpacity - w; _ < b;) { + v = x[_ + 3] / 256; + var M = 4 * Math.floor(255 * v); + if (v > 0) { + var I = o(v) ? s : l; + v > 0 && (v = v * S + w), x[_++] = I[M], x[_++] = I[M + 1], x[_++] = I[M + 2], x[_++] = I[M + 3] * v * 256 + } else _ += 4 + } + return c.putImageData(m, 0, 0), h + }, t.prototype._getBrush = function () { + var t = this._brushCanvas || (this._brushCanvas = h.createCanvas()), e = this.pointSize + this.blurSize, + n = 2 * e; + t.width = n, t.height = n; + var i = t.getContext("2d"); + return i.clearRect(0, 0, n, n), i.shadowOffsetX = n, i.shadowBlur = this.blurSize, i.shadowColor = "#000", i.beginPath(), i.arc(-e, e, this.pointSize, 0, 2 * Math.PI, !0), i.closePath(), i.fill(), t + }, t.prototype._getGradient = function (t, e) { + for (var n = this._gradientPixels, i = n[e] || (n[e] = new Uint8ClampedArray(1024)), r = [0, 0, 0, 0], o = 0, a = 0; a < 256; a++) t[e](a / 255, !0, r), i[o++] = r[0], i[o++] = r[1], i[o++] = r[2], i[o++] = r[3]; + return i + }, t + }(); + + function OP(t) { + var e = t.dimensions; + return "lng" === e[0] && "lat" === e[1] + } + + var RP = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + var i; + e.eachComponent("visualMap", (function (e) { + e.eachTargetSeries((function (n) { + n === t && (i = e) + })) + })), this._progressiveEls = null, this.group.removeAll(); + var r = t.coordinateSystem; + "cartesian2d" === r.type || "calendar" === r.type ? this._renderOnCartesianAndCalendar(t, n, 0, t.getData().count()) : OP(r) && this._renderOnGeo(r, t, i, n) + }, e.prototype.incrementalPrepareRender = function (t, e, n) { + this.group.removeAll() + }, e.prototype.incrementalRender = function (t, e, n, i) { + var r = e.coordinateSystem; + r && (OP(r) ? this.render(e, n, i) : (this._progressiveEls = [], this._renderOnCartesianAndCalendar(e, i, t.start, t.end, !0))) + }, e.prototype.eachRendered = function (t) { + zh(this._progressiveEls || this.group, t) + }, e.prototype._renderOnCartesianAndCalendar = function (t, e, n, i, r) { + var o, a, s, l, u = t.coordinateSystem; + if (sS(u, "cartesian2d")) { + var h = u.getAxis("x"), c = u.getAxis("y"); + 0, o = h.getBandWidth(), a = c.getBandWidth(), s = h.scale.getExtent(), l = c.scale.getExtent() + } + for (var p = this.group, d = t.getData(), f = t.getModel(["emphasis", "itemStyle"]).getItemStyle(), g = t.getModel(["blur", "itemStyle"]).getItemStyle(), y = t.getModel(["select", "itemStyle"]).getItemStyle(), v = Hh(t), m = t.getModel("emphasis"), x = m.get("focus"), _ = m.get("blurScope"), b = m.get("disabled"), w = sS(u, "cartesian2d") ? [d.mapDimension("x"), d.mapDimension("y"), d.mapDimension("value")] : [d.mapDimension("time"), d.mapDimension("value")], S = n; S < i; S++) { + var M = void 0, I = d.getItemVisual(S, "style"); + if (sS(u, "cartesian2d")) { + var T = d.get(w[0], S), C = d.get(w[1], S); + if (isNaN(d.get(w[2], S)) || T < s[0] || T > s[1] || C < l[0] || C > l[1]) continue; + var D = u.dataToPoint([T, C]); + M = new Ts({ + shape: { + x: Math.floor(Math.round(D[0]) - o / 2), + y: Math.floor(Math.round(D[1]) - a / 2), + width: Math.ceil(o), + height: Math.ceil(a) + }, style: I + }) + } else { + if (isNaN(d.get(w[1], S))) continue; + M = new Ts({z2: 1, shape: u.dataToRect([d.get(w[0], S)]).contentShape, style: I}) + } + var A = d.getItemModel(S); + if (d.hasItemOption) { + var k = A.getModel("emphasis"); + f = k.getModel("itemStyle").getItemStyle(), g = A.getModel(["blur", "itemStyle"]).getItemStyle(), y = A.getModel(["select", "itemStyle"]).getItemStyle(), x = k.get("focus"), _ = k.get("blurScope"), b = k.get("disabled"), v = Hh(A) + } + var L = t.getRawValue(S), P = "-"; + L && null != L[2] && (P = L[2] + ""), Wh(M, v, { + labelFetcher: t, + labelDataIndex: S, + defaultOpacity: I.opacity, + defaultText: P + }), M.ensureState("emphasis").style = f, M.ensureState("blur").style = g, M.ensureState("select").style = y, Ol(M, x, _, b), M.incremental = r, r && (M.states.emphasis.hoverLayer = !0), p.add(M), d.setItemGraphicEl(S, M), this._progressiveEls && this._progressiveEls.push(M) + } + }, e.prototype._renderOnGeo = function (t, e, n, i) { + var r = n.targetVisuals.inRange, o = n.targetVisuals.outOfRange, a = e.getData(), + s = this._hmLayer || this._hmLayer || new PP; + s.blurSize = e.get("blurSize"), s.pointSize = e.get("pointSize"), s.minOpacity = e.get("minOpacity"), s.maxOpacity = e.get("maxOpacity"); + var l = t.getViewRect().clone(), u = t.getRoamTransform(); + l.applyTransform(u); + var h = Math.max(l.x, 0), c = Math.max(l.y, 0), p = Math.min(l.width + l.x, i.getWidth()), + d = Math.min(l.height + l.y, i.getHeight()), f = p - h, g = d - c, + y = [a.mapDimension("lng"), a.mapDimension("lat"), a.mapDimension("value")], + v = a.mapArray(y, (function (e, n, i) { + var r = t.dataToPoint([e, n]); + return r[0] -= h, r[1] -= c, r.push(i), r + })), m = n.getExtent(), x = "visualMap.continuous" === n.type ? function (t, e) { + var n = t[1] - t[0]; + return e = [(e[0] - t[0]) / n, (e[1] - t[0]) / n], function (t) { + return t >= e[0] && t <= e[1] + } + }(m, n.option.range) : function (t, e, n) { + var i = t[1] - t[0], r = (e = z(e, (function (e) { + return {interval: [(e.interval[0] - t[0]) / i, (e.interval[1] - t[0]) / i]} + }))).length, o = 0; + return function (t) { + var i; + for (i = o; i < r; i++) if ((a = e[i].interval)[0] <= t && t <= a[1]) { + o = i; + break + } + if (i === r) for (i = o - 1; i >= 0; i--) { + var a; + if ((a = e[i].interval)[0] <= t && t <= a[1]) { + o = i; + break + } + } + return i >= 0 && i < r && n[i] + } + }(m, n.getPieceList(), n.option.selected); + s.update(v, f, g, r.color.getNormalizer(), { + inRange: r.color.getColorMapper(), + outOfRange: o.color.getColorMapper() + }, x); + var _ = new xs({style: {width: f, height: g, x: h, y: c, image: s.canvas}, silent: !0}); + this.group.add(_) + }, e.type = "heatmap", e + }(mg), NP = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.getInitialData = function (t, e) { + return nx(null, this, {generateCoord: "value"}) + }, e.prototype.preventIncremental = function () { + var t = ud.get(this.get("coordinateSystem")); + if (t && t.dimensions) return "lng" === t.dimensions[0] && "lat" === t.dimensions[1] + }, e.type = "series.heatmap", e.dependencies = ["grid", "geo", "calendar"], e.defaultOption = { + coordinateSystem: "cartesian2d", + z: 2, + geoIndex: 0, + blurSize: 30, + pointSize: 20, + maxOpacity: 1, + minOpacity: 0, + select: {itemStyle: {borderColor: "#212121"}} + }, e + }(ag); + var EP = ["itemStyle", "borderWidth"], zP = [{xy: "x", wh: "width", index: 0, posDesc: ["left", "right"]}, { + xy: "y", + wh: "height", + index: 1, + posDesc: ["top", "bottom"] + }], VP = new uu, BP = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + var i = this.group, r = t.getData(), o = this._data, a = t.coordinateSystem, + s = a.getBaseAxis().isHorizontal(), l = a.master.getRect(), u = { + ecSize: {width: n.getWidth(), height: n.getHeight()}, + seriesModel: t, + coordSys: a, + coordSysExtent: [[l.x, l.x + l.width], [l.y, l.y + l.height]], + isHorizontal: s, + valueDim: zP[+s], + categoryDim: zP[1 - +s] + }; + return r.diff(o).add((function (t) { + if (r.hasValue(t)) { + var e = ZP(r, t), n = FP(r, t, e, u), o = KP(r, u, n); + r.setItemGraphicEl(t, o), i.add(o), eO(o, u, n) + } + })).update((function (t, e) { + var n = o.getItemGraphicEl(e); + if (r.hasValue(t)) { + var a = ZP(r, t), s = FP(r, t, a, u), l = JP(r, s); + n && l !== n.__pictorialShapeStr && (i.remove(n), r.setItemGraphicEl(t, null), n = null), n ? function (t, e, n) { + var i = n.animationModel, r = n.dataIndex; + ih(t.__pictorialBundle, { + x: n.bundlePosition[0], + y: n.bundlePosition[1] + }, i, r), n.symbolRepeat ? HP(t, e, n, !0) : YP(t, e, n, !0); + UP(t, n, !0), XP(t, e, n, !0) + }(n, u, s) : n = KP(r, u, s, !0), r.setItemGraphicEl(t, n), n.__pictorialSymbolMeta = s, i.add(n), eO(n, u, s) + } else i.remove(n) + })).remove((function (t) { + var e = o.getItemGraphicEl(t); + e && $P(o, t, e.__pictorialSymbolMeta.animationModel, e) + })).execute(), this._data = r, this.group + }, e.prototype.remove = function (t, e) { + var n = this.group, i = this._data; + t.get("animation") ? i && i.eachItemGraphicEl((function (e) { + $P(i, Ws(e).dataIndex, t, e) + })) : n.removeAll() + }, e.type = "pictorialBar", e + }(mg); + + function FP(t, e, n, i) { + var r = t.getItemLayout(e), o = n.get("symbolRepeat"), a = n.get("symbolClip"), + s = n.get("symbolPosition") || "start", l = (n.get("symbolRotate") || 0) * Math.PI / 180 || 0, + u = n.get("symbolPatternSize") || 2, h = n.isAnimationEnabled(), c = { + dataIndex: e, + layout: r, + itemModel: n, + symbolType: t.getItemVisual(e, "symbol") || "circle", + style: t.getItemVisual(e, "style"), + symbolClip: a, + symbolRepeat: o, + symbolRepeatDirection: n.get("symbolRepeatDirection"), + symbolPatternSize: u, + rotation: l, + animationModel: h ? n : null, + hoverScale: h && n.get(["emphasis", "scale"]), + z2: n.getShallow("z", !0) || 0 + }; + !function (t, e, n, i, r) { + var o, a = i.valueDim, s = t.get("symbolBoundingData"), + l = i.coordSys.getOtherAxis(i.coordSys.getBaseAxis()), u = l.toGlobalCoord(l.dataToCoord(0)), + h = 1 - +(n[a.wh] <= 0); + if (Y(s)) { + var c = [GP(l, s[0]) - u, GP(l, s[1]) - u]; + c[1] < c[0] && c.reverse(), o = c[h] + } else o = null != s ? GP(l, s) - u : e ? i.coordSysExtent[a.index][h] - u : n[a.wh]; + r.boundingLength = o, e && (r.repeatCutLength = n[a.wh]); + r.pxSign = o > 0 ? 1 : -1 + }(n, o, r, i, c), function (t, e, n, i, r, o, a, s, l, u) { + var h, c = l.valueDim, p = l.categoryDim, d = Math.abs(n[p.wh]), f = t.getItemVisual(e, "symbolSize"); + h = Y(f) ? f.slice() : null == f ? ["100%", "100%"] : [f, f]; + h[p.index] = Er(h[p.index], d), h[c.index] = Er(h[c.index], i ? d : Math.abs(o)), u.symbolSize = h, (u.symbolScale = [h[0] / s, h[1] / s])[c.index] *= (l.isHorizontal ? -1 : 1) * a + }(t, e, r, o, 0, c.boundingLength, c.pxSign, u, i, c), function (t, e, n, i, r) { + var o = t.get(EP) || 0; + o && (VP.attr({ + scaleX: e[0], + scaleY: e[1], + rotation: n + }), VP.updateTransform(), o /= VP.getLineScale(), o *= e[i.valueDim.index]); + r.valueLineWidth = o + }(n, c.symbolScale, l, i, c); + var p = c.symbolSize, d = Py(n.get("symbolOffset"), p); + return function (t, e, n, i, r, o, a, s, l, u, h, c) { + var p = h.categoryDim, d = h.valueDim, f = c.pxSign, g = Math.max(e[d.index] + s, 0), y = g; + if (i) { + var v = Math.abs(l), m = it(t.get("symbolMargin"), "15%") + "", x = !1; + m.lastIndexOf("!") === m.length - 1 && (x = !0, m = m.slice(0, m.length - 1)); + var _ = Er(m, e[d.index]), b = Math.max(g + 2 * _, 0), w = x ? 0 : 2 * _, S = eo(i), + M = S ? i : nO((v + w) / b); + b = g + 2 * (_ = (v - M * g) / 2 / (x ? M : Math.max(M - 1, 1))), w = x ? 0 : 2 * _, S || "fixed" === i || (M = u ? nO((Math.abs(u) + w) / b) : 0), y = M * b - w, c.repeatTimes = M, c.symbolMargin = _ + } + var I = f * (y / 2), T = c.pathPosition = []; + T[p.index] = n[p.wh] / 2, T[d.index] = "start" === a ? I : "end" === a ? l - I : l / 2, o && (T[0] += o[0], T[1] += o[1]); + var C = c.bundlePosition = []; + C[p.index] = n[p.xy], C[d.index] = n[d.xy]; + var D = c.barRectShape = A({}, n); + D[d.wh] = f * Math.max(Math.abs(n[d.wh]), Math.abs(T[d.index] + I)), D[p.wh] = n[p.wh]; + var k = c.clipShape = {}; + k[p.xy] = -n[p.xy], k[p.wh] = h.ecSize[p.wh], k[d.xy] = 0, k[d.wh] = n[d.wh] + }(n, p, r, o, 0, d, s, c.valueLineWidth, c.boundingLength, c.repeatCutLength, i, c), c + } + + function GP(t, e) { + return t.toGlobalCoord(t.dataToCoord(t.scale.parse(e))) + } + + function WP(t) { + var e = t.symbolPatternSize, n = ky(t.symbolType, -e / 2, -e / 2, e, e); + return n.attr({culling: !0}), "image" !== n.type && n.setStyle({strokeNoScale: !0}), n + } + + function HP(t, e, n, i) { + var r = t.__pictorialBundle, o = n.symbolSize, a = n.valueLineWidth, s = n.pathPosition, l = e.valueDim, + u = n.repeatTimes || 0, h = 0, c = o[e.valueDim.index] + a + 2 * n.symbolMargin; + for (QP(t, (function (t) { + t.__pictorialAnimationIndex = h, t.__pictorialRepeatTimes = u, h < u ? tO(t, null, f(h), n, i) : tO(t, null, { + scaleX: 0, + scaleY: 0 + }, n, i, (function () { + r.remove(t) + })), h++ + })); h < u; h++) { + var p = WP(n); + p.__pictorialAnimationIndex = h, p.__pictorialRepeatTimes = u, r.add(p); + var d = f(h); + tO(p, {x: d.x, y: d.y, scaleX: 0, scaleY: 0}, { + scaleX: d.scaleX, + scaleY: d.scaleY, + rotation: d.rotation + }, n, i) + } + + function f(t) { + var e = s.slice(), i = n.pxSign, r = t; + return ("start" === n.symbolRepeatDirection ? i > 0 : i < 0) && (r = u - 1 - t), e[l.index] = c * (r - u / 2 + .5) + s[l.index], { + x: e[0], + y: e[1], + scaleX: n.symbolScale[0], + scaleY: n.symbolScale[1], + rotation: n.rotation + } + } + } + + function YP(t, e, n, i) { + var r = t.__pictorialBundle, o = t.__pictorialMainPath; + o ? tO(o, null, { + x: n.pathPosition[0], + y: n.pathPosition[1], + scaleX: n.symbolScale[0], + scaleY: n.symbolScale[1], + rotation: n.rotation + }, n, i) : (o = t.__pictorialMainPath = WP(n), r.add(o), tO(o, { + x: n.pathPosition[0], + y: n.pathPosition[1], + scaleX: 0, + scaleY: 0, + rotation: n.rotation + }, {scaleX: n.symbolScale[0], scaleY: n.symbolScale[1]}, n, i)) + } + + function UP(t, e, n) { + var i = A({}, e.barRectShape), r = t.__pictorialBarRect; + r ? tO(r, null, {shape: i}, e, n) : ((r = t.__pictorialBarRect = new Ts({ + z2: 2, + shape: i, + silent: !0, + style: {stroke: "transparent", fill: "transparent", lineWidth: 0} + })).disableMorphing = !0, t.add(r)) + } + + function XP(t, e, n, i) { + if (n.symbolClip) { + var r = t.__pictorialClipPath, o = A({}, n.clipShape), a = e.valueDim, s = n.animationModel, + l = n.dataIndex; + if (r) ih(r, {shape: o}, s, l); else { + o[a.wh] = 0, r = new Ts({shape: o}), t.__pictorialBundle.setClipPath(r), t.__pictorialClipPath = r; + var u = {}; + u[a.wh] = n.clipShape[a.wh], Vh[i ? "updateProps" : "initProps"](r, {shape: u}, s, l) + } + } + } + + function ZP(t, e) { + var n = t.getItemModel(e); + return n.getAnimationDelayParams = jP, n.isAnimationEnabled = qP, n + } + + function jP(t) { + return {index: t.__pictorialAnimationIndex, count: t.__pictorialRepeatTimes} + } + + function qP() { + return this.parentModel.isAnimationEnabled() && !!this.getShallow("animation") + } + + function KP(t, e, n, i) { + var r = new Cr, o = new Cr; + return r.add(o), r.__pictorialBundle = o, o.x = n.bundlePosition[0], o.y = n.bundlePosition[1], n.symbolRepeat ? HP(r, e, n) : YP(r, 0, n), UP(r, n, i), XP(r, e, n, i), r.__pictorialShapeStr = JP(t, n), r.__pictorialSymbolMeta = n, r + } + + function $P(t, e, n, i) { + var r = i.__pictorialBarRect; + r && r.removeTextContent(); + var o = []; + QP(i, (function (t) { + o.push(t) + })), i.__pictorialMainPath && o.push(i.__pictorialMainPath), i.__pictorialClipPath && (n = null), E(o, (function (t) { + ah(t, {scaleX: 0, scaleY: 0}, n, e, (function () { + i.parent && i.parent.remove(i) + })) + })), t.setItemGraphicEl(e, null) + } + + function JP(t, e) { + return [t.getItemVisual(e.dataIndex, "symbol") || "none", !!e.symbolRepeat, !!e.symbolClip].join(":") + } + + function QP(t, e, n) { + E(t.__pictorialBundle.children(), (function (i) { + i !== t.__pictorialBarRect && e.call(n, i) + })) + } + + function tO(t, e, n, i, r, o) { + e && t.attr(e), i.symbolClip && !r ? n && t.attr(n) : n && Vh[r ? "updateProps" : "initProps"](t, n, i.animationModel, i.dataIndex, o) + } + + function eO(t, e, n) { + var i = n.dataIndex, r = n.itemModel, o = r.getModel("emphasis"), a = o.getModel("itemStyle").getItemStyle(), + s = r.getModel(["blur", "itemStyle"]).getItemStyle(), + l = r.getModel(["select", "itemStyle"]).getItemStyle(), u = r.getShallow("cursor"), h = o.get("focus"), + c = o.get("blurScope"), p = o.get("scale"); + QP(t, (function (t) { + if (t instanceof xs) { + var e = t.style; + t.useStyle(A({image: e.image, x: e.x, y: e.y, width: e.width, height: e.height}, n.style)) + } else t.useStyle(n.style); + var i = t.ensureState("emphasis"); + i.style = a, p && (i.scaleX = 1.1 * t.scaleX, i.scaleY = 1.1 * t.scaleY), t.ensureState("blur").style = s, t.ensureState("select").style = l, u && (t.cursor = u), t.z2 = n.z2 + })); + var d = e.valueDim.posDesc[+(n.boundingLength > 0)]; + Wh(t.__pictorialBarRect, Hh(r), { + labelFetcher: e.seriesModel, + labelDataIndex: i, + defaultText: Fw(e.seriesModel.getData(), i), + inheritColor: n.style.fill, + defaultOpacity: n.style.opacity, + defaultOutsidePosition: d + }), Ol(t, h, c, o.get("disabled")) + } + + function nO(t) { + var e = Math.round(t); + return Math.abs(t - e) < 1e-4 ? e : Math.ceil(t) + } + + var iO = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.hasSymbolVisual = !0, n.defaultSymbol = "roundRect", n + } + + return n(e, t), e.prototype.getInitialData = function (e) { + return e.stack = null, t.prototype.getInitialData.apply(this, arguments) + }, e.type = "series.pictorialBar", e.dependencies = ["grid"], e.defaultOption = gc(SS.defaultOption, { + symbol: "circle", + symbolSize: null, + symbolRotate: null, + symbolPosition: null, + symbolOffset: null, + symbolMargin: null, + symbolRepeat: !1, + symbolRepeatDirection: "end", + symbolClip: !1, + symbolBoundingData: null, + symbolPatternSize: 400, + barGap: "-100%", + progressive: 0, + emphasis: {scale: !1}, + select: {itemStyle: {borderColor: "#212121"}} + }), e + }(SS); + var rO = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n._layers = [], n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + var i = t.getData(), r = this, o = this.group, a = t.getLayerSeries(), s = i.getLayout("layoutInfo"), + l = s.rect, u = s.boundaryGap; + + function h(t) { + return t.name + } + + o.x = 0, o.y = l.y + u[0]; + var c = new Sm(this._layersSeries || [], a, h, h), p = []; + + function d(e, n, s) { + var l = r._layers; + if ("remove" !== e) { + for (var u, h, c = [], d = [], f = a[n].indices, g = 0; g < f.length; g++) { + var y = i.getItemLayout(f[g]), v = y.x, m = y.y0, x = y.y; + c.push(v, m), d.push(v, m + x), u = i.getItemVisual(f[g], "style") + } + var _ = i.getItemLayout(f[0]), b = t.getModel("label").get("margin"), w = t.getModel("emphasis"); + if ("add" === e) { + var S = p[n] = new Cr; + h = new iS({ + shape: { + points: c, + stackedOnPoints: d, + smooth: .4, + stackedOnSmooth: .4, + smoothConstraint: !1 + }, z2: 0 + }), S.add(h), o.add(S), t.isAnimationEnabled() && h.setClipPath(function (t, e, n) { + var i = new Ts({shape: {x: t.x - 10, y: t.y - 10, width: 0, height: t.height + 20}}); + return rh(i, {shape: {x: t.x - 50, width: t.width + 100, height: t.height + 20}}, e, n), i + }(h.getBoundingRect(), t, (function () { + h.removeClipPath() + }))) + } else { + S = l[s]; + h = S.childAt(0), o.add(S), p[n] = S, ih(h, {shape: {points: c, stackedOnPoints: d}}, t), uh(h) + } + Wh(h, Hh(t), { + labelDataIndex: f[g - 1], + defaultText: i.getName(f[g - 1]), + inheritColor: u.fill + }, {normal: {verticalAlign: "middle"}}), h.setTextConfig({position: null, local: !0}); + var M = h.getTextContent(); + M && (M.x = _.x - b, M.y = _.y0 + _.y / 2), h.useStyle(u), i.setItemGraphicEl(n, h), zl(h, t), Ol(h, w.get("focus"), w.get("blurScope"), w.get("disabled")) + } else o.remove(l[n]) + } + + c.add(W(d, this, "add")).update(W(d, this, "update")).remove(W(d, this, "remove")).execute(), this._layersSeries = a, this._layers = p + }, e.type = "themeRiver", e + }(mg); + var oO = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function (e) { + t.prototype.init.apply(this, arguments), this.legendVisualProvider = new lM(W(this.getData, this), W(this.getRawData, this)) + }, e.prototype.fixData = function (t) { + var e = t.length, n = {}, i = Lo(t, (function (t) { + return n.hasOwnProperty(t[0] + "") || (n[t[0] + ""] = -1), t[2] + })), r = []; + i.buckets.each((function (t, e) { + r.push({name: e, dataList: t}) + })); + for (var o = r.length, a = 0; a < o; ++a) { + for (var s = r[a].name, l = 0; l < r[a].dataList.length; ++l) { + var u = r[a].dataList[l][0] + ""; + n[u] = a + } + for (var u in n) n.hasOwnProperty(u) && n[u] !== a && (n[u] = a, t[e] = [u, 0, s], e++) + } + return t + }, e.prototype.getInitialData = function (t, e) { + for (var n = this.getReferringComponents("singleAxis", Co).models[0].get("type"), i = B(t.data, (function (t) { + return void 0 !== t[2] + })), r = this.fixData(i || []), o = [], a = this.nameMap = ft(), s = 0, l = 0; l < r.length; ++l) o.push(r[l][2]), a.get(r[l][2]) || (a.set(r[l][2], s), s++); + var u = jm(r, { + coordDimensions: ["single"], + dimensionsDefine: [{name: "time", type: Tm(n)}, {name: "value", type: "float"}, { + name: "name", + type: "ordinal" + }], + encodeDefine: {single: 0, value: 1, itemName: 2} + }).dimensions, h = new Zm(u, this); + return h.initData(r), h + }, e.prototype.getLayerSeries = function () { + for (var t = this.getData(), e = t.count(), n = [], i = 0; i < e; ++i) n[i] = i; + var r = t.mapDimension("single"), o = Lo(n, (function (e) { + return t.get("name", e) + })), a = []; + return o.buckets.each((function (e, n) { + e.sort((function (e, n) { + return t.get(r, e) - t.get(r, n) + })), a.push({name: n, indices: e}) + })), a + }, e.prototype.getAxisTooltipData = function (t, e, n) { + Y(t) || (t = t ? [t] : []); + for (var i, r = this.getData(), o = this.getLayerSeries(), a = [], s = o.length, l = 0; l < s; ++l) { + for (var u = Number.MAX_VALUE, h = -1, c = o[l].indices.length, p = 0; p < c; ++p) { + var d = r.get(t[0], o[l].indices[p]), f = Math.abs(d - e); + f <= u && (i = d, u = f, h = o[l].indices[p]) + } + a.push(h) + } + return {dataIndices: a, nestestValue: i} + }, e.prototype.formatTooltip = function (t, e, n) { + var i = this.getData(); + return Uf("nameValue", {name: i.getName(t), value: i.get(i.mapDimension("value"), t)}) + }, e.type = "series.themeRiver", e.dependencies = ["singleAxis"], e.defaultOption = { + z: 2, + colorBy: "data", + coordinateSystem: "singleAxis", + boundaryGap: ["10%", "10%"], + singleAxisIndex: 0, + animationEasing: "linear", + label: {margin: 4, show: !0, position: "left", fontSize: 11}, + emphasis: {label: {show: !0}} + }, e + }(ag); + + function aO(t, e) { + t.eachSeriesByType("themeRiver", (function (t) { + var e = t.getData(), n = t.coordinateSystem, i = {}, r = n.getRect(); + i.rect = r; + var o = t.get("boundaryGap"), a = n.getAxis(); + (i.boundaryGap = o, "horizontal" === a.orient) ? (o[0] = Er(o[0], r.height), o[1] = Er(o[1], r.height), sO(e, t, r.height - o[0] - o[1])) : (o[0] = Er(o[0], r.width), o[1] = Er(o[1], r.width), sO(e, t, r.width - o[0] - o[1])); + e.setLayout("layoutInfo", i) + })) + } + + function sO(t, e, n) { + if (t.count()) for (var i, r = e.coordinateSystem, o = e.getLayerSeries(), a = t.mapDimension("single"), s = t.mapDimension("value"), l = z(o, (function (e) { + return z(e.indices, (function (e) { + var n = r.dataToPoint(t.get(a, e)); + return n[1] = t.get(s, e), n + })) + })), u = function (t) { + for (var e = t.length, n = t[0].length, i = [], r = [], o = 0, a = 0; a < n; ++a) { + for (var s = 0, l = 0; l < e; ++l) s += t[l][a][1]; + s > o && (o = s), i.push(s) + } + for (var u = 0; u < n; ++u) r[u] = (o - i[u]) / 2; + o = 0; + for (var h = 0; h < n; ++h) { + var c = i[h] + r[h]; + c > o && (o = c) + } + return {y0: r, max: o} + }(l), h = u.y0, c = n / u.max, p = o.length, d = o[0].indices.length, f = 0; f < d; ++f) { + i = h[f] * c, t.setItemLayout(o[0].indices[f], {layerIndex: 0, x: l[0][f][0], y0: i, y: l[0][f][1] * c}); + for (var g = 1; g < p; ++g) i += l[g - 1][f][1] * c, t.setItemLayout(o[g].indices[f], { + layerIndex: g, + x: l[g][f][0], + y0: i, + y: l[g][f][1] * c + }) + } + } + + var lO = function (t) { + function e(e, n, i, r) { + var o = t.call(this) || this; + o.z2 = 2, o.textConfig = {inside: !0}, Ws(o).seriesIndex = n.seriesIndex; + var a = new As({z2: 4, silent: e.getModel().get(["label", "silent"])}); + return o.setTextContent(a), o.updateData(!0, e, n, i, r), o + } + + return n(e, t), e.prototype.updateData = function (t, e, n, i, r) { + this.node = e, e.piece = this, n = n || this._seriesModel, i = i || this._ecModel; + var o = this; + Ws(o).dataIndex = e.dataIndex; + var a = e.getModel(), s = a.getModel("emphasis"), l = e.getLayout(), u = A({}, l); + u.label = null; + var h = e.getVisual("style"); + h.lineJoin = "bevel"; + var c = e.getVisual("decal"); + c && (h.decal = nv(c, r)); + var p = rM(a.getModel("itemStyle"), u, !0); + A(u, p), E(js, (function (t) { + var e = o.ensureState(t), n = a.getModel([t, "itemStyle"]); + e.style = n.getItemStyle(); + var i = rM(n, u); + i && (e.shape = i) + })), t ? (o.setShape(u), o.shape.r = l.r0, ih(o, {shape: {r: l.r}}, n, e.dataIndex)) : (ih(o, {shape: u}, n), uh(o)), o.useStyle(h), this._updateLabel(n); + var d = a.getShallow("cursor"); + d && o.attr("cursor", d), this._seriesModel = n || this._seriesModel, this._ecModel = i || this._ecModel; + var f = s.get("focus"); + Ol(this, "ancestor" === f ? e.getAncestorsIndices() : "descendant" === f ? e.getDescendantIndices() : f, s.get("blurScope"), s.get("disabled")) + }, e.prototype._updateLabel = function (t) { + var e = this, n = this.node.getModel(), i = n.getModel("label"), r = this.node.getLayout(), + o = r.endAngle - r.startAngle, a = (r.startAngle + r.endAngle) / 2, s = Math.cos(a), l = Math.sin(a), + u = this, h = u.getTextContent(), c = this.node.dataIndex, p = i.get("minAngle") / 180 * Math.PI, + d = i.get("show") && !(null != p && Math.abs(o) < p); + + function f(t, e) { + var n = t.get(e); + return null == n ? i.get(e) : n + } + + h.ignore = !d, E(qs, (function (i) { + var o = "normal" === i ? n.getModel("label") : n.getModel([i, "label"]), p = "normal" === i, + d = p ? h : h.ensureState(i), g = t.getFormattedLabel(c, i); + p && (g = g || e.node.name), d.style = Yh(o, {}, null, "normal" !== i, !0), g && (d.style.text = g); + var y = o.get("show"); + null == y || p || (d.ignore = !y); + var v, m = f(o, "position"), x = p ? u : u.states[i], _ = x.style.fill; + x.textConfig = {outsideFill: "inherit" === o.get("color") ? _ : null, inside: "outside" !== m}; + var b = f(o, "distance") || 0, w = f(o, "align"); + "outside" === m ? (v = r.r + b, w = a > Math.PI / 2 ? "right" : "left") : w && "center" !== w ? "left" === w ? (v = r.r0 + b, a > Math.PI / 2 && (w = "right")) : "right" === w && (v = r.r - b, a > Math.PI / 2 && (w = "left")) : (v = (r.r + r.r0) / 2, w = "center"), d.style.align = w, d.style.verticalAlign = f(o, "verticalAlign") || "middle", d.x = v * s + r.cx, d.y = v * l + r.cy; + var S = f(o, "rotate"), M = 0; + "radial" === S ? (M = -a) < -Math.PI / 2 && (M += Math.PI) : "tangential" === S ? (M = Math.PI / 2 - a) > Math.PI / 2 ? M -= Math.PI : M < -Math.PI / 2 && (M += Math.PI) : j(S) && (M = S * Math.PI / 180), d.rotation = M + })), h.dirtyStyle() + }, e + }(Tu), uO = "sunburstRootToNode", hO = "sunburstHighlight"; + var cO = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n, i) { + var r = this; + this.seriesModel = t, this.api = n, this.ecModel = e; + var o = t.getData(), a = o.tree.root, s = t.getViewRoot(), l = this.group, + u = t.get("renderLabelForZeroData"), h = []; + s.eachNode((function (t) { + h.push(t) + })); + var c = this._oldChildren || []; + !function (i, r) { + if (0 === i.length && 0 === r.length) return; + + function s(t) { + return t.getId() + } + + function h(s, h) { + !function (i, r) { + u || !i || i.getValue() || (i = null); + if (i !== a && r !== a) if (r && r.piece) i ? (r.piece.updateData(!1, i, t, e, n), o.setItemGraphicEl(i.dataIndex, r.piece)) : function (t) { + if (!t) return; + t.piece && (l.remove(t.piece), t.piece = null) + }(r); else if (i) { + var s = new lO(i, t, e, n); + l.add(s), o.setItemGraphicEl(i.dataIndex, s) + } + }(null == s ? null : i[s], null == h ? null : r[h]) + } + + new Sm(r, i, s, s).add(h).update(h).remove(H(h, null)).execute() + }(h, c), function (i, o) { + o.depth > 0 ? (r.virtualPiece ? r.virtualPiece.updateData(!1, i, t, e, n) : (r.virtualPiece = new lO(i, t, e, n), l.add(r.virtualPiece)), o.piece.off("click"), r.virtualPiece.on("click", (function (t) { + r._rootToNode(o.parentNode) + }))) : r.virtualPiece && (l.remove(r.virtualPiece), r.virtualPiece = null) + }(a, s), this._initEvents(), this._oldChildren = h + }, e.prototype._initEvents = function () { + var t = this; + this.group.off("click"), this.group.on("click", (function (e) { + var n = !1; + t.seriesModel.getViewRoot().eachNode((function (i) { + if (!n && i.piece && i.piece === e.target) { + var r = i.getModel().get("nodeClick"); + if ("rootToNode" === r) t._rootToNode(i); else if ("link" === r) { + var o = i.getModel(), a = o.get("link"); + if (a) pp(a, o.get("target", !0) || "_blank") + } + n = !0 + } + })) + })) + }, e.prototype._rootToNode = function (t) { + t !== this.seriesModel.getViewRoot() && this.api.dispatchAction({ + type: uO, + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: t + }) + }, e.prototype.containPoint = function (t, e) { + var n = e.getData().getItemLayout(0); + if (n) { + var i = t[0] - n.cx, r = t[1] - n.cy, o = Math.sqrt(i * i + r * r); + return o <= n.r && o >= n.r0 + } + }, e.type = "sunburst", e + }(mg), pO = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.ignoreStyleOnData = !0, n + } + + return n(e, t), e.prototype.getInitialData = function (t, e) { + var n = {name: t.name, children: t.data}; + dO(n); + var i = this._levelModels = z(t.levels || [], (function (t) { + return new pc(t, this, e) + }), this), r = CC.createTree(n, this, (function (t) { + t.wrapMethod("getItemModel", (function (t, e) { + var n = r.getNodeByDataIndex(e), o = i[n.depth]; + return o && (t.parentModel = o), t + })) + })); + return r.data + }, e.prototype.optionUpdated = function () { + this.resetViewRoot() + }, e.prototype.getDataParams = function (e) { + var n = t.prototype.getDataParams.apply(this, arguments), i = this.getData().tree.getNodeByDataIndex(e); + return n.treePathInfo = LC(i, this), n + }, e.prototype.getLevelModel = function (t) { + return this._levelModels && this._levelModels[t.depth] + }, e.prototype.getViewRoot = function () { + return this._viewRoot + }, e.prototype.resetViewRoot = function (t) { + t ? this._viewRoot = t : t = this._viewRoot; + var e = this.getRawData().tree.root; + t && (t === e || e.contains(t)) || (this._viewRoot = e) + }, e.prototype.enableAriaDecal = function () { + zC(this) + }, e.type = "series.sunburst", e.defaultOption = { + z: 2, + center: ["50%", "50%"], + radius: [0, "75%"], + clockwise: !0, + startAngle: 90, + minAngle: 0, + stillShowZeroSum: !0, + nodeClick: "rootToNode", + renderLabelForZeroData: !1, + label: { + rotate: "radial", + show: !0, + opacity: 1, + align: "center", + position: "inside", + distance: 5, + silent: !0 + }, + itemStyle: { + borderWidth: 1, + borderColor: "white", + borderType: "solid", + shadowBlur: 0, + shadowColor: "rgba(0, 0, 0, 0.2)", + shadowOffsetX: 0, + shadowOffsetY: 0, + opacity: 1 + }, + emphasis: {focus: "descendant"}, + blur: {itemStyle: {opacity: .2}, label: {opacity: .1}}, + animationType: "expansion", + animationDuration: 1e3, + animationDurationUpdate: 500, + data: [], + sort: "desc" + }, e + }(ag); + + function dO(t) { + var e = 0; + E(t.children, (function (t) { + dO(t); + var n = t.value; + Y(n) && (n = n[0]), e += n + })); + var n = t.value; + Y(n) && (n = n[0]), (null == n || isNaN(n)) && (n = e), n < 0 && (n = 0), Y(t.value) ? t.value[0] = n : t.value = n + } + + var fO = Math.PI / 180; + + function gO(t, e, n) { + e.eachSeriesByType(t, (function (t) { + var e = t.get("center"), i = t.get("radius"); + Y(i) || (i = [0, i]), Y(e) || (e = [e, e]); + var r = n.getWidth(), o = n.getHeight(), a = Math.min(r, o), s = Er(e[0], r), l = Er(e[1], o), + u = Er(i[0], a / 2), h = Er(i[1], a / 2), c = -t.get("startAngle") * fO, p = t.get("minAngle") * fO, + d = t.getData().tree.root, f = t.getViewRoot(), g = f.depth, y = t.get("sort"); + null != y && yO(f, y); + var v = 0; + E(f.children, (function (t) { + !isNaN(t.getValue()) && v++ + })); + var m = f.getValue(), x = Math.PI / (m || v) * 2, _ = f.depth > 0, b = f.height - (_ ? -1 : 1), + w = (h - u) / (b || 1), S = t.get("clockwise"), M = t.get("stillShowZeroSum"), I = S ? 1 : -1, + T = function (e, n) { + if (e) { + var i = n; + if (e !== d) { + var r = e.getValue(), o = 0 === m && M ? x : r * x; + o < p && (o = p), i = n + I * o; + var h = e.depth - g - (_ ? -1 : 1), c = u + w * h, f = u + w * (h + 1), + y = t.getLevelModel(e); + if (y) { + var v = y.get("r0", !0), b = y.get("r", !0), C = y.get("radius", !0); + null != C && (v = C[0], b = C[1]), null != v && (c = Er(v, a / 2)), null != b && (f = Er(b, a / 2)) + } + e.setLayout({angle: o, startAngle: n, endAngle: i, clockwise: S, cx: s, cy: l, r0: c, r: f}) + } + if (e.children && e.children.length) { + var D = 0; + E(e.children, (function (t) { + D += T(t, n + D) + })) + } + return i - n + } + }; + if (_) { + var C = u, D = u + w, A = 2 * Math.PI; + d.setLayout({angle: A, startAngle: c, endAngle: c + A, clockwise: S, cx: s, cy: l, r0: C, r: D}) + } + T(f, c) + })) + } + + function yO(t, e) { + var n = t.children || []; + t.children = function (t, e) { + if (U(e)) { + var n = z(t, (function (t, e) { + var n = t.getValue(); + return { + params: { + depth: t.depth, height: t.height, dataIndex: t.dataIndex, getValue: function () { + return n + } + }, index: e + } + })); + return n.sort((function (t, n) { + return e(t.params, n.params) + })), z(n, (function (e) { + return t[e.index] + })) + } + var i = "asc" === e; + return t.sort((function (t, e) { + var n = (t.getValue() - e.getValue()) * (i ? 1 : -1); + return 0 === n ? (t.dataIndex - e.dataIndex) * (i ? -1 : 1) : n + })) + }(n, e), n.length && E(t.children, (function (t) { + yO(t, e) + })) + } + + function vO(t) { + var e = {}; + t.eachSeriesByType("sunburst", (function (t) { + var n = t.getData(), i = n.tree; + i.eachNode((function (r) { + var o = r.getModel().getModel("itemStyle").getItemStyle(); + o.fill || (o.fill = function (t, n, i) { + for (var r = t; r && r.depth > 1;) r = r.parentNode; + var o = n.getColorFromPalette(r.name || r.dataIndex + "", e); + return t.depth > 1 && X(o) && (o = Sn(o, (t.depth - 1) / (i - 1) * .5)), o + }(r, t, i.root.height)), A(n.ensureUniqueItemVisual(r.dataIndex, "style"), o) + })) + })) + } + + var mO = {color: "fill", borderColor: "stroke"}, + xO = {symbol: 1, symbolSize: 1, symbolKeepAspect: 1, legendIcon: 1, visualMeta: 1, liftZ: 1, decal: 1}, + _O = So(), bO = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.optionUpdated = function () { + this.currentZLevel = this.get("zlevel", !0), this.currentZ = this.get("z", !0) + }, e.prototype.getInitialData = function (t, e) { + return nx(null, this) + }, e.prototype.getDataParams = function (e, n, i) { + var r = t.prototype.getDataParams.call(this, e, n); + return i && (r.info = _O(i).info), r + }, e.type = "series.custom", e.dependencies = ["grid", "polar", "geo", "singleAxis", "calendar"], e.defaultOption = { + coordinateSystem: "cartesian2d", + z: 2, + legendHoverLink: !0, + clip: !1 + }, e + }(ag); + + function wO(t, e) { + return e = e || [0, 0], z(["x", "y"], (function (n, i) { + var r = this.getAxis(n), o = e[i], a = t[i] / 2; + return "category" === r.type ? r.getBandWidth() : Math.abs(r.dataToCoord(o - a) - r.dataToCoord(o + a)) + }), this) + } + + function SO(t, e) { + return e = e || [0, 0], z([0, 1], (function (n) { + var i = e[n], r = t[n] / 2, o = [], a = []; + return o[n] = i - r, a[n] = i + r, o[1 - n] = a[1 - n] = e[1 - n], Math.abs(this.dataToPoint(o)[n] - this.dataToPoint(a)[n]) + }), this) + } + + function MO(t, e) { + var n = this.getAxis(), i = e instanceof Array ? e[0] : e, r = (t instanceof Array ? t[0] : t) / 2; + return "category" === n.type ? n.getBandWidth() : Math.abs(n.dataToCoord(i - r) - n.dataToCoord(i + r)) + } + + function IO(t, e) { + return e = e || [0, 0], z(["Radius", "Angle"], (function (n, i) { + var r = this["get" + n + "Axis"](), o = e[i], a = t[i] / 2, + s = "category" === r.type ? r.getBandWidth() : Math.abs(r.dataToCoord(o - a) - r.dataToCoord(o + a)); + return "Angle" === n && (s = s * Math.PI / 180), s + }), this) + } + + function TO(t, e, n, i) { + return t && (t.legacy || !1 !== t.legacy && !n && !i && "tspan" !== e && ("text" === e || mt(t, "text"))) + } + + function CO(t, e, n) { + var i, r, o, a = t; + if ("text" === e) o = a; else { + o = {}, mt(a, "text") && (o.text = a.text), mt(a, "rich") && (o.rich = a.rich), mt(a, "textFill") && (o.fill = a.textFill), mt(a, "textStroke") && (o.stroke = a.textStroke), mt(a, "fontFamily") && (o.fontFamily = a.fontFamily), mt(a, "fontSize") && (o.fontSize = a.fontSize), mt(a, "fontStyle") && (o.fontStyle = a.fontStyle), mt(a, "fontWeight") && (o.fontWeight = a.fontWeight), r = { + type: "text", + style: o, + silent: !0 + }, i = {}; + var s = mt(a, "textPosition"); + n ? i.position = s ? a.textPosition : "inside" : s && (i.position = a.textPosition), mt(a, "textPosition") && (i.position = a.textPosition), mt(a, "textOffset") && (i.offset = a.textOffset), mt(a, "textRotation") && (i.rotation = a.textRotation), mt(a, "textDistance") && (i.distance = a.textDistance) + } + return DO(o, t), E(o.rich, (function (t) { + DO(t, t) + })), {textConfig: i, textContent: r} + } + + function DO(t, e) { + e && (e.font = e.textFont || e.font, mt(e, "textStrokeWidth") && (t.lineWidth = e.textStrokeWidth), mt(e, "textAlign") && (t.align = e.textAlign), mt(e, "textVerticalAlign") && (t.verticalAlign = e.textVerticalAlign), mt(e, "textLineHeight") && (t.lineHeight = e.textLineHeight), mt(e, "textWidth") && (t.width = e.textWidth), mt(e, "textHeight") && (t.height = e.textHeight), mt(e, "textBackgroundColor") && (t.backgroundColor = e.textBackgroundColor), mt(e, "textPadding") && (t.padding = e.textPadding), mt(e, "textBorderColor") && (t.borderColor = e.textBorderColor), mt(e, "textBorderWidth") && (t.borderWidth = e.textBorderWidth), mt(e, "textBorderRadius") && (t.borderRadius = e.textBorderRadius), mt(e, "textBoxShadowColor") && (t.shadowColor = e.textBoxShadowColor), mt(e, "textBoxShadowBlur") && (t.shadowBlur = e.textBoxShadowBlur), mt(e, "textBoxShadowOffsetX") && (t.shadowOffsetX = e.textBoxShadowOffsetX), mt(e, "textBoxShadowOffsetY") && (t.shadowOffsetY = e.textBoxShadowOffsetY)) + } + + function AO(t, e, n) { + var i = t; + i.textPosition = i.textPosition || n.position || "inside", null != n.offset && (i.textOffset = n.offset), null != n.rotation && (i.textRotation = n.rotation), null != n.distance && (i.textDistance = n.distance); + var r = i.textPosition.indexOf("inside") >= 0, o = t.fill || "#000"; + kO(i, e); + var a = null == i.textFill; + return r ? a && (i.textFill = n.insideFill || "#fff", !i.textStroke && n.insideStroke && (i.textStroke = n.insideStroke), !i.textStroke && (i.textStroke = o), null == i.textStrokeWidth && (i.textStrokeWidth = 2)) : (a && (i.textFill = t.fill || n.outsideFill || "#000"), !i.textStroke && n.outsideStroke && (i.textStroke = n.outsideStroke)), i.text = e.text, i.rich = e.rich, E(e.rich, (function (t) { + kO(t, t) + })), i + } + + function kO(t, e) { + e && (mt(e, "fill") && (t.textFill = e.fill), mt(e, "stroke") && (t.textStroke = e.fill), mt(e, "lineWidth") && (t.textStrokeWidth = e.lineWidth), mt(e, "font") && (t.font = e.font), mt(e, "fontStyle") && (t.fontStyle = e.fontStyle), mt(e, "fontWeight") && (t.fontWeight = e.fontWeight), mt(e, "fontSize") && (t.fontSize = e.fontSize), mt(e, "fontFamily") && (t.fontFamily = e.fontFamily), mt(e, "align") && (t.textAlign = e.align), mt(e, "verticalAlign") && (t.textVerticalAlign = e.verticalAlign), mt(e, "lineHeight") && (t.textLineHeight = e.lineHeight), mt(e, "width") && (t.textWidth = e.width), mt(e, "height") && (t.textHeight = e.height), mt(e, "backgroundColor") && (t.textBackgroundColor = e.backgroundColor), mt(e, "padding") && (t.textPadding = e.padding), mt(e, "borderColor") && (t.textBorderColor = e.borderColor), mt(e, "borderWidth") && (t.textBorderWidth = e.borderWidth), mt(e, "borderRadius") && (t.textBorderRadius = e.borderRadius), mt(e, "shadowColor") && (t.textBoxShadowColor = e.shadowColor), mt(e, "shadowBlur") && (t.textBoxShadowBlur = e.shadowBlur), mt(e, "shadowOffsetX") && (t.textBoxShadowOffsetX = e.shadowOffsetX), mt(e, "shadowOffsetY") && (t.textBoxShadowOffsetY = e.shadowOffsetY), mt(e, "textShadowColor") && (t.textShadowColor = e.textShadowColor), mt(e, "textShadowBlur") && (t.textShadowBlur = e.textShadowBlur), mt(e, "textShadowOffsetX") && (t.textShadowOffsetX = e.textShadowOffsetX), mt(e, "textShadowOffsetY") && (t.textShadowOffsetY = e.textShadowOffsetY)) + } + + var LO = {position: ["x", "y"], scale: ["scaleX", "scaleY"], origin: ["originX", "originY"]}, PO = G(LO), + OO = (V(Ki, (function (t, e) { + return t[e] = 1, t + }), {}), Ki.join(", "), ["", "style", "shape", "extra"]), RO = So(); + + function NO(t, e, n, i, r) { + var o = t + "Animation", a = eh(t, i, r) || {}, s = RO(e).userDuring; + return a.duration > 0 && (a.during = s ? W(WO, { + el: e, + userDuring: s + }) : null, a.setToFinal = !0, a.scope = t), A(a, n[o]), a + } + + function EO(t, e, n, i) { + var r = (i = i || {}).dataIndex, o = i.isInit, a = i.clearStyle, s = n.isAnimationEnabled(), l = RO(t), + u = e.style; + l.userDuring = e.during; + var h = {}, c = {}; + if (function (t, e, n) { + for (var i = 0; i < PO.length; i++) { + var r = PO[i], o = LO[r], a = e[r]; + a && (n[o[0]] = a[0], n[o[1]] = a[1]) + } + for (i = 0; i < Ki.length; i++) { + var s = Ki[i]; + null != e[s] && (n[s] = e[s]) + } + }(0, e, c), YO("shape", e, c), YO("extra", e, c), !o && s && (function (t, e, n) { + for (var i = e.transition, r = BO(i) ? Ki : ho(i || []), o = 0; o < r.length; o++) { + var a = r[o]; + if ("style" !== a && "shape" !== a && "extra" !== a) { + var s = t[a]; + 0, n[a] = s + } + } + }(t, e, h), HO("shape", t, e, h), HO("extra", t, e, h), function (t, e, n, i) { + if (!n) return; + var r, o = t.style; + if (o) { + var a = n.transition, s = e.transition; + if (a && !BO(a)) { + var l = ho(a); + !r && (r = i.style = {}); + for (var u = 0; u < l.length; u++) { + var h = o[f = l[u]]; + r[f] = h + } + } else if (t.getAnimationStyleProps && (BO(s) || BO(a) || P(s, "style") >= 0)) { + var c = t.getAnimationStyleProps(), p = c ? c.style : null; + if (p) { + !r && (r = i.style = {}); + var d = G(n); + for (u = 0; u < d.length; u++) { + var f; + if (p[f = d[u]]) { + h = o[f]; + r[f] = h + } + } + } + } + } + }(t, e, u, h)), c.style = u, function (t, e, n) { + var i = e.style; + if (!t.isGroup && i) { + if (n) { + t.useStyle({}); + for (var r = t.animators, o = 0; o < r.length; o++) { + var a = r[o]; + "style" === a.targetName && a.changeTarget(t.style) + } + } + t.setStyle(i) + } + e && (e.style = null, e && t.attr(e), e.style = i) + }(t, c, a), function (t, e) { + mt(e, "silent") && (t.silent = e.silent), mt(e, "ignore") && (t.ignore = e.ignore), t instanceof da && mt(e, "invisible") && (t.invisible = e.invisible); + t instanceof fs && mt(e, "autoBatch") && (t.autoBatch = e.autoBatch) + }(t, e), s) if (o) { + var p = {}; + E(OO, (function (t) { + var n = t ? e[t] : e; + n && n.enterFrom && (t && (p[t] = p[t] || {}), A(t ? p[t] : p, n.enterFrom)) + })); + var d = NO("enter", t, e, n, r); + d.duration > 0 && t.animateFrom(p, d) + } else !function (t, e, n, i, r) { + if (r) { + var o = NO("update", t, e, i, n); + o.duration > 0 && t.animateFrom(r, o) + } + }(t, e, r || 0, n, h); + zO(t, e), u ? t.dirty() : t.markRedraw() + } + + function zO(t, e) { + for (var n = RO(t).leaveToProps, i = 0; i < OO.length; i++) { + var r = OO[i], o = r ? e[r] : e; + o && o.leaveTo && (n || (n = RO(t).leaveToProps = {}), r && (n[r] = n[r] || {}), A(r ? n[r] : n, o.leaveTo)) + } + } + + function VO(t, e, n, i) { + if (t) { + var r = t.parent, o = RO(t).leaveToProps; + if (o) { + var a = NO("update", t, e, n, 0); + a.done = function () { + r.remove(t), i && i() + }, t.animateTo(o, a) + } else r.remove(t), i && i() + } + } + + function BO(t) { + return "all" === t + } + + var FO = {}, GO = { + setTransform: function (t, e) { + return FO.el[t] = e, this + }, getTransform: function (t) { + return FO.el[t] + }, setShape: function (t, e) { + var n = FO.el; + return (n.shape || (n.shape = {}))[t] = e, n.dirtyShape && n.dirtyShape(), this + }, getShape: function (t) { + var e = FO.el.shape; + if (e) return e[t] + }, setStyle: function (t, e) { + var n = FO.el, i = n.style; + return i && (i[t] = e, n.dirtyStyle && n.dirtyStyle()), this + }, getStyle: function (t) { + var e = FO.el.style; + if (e) return e[t] + }, setExtra: function (t, e) { + return (FO.el.extra || (FO.el.extra = {}))[t] = e, this + }, getExtra: function (t) { + var e = FO.el.extra; + if (e) return e[t] + } + }; + + function WO() { + var t = this, e = t.el; + if (e) { + var n = RO(e).userDuring, i = t.userDuring; + n === i ? (FO.el = e, i(GO)) : t.el = t.userDuring = null + } + } + + function HO(t, e, n, i) { + var r = n[t]; + if (r) { + var o, a = e[t]; + if (a) { + var s = n.transition, l = r.transition; + if (l) if (!o && (o = i[t] = {}), BO(l)) A(o, a); else for (var u = ho(l), h = 0; h < u.length; h++) { + var c = a[d = u[h]]; + o[d] = c + } else if (BO(s) || P(s, t) >= 0) { + !o && (o = i[t] = {}); + var p = G(a); + for (h = 0; h < p.length; h++) { + var d; + c = a[d = p[h]]; + UO(r[d], c) && (o[d] = c) + } + } + } + } + } + + function YO(t, e, n) { + var i = e[t]; + if (i) for (var r = n[t] = {}, o = G(i), a = 0; a < o.length; a++) { + var s = o[a]; + r[s] = ti(i[s]) + } + } + + function UO(t, e) { + return N(t) ? t !== e : null != t && isFinite(t) + } + + var XO = So(), ZO = ["percent", "easing", "shape", "style", "extra"]; + + function jO(t) { + t.stopAnimation("keyframe"), t.attr(XO(t)) + } + + function qO(t, e, n) { + if (n.isAnimationEnabled() && e) if (Y(e)) E(e, (function (e) { + qO(t, e, n) + })); else { + var i = e.keyframes, r = e.duration; + if (n && null == r) { + var o = eh("enter", n, 0); + r = o && o.duration + } + if (i && r) { + var a = XO(t); + E(OO, (function (n) { + if (!n || t[n]) { + var o; + i.sort((function (t, e) { + return t.percent - e.percent + })), E(i, (function (i) { + var s = t.animators, l = n ? i[n] : i; + if (l) { + var u = G(l); + if (n || (u = B(u, (function (t) { + return P(ZO, t) < 0 + }))), u.length) { + o || ((o = t.animate(n, e.loop, !0)).scope = "keyframe"); + for (var h = 0; h < s.length; h++) s[h] !== o && s[h].targetName === o.targetName && s[h].stopTracks(u); + n && (a[n] = a[n] || {}); + var c = n ? a[n] : a; + E(u, (function (e) { + c[e] = ((n ? t[n] : t) || {})[e] + })), o.whenWithKeys(r * i.percent, l, u, i.easing) + } + } + })), o && o.delay(e.delay || 0).duration(r).start(e.easing) + } + })) + } + } + } + + var KO = "emphasis", $O = "normal", JO = "blur", QO = "select", tR = [$O, KO, JO, QO], + eR = {normal: ["itemStyle"], emphasis: [KO, "itemStyle"], blur: [JO, "itemStyle"], select: [QO, "itemStyle"]}, + nR = {normal: ["label"], emphasis: [KO, "label"], blur: [JO, "label"], select: [QO, "label"]}, iR = ["x", "y"], + rR = {normal: {}, emphasis: {}, blur: {}, select: {}}, oR = { + cartesian2d: function (t) { + var e = t.master.getRect(); + return { + coordSys: {type: "cartesian2d", x: e.x, y: e.y, width: e.width, height: e.height}, + api: { + coord: function (e) { + return t.dataToPoint(e) + }, size: W(wO, t) + } + } + }, geo: function (t) { + var e = t.getBoundingRect(); + return { + coordSys: {type: "geo", x: e.x, y: e.y, width: e.width, height: e.height, zoom: t.getZoom()}, + api: { + coord: function (e) { + return t.dataToPoint(e) + }, size: W(SO, t) + } + } + }, singleAxis: function (t) { + var e = t.getRect(); + return { + coordSys: {type: "singleAxis", x: e.x, y: e.y, width: e.width, height: e.height}, + api: { + coord: function (e) { + return t.dataToPoint(e) + }, size: W(MO, t) + } + } + }, polar: function (t) { + var e = t.getRadiusAxis(), n = t.getAngleAxis(), i = e.getExtent(); + return i[0] > i[1] && i.reverse(), { + coordSys: {type: "polar", cx: t.cx, cy: t.cy, r: i[1], r0: i[0]}, + api: { + coord: function (i) { + var r = e.dataToRadius(i[0]), o = n.dataToAngle(i[1]), a = t.coordToPoint([r, o]); + return a.push(r, o * Math.PI / 180), a + }, size: W(IO, t) + } + } + }, calendar: function (t) { + var e = t.getRect(), n = t.getRangeInfo(); + return { + coordSys: { + type: "calendar", + x: e.x, + y: e.y, + width: e.width, + height: e.height, + cellWidth: t.getCellWidth(), + cellHeight: t.getCellHeight(), + rangeInfo: {start: n.start, end: n.end, weeks: n.weeks, dayCount: n.allDay} + }, api: { + coord: function (e, n) { + return t.dataToPoint(e, n) + } + } + } + } + }; + + function aR(t) { + return t instanceof fs + } + + function sR(t) { + return t instanceof da + } + + var lR = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n, i) { + this._progressiveEls = null; + var r = this._data, o = t.getData(), a = this.group, s = dR(t, o, e, n); + r || a.removeAll(), o.diff(r).add((function (e) { + gR(n, null, e, s(e, i), t, a, o) + })).remove((function (e) { + var n = r.getItemGraphicEl(e); + VO(n, _O(n).option, t) + })).update((function (e, l) { + var u = r.getItemGraphicEl(l); + gR(n, u, e, s(e, i), t, a, o) + })).execute(); + var l = t.get("clip", !0) ? aS(t.coordinateSystem, !1, t) : null; + l ? a.setClipPath(l) : a.removeClipPath(), this._data = o + }, e.prototype.incrementalPrepareRender = function (t, e, n) { + this.group.removeAll(), this._data = null + }, e.prototype.incrementalRender = function (t, e, n, i, r) { + var o = e.getData(), a = dR(e, o, n, i), s = this._progressiveEls = []; + + function l(t) { + t.isGroup || (t.incremental = !0, t.ensureState("emphasis").hoverLayer = !0) + } + + for (var u = t.start; u < t.end; u++) { + var h = gR(null, null, u, a(u, r), e, this.group, o); + h && (h.traverse(l), s.push(h)) + } + }, e.prototype.eachRendered = function (t) { + zh(this._progressiveEls || this.group, t) + }, e.prototype.filterForExposedEvent = function (t, e, n, i) { + var r = e.element; + if (null == r || n.name === r) return !0; + for (; (n = n.__hostTarget || n.parent) && n !== this.group;) if (n.name === r) return !0; + return !1 + }, e.type = "custom", e + }(mg); + + function uR(t) { + var e, n = t.type; + if ("path" === n) { + var i = t.shape, r = null != i.width && null != i.height ? { + x: i.x || 0, + y: i.y || 0, + width: i.width, + height: i.height + } : null, o = MR(i); + e = mh(o, null, r, i.layout || "center"), _O(e).customPathData = o + } else if ("image" === n) e = new xs({}), _O(e).customImagePath = t.style.image; else if ("text" === n) e = new As({}); else if ("group" === n) e = new Cr; else { + if ("compoundPath" === n) throw new Error('"compoundPath" is not supported yet.'); + var a = vh(n); + if (!a) { + var s = ""; + 0, ao(s) + } + e = new a + } + return _O(e).customGraphicType = n, e.name = t.name, e.z2EmphasisLift = 1, e.z2SelectLift = 1, e + } + + function hR(t, e, n, i, r, o, a) { + jO(e); + var s = r && r.normal.cfg; + s && e.setTextConfig(s), i && null == i.transition && (i.transition = iR); + var l = i && i.style; + if (l) { + if ("text" === e.type) { + var u = l; + mt(u, "textFill") && (u.fill = u.textFill), mt(u, "textStroke") && (u.stroke = u.textStroke) + } + var h = void 0, c = aR(e) ? l.decal : null; + t && c && (c.dirty = !0, h = nv(c, t)), l.__decalPattern = h + } + sR(e) && (l && (h = l.__decalPattern) && (l.decal = h)); + EO(e, i, o, {dataIndex: n, isInit: a, clearStyle: !0}), qO(e, i.keyframeAnimation, o) + } + + function cR(t, e, n, i, r) { + var o = e.isGroup ? null : e, a = r && r[t].cfg; + if (o) { + var s = o.ensureState(t); + if (!1 === i) { + var l = o.getState(t); + l && (l.style = null) + } else s.style = i || null; + a && (s.textConfig = a), yl(o) + } + } + + function pR(t, e, n) { + var i = n === $O, r = i ? e : xR(e, n), o = r ? r.z2 : null; + null != o && ((i ? t : t.ensureState(n)).z2 = o || 0) + } + + function dR(t, e, n, i) { + var r = t.get("renderItem"), o = t.coordinateSystem, a = {}; + o && (a = o.prepareCustoms ? o.prepareCustoms(o) : oR[o.type](o)); + for (var s, l, u = k({ + getWidth: i.getWidth, + getHeight: i.getHeight, + getZr: i.getZr, + getDevicePixelRatio: i.getDevicePixelRatio, + value: function (t, n) { + return null == n && (n = s), e.getStore().get(e.getDimensionIndex(t || 0), n) + }, + style: function (n, i) { + 0; + null == i && (i = s); + var r = e.getItemVisual(i, "style"), o = r && r.fill, a = r && r.opacity, l = m(i, $O).getItemStyle(); + null != o && (l.fill = o), null != a && (l.opacity = a); + var u = {inheritColor: X(o) ? o : "#000"}, h = x(i, $O), c = Yh(h, null, u, !1, !0); + c.text = h.getShallow("show") ? rt(t.getFormattedLabel(i, $O), Fw(e, i)) : null; + var p = Uh(h, u, !1); + return b(n, l), l = AO(l, c, p), n && _(l, n), l.legacy = !0, l + }, + ordinalRawValue: function (t, n) { + null == n && (n = s), t = t || 0; + var i = e.getDimensionInfo(t); + if (!i) { + var r = e.getDimensionIndex(t); + return r >= 0 ? e.getStore().get(r, n) : void 0 + } + var o = e.get(i.name, n), a = i && i.ordinalMeta; + return a ? a.categories[o] : o + }, + styleEmphasis: function (n, i) { + 0; + null == i && (i = s); + var r = m(i, KO).getItemStyle(), o = x(i, KO), a = Yh(o, null, null, !0, !0); + a.text = o.getShallow("show") ? ot(t.getFormattedLabel(i, KO), t.getFormattedLabel(i, $O), Fw(e, i)) : null; + var l = Uh(o, null, !0); + return b(n, r), r = AO(r, a, l), n && _(r, n), r.legacy = !0, r + }, + visual: function (t, n) { + if (null == n && (n = s), mt(mO, t)) { + var i = e.getItemVisual(n, "style"); + return i ? i[mO[t]] : null + } + if (mt(xO, t)) return e.getItemVisual(n, t) + }, + barLayout: function (t) { + if ("cartesian2d" === o.type) { + return function (t) { + var e = [], n = t.axis, i = "axis0"; + if ("category" === n.type) { + for (var r = n.getBandWidth(), o = 0; o < t.count; o++) e.push(k({ + bandWidth: r, + axisKey: i, + stackId: bx + o + }, t)); + var a = Cx(e), s = []; + for (o = 0; o < t.count; o++) { + var l = a.axis0[bx + o]; + l.offsetCenter = l.offset + l.width / 2, s.push(l) + } + return s + } + }(k({axis: o.getBaseAxis()}, t)) + } + }, + currentSeriesIndices: function () { + return n.getCurrentSeriesIndices() + }, + font: function (t) { + return Kh(t, n) + } + }, a.api || {}), h = { + context: {}, + seriesId: t.id, + seriesName: t.name, + seriesIndex: t.seriesIndex, + coordSys: a.coordSys, + dataInsideLength: e.count(), + encode: fR(t.getData()) + }, c = {}, p = {}, d = {}, f = {}, g = 0; g < tR.length; g++) { + var y = tR[g]; + d[y] = t.getModel(eR[y]), f[y] = t.getModel(nR[y]) + } + + function v(t) { + return t === s ? l || (l = e.getItemModel(t)) : e.getItemModel(t) + } + + function m(t, n) { + return e.hasItemOption ? t === s ? c[n] || (c[n] = v(t).getModel(eR[n])) : v(t).getModel(eR[n]) : d[n] + } + + function x(t, n) { + return e.hasItemOption ? t === s ? p[n] || (p[n] = v(t).getModel(nR[n])) : v(t).getModel(nR[n]) : f[n] + } + + return function (t, n) { + return s = t, l = null, c = {}, p = {}, r && r(k({ + dataIndexInside: t, + dataIndex: e.getRawIndex(t), + actionType: n ? n.type : null + }, h), u) + }; + + function _(t, e) { + for (var n in e) mt(e, n) && (t[n] = e[n]) + } + + function b(t, e) { + t && (t.textFill && (e.textFill = t.textFill), t.textPosition && (e.textPosition = t.textPosition)) + } + } + + function fR(t) { + var e = {}; + return E(t.dimensions, (function (n) { + var i = t.getDimensionInfo(n); + if (!i.isExtraCoord) { + var r = i.coordDim; + (e[r] = e[r] || [])[i.coordDimIndex] = t.getDimensionIndex(n) + } + })), e + } + + function gR(t, e, n, i, r, o, a) { + if (i) { + var s = yR(t, e, n, i, r, o); + return s && a.setItemGraphicEl(n, s), s && Ol(s, i.focus, i.blurScope, i.emphasisDisabled), s + } + o.remove(e) + } + + function yR(t, e, n, i, r, o) { + var a = -1, s = e; + e && vR(e, i, r) && (a = P(o.childrenRef(), e), e = null); + var l, u, h = !e, c = e; + c ? c.clearStates() : (c = uR(i), s && (l = s, (u = c).copyTransform(l), sR(u) && sR(l) && (u.setStyle(l.style), u.z = l.z, u.z2 = l.z2, u.zlevel = l.zlevel, u.invisible = l.invisible, u.ignore = l.ignore, aR(u) && aR(l) && u.setShape(l.shape)))), !1 === i.morph ? c.disableMorphing = !0 : c.disableMorphing && (c.disableMorphing = !1), rR.normal.cfg = rR.normal.conOpt = rR.emphasis.cfg = rR.emphasis.conOpt = rR.blur.cfg = rR.blur.conOpt = rR.select.cfg = rR.select.conOpt = null, rR.isLegacy = !1, function (t, e, n, i, r, o) { + if (t.isGroup) return; + mR(n, null, o), mR(n, KO, o); + var a = o.normal.conOpt, s = o.emphasis.conOpt, l = o.blur.conOpt, u = o.select.conOpt; + if (null != a || null != s || null != u || null != l) { + var h = t.getTextContent(); + if (!1 === a) h && t.removeTextContent(); else { + a = o.normal.conOpt = a || {type: "text"}, h ? h.clearStates() : (h = uR(a), t.setTextContent(h)), hR(null, h, e, a, null, i, r); + for (var c = a && a.style, p = 0; p < tR.length; p++) { + var d = tR[p]; + if (d !== $O) { + var f = o[d].conOpt; + cR(d, h, 0, _R(a, f, d), null) + } + } + c ? h.dirty() : h.markRedraw() + } + } + }(c, n, i, r, h, rR), function (t, e, n, i, r) { + var o = n.clipPath; + if (!1 === o) t && t.getClipPath() && t.removeClipPath(); else if (o) { + var a = t.getClipPath(); + a && vR(a, o, i) && (a = null), a || (a = uR(o), t.setClipPath(a)), hR(null, a, e, o, null, i, r) + } + }(c, n, i, r, h), hR(t, c, n, i, rR, r, h), mt(i, "info") && (_O(c).info = i.info); + for (var p = 0; p < tR.length; p++) { + var d = tR[p]; + if (d !== $O) { + var f = xR(i, d); + cR(d, c, 0, _R(i, f, d), rR) + } + } + return function (t, e, n) { + if (!t.isGroup) { + var i = t, r = n.currentZ, o = n.currentZLevel; + i.z = r, i.zlevel = o; + var a = e.z2; + null != a && (i.z2 = a || 0); + for (var s = 0; s < tR.length; s++) pR(i, e, tR[s]) + } + }(c, i, r), "group" === i.type && function (t, e, n, i, r) { + var o = i.children, a = o ? o.length : 0, s = i.$mergeChildren, l = "byName" === s || i.diffChildrenByName, + u = !1 === s; + if (!a && !l && !u) return; + if (l) return h = { + api: t, + oldChildren: e.children() || [], + newChildren: o || [], + dataIndex: n, + seriesModel: r, + group: e + }, void new Sm(h.oldChildren, h.newChildren, bR, bR, h).add(wR).update(wR).remove(SR).execute(); + var h; + u && e.removeAll(); + for (var c = 0; c < a; c++) o[c] && yR(t, e.childAt(c), n, o[c], r, e); + for (var p = e.childCount() - 1; p >= c; p--) { + VO(e.childAt(p), _O(e).option, r) + } + }(t, c, n, i, r), a >= 0 ? o.replaceAt(c, a) : o.add(c), c + } + + function vR(t, e, n) { + var i, r = _O(t), o = e.type, a = e.shape, s = e.style; + return n.isUniversalTransitionEnabled() || null != o && o !== r.customGraphicType || "path" === o && ((i = a) && (mt(i, "pathData") || mt(i, "d"))) && MR(a) !== r.customPathData || "image" === o && mt(s, "image") && s.image !== r.customImagePath + } + + function mR(t, e, n) { + var i = e ? xR(t, e) : t, r = e ? _R(t, i, KO) : t.style, o = t.type, a = i ? i.textConfig : null, + s = t.textContent, l = s ? e ? xR(s, e) : s : null; + if (r && (n.isLegacy || TO(r, o, !!a, !!l))) { + n.isLegacy = !0; + var u = CO(r, o, !e); + !a && u.textConfig && (a = u.textConfig), !l && u.textContent && (l = u.textContent) + } + if (!e && l) { + var h = l; + !h.type && (h.type = "text") + } + var c = e ? n[e] : n.normal; + c.cfg = a, c.conOpt = l + } + + function xR(t, e) { + return e ? t ? t[e] : null : t + } + + function _R(t, e, n) { + var i = e && e.style; + return null == i && n === KO && t && (i = t.styleEmphasis), i + } + + function bR(t, e) { + var n = t && t.name; + return null != n ? n : "e\0\0" + e + } + + function wR(t, e) { + var n = this.context, i = null != t ? n.newChildren[t] : null, r = null != e ? n.oldChildren[e] : null; + yR(n.api, r, n.dataIndex, i, n.seriesModel, n.group) + } + + function SR(t) { + var e = this.context, n = e.oldChildren[t]; + VO(n, _O(n).option, e.seriesModel) + } + + function MR(t) { + return t && (t.pathData || t.d) + } + + var IR = So(), TR = T, CR = W, DR = function () { + function t() { + this._dragging = !1, this.animationThreshold = 15 + } + + return t.prototype.render = function (t, e, n, i) { + var r = e.get("value"), o = e.get("status"); + if (this._axisModel = t, this._axisPointerModel = e, this._api = n, i || this._lastValue !== r || this._lastStatus !== o) { + this._lastValue = r, this._lastStatus = o; + var a = this._group, s = this._handle; + if (!o || "hide" === o) return a && a.hide(), void (s && s.hide()); + a && a.show(), s && s.show(); + var l = {}; + this.makeElOption(l, r, t, e, n); + var u = l.graphicKey; + u !== this._lastGraphicKey && this.clear(n), this._lastGraphicKey = u; + var h = this._moveAnimation = this.determineAnimation(t, e); + if (a) { + var c = H(AR, e, h); + this.updatePointerEl(a, l, c), this.updateLabelEl(a, l, c, e) + } else a = this._group = new Cr, this.createPointerEl(a, l, t, e), this.createLabelEl(a, l, t, e), n.getZr().add(a); + OR(a, e, !0), this._renderHandle(r) + } + }, t.prototype.remove = function (t) { + this.clear(t) + }, t.prototype.dispose = function (t) { + this.clear(t) + }, t.prototype.determineAnimation = function (t, e) { + var n = e.get("animation"), i = t.axis, r = "category" === i.type, o = e.get("snap"); + if (!o && !r) return !1; + if ("auto" === n || null == n) { + var a = this.animationThreshold; + if (r && i.getBandWidth() > a) return !0; + if (o) { + var s = jM(t).seriesDataCount, l = i.getExtent(); + return Math.abs(l[0] - l[1]) / s > a + } + return !1 + } + return !0 === n + }, t.prototype.makeElOption = function (t, e, n, i, r) { + }, t.prototype.createPointerEl = function (t, e, n, i) { + var r = e.pointer; + if (r) { + var o = IR(t).pointerEl = new Vh[r.type](TR(e.pointer)); + t.add(o) + } + }, t.prototype.createLabelEl = function (t, e, n, i) { + if (e.label) { + var r = IR(t).labelEl = new As(TR(e.label)); + t.add(r), LR(r, i) + } + }, t.prototype.updatePointerEl = function (t, e, n) { + var i = IR(t).pointerEl; + i && e.pointer && (i.setStyle(e.pointer.style), n(i, {shape: e.pointer.shape})) + }, t.prototype.updateLabelEl = function (t, e, n, i) { + var r = IR(t).labelEl; + r && (r.setStyle(e.label.style), n(r, {x: e.label.x, y: e.label.y}), LR(r, i)) + }, t.prototype._renderHandle = function (t) { + if (!this._dragging && this.updateHandleTransform) { + var e, n = this._axisPointerModel, i = this._api.getZr(), r = this._handle, o = n.getModel("handle"), + a = n.get("status"); + if (!o.get("show") || !a || "hide" === a) return r && i.remove(r), void (this._handle = null); + this._handle || (e = !0, r = this._handle = Lh(o.get("icon"), { + cursor: "move", + draggable: !0, + onmousemove: function (t) { + se(t.event) + }, + onmousedown: CR(this._onHandleDragMove, this, 0, 0), + drift: CR(this._onHandleDragMove, this), + ondragend: CR(this._onHandleDragEnd, this) + }), i.add(r)), OR(r, n, !1), r.setStyle(o.getItemStyle(null, ["color", "borderColor", "borderWidth", "opacity", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY"])); + var s = o.get("size"); + Y(s) || (s = [s, s]), r.scaleX = s[0] / 2, r.scaleY = s[1] / 2, Dg(this, "_doDispatchAxisPointer", o.get("throttle") || 0, "fixRate"), this._moveHandleToValue(t, e) + } + }, t.prototype._moveHandleToValue = function (t, e) { + AR(this._axisPointerModel, !e && this._moveAnimation, this._handle, PR(this.getHandleTransform(t, this._axisModel, this._axisPointerModel))) + }, t.prototype._onHandleDragMove = function (t, e) { + var n = this._handle; + if (n) { + this._dragging = !0; + var i = this.updateHandleTransform(PR(n), [t, e], this._axisModel, this._axisPointerModel); + this._payloadInfo = i, n.stopAnimation(), n.attr(PR(i)), IR(n).lastProp = null, this._doDispatchAxisPointer() + } + }, t.prototype._doDispatchAxisPointer = function () { + if (this._handle) { + var t = this._payloadInfo, e = this._axisModel; + this._api.dispatchAction({ + type: "updateAxisPointer", + x: t.cursorPoint[0], + y: t.cursorPoint[1], + tooltipOption: t.tooltipOption, + axesInfo: [{axisDim: e.axis.dim, axisIndex: e.componentIndex}] + }) + } + }, t.prototype._onHandleDragEnd = function () { + if (this._dragging = !1, this._handle) { + var t = this._axisPointerModel.get("value"); + this._moveHandleToValue(t), this._api.dispatchAction({type: "hideTip"}) + } + }, t.prototype.clear = function (t) { + this._lastValue = null, this._lastStatus = null; + var e = t.getZr(), n = this._group, i = this._handle; + e && n && (this._lastGraphicKey = null, n && e.remove(n), i && e.remove(i), this._group = null, this._handle = null, this._payloadInfo = null), Ag(this, "_doDispatchAxisPointer") + }, t.prototype.doClear = function () { + }, t.prototype.buildLabel = function (t, e, n) { + return {x: t[n = n || 0], y: t[1 - n], width: e[n], height: e[1 - n]} + }, t + }(); + + function AR(t, e, n, i) { + kR(IR(n).lastProp, i) || (IR(n).lastProp = i, e ? ih(n, i, t) : (n.stopAnimation(), n.attr(i))) + } + + function kR(t, e) { + if (q(t) && q(e)) { + var n = !0; + return E(e, (function (e, i) { + n = n && kR(t[i], e) + })), !!n + } + return t === e + } + + function LR(t, e) { + t[e.get(["label", "show"]) ? "show" : "hide"]() + } + + function PR(t) { + return {x: t.x || 0, y: t.y || 0, rotation: t.rotation || 0} + } + + function OR(t, e, n) { + var i = e.get("z"), r = e.get("zlevel"); + t && t.traverse((function (t) { + "group" !== t.type && (null != i && (t.z = i), null != r && (t.zlevel = r), t.silent = n) + })) + } + + function RR(t) { + var e, n = t.get("type"), i = t.getModel(n + "Style"); + return "line" === n ? (e = i.getLineStyle()).fill = null : "shadow" === n && ((e = i.getAreaStyle()).stroke = null), e + } + + function NR(t, e, n, i, r) { + var o = ER(n.get("value"), e.axis, e.ecModel, n.get("seriesDataIndices"), { + precision: n.get(["label", "precision"]), + formatter: n.get(["label", "formatter"]) + }), a = n.getModel("label"), s = np(a.get("padding") || 0), l = a.getFont(), u = cr(o, l), h = r.position, + c = u.width + s[1] + s[3], p = u.height + s[0] + s[2], d = r.align; + "right" === d && (h[0] -= c), "center" === d && (h[0] -= c / 2); + var f = r.verticalAlign; + "bottom" === f && (h[1] -= p), "middle" === f && (h[1] -= p / 2), function (t, e, n, i) { + var r = i.getWidth(), o = i.getHeight(); + t[0] = Math.min(t[0] + e, r) - e, t[1] = Math.min(t[1] + n, o) - n, t[0] = Math.max(t[0], 0), t[1] = Math.max(t[1], 0) + }(h, c, p, i); + var g = a.get("backgroundColor"); + g && "auto" !== g || (g = e.get(["axisLine", "lineStyle", "color"])), t.label = { + x: h[0], + y: h[1], + style: Yh(a, {text: o, font: l, fill: a.getTextColor(), padding: s, backgroundColor: g}), + z2: 10 + } + } + + function ER(t, e, n, i, r) { + t = e.scale.parse(t); + var o = e.scale.getLabel({value: t}, {precision: r.precision}), a = r.formatter; + if (a) { + var s = {value: o_(e, {value: t}), axisDimension: e.dim, axisIndex: e.index, seriesData: []}; + E(i, (function (t) { + var e = n.getSeriesByIndex(t.seriesIndex), i = t.dataIndexInside, r = e && e.getDataParams(i); + r && s.seriesData.push(r) + })), X(a) ? o = a.replace("{value}", o) : U(a) && (o = a(s)) + } + return o + } + + function zR(t, e, n) { + var i = [1, 0, 0, 1, 0, 0]; + return zi(i, i, n.rotation), Ei(i, i, n.position), Ih([t.dataToCoord(e), (n.labelOffset || 0) + (n.labelDirection || 1) * (n.labelMargin || 0)], i) + } + + function VR(t, e, n, i, r, o) { + var a = BM.innerTextLayout(n.rotation, 0, n.labelDirection); + n.labelMargin = r.get(["label", "margin"]), NR(e, i, r, o, { + position: zR(i.axis, t, n), + align: a.textAlign, + verticalAlign: a.textVerticalAlign + }) + } + + function BR(t, e, n) { + return {x1: t[n = n || 0], y1: t[1 - n], x2: e[n], y2: e[1 - n]} + } + + function FR(t, e, n) { + return {x: t[n = n || 0], y: t[1 - n], width: e[n], height: e[1 - n]} + } + + function GR(t, e, n, i, r, o) { + return {cx: t, cy: e, r0: n, r: i, startAngle: r, endAngle: o, clockwise: !0} + } + + var WR = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.makeElOption = function (t, e, n, i, r) { + var o = n.axis, a = o.grid, s = i.get("type"), l = HR(a, o).getOtherAxis(o).getGlobalExtent(), + u = o.toGlobalCoord(o.dataToCoord(e, !0)); + if (s && "none" !== s) { + var h = RR(i), c = YR[s](o, u, l); + c.style = h, t.graphicKey = c.type, t.pointer = c + } + VR(e, t, AM(a.model, n), n, i, r) + }, e.prototype.getHandleTransform = function (t, e, n) { + var i = AM(e.axis.grid.model, e, {labelInside: !1}); + i.labelMargin = n.get(["handle", "margin"]); + var r = zR(e.axis, t, i); + return {x: r[0], y: r[1], rotation: i.rotation + (i.labelDirection < 0 ? Math.PI : 0)} + }, e.prototype.updateHandleTransform = function (t, e, n, i) { + var r = n.axis, o = r.grid, a = r.getGlobalExtent(!0), s = HR(o, r).getOtherAxis(r).getGlobalExtent(), + l = "x" === r.dim ? 0 : 1, u = [t.x, t.y]; + u[l] += e[l], u[l] = Math.min(a[1], u[l]), u[l] = Math.max(a[0], u[l]); + var h = (s[1] + s[0]) / 2, c = [h, h]; + c[l] = u[l]; + return { + x: u[0], + y: u[1], + rotation: t.rotation, + cursorPoint: c, + tooltipOption: [{verticalAlign: "middle"}, {align: "center"}][l] + } + }, e + }(DR); + + function HR(t, e) { + var n = {}; + return n[e.dim + "AxisIndex"] = e.index, t.getCartesian(n) + } + + var YR = { + line: function (t, e, n) { + return {type: "Line", subPixelOptimize: !0, shape: BR([e, n[0]], [e, n[1]], UR(t))} + }, shadow: function (t, e, n) { + var i = Math.max(1, t.getBandWidth()), r = n[1] - n[0]; + return {type: "Rect", shape: FR([e - i / 2, n[0]], [i, r], UR(t))} + } + }; + + function UR(t) { + return "x" === t.dim ? 0 : 1 + } + + var XR = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "axisPointer", e.defaultOption = { + show: "auto", + z: 50, + type: "line", + snap: !1, + triggerTooltip: !0, + value: null, + status: null, + link: [], + animation: null, + animationDurationUpdate: 200, + lineStyle: {color: "#B9BEC9", width: 1, type: "dashed"}, + shadowStyle: {color: "rgba(210,219,238,0.2)"}, + label: { + show: !0, + formatter: null, + precision: "auto", + margin: 3, + color: "#fff", + padding: [5, 7, 5, 7], + backgroundColor: "auto", + borderColor: null, + borderWidth: 0, + borderRadius: 3 + }, + handle: { + show: !1, + icon: "M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z", + size: 45, + margin: 50, + color: "#333", + shadowBlur: 3, + shadowColor: "#aaa", + shadowOffsetX: 0, + shadowOffsetY: 2, + throttle: 40 + } + }, e + }(Ip), ZR = So(), jR = E; + + function qR(t, e, n) { + if (!r.node) { + var i = e.getZr(); + ZR(i).records || (ZR(i).records = {}), function (t, e) { + if (ZR(t).initialized) return; + + function n(n, i) { + t.on(n, (function (n) { + var r = function (t) { + var e = {showTip: [], hideTip: []}, n = function (i) { + var r = e[i.type]; + r ? r.push(i) : (i.dispatchAction = n, t.dispatchAction(i)) + }; + return {dispatchAction: n, pendings: e} + }(e); + jR(ZR(t).records, (function (t) { + t && i(t, n, r.dispatchAction) + })), function (t, e) { + var n, i = t.showTip.length, r = t.hideTip.length; + i ? n = t.showTip[i - 1] : r && (n = t.hideTip[r - 1]); + n && (n.dispatchAction = null, e.dispatchAction(n)) + }(r.pendings, e) + })) + } + + ZR(t).initialized = !0, n("click", H($R, "click")), n("mousemove", H($R, "mousemove")), n("globalout", KR) + }(i, e), (ZR(i).records[t] || (ZR(i).records[t] = {})).handler = n + } + } + + function KR(t, e, n) { + t.handler("leave", null, n) + } + + function $R(t, e, n, i) { + e.handler(t, n, i) + } + + function JR(t, e) { + if (!r.node) { + var n = e.getZr(); + (ZR(n).records || {})[t] && (ZR(n).records[t] = null) + } + } + + var QR = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + var i = e.getComponent("tooltip"), r = t.get("triggerOn") || i && i.get("triggerOn") || "mousemove|click"; + qR("axisPointer", n, (function (t, e, n) { + "none" !== r && ("leave" === t || r.indexOf(t) >= 0) && n({ + type: "updateAxisPointer", + currTrigger: t, + x: e && e.offsetX, + y: e && e.offsetY + }) + })) + }, e.prototype.remove = function (t, e) { + JR("axisPointer", e) + }, e.prototype.dispose = function (t, e) { + JR("axisPointer", e) + }, e.type = "axisPointer", e + }(fg); + + function tN(t, e) { + var n, i = [], r = t.seriesIndex; + if (null == r || !(n = e.getSeriesByIndex(r))) return {point: []}; + var o = n.getData(), a = wo(o, t); + if (null == a || a < 0 || Y(a)) return {point: []}; + var s = o.getItemGraphicEl(a), l = n.coordinateSystem; + if (n.getTooltipPosition) i = n.getTooltipPosition(a) || []; else if (l && l.dataToPoint) if (t.isStacked) { + var u = l.getBaseAxis(), h = l.getOtherAxis(u).dim, c = u.dim, p = "x" === h || "radius" === h ? 1 : 0, + d = o.mapDimension(c), f = []; + f[p] = o.get(d, a), f[1 - p] = o.get(o.getCalculationInfo("stackResultDimension"), a), i = l.dataToPoint(f) || [] + } else i = l.dataToPoint(o.getValues(z(l.dimensions, (function (t) { + return o.mapDimension(t) + })), a)) || []; else if (s) { + var g = s.getBoundingRect().clone(); + g.applyTransform(s.transform), i = [g.x + g.width / 2, g.y + g.height / 2] + } + return {point: i, el: s} + } + + var eN = So(); + + function nN(t, e, n) { + var i = t.currTrigger, r = [t.x, t.y], o = t, a = t.dispatchAction || W(n.dispatchAction, n), + s = e.getComponent("axisPointer").coordSysAxesInfo; + if (s) { + sN(r) && (r = tN({seriesIndex: o.seriesIndex, dataIndex: o.dataIndex}, e).point); + var l = sN(r), u = o.axesInfo, h = s.axesInfo, c = "leave" === i || sN(r), p = {}, d = {}, + f = {list: [], map: {}}, g = {showPointer: H(rN, d), showTooltip: H(oN, f)}; + E(s.coordSysMap, (function (t, e) { + var n = l || t.containPoint(r); + E(s.coordSysAxesInfo[e], (function (t, e) { + var i = t.axis, o = function (t, e) { + for (var n = 0; n < (t || []).length; n++) { + var i = t[n]; + if (e.axis.dim === i.axisDim && e.axis.model.componentIndex === i.axisIndex) return i + } + }(u, t); + if (!c && n && (!u || o)) { + var a = o && o.value; + null != a || l || (a = i.pointToData(r)), null != a && iN(t, a, g, !1, p) + } + })) + })); + var y = {}; + return E(h, (function (t, e) { + var n = t.linkGroup; + n && !d[e] && E(n.axesInfo, (function (e, i) { + var r = d[i]; + if (e !== t && r) { + var o = r.value; + n.mapper && (o = t.axis.scale.parse(n.mapper(o, aN(e), aN(t)))), y[t.key] = o + } + })) + })), E(y, (function (t, e) { + iN(h[e], t, g, !0, p) + })), function (t, e, n) { + var i = n.axesInfo = []; + E(e, (function (e, n) { + var r = e.axisPointerModel.option, o = t[n]; + o ? (!e.useHandle && (r.status = "show"), r.value = o.value, r.seriesDataIndices = (o.payloadBatch || []).slice()) : !e.useHandle && (r.status = "hide"), "show" === r.status && i.push({ + axisDim: e.axis.dim, + axisIndex: e.axis.model.componentIndex, + value: r.value + }) + })) + }(d, h, p), function (t, e, n, i) { + if (sN(e) || !t.list.length) return void i({type: "hideTip"}); + var r = ((t.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {}; + i({ + type: "showTip", + escapeConnect: !0, + x: e[0], + y: e[1], + tooltipOption: n.tooltipOption, + position: n.position, + dataIndexInside: r.dataIndexInside, + dataIndex: r.dataIndex, + seriesIndex: r.seriesIndex, + dataByCoordSys: t.list + }) + }(f, r, t, a), function (t, e, n) { + var i = n.getZr(), r = "axisPointerLastHighlights", o = eN(i)[r] || {}, a = eN(i)[r] = {}; + E(t, (function (t, e) { + var n = t.axisPointerModel.option; + "show" === n.status && E(n.seriesDataIndices, (function (t) { + var e = t.seriesIndex + " | " + t.dataIndex; + a[e] = t + })) + })); + var s = [], l = []; + E(o, (function (t, e) { + !a[e] && l.push(t) + })), E(a, (function (t, e) { + !o[e] && s.push(t) + })), l.length && n.dispatchAction({ + type: "downplay", + escapeConnect: !0, + notBlur: !0, + batch: l + }), s.length && n.dispatchAction({type: "highlight", escapeConnect: !0, notBlur: !0, batch: s}) + }(h, 0, n), p + } + } + + function iN(t, e, n, i, r) { + var o = t.axis; + if (!o.scale.isBlank() && o.containData(e)) if (t.involveSeries) { + var a = function (t, e) { + var n = e.axis, i = n.dim, r = t, o = [], a = Number.MAX_VALUE, s = -1; + return E(e.seriesModels, (function (e, l) { + var u, h, c = e.getData().mapDimensionsAll(i); + if (e.getAxisTooltipData) { + var p = e.getAxisTooltipData(c, t, n); + h = p.dataIndices, u = p.nestestValue + } else { + if (!(h = e.getData().indicesOfNearest(c[0], t, "category" === n.type ? .5 : null)).length) return; + u = e.getData().get(c[0], h[0]) + } + if (null != u && isFinite(u)) { + var d = t - u, f = Math.abs(d); + f <= a && ((f < a || d >= 0 && s < 0) && (a = f, s = d, r = u, o.length = 0), E(h, (function (t) { + o.push({ + seriesIndex: e.seriesIndex, + dataIndexInside: t, + dataIndex: e.getData().getRawIndex(t) + }) + }))) + } + })), {payloadBatch: o, snapToValue: r} + }(e, t), s = a.payloadBatch, l = a.snapToValue; + s[0] && null == r.seriesIndex && A(r, s[0]), !i && t.snap && o.containData(l) && null != l && (e = l), n.showPointer(t, e, s), n.showTooltip(t, a, l) + } else n.showPointer(t, e) + } + + function rN(t, e, n, i) { + t[e.key] = {value: n, payloadBatch: i} + } + + function oN(t, e, n, i) { + var r = n.payloadBatch, o = e.axis, a = o.model, s = e.axisPointerModel; + if (e.triggerTooltip && r.length) { + var l = e.coordSys.model, u = KM(l), h = t.map[u]; + h || (h = t.map[u] = { + coordSysId: l.id, + coordSysIndex: l.componentIndex, + coordSysType: l.type, + coordSysMainType: l.mainType, + dataByAxis: [] + }, t.list.push(h)), h.dataByAxis.push({ + axisDim: o.dim, + axisIndex: a.componentIndex, + axisType: a.type, + axisId: a.id, + value: i, + valueLabelOpt: {precision: s.get(["label", "precision"]), formatter: s.get(["label", "formatter"])}, + seriesDataIndices: r.slice() + }) + } + } + + function aN(t) { + var e = t.axis.model, n = {}, i = n.axisDim = t.axis.dim; + return n.axisIndex = n[i + "AxisIndex"] = e.componentIndex, n.axisName = n[i + "AxisName"] = e.name, n.axisId = n[i + "AxisId"] = e.id, n + } + + function sN(t) { + return !t || null == t[0] || isNaN(t[0]) || null == t[1] || isNaN(t[1]) + } + + function lN(t) { + JM.registerAxisPointerClass("CartesianAxisPointer", WR), t.registerComponentModel(XR), t.registerComponentView(QR), t.registerPreprocessor((function (t) { + if (t) { + (!t.axisPointer || 0 === t.axisPointer.length) && (t.axisPointer = {}); + var e = t.axisPointer.link; + e && !Y(e) && (t.axisPointer.link = [e]) + } + })), t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC, (function (t, e) { + t.getComponent("axisPointer").coordSysAxesInfo = UM(t, e) + })), t.registerAction({type: "updateAxisPointer", event: "updateAxisPointer", update: ":updateAxisPointer"}, nN) + } + + var uN = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.makeElOption = function (t, e, n, i, r) { + var o = n.axis; + "angle" === o.dim && (this.animationThreshold = Math.PI / 18); + var a = o.polar, s = a.getOtherAxis(o).getExtent(), l = o.dataToCoord(e), u = i.get("type"); + if (u && "none" !== u) { + var h = RR(i), c = hN[u](o, a, l, s); + c.style = h, t.graphicKey = c.type, t.pointer = c + } + var p = function (t, e, n, i, r) { + var o = e.axis, a = o.dataToCoord(t), s = i.getAngleAxis().getExtent()[0]; + s = s / 180 * Math.PI; + var l, u, h, c = i.getRadiusAxis().getExtent(); + if ("radius" === o.dim) { + var p = [1, 0, 0, 1, 0, 0]; + zi(p, p, s), Ei(p, p, [i.cx, i.cy]), l = Ih([a, -r], p); + var d = e.getModel("axisLabel").get("rotate") || 0, + f = BM.innerTextLayout(s, d * Math.PI / 180, -1); + u = f.textAlign, h = f.textVerticalAlign + } else { + var g = c[1]; + l = i.coordToPoint([g + r, a]); + var y = i.cx, v = i.cy; + u = Math.abs(l[0] - y) / g < .3 ? "center" : l[0] > y ? "left" : "right", h = Math.abs(l[1] - v) / g < .3 ? "middle" : l[1] > v ? "top" : "bottom" + } + return {position: l, align: u, verticalAlign: h} + }(e, n, 0, a, i.get(["label", "margin"])); + NR(t, n, i, r, p) + }, e + }(DR); + var hN = { + line: function (t, e, n, i) { + return "angle" === t.dim ? { + type: "Line", + shape: BR(e.coordToPoint([i[0], n]), e.coordToPoint([i[1], n])) + } : {type: "Circle", shape: {cx: e.cx, cy: e.cy, r: n}} + }, shadow: function (t, e, n, i) { + var r = Math.max(1, t.getBandWidth()), o = Math.PI / 180; + return "angle" === t.dim ? { + type: "Sector", + shape: GR(e.cx, e.cy, i[0], i[1], (-n - r / 2) * o, (r / 2 - n) * o) + } : {type: "Sector", shape: GR(e.cx, e.cy, n - r / 2, n + r / 2, 0, 2 * Math.PI)} + } + }, cN = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.findAxisModel = function (t) { + var e; + return this.ecModel.eachComponent(t, (function (t) { + t.getCoordSysModel() === this && (e = t) + }), this), e + }, e.type = "polar", e.dependencies = ["radiusAxis", "angleAxis"], e.defaultOption = { + z: 0, + center: ["50%", "50%"], + radius: "80%" + }, e + }(Ip), pN = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.getCoordSysModel = function () { + return this.getReferringComponents("polar", Co).models[0] + }, e.type = "polarAxis", e + }(Ip); + R(pN, h_); + var dN = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "angleAxis", e + }(pN), fN = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "radiusAxis", e + }(pN), gN = function (t) { + function e(e, n) { + return t.call(this, "radius", e, n) || this + } + + return n(e, t), e.prototype.pointToData = function (t, e) { + return this.polar.pointToData(t, e)["radius" === this.dim ? 0 : 1] + }, e + }(G_); + gN.prototype.dataToRadius = G_.prototype.dataToCoord, gN.prototype.radiusToData = G_.prototype.coordToData; + var yN = So(), vN = function (t) { + function e(e, n) { + return t.call(this, "angle", e, n || [0, 360]) || this + } + + return n(e, t), e.prototype.pointToData = function (t, e) { + return this.polar.pointToData(t, e)["radius" === this.dim ? 0 : 1] + }, e.prototype.calculateCategoryInterval = function () { + var t = this, e = t.getLabelModel(), n = t.scale, i = n.getExtent(), r = n.count(); + if (i[1] - i[0] < 1) return 0; + var o = i[0], a = t.dataToCoord(o + 1) - t.dataToCoord(o), s = Math.abs(a), + l = cr(null == o ? "" : o + "", e.getFont(), "center", "top"), u = Math.max(l.height, 7) / s; + isNaN(u) && (u = 1 / 0); + var h = Math.max(0, Math.floor(u)), c = yN(t.model), p = c.lastAutoInterval, d = c.lastTickCount; + return null != p && null != d && Math.abs(p - h) <= 1 && Math.abs(d - r) <= 1 && p > h ? h = p : (c.lastTickCount = r, c.lastAutoInterval = h), h + }, e + }(G_); + vN.prototype.dataToAngle = G_.prototype.dataToCoord, vN.prototype.angleToData = G_.prototype.coordToData; + var mN = ["radius", "angle"], xN = function () { + function t(t) { + this.dimensions = mN, this.type = "polar", this.cx = 0, this.cy = 0, this._radiusAxis = new gN, this._angleAxis = new vN, this.axisPointerEnabled = !0, this.name = t || "", this._radiusAxis.polar = this._angleAxis.polar = this + } + + return t.prototype.containPoint = function (t) { + var e = this.pointToCoord(t); + return this._radiusAxis.contain(e[0]) && this._angleAxis.contain(e[1]) + }, t.prototype.containData = function (t) { + return this._radiusAxis.containData(t[0]) && this._angleAxis.containData(t[1]) + }, t.prototype.getAxis = function (t) { + return this["_" + t + "Axis"] + }, t.prototype.getAxes = function () { + return [this._radiusAxis, this._angleAxis] + }, t.prototype.getAxesByScale = function (t) { + var e = [], n = this._angleAxis, i = this._radiusAxis; + return n.scale.type === t && e.push(n), i.scale.type === t && e.push(i), e + }, t.prototype.getAngleAxis = function () { + return this._angleAxis + }, t.prototype.getRadiusAxis = function () { + return this._radiusAxis + }, t.prototype.getOtherAxis = function (t) { + var e = this._angleAxis; + return t === e ? this._radiusAxis : e + }, t.prototype.getBaseAxis = function () { + return this.getAxesByScale("ordinal")[0] || this.getAxesByScale("time")[0] || this.getAngleAxis() + }, t.prototype.getTooltipAxes = function (t) { + var e = null != t && "auto" !== t ? this.getAxis(t) : this.getBaseAxis(); + return {baseAxes: [e], otherAxes: [this.getOtherAxis(e)]} + }, t.prototype.dataToPoint = function (t, e) { + return this.coordToPoint([this._radiusAxis.dataToRadius(t[0], e), this._angleAxis.dataToAngle(t[1], e)]) + }, t.prototype.pointToData = function (t, e) { + var n = this.pointToCoord(t); + return [this._radiusAxis.radiusToData(n[0], e), this._angleAxis.angleToData(n[1], e)] + }, t.prototype.pointToCoord = function (t) { + var e = t[0] - this.cx, n = t[1] - this.cy, i = this.getAngleAxis(), r = i.getExtent(), + o = Math.min(r[0], r[1]), a = Math.max(r[0], r[1]); + i.inverse ? o = a - 360 : a = o + 360; + var s = Math.sqrt(e * e + n * n); + e /= s, n /= s; + for (var l = Math.atan2(-n, e) / Math.PI * 180, u = l < o ? 1 : -1; l < o || l > a;) l += 360 * u; + return [s, l] + }, t.prototype.coordToPoint = function (t) { + var e = t[0], n = t[1] / 180 * Math.PI; + return [Math.cos(n) * e + this.cx, -Math.sin(n) * e + this.cy] + }, t.prototype.getArea = function () { + var t = this.getAngleAxis(), e = this.getRadiusAxis().getExtent().slice(); + e[0] > e[1] && e.reverse(); + var n = t.getExtent(), i = Math.PI / 180; + return { + cx: this.cx, + cy: this.cy, + r0: e[0], + r: e[1], + startAngle: -n[0] * i, + endAngle: -n[1] * i, + clockwise: t.inverse, + contain: function (t, e) { + var n = t - this.cx, i = e - this.cy, r = n * n + i * i - 1e-4, o = this.r, a = this.r0; + return r <= o * o && r >= a * a + } + } + }, t.prototype.convertToPixel = function (t, e, n) { + return _N(e) === this ? this.dataToPoint(n) : null + }, t.prototype.convertFromPixel = function (t, e, n) { + return _N(e) === this ? this.pointToData(n) : null + }, t + }(); + + function _N(t) { + var e = t.seriesModel, n = t.polarModel; + return n && n.coordinateSystem || e && e.coordinateSystem + } + + function bN(t, e) { + var n = this, i = n.getAngleAxis(), r = n.getRadiusAxis(); + if (i.scale.setExtent(1 / 0, -1 / 0), r.scale.setExtent(1 / 0, -1 / 0), t.eachSeries((function (t) { + if (t.coordinateSystem === n) { + var e = t.getData(); + E(u_(e, "radius"), (function (t) { + r.scale.unionExtentFromData(e, t) + })), E(u_(e, "angle"), (function (t) { + i.scale.unionExtentFromData(e, t) + })) + } + })), n_(i.scale, i.model), n_(r.scale, r.model), "category" === i.type && !i.onBand) { + var o = i.getExtent(), a = 360 / i.scale.count(); + i.inverse ? o[1] += a : o[1] -= a, i.setExtent(o[0], o[1]) + } + } + + function wN(t, e) { + if (t.type = e.get("type"), t.scale = i_(e), t.onBand = e.get("boundaryGap") && "category" === t.type, t.inverse = e.get("inverse"), function (t) { + return "angleAxis" === t.mainType + }(e)) { + t.inverse = t.inverse !== e.get("clockwise"); + var n = e.get("startAngle"); + t.setExtent(n, n + (t.inverse ? -360 : 360)) + } + e.axis = t, t.model = e + } + + var SN = { + dimensions: mN, create: function (t, e) { + var n = []; + return t.eachComponent("polar", (function (t, i) { + var r = new xN(i + ""); + r.update = bN; + var o = r.getRadiusAxis(), a = r.getAngleAxis(), s = t.findAxisModel("radiusAxis"), + l = t.findAxisModel("angleAxis"); + wN(o, s), wN(a, l), function (t, e, n) { + var i = e.get("center"), r = n.getWidth(), o = n.getHeight(); + t.cx = Er(i[0], r), t.cy = Er(i[1], o); + var a = t.getRadiusAxis(), s = Math.min(r, o) / 2, l = e.get("radius"); + null == l ? l = [0, "100%"] : Y(l) || (l = [0, l]); + var u = [Er(l[0], s), Er(l[1], s)]; + a.inverse ? a.setExtent(u[1], u[0]) : a.setExtent(u[0], u[1]) + }(r, t, e), n.push(r), t.coordinateSystem = r, r.model = t + })), t.eachSeries((function (t) { + if ("polar" === t.get("coordinateSystem")) { + var e = t.getReferringComponents("polar", Co).models[0]; + 0, t.coordinateSystem = e.coordinateSystem + } + })), n + } + }, MN = ["axisLine", "axisLabel", "axisTick", "minorTick", "splitLine", "minorSplitLine", "splitArea"]; + + function IN(t, e, n) { + e[1] > e[0] && (e = e.slice().reverse()); + var i = t.coordToPoint([e[0], n]), r = t.coordToPoint([e[1], n]); + return {x1: i[0], y1: i[1], x2: r[0], y2: r[1]} + } + + function TN(t) { + return t.getRadiusAxis().inverse ? 0 : 1 + } + + function CN(t) { + var e = t[0], n = t[t.length - 1]; + e && n && Math.abs(Math.abs(e.coord - n.coord) - 360) < 1e-4 && t.pop() + } + + var DN = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.axisPointerClass = "PolarAxisPointer", n + } + + return n(e, t), e.prototype.render = function (t, e) { + if (this.group.removeAll(), t.get("show")) { + var n = t.axis, i = n.polar, r = i.getRadiusAxis().getExtent(), o = n.getTicksCoords(), + a = n.getMinorTicksCoords(), s = z(n.getViewLabels(), (function (t) { + t = T(t); + var e = n.scale, i = "ordinal" === e.type ? e.getRawOrdinalNumber(t.tickValue) : t.tickValue; + return t.coord = n.dataToCoord(i), t + })); + CN(s), CN(o), E(MN, (function (e) { + !t.get([e, "show"]) || n.scale.isBlank() && "axisLine" !== e || AN[e](this.group, t, i, o, a, r, s) + }), this) + } + }, e.type = "angleAxis", e + }(JM), AN = { + axisLine: function (t, e, n, i, r, o) { + var a, s = e.getModel(["axisLine", "lineStyle"]), l = TN(n), u = l ? 0 : 1; + (a = 0 === o[u] ? new uu({ + shape: {cx: n.cx, cy: n.cy, r: o[l]}, + style: s.getLineStyle(), + z2: 1, + silent: !0 + }) : new Du({ + shape: {cx: n.cx, cy: n.cy, r: o[l], r0: o[u]}, + style: s.getLineStyle(), + z2: 1, + silent: !0 + })).style.fill = null, t.add(a) + }, axisTick: function (t, e, n, i, r, o) { + var a = e.getModel("axisTick"), s = (a.get("inside") ? -1 : 1) * a.get("length"), l = o[TN(n)], + u = z(i, (function (t) { + return new Eu({shape: IN(n, [l, l + s], t.coord)}) + })); + t.add(bh(u, {style: k(a.getModel("lineStyle").getLineStyle(), {stroke: e.get(["axisLine", "lineStyle", "color"])})})) + }, minorTick: function (t, e, n, i, r, o) { + if (r.length) { + for (var a = e.getModel("axisTick"), s = e.getModel("minorTick"), l = (a.get("inside") ? -1 : 1) * s.get("length"), u = o[TN(n)], h = [], c = 0; c < r.length; c++) for (var p = 0; p < r[c].length; p++) h.push(new Eu({shape: IN(n, [u, u + l], r[c][p].coord)})); + t.add(bh(h, {style: k(s.getModel("lineStyle").getLineStyle(), k(a.getLineStyle(), {stroke: e.get(["axisLine", "lineStyle", "color"])}))})) + } + }, axisLabel: function (t, e, n, i, r, o, a) { + var s = e.getCategories(!0), l = e.getModel("axisLabel"), u = l.get("margin"), h = e.get("triggerEvent"); + E(a, (function (i, r) { + var a = l, c = i.tickValue, p = o[TN(n)], d = n.coordToPoint([p + u, i.coord]), f = n.cx, g = n.cy, + y = Math.abs(d[0] - f) / p < .3 ? "center" : d[0] > f ? "left" : "right", + v = Math.abs(d[1] - g) / p < .3 ? "middle" : d[1] > g ? "top" : "bottom"; + if (s && s[c]) { + var m = s[c]; + q(m) && m.textStyle && (a = new pc(m.textStyle, l, l.ecModel)) + } + var x = new As({ + silent: BM.isLabelSilent(e), + style: Yh(a, { + x: d[0], + y: d[1], + fill: a.getTextColor() || e.get(["axisLine", "lineStyle", "color"]), + text: i.formattedLabel, + align: y, + verticalAlign: v + }) + }); + if (t.add(x), h) { + var _ = BM.makeAxisEventDataBase(e); + _.targetType = "axisLabel", _.value = i.rawLabel, Ws(x).eventData = _ + } + }), this) + }, splitLine: function (t, e, n, i, r, o) { + var a = e.getModel("splitLine").getModel("lineStyle"), s = a.get("color"), l = 0; + s = s instanceof Array ? s : [s]; + for (var u = [], h = 0; h < i.length; h++) { + var c = l++ % s.length; + u[c] = u[c] || [], u[c].push(new Eu({shape: IN(n, o, i[h].coord)})) + } + for (h = 0; h < u.length; h++) t.add(bh(u[h], { + style: k({stroke: s[h % s.length]}, a.getLineStyle()), + silent: !0, + z: e.get("z") + })) + }, minorSplitLine: function (t, e, n, i, r, o) { + if (r.length) { + for (var a = e.getModel("minorSplitLine").getModel("lineStyle"), s = [], l = 0; l < r.length; l++) for (var u = 0; u < r[l].length; u++) s.push(new Eu({shape: IN(n, o, r[l][u].coord)})); + t.add(bh(s, {style: a.getLineStyle(), silent: !0, z: e.get("z")})) + } + }, splitArea: function (t, e, n, i, r, o) { + if (i.length) { + var a = e.getModel("splitArea").getModel("areaStyle"), s = a.get("color"), l = 0; + s = s instanceof Array ? s : [s]; + for (var u = [], h = Math.PI / 180, c = -i[0].coord * h, p = Math.min(o[0], o[1]), d = Math.max(o[0], o[1]), f = e.get("clockwise"), g = 1, y = i.length; g <= y; g++) { + var v = g === y ? i[0].coord : i[g].coord, m = l++ % s.length; + u[m] = u[m] || [], u[m].push(new Tu({ + shape: { + cx: n.cx, + cy: n.cy, + r0: p, + r: d, + startAngle: c, + endAngle: -v * h, + clockwise: f + }, silent: !0 + })), c = -v * h + } + for (g = 0; g < u.length; g++) t.add(bh(u[g], { + style: k({fill: s[g % s.length]}, a.getAreaStyle()), + silent: !0 + })) + } + } + }, kN = ["axisLine", "axisTickLabel", "axisName"], LN = ["splitLine", "splitArea", "minorSplitLine"], + PN = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.axisPointerClass = "PolarAxisPointer", n + } + + return n(e, t), e.prototype.render = function (t, e) { + if (this.group.removeAll(), t.get("show")) { + var n = this._axisGroup, i = this._axisGroup = new Cr; + this.group.add(i); + var r = t.axis, o = r.polar, a = o.getAngleAxis(), s = r.getTicksCoords(), + l = r.getMinorTicksCoords(), u = a.getExtent()[0], h = r.getExtent(), c = function (t, e, n) { + return { + position: [t.cx, t.cy], + rotation: n / 180 * Math.PI, + labelDirection: -1, + tickDirection: -1, + nameDirection: 1, + labelRotate: e.getModel("axisLabel").get("rotate"), + z2: 1 + } + }(o, t, u), p = new BM(t, c); + E(kN, p.add, p), i.add(p.getGroup()), Dh(n, i, t), E(LN, (function (e) { + t.get([e, "show"]) && !r.scale.isBlank() && ON[e](this.group, t, o, u, h, s, l) + }), this) + } + }, e.type = "radiusAxis", e + }(JM), ON = { + splitLine: function (t, e, n, i, r, o) { + var a = e.getModel("splitLine").getModel("lineStyle"), s = a.get("color"), l = 0; + s = s instanceof Array ? s : [s]; + for (var u = [], h = 0; h < o.length; h++) { + var c = l++ % s.length; + u[c] = u[c] || [], u[c].push(new uu({shape: {cx: n.cx, cy: n.cy, r: o[h].coord}})) + } + for (h = 0; h < u.length; h++) t.add(bh(u[h], { + style: k({ + stroke: s[h % s.length], + fill: null + }, a.getLineStyle()), silent: !0 + })) + }, minorSplitLine: function (t, e, n, i, r, o, a) { + if (a.length) { + for (var s = e.getModel("minorSplitLine").getModel("lineStyle"), l = [], u = 0; u < a.length; u++) for (var h = 0; h < a[u].length; h++) l.push(new uu({ + shape: { + cx: n.cx, + cy: n.cy, + r: a[u][h].coord + } + })); + t.add(bh(l, {style: k({fill: null}, s.getLineStyle()), silent: !0})) + } + }, splitArea: function (t, e, n, i, r, o) { + if (o.length) { + var a = e.getModel("splitArea").getModel("areaStyle"), s = a.get("color"), l = 0; + s = s instanceof Array ? s : [s]; + for (var u = [], h = o[0].coord, c = 1; c < o.length; c++) { + var p = l++ % s.length; + u[p] = u[p] || [], u[p].push(new Tu({ + shape: { + cx: n.cx, + cy: n.cy, + r0: h, + r: o[c].coord, + startAngle: 0, + endAngle: 2 * Math.PI + }, silent: !0 + })), h = o[c].coord + } + for (c = 0; c < u.length; c++) t.add(bh(u[c], { + style: k({fill: s[c % s.length]}, a.getAreaStyle()), + silent: !0 + })) + } + } + }; + + function RN(t) { + return t.get("stack") || "__ec_stack_" + t.seriesIndex + } + + function NN(t, e) { + return e.dim + t.model.componentIndex + } + + function EN(t, e, n) { + var i = {}, r = function (t) { + var e = {}; + E(t, (function (t, n) { + var i = t.getData(), r = t.coordinateSystem, o = r.getBaseAxis(), a = NN(r, o), s = o.getExtent(), + l = "category" === o.type ? o.getBandWidth() : Math.abs(s[1] - s[0]) / i.count(), u = e[a] || { + bandWidth: l, + remainedWidth: l, + autoWidthCount: 0, + categoryGap: "20%", + gap: "30%", + stacks: {} + }, h = u.stacks; + e[a] = u; + var c = RN(t); + h[c] || u.autoWidthCount++, h[c] = h[c] || {width: 0, maxWidth: 0}; + var p = Er(t.get("barWidth"), l), d = Er(t.get("barMaxWidth"), l), f = t.get("barGap"), + g = t.get("barCategoryGap"); + p && !h[c].width && (p = Math.min(u.remainedWidth, p), h[c].width = p, u.remainedWidth -= p), d && (h[c].maxWidth = d), null != f && (u.gap = f), null != g && (u.categoryGap = g) + })); + var n = {}; + return E(e, (function (t, e) { + n[e] = {}; + var i = t.stacks, r = t.bandWidth, o = Er(t.categoryGap, r), a = Er(t.gap, 1), s = t.remainedWidth, + l = t.autoWidthCount, u = (s - o) / (l + (l - 1) * a); + u = Math.max(u, 0), E(i, (function (t, e) { + var n = t.maxWidth; + n && n < u && (n = Math.min(n, s), t.width && (n = Math.min(n, t.width)), s -= n, t.width = n, l--) + })), u = (s - o) / (l + (l - 1) * a), u = Math.max(u, 0); + var h, c = 0; + E(i, (function (t, e) { + t.width || (t.width = u), h = t, c += t.width * (1 + a) + })), h && (c -= h.width * a); + var p = -c / 2; + E(i, (function (t, i) { + n[e][i] = n[e][i] || {offset: p, width: t.width}, p += t.width * (1 + a) + })) + })), n + }(B(e.getSeriesByType(t), (function (t) { + return !e.isSeriesFiltered(t) && t.coordinateSystem && "polar" === t.coordinateSystem.type + }))); + e.eachSeriesByType(t, (function (t) { + if ("polar" === t.coordinateSystem.type) { + var e = t.getData(), n = t.coordinateSystem, o = n.getBaseAxis(), a = NN(n, o), s = RN(t), l = r[a][s], + u = l.offset, h = l.width, c = n.getOtherAxis(o), p = t.coordinateSystem.cx, + d = t.coordinateSystem.cy, f = t.get("barMinHeight") || 0, g = t.get("barMinAngle") || 0; + i[s] = i[s] || []; + for (var y = e.mapDimension(c.dim), v = e.mapDimension(o.dim), m = tx(e, y), x = "radius" !== o.dim || !t.get("roundCap", !0), _ = c.dataToCoord(0), b = 0, w = e.count(); b < w; b++) { + var S = e.get(y, b), M = e.get(v, b), I = S >= 0 ? "p" : "n", T = _; + m && (i[s][M] || (i[s][M] = {p: _, n: _}), T = i[s][M][I]); + var C = void 0, D = void 0, A = void 0, k = void 0; + if ("radius" === c.dim) { + var L = c.dataToCoord(S) - _, P = o.dataToCoord(M); + Math.abs(L) < f && (L = (L < 0 ? -1 : 1) * f), C = T, D = T + L, k = (A = P - u) - h, m && (i[s][M][I] = D) + } else { + var O = c.dataToCoord(S, x) - _, R = o.dataToCoord(M); + Math.abs(O) < g && (O = (O < 0 ? -1 : 1) * g), D = (C = R + u) + h, A = T, k = T + O, m && (i[s][M][I] = k) + } + e.setItemLayout(b, { + cx: p, + cy: d, + r0: C, + r: D, + startAngle: -A * Math.PI / 180, + endAngle: -k * Math.PI / 180, + clockwise: A >= k + }) + } + } + })) + } + + var zN = {startAngle: 90, clockwise: !0, splitNumber: 12, axisLabel: {rotate: 0}}, VN = {splitNumber: 5}, + BN = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "polar", e + }(fg); + + function FN(t, e) { + e = e || {}; + var n = t.coordinateSystem, i = t.axis, r = {}, o = i.position, a = i.orient, s = n.getRect(), + l = [s.x, s.x + s.width, s.y, s.y + s.height], + u = {horizontal: {top: l[2], bottom: l[3]}, vertical: {left: l[0], right: l[1]}}; + r.position = ["vertical" === a ? u.vertical[o] : l[0], "horizontal" === a ? u.horizontal[o] : l[3]]; + r.rotation = Math.PI / 2 * {horizontal: 0, vertical: 1}[a]; + r.labelDirection = r.tickDirection = r.nameDirection = { + top: -1, + bottom: 1, + right: 1, + left: -1 + }[o], t.get(["axisTick", "inside"]) && (r.tickDirection = -r.tickDirection), it(e.labelInside, t.get(["axisLabel", "inside"])) && (r.labelDirection = -r.labelDirection); + var h = e.rotate; + return null == h && (h = t.get(["axisLabel", "rotate"])), r.labelRotation = "top" === o ? -h : h, r.z2 = 1, r + } + + var GN = ["axisLine", "axisTickLabel", "axisName"], WN = ["splitArea", "splitLine"], HN = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.axisPointerClass = "SingleAxisPointer", n + } + + return n(e, t), e.prototype.render = function (e, n, i, r) { + var o = this.group; + o.removeAll(); + var a = this._axisGroup; + this._axisGroup = new Cr; + var s = FN(e), l = new BM(e, s); + E(GN, l.add, l), o.add(this._axisGroup), o.add(l.getGroup()), E(WN, (function (t) { + e.get([t, "show"]) && YN[t](this, this.group, this._axisGroup, e) + }), this), Dh(a, this._axisGroup, e), t.prototype.render.call(this, e, n, i, r) + }, e.prototype.remove = function () { + eI(this) + }, e.type = "singleAxis", e + }(JM), YN = { + splitLine: function (t, e, n, i) { + var r = i.axis; + if (!r.scale.isBlank()) { + var o = i.getModel("splitLine"), a = o.getModel("lineStyle"), s = a.get("color"); + s = s instanceof Array ? s : [s]; + for (var l = i.coordinateSystem.getRect(), u = r.isHorizontal(), h = [], c = 0, p = r.getTicksCoords({tickModel: o}), d = [], f = [], g = 0; g < p.length; ++g) { + var y = r.toGlobalCoord(p[g].coord); + u ? (d[0] = y, d[1] = l.y, f[0] = y, f[1] = l.y + l.height) : (d[0] = l.x, d[1] = y, f[0] = l.x + l.width, f[1] = y); + var v = c++ % s.length; + h[v] = h[v] || [], h[v].push(new Eu({ + subPixelOptimize: !0, + shape: {x1: d[0], y1: d[1], x2: f[0], y2: f[1]}, + silent: !0 + })) + } + var m = a.getLineStyle(["color"]); + for (g = 0; g < h.length; ++g) e.add(bh(h[g], {style: k({stroke: s[g % s.length]}, m), silent: !0})) + } + }, splitArea: function (t, e, n, i) { + tI(t, n, i, i) + } + }, UN = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.getCoordSysModel = function () { + return this + }, e.type = "singleAxis", e.layoutMode = "box", e.defaultOption = { + left: "5%", + top: "5%", + right: "5%", + bottom: "5%", + type: "value", + position: "bottom", + orient: "horizontal", + axisLine: {show: !0, lineStyle: {width: 1, type: "solid"}}, + tooltip: {show: !0}, + axisTick: {show: !0, length: 6, lineStyle: {width: 1}}, + axisLabel: {show: !0, interval: "auto"}, + splitLine: {show: !0, lineStyle: {type: "dashed", opacity: .2}} + }, e + }(Ip); + R(UN, h_.prototype); + var XN = function (t) { + function e(e, n, i, r, o) { + var a = t.call(this, e, n, i) || this; + return a.type = r || "value", a.position = o || "bottom", a + } + + return n(e, t), e.prototype.isHorizontal = function () { + var t = this.position; + return "top" === t || "bottom" === t + }, e.prototype.pointToData = function (t, e) { + return this.coordinateSystem.pointToData(t)[0] + }, e + }(G_), ZN = ["single"], jN = function () { + function t(t, e, n) { + this.type = "single", this.dimension = "single", this.dimensions = ZN, this.axisPointerEnabled = !0, this.model = t, this._init(t, e, n) + } + + return t.prototype._init = function (t, e, n) { + var i = this.dimension, r = new XN(i, i_(t), [0, 0], t.get("type"), t.get("position")), + o = "category" === r.type; + r.onBand = o && t.get("boundaryGap"), r.inverse = t.get("inverse"), r.orient = t.get("orient"), t.axis = r, r.model = t, r.coordinateSystem = this, this._axis = r + }, t.prototype.update = function (t, e) { + t.eachSeries((function (t) { + if (t.coordinateSystem === this) { + var e = t.getData(); + E(e.mapDimensionsAll(this.dimension), (function (t) { + this._axis.scale.unionExtentFromData(e, t) + }), this), n_(this._axis.scale, this._axis.model) + } + }), this) + }, t.prototype.resize = function (t, e) { + this._rect = mp({ + left: t.get("left"), + top: t.get("top"), + right: t.get("right"), + bottom: t.get("bottom"), + width: t.get("width"), + height: t.get("height") + }, {width: e.getWidth(), height: e.getHeight()}), this._adjustAxis() + }, t.prototype.getRect = function () { + return this._rect + }, t.prototype._adjustAxis = function () { + var t = this._rect, e = this._axis, n = e.isHorizontal(), i = n ? [0, t.width] : [0, t.height], + r = e.reverse ? 1 : 0; + e.setExtent(i[r], i[1 - r]), this._updateAxisTransform(e, n ? t.x : t.y) + }, t.prototype._updateAxisTransform = function (t, e) { + var n = t.getExtent(), i = n[0] + n[1], r = t.isHorizontal(); + t.toGlobalCoord = r ? function (t) { + return t + e + } : function (t) { + return i - t + e + }, t.toLocalCoord = r ? function (t) { + return t - e + } : function (t) { + return i - t + e + } + }, t.prototype.getAxis = function () { + return this._axis + }, t.prototype.getBaseAxis = function () { + return this._axis + }, t.prototype.getAxes = function () { + return [this._axis] + }, t.prototype.getTooltipAxes = function () { + return {baseAxes: [this.getAxis()], otherAxes: []} + }, t.prototype.containPoint = function (t) { + var e = this.getRect(), n = this.getAxis(); + return "horizontal" === n.orient ? n.contain(n.toLocalCoord(t[0])) && t[1] >= e.y && t[1] <= e.y + e.height : n.contain(n.toLocalCoord(t[1])) && t[0] >= e.y && t[0] <= e.y + e.height + }, t.prototype.pointToData = function (t) { + var e = this.getAxis(); + return [e.coordToData(e.toLocalCoord(t["horizontal" === e.orient ? 0 : 1]))] + }, t.prototype.dataToPoint = function (t) { + var e = this.getAxis(), n = this.getRect(), i = [], r = "horizontal" === e.orient ? 0 : 1; + return t instanceof Array && (t = t[0]), i[r] = e.toGlobalCoord(e.dataToCoord(+t)), i[1 - r] = 0 === r ? n.y + n.height / 2 : n.x + n.width / 2, i + }, t.prototype.convertToPixel = function (t, e, n) { + return qN(e) === this ? this.dataToPoint(n) : null + }, t.prototype.convertFromPixel = function (t, e, n) { + return qN(e) === this ? this.pointToData(n) : null + }, t + }(); + + function qN(t) { + var e = t.seriesModel, n = t.singleAxisModel; + return n && n.coordinateSystem || e && e.coordinateSystem + } + + var KN = { + create: function (t, e) { + var n = []; + return t.eachComponent("singleAxis", (function (i, r) { + var o = new jN(i, t, e); + o.name = "single_" + r, o.resize(i, e), i.coordinateSystem = o, n.push(o) + })), t.eachSeries((function (t) { + if ("singleAxis" === t.get("coordinateSystem")) { + var e = t.getReferringComponents("singleAxis", Co).models[0]; + t.coordinateSystem = e && e.coordinateSystem + } + })), n + }, dimensions: ZN + }, $N = ["x", "y"], JN = ["width", "height"], QN = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.makeElOption = function (t, e, n, i, r) { + var o = n.axis, a = o.coordinateSystem, s = nE(a, 1 - eE(o)), l = a.dataToPoint(e)[0], u = i.get("type"); + if (u && "none" !== u) { + var h = RR(i), c = tE[u](o, l, s); + c.style = h, t.graphicKey = c.type, t.pointer = c + } + VR(e, t, FN(n), n, i, r) + }, e.prototype.getHandleTransform = function (t, e, n) { + var i = FN(e, {labelInside: !1}); + i.labelMargin = n.get(["handle", "margin"]); + var r = zR(e.axis, t, i); + return {x: r[0], y: r[1], rotation: i.rotation + (i.labelDirection < 0 ? Math.PI : 0)} + }, e.prototype.updateHandleTransform = function (t, e, n, i) { + var r = n.axis, o = r.coordinateSystem, a = eE(r), s = nE(o, a), l = [t.x, t.y]; + l[a] += e[a], l[a] = Math.min(s[1], l[a]), l[a] = Math.max(s[0], l[a]); + var u = nE(o, 1 - a), h = (u[1] + u[0]) / 2, c = [h, h]; + return c[a] = l[a], { + x: l[0], + y: l[1], + rotation: t.rotation, + cursorPoint: c, + tooltipOption: {verticalAlign: "middle"} + } + }, e + }(DR), tE = { + line: function (t, e, n) { + return {type: "Line", subPixelOptimize: !0, shape: BR([e, n[0]], [e, n[1]], eE(t))} + }, shadow: function (t, e, n) { + var i = t.getBandWidth(), r = n[1] - n[0]; + return {type: "Rect", shape: FR([e - i / 2, n[0]], [i, r], eE(t))} + } + }; + + function eE(t) { + return t.isHorizontal() ? 0 : 1 + } + + function nE(t, e) { + var n = t.getRect(); + return [n[$N[e]], n[$N[e]] + n[JN[e]]] + } + + var iE = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "single", e + }(fg); + var rE = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function (e, n, i) { + var r = wp(e); + t.prototype.init.apply(this, arguments), oE(e, r) + }, e.prototype.mergeOption = function (e) { + t.prototype.mergeOption.apply(this, arguments), oE(this.option, e) + }, e.prototype.getCellSize = function () { + return this.option.cellSize + }, e.type = "calendar", e.defaultOption = { + z: 2, + left: 80, + top: 60, + cellSize: 20, + orient: "horizontal", + splitLine: {show: !0, lineStyle: {color: "#000", width: 1, type: "solid"}}, + itemStyle: {color: "#fff", borderWidth: 1, borderColor: "#ccc"}, + dayLabel: {show: !0, firstDay: 0, position: "start", margin: "50%", color: "#000"}, + monthLabel: {show: !0, position: "start", margin: 5, align: "center", formatter: null, color: "#000"}, + yearLabel: { + show: !0, + position: null, + margin: 30, + formatter: null, + color: "#ccc", + fontFamily: "sans-serif", + fontWeight: "bolder", + fontSize: 20 + } + }, e + }(Ip); + + function oE(t, e) { + var n, i = t.cellSize; + 1 === (n = Y(i) ? i : t.cellSize = [i, i]).length && (n[1] = n[0]); + var r = z([0, 1], (function (t) { + return function (t, e) { + return null != t[gp[e][0]] || null != t[gp[e][1]] && null != t[gp[e][2]] + }(e, t) && (n[t] = "auto"), null != n[t] && "auto" !== n[t] + })); + bp(t, e, {type: "box", ignoreSize: r}) + } + + var aE = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + var i = this.group; + i.removeAll(); + var r = t.coordinateSystem, o = r.getRangeInfo(), a = r.getOrient(), s = e.getLocaleModel(); + this._renderDayRect(t, o, i), this._renderLines(t, o, a, i), this._renderYearText(t, o, a, i), this._renderMonthText(t, s, a, i), this._renderWeekText(t, s, o, a, i) + }, e.prototype._renderDayRect = function (t, e, n) { + for (var i = t.coordinateSystem, r = t.getModel("itemStyle").getItemStyle(), o = i.getCellWidth(), a = i.getCellHeight(), s = e.start.time; s <= e.end.time; s = i.getNextNDay(s, 1).time) { + var l = i.dataToRect([s], !1).tl, + u = new Ts({shape: {x: l[0], y: l[1], width: o, height: a}, cursor: "default", style: r}); + n.add(u) + } + }, e.prototype._renderLines = function (t, e, n, i) { + var r = this, o = t.coordinateSystem, a = t.getModel(["splitLine", "lineStyle"]).getLineStyle(), + s = t.get(["splitLine", "show"]), l = a.lineWidth; + this._tlpoints = [], this._blpoints = [], this._firstDayOfMonth = [], this._firstDayPoints = []; + for (var u = e.start, h = 0; u.time <= e.end.time; h++) { + p(u.formatedDate), 0 === h && (u = o.getDateInfo(e.start.y + "-" + e.start.m)); + var c = u.date; + c.setMonth(c.getMonth() + 1), u = o.getDateInfo(c) + } + + function p(e) { + r._firstDayOfMonth.push(o.getDateInfo(e)), r._firstDayPoints.push(o.dataToRect([e], !1).tl); + var l = r._getLinePointsOfOneWeek(t, e, n); + r._tlpoints.push(l[0]), r._blpoints.push(l[l.length - 1]), s && r._drawSplitline(l, a, i) + } + + p(o.getNextNDay(e.end.time, 1).formatedDate), s && this._drawSplitline(r._getEdgesPoints(r._tlpoints, l, n), a, i), s && this._drawSplitline(r._getEdgesPoints(r._blpoints, l, n), a, i) + }, e.prototype._getEdgesPoints = function (t, e, n) { + var i = [t[0].slice(), t[t.length - 1].slice()], r = "horizontal" === n ? 0 : 1; + return i[0][r] = i[0][r] - e / 2, i[1][r] = i[1][r] + e / 2, i + }, e.prototype._drawSplitline = function (t, e, n) { + var i = new Ou({z2: 20, shape: {points: t}, style: e}); + n.add(i) + }, e.prototype._getLinePointsOfOneWeek = function (t, e, n) { + for (var i = t.coordinateSystem, r = i.getDateInfo(e), o = [], a = 0; a < 7; a++) { + var s = i.getNextNDay(r.time, a), l = i.dataToRect([s.time], !1); + o[2 * s.day] = l.tl, o[2 * s.day + 1] = l["horizontal" === n ? "bl" : "tr"] + } + return o + }, e.prototype._formatterLabel = function (t, e) { + return X(t) && t ? (n = t, E(e, (function (t, e) { + n = n.replace("{" + e + "}", i ? op(t) : t) + })), n) : U(t) ? t(e) : e.nameMap; + var n, i + }, e.prototype._yearTextPositionControl = function (t, e, n, i, r) { + var o = e[0], a = e[1], s = ["center", "bottom"]; + "bottom" === i ? (a += r, s = ["center", "top"]) : "left" === i ? o -= r : "right" === i ? (o += r, s = ["center", "top"]) : a -= r; + var l = 0; + return "left" !== i && "right" !== i || (l = Math.PI / 2), { + rotation: l, + x: o, + y: a, + style: {align: s[0], verticalAlign: s[1]} + } + }, e.prototype._renderYearText = function (t, e, n, i) { + var r = t.getModel("yearLabel"); + if (r.get("show")) { + var o = r.get("margin"), a = r.get("position"); + a || (a = "horizontal" !== n ? "top" : "left"); + var s = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]], l = (s[0][0] + s[1][0]) / 2, + u = (s[0][1] + s[1][1]) / 2, h = "horizontal" === n ? 0 : 1, + c = {top: [l, s[h][1]], bottom: [l, s[1 - h][1]], left: [s[1 - h][0], u], right: [s[h][0], u]}, + p = e.start.y; + +e.end.y > +e.start.y && (p = p + "-" + e.end.y); + var d = r.get("formatter"), f = {start: e.start.y, end: e.end.y, nameMap: p}, + g = this._formatterLabel(d, f), y = new As({z2: 30, style: Yh(r, {text: g})}); + y.attr(this._yearTextPositionControl(y, c[a], n, a, o)), i.add(y) + } + }, e.prototype._monthTextPositionControl = function (t, e, n, i, r) { + var o = "left", a = "top", s = t[0], l = t[1]; + return "horizontal" === n ? (l += r, e && (o = "center"), "start" === i && (a = "bottom")) : (s += r, e && (a = "middle"), "start" === i && (o = "right")), { + x: s, + y: l, + align: o, + verticalAlign: a + } + }, e.prototype._renderMonthText = function (t, e, n, i) { + var r = t.getModel("monthLabel"); + if (r.get("show")) { + var o = r.get("nameMap"), a = r.get("margin"), s = r.get("position"), l = r.get("align"), + u = [this._tlpoints, this._blpoints]; + o && !X(o) || (o && (e = Sc(o) || e), o = e.get(["time", "monthAbbr"]) || []); + var h = "start" === s ? 0 : 1, c = "horizontal" === n ? 0 : 1; + a = "start" === s ? -a : a; + for (var p = "center" === l, d = 0; d < u[h].length - 1; d++) { + var f = u[h][d].slice(), g = this._firstDayOfMonth[d]; + if (p) { + var y = this._firstDayPoints[d]; + f[c] = (y[c] + u[0][d + 1][c]) / 2 + } + var v = r.get("formatter"), m = o[+g.m - 1], + x = {yyyy: g.y, yy: (g.y + "").slice(2), MM: g.m, M: +g.m, nameMap: m}, + _ = this._formatterLabel(v, x), + b = new As({z2: 30, style: A(Yh(r, {text: _}), this._monthTextPositionControl(f, p, n, s, a))}); + i.add(b) + } + } + }, e.prototype._weekTextPositionControl = function (t, e, n, i, r) { + var o = "center", a = "middle", s = t[0], l = t[1], u = "start" === n; + return "horizontal" === e ? (s = s + i + (u ? 1 : -1) * r[0] / 2, o = u ? "right" : "left") : (l = l + i + (u ? 1 : -1) * r[1] / 2, a = u ? "bottom" : "top"), { + x: s, + y: l, + align: o, + verticalAlign: a + } + }, e.prototype._renderWeekText = function (t, e, n, i, r) { + var o = t.getModel("dayLabel"); + if (o.get("show")) { + var a = t.coordinateSystem, s = o.get("position"), l = o.get("nameMap"), u = o.get("margin"), + h = a.getFirstDayOfWeek(); + if (!l || X(l)) l && (e = Sc(l) || e), l = e.get(["time", "dayOfWeekShort"]) || z(e.get(["time", "dayOfWeekAbbr"]), (function (t) { + return t[0] + })); + var c = a.getNextNDay(n.end.time, 7 - n.lweek).time, p = [a.getCellWidth(), a.getCellHeight()]; + u = Er(u, Math.min(p[1], p[0])), "start" === s && (c = a.getNextNDay(n.start.time, -(7 + n.fweek)).time, u = -u); + for (var d = 0; d < 7; d++) { + var f, g = a.getNextNDay(c, d), y = a.dataToRect([g.time], !1).center; + f = Math.abs((d + h) % 7); + var v = new As({ + z2: 30, + style: A(Yh(o, {text: l[f]}), this._weekTextPositionControl(y, i, s, u, p)) + }); + r.add(v) + } + } + }, e.type = "calendar", e + }(fg), sE = 864e5, lE = function () { + function t(e, n, i) { + this.type = "calendar", this.dimensions = t.dimensions, this.getDimensionsInfo = t.getDimensionsInfo, this._model = e + } + + return t.getDimensionsInfo = function () { + return [{name: "time", type: "time"}, "value"] + }, t.prototype.getRangeInfo = function () { + return this._rangeInfo + }, t.prototype.getModel = function () { + return this._model + }, t.prototype.getRect = function () { + return this._rect + }, t.prototype.getCellWidth = function () { + return this._sw + }, t.prototype.getCellHeight = function () { + return this._sh + }, t.prototype.getOrient = function () { + return this._orient + }, t.prototype.getFirstDayOfWeek = function () { + return this._firstDayOfWeek + }, t.prototype.getDateInfo = function (t) { + var e = (t = jr(t)).getFullYear(), n = t.getMonth() + 1, i = n < 10 ? "0" + n : "" + n, r = t.getDate(), + o = r < 10 ? "0" + r : "" + r, a = t.getDay(); + return { + y: e + "", + m: i, + d: o, + day: a = Math.abs((a + 7 - this.getFirstDayOfWeek()) % 7), + time: t.getTime(), + formatedDate: e + "-" + i + "-" + o, + date: t + } + }, t.prototype.getNextNDay = function (t, e) { + return 0 === (e = e || 0) || (t = new Date(this.getDateInfo(t).time)).setDate(t.getDate() + e), this.getDateInfo(t) + }, t.prototype.update = function (t, e) { + this._firstDayOfWeek = +this._model.getModel("dayLabel").get("firstDay"), this._orient = this._model.get("orient"), this._lineWidth = this._model.getModel("itemStyle").getItemStyle().lineWidth || 0, this._rangeInfo = this._getRangeInfo(this._initRangeOption()); + var n = this._rangeInfo.weeks || 1, i = ["width", "height"], r = this._model.getCellSize().slice(), + o = this._model.getBoxLayoutParams(), a = "horizontal" === this._orient ? [n, 7] : [7, n]; + E([0, 1], (function (t) { + u(r, t) && (o[i[t]] = r[t] * a[t]) + })); + var s = {width: e.getWidth(), height: e.getHeight()}, l = this._rect = mp(o, s); + + function u(t, e) { + return null != t[e] && "auto" !== t[e] + } + + E([0, 1], (function (t) { + u(r, t) || (r[t] = l[i[t]] / a[t]) + })), this._sw = r[0], this._sh = r[1] + }, t.prototype.dataToPoint = function (t, e) { + Y(t) && (t = t[0]), null == e && (e = !0); + var n = this.getDateInfo(t), i = this._rangeInfo, r = n.formatedDate; + if (e && !(n.time >= i.start.time && n.time < i.end.time + sE)) return [NaN, NaN]; + var o = n.day, a = this._getRangeInfo([i.start.time, r]).nthWeek; + return "vertical" === this._orient ? [this._rect.x + o * this._sw + this._sw / 2, this._rect.y + a * this._sh + this._sh / 2] : [this._rect.x + a * this._sw + this._sw / 2, this._rect.y + o * this._sh + this._sh / 2] + }, t.prototype.pointToData = function (t) { + var e = this.pointToDate(t); + return e && e.time + }, t.prototype.dataToRect = function (t, e) { + var n = this.dataToPoint(t, e); + return { + contentShape: { + x: n[0] - (this._sw - this._lineWidth) / 2, + y: n[1] - (this._sh - this._lineWidth) / 2, + width: this._sw - this._lineWidth, + height: this._sh - this._lineWidth + }, + center: n, + tl: [n[0] - this._sw / 2, n[1] - this._sh / 2], + tr: [n[0] + this._sw / 2, n[1] - this._sh / 2], + br: [n[0] + this._sw / 2, n[1] + this._sh / 2], + bl: [n[0] - this._sw / 2, n[1] + this._sh / 2] + } + }, t.prototype.pointToDate = function (t) { + var e = Math.floor((t[0] - this._rect.x) / this._sw) + 1, + n = Math.floor((t[1] - this._rect.y) / this._sh) + 1, i = this._rangeInfo.range; + return "vertical" === this._orient ? this._getDateByWeeksAndDay(n, e - 1, i) : this._getDateByWeeksAndDay(e, n - 1, i) + }, t.prototype.convertToPixel = function (t, e, n) { + var i = uE(e); + return i === this ? i.dataToPoint(n) : null + }, t.prototype.convertFromPixel = function (t, e, n) { + var i = uE(e); + return i === this ? i.pointToData(n) : null + }, t.prototype.containPoint = function (t) { + return console.warn("Not implemented."), !1 + }, t.prototype._initRangeOption = function () { + var t, e = this._model.get("range"); + if (Y(e) && 1 === e.length && (e = e[0]), Y(e)) t = e; else { + var n = e.toString(); + if (/^\d{4}$/.test(n) && (t = [n + "-01-01", n + "-12-31"]), /^\d{4}[\/|-]\d{1,2}$/.test(n)) { + var i = this.getDateInfo(n), r = i.date; + r.setMonth(r.getMonth() + 1); + var o = this.getNextNDay(r, -1); + t = [i.formatedDate, o.formatedDate] + } + /^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(n) && (t = [n, n]) + } + if (!t) return e; + var a = this._getRangeInfo(t); + return a.start.time > a.end.time && t.reverse(), t + }, t.prototype._getRangeInfo = function (t) { + var e, n = [this.getDateInfo(t[0]), this.getDateInfo(t[1])]; + n[0].time > n[1].time && (e = !0, n.reverse()); + var i = Math.floor(n[1].time / sE) - Math.floor(n[0].time / sE) + 1, r = new Date(n[0].time), + o = r.getDate(), a = n[1].date.getDate(); + r.setDate(o + i - 1); + var s = r.getDate(); + if (s !== a) for (var l = r.getTime() - n[1].time > 0 ? 1 : -1; (s = r.getDate()) !== a && (r.getTime() - n[1].time) * l > 0;) i -= l, r.setDate(s - l); + var u = Math.floor((i + n[0].day + 6) / 7), h = e ? 1 - u : u - 1; + return e && n.reverse(), { + range: [n[0].formatedDate, n[1].formatedDate], + start: n[0], + end: n[1], + allDay: i, + weeks: u, + nthWeek: h, + fweek: n[0].day, + lweek: n[1].day + } + }, t.prototype._getDateByWeeksAndDay = function (t, e, n) { + var i = this._getRangeInfo(n); + if (t > i.weeks || 0 === t && e < i.fweek || t === i.weeks && e > i.lweek) return null; + var r = 7 * (t - 1) - i.fweek + e, o = new Date(i.start.time); + return o.setDate(+i.start.d + r), this.getDateInfo(o) + }, t.create = function (e, n) { + var i = []; + return e.eachComponent("calendar", (function (r) { + var o = new t(r, e, n); + i.push(o), r.coordinateSystem = o + })), e.eachSeries((function (t) { + "calendar" === t.get("coordinateSystem") && (t.coordinateSystem = i[t.get("calendarIndex") || 0]) + })), i + }, t.dimensions = ["time", "value"], t + }(); + + function uE(t) { + var e = t.calendarModel, n = t.seriesModel; + return e ? e.coordinateSystem : n ? n.coordinateSystem : null + } + + function hE(t, e) { + var n; + return E(e, (function (e) { + null != t[e] && "auto" !== t[e] && (n = !0) + })), n + } + + var cE = ["transition", "enterFrom", "leaveTo"], + pE = cE.concat(["enterAnimation", "updateAnimation", "leaveAnimation"]); + + function dE(t, e, n) { + if (n && (!t[n] && e[n] && (t[n] = {}), t = t[n], e = e[n]), t && e) for (var i = n ? cE : pE, r = 0; r < i.length; r++) { + var o = i[r]; + null == t[o] && null != e[o] && (t[o] = e[o]) + } + } + + var fE = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.preventAutoZ = !0, n + } + + return n(e, t), e.prototype.mergeOption = function (e, n) { + var i = this.option.elements; + this.option.elements = null, t.prototype.mergeOption.call(this, e, n), this.option.elements = i + }, e.prototype.optionUpdated = function (t, e) { + var n = this.option, i = (e ? n : t).elements, r = n.elements = e ? [] : n.elements, o = []; + this._flatten(i, o, null); + var a = yo(r, o, "normalMerge"), s = this._elOptionsToUpdate = []; + E(a, (function (t, e) { + var n = t.newOption; + n && (s.push(n), function (t, e) { + var n = t.existing; + if (e.id = t.keyInfo.id, !e.type && n && (e.type = n.type), null == e.parentId) { + var i = e.parentOption; + i ? e.parentId = i.id : n && (e.parentId = n.parentId) + } + e.parentOption = null + }(t, n), function (t, e, n) { + var i = A({}, n), r = t[e], o = n.$action || "merge"; + "merge" === o ? r ? (C(r, i, !0), bp(r, i, {ignoreSize: !0}), Sp(n, r), dE(n, r), dE(n, r, "shape"), dE(n, r, "style"), dE(n, r, "extra"), n.clipPath = r.clipPath) : t[e] = i : "replace" === o ? t[e] = i : "remove" === o && r && (t[e] = null) + }(r, e, n), function (t, e) { + if (t && (t.hv = e.hv = [hE(e, ["left", "right"]), hE(e, ["top", "bottom"])], "group" === t.type)) { + var n = t, i = e; + null == n.width && (n.width = i.width = 0), null == n.height && (n.height = i.height = 0) + } + }(r[e], n)) + }), this), n.elements = B(r, (function (t) { + return t && delete t.$action, null != t + })) + }, e.prototype._flatten = function (t, e, n) { + E(t, (function (t) { + if (t) { + n && (t.parentOption = n), e.push(t); + var i = t.children; + "group" === t.type && i && this._flatten(i, e, t), delete t.children + } + }), this) + }, e.prototype.useElOptionsToUpdate = function () { + var t = this._elOptionsToUpdate; + return this._elOptionsToUpdate = null, t + }, e.type = "graphic", e.defaultOption = {elements: []}, e + }(Ip), gE = {path: null, compoundPath: null, group: Cr, image: xs, text: As}, yE = So(), vE = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function () { + this._elMap = ft() + }, e.prototype.render = function (t, e, n) { + t !== this._lastGraphicModel && this._clear(), this._lastGraphicModel = t, this._updateElements(t), this._relocate(t, n) + }, e.prototype._updateElements = function (t) { + var e = t.useElOptionsToUpdate(); + if (e) { + var n = this._elMap, i = this.group, r = t.get("z"), o = t.get("zlevel"); + E(e, (function (e) { + var a = xo(e.id, null), s = null != a ? n.get(a) : null, l = xo(e.parentId, null), + u = null != l ? n.get(l) : i, h = e.type, c = e.style; + "text" === h && c && e.hv && e.hv[1] && (c.textVerticalAlign = c.textBaseline = c.verticalAlign = c.align = null); + var p = e.textContent, d = e.textConfig; + if (c && TO(c, h, !!d, !!p)) { + var f = CO(c, h, !0); + !d && f.textConfig && (d = e.textConfig = f.textConfig), !p && f.textContent && (p = f.textContent) + } + var g = function (t) { + return t = A({}, t), E(["id", "parentId", "$action", "hv", "bounding", "textContent", "clipPath"].concat(fp), (function (e) { + delete t[e] + })), t + }(e); + var y = e.$action || "merge", v = "merge" === y, m = "replace" === y; + if (v) { + var x = s; + (T = !s) ? x = xE(a, u, e.type, n) : (x && (yE(x).isNew = !1), jO(x)), x && (EO(x, g, t, {isInit: T}), bE(x, e, r, o)) + } else if (m) { + _E(s, e, n, t); + var _ = xE(a, u, e.type, n); + _ && (EO(_, g, t, {isInit: !0}), bE(_, e, r, o)) + } else "remove" === y && (zO(s, e), _E(s, e, n, t)); + var b = n.get(a); + if (b && p) if (v) { + var w = b.getTextContent(); + w ? w.attr(p) : b.setTextContent(new As(p)) + } else m && b.setTextContent(new As(p)); + if (b) { + var S = e.clipPath; + if (S) { + var M = S.type, I = void 0, T = !1; + if (v) { + var C = b.getClipPath(); + I = (T = !C || yE(C).type !== M) ? mE(M) : C + } else m && (T = !0, I = mE(M)); + b.setClipPath(I), EO(I, S, t, {isInit: T}), qO(I, S.keyframeAnimation, t) + } + var D = yE(b); + b.setTextConfig(d), D.option = e, function (t, e, n) { + var i = Ws(t).eventData; + t.silent || t.ignore || i || (i = Ws(t).eventData = { + componentType: "graphic", + componentIndex: e.componentIndex, + name: t.name + }); + i && (i.info = n.info) + }(b, t, e), Nh({ + el: b, + componentModel: t, + itemName: b.name, + itemTooltipOption: e.tooltip + }), qO(b, e.keyframeAnimation, t) + } + })) + } + }, e.prototype._relocate = function (t, e) { + for (var n = t.option.elements, i = this.group, r = this._elMap, o = e.getWidth(), a = e.getHeight(), s = ["x", "y"], l = 0; l < n.length; l++) { + if ((f = null != (d = xo((p = n[l]).id, null)) ? r.get(d) : null) && f.isGroup) { + var u = (g = f.parent) === i, h = yE(f), c = yE(g); + h.width = Er(h.option.width, u ? o : c.width) || 0, h.height = Er(h.option.height, u ? a : c.height) || 0 + } + } + for (l = n.length - 1; l >= 0; l--) { + var p, d, f; + if (f = null != (d = xo((p = n[l]).id, null)) ? r.get(d) : null) { + var g = f.parent, y = (c = yE(g), {}), v = xp(f, p, g === i ? {width: o, height: a} : { + width: c.width, + height: c.height + }, null, {hv: p.hv, boundingMode: p.bounding}, y); + if (!yE(f).isNew && v) { + for (var m = p.transition, x = {}, _ = 0; _ < s.length; _++) { + var b = s[_], w = y[b]; + m && (BO(m) || P(m, b) >= 0) ? x[b] = w : f[b] = w + } + ih(f, x, t, 0) + } else f.attr(y) + } + } + }, e.prototype._clear = function () { + var t = this, e = this._elMap; + e.each((function (n) { + _E(n, yE(n).option, e, t._lastGraphicModel) + })), this._elMap = ft() + }, e.prototype.dispose = function () { + this._clear() + }, e.type = "graphic", e + }(fg); + + function mE(t) { + var e = mt(gE, t) ? gE[t] : vh(t); + var n = new e({}); + return yE(n).type = t, n + } + + function xE(t, e, n, i) { + var r = mE(n); + return e.add(r), i.set(t, r), yE(r).id = t, yE(r).isNew = !0, r + } + + function _E(t, e, n, i) { + t && t.parent && ("group" === t.type && t.traverse((function (t) { + _E(t, e, n, i) + })), VO(t, e, i), n.removeKey(yE(t).id)) + } + + function bE(t, e, n, i) { + if (!t.isGroup) { + var r = t; + r.z = rt(e.z, n || 0), r.zlevel = rt(e.zlevel, i || 0); + var o = e.z2; + null != o && (r.z2 = o || 0) + } + E(G(e), (function (n) { + var i = e[n]; + 0 === n.indexOf("on") && U(i) && (t[n] = i) + })), t.draggable = e.draggable, null != e.name && (t.name = e.name), null != e.id && (t.id = e.id) + } + + var wE = ["x", "y", "radius", "angle", "single"], SE = ["cartesian2d", "polar", "singleAxis"]; + + function ME(t) { + return t + "Axis" + } + + function IE(t, e) { + var n, i = ft(), r = [], o = ft(); + t.eachComponent({mainType: "dataZoom", query: e}, (function (t) { + o.get(t.uid) || s(t) + })); + do { + n = !1, t.eachComponent("dataZoom", a) + } while (n); + + function a(t) { + !o.get(t.uid) && function (t) { + var e = !1; + return t.eachTargetAxis((function (t, n) { + var r = i.get(t); + r && r[n] && (e = !0) + })), e + }(t) && (s(t), n = !0) + } + + function s(t) { + o.set(t.uid, !0), r.push(t), t.eachTargetAxis((function (t, e) { + (i.get(t) || i.set(t, []))[e] = !0 + })) + } + + return r + } + + function TE(t) { + var e = t.ecModel, n = {infoList: [], infoMap: ft()}; + return t.eachTargetAxis((function (t, i) { + var r = e.getComponent(ME(t), i); + if (r) { + var o = r.getCoordSysModel(); + if (o) { + var a = o.uid, s = n.infoMap.get(a); + s || (s = {model: o, axisModels: []}, n.infoList.push(s), n.infoMap.set(a, s)), s.axisModels.push(r) + } + } + })), n + } + + var CE = function () { + function t() { + this.indexList = [], this.indexMap = [] + } + + return t.prototype.add = function (t) { + this.indexMap[t] || (this.indexList.push(t), this.indexMap[t] = !0) + }, t + }(), DE = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n._autoThrottle = !0, n._noTarget = !0, n._rangePropMode = ["percent", "percent"], n + } + + return n(e, t), e.prototype.init = function (t, e, n) { + var i = AE(t); + this.settledOption = i, this.mergeDefaultAndTheme(t, n), this._doInit(i) + }, e.prototype.mergeOption = function (t) { + var e = AE(t); + C(this.option, t, !0), C(this.settledOption, e, !0), this._doInit(e) + }, e.prototype._doInit = function (t) { + var e = this.option; + this._setDefaultThrottle(t), this._updateRangeUse(t); + var n = this.settledOption; + E([["start", "startValue"], ["end", "endValue"]], (function (t, i) { + "value" === this._rangePropMode[i] && (e[t[0]] = n[t[0]] = null) + }), this), this._resetTarget() + }, e.prototype._resetTarget = function () { + var t = this.get("orient", !0), e = this._targetAxisInfoMap = ft(); + this._fillSpecifiedTargetAxis(e) ? this._orient = t || this._makeAutoOrientByTargetAxis() : (this._orient = t || "horizontal", this._fillAutoTargetAxisByOrient(e, this._orient)), this._noTarget = !0, e.each((function (t) { + t.indexList.length && (this._noTarget = !1) + }), this) + }, e.prototype._fillSpecifiedTargetAxis = function (t) { + var e = !1; + return E(wE, (function (n) { + var i = this.getReferringComponents(ME(n), Do); + if (i.specified) { + e = !0; + var r = new CE; + E(i.models, (function (t) { + r.add(t.componentIndex) + })), t.set(n, r) + } + }), this), e + }, e.prototype._fillAutoTargetAxisByOrient = function (t, e) { + var n = this.ecModel, i = !0; + if (i) { + var r = "vertical" === e ? "y" : "x"; + o(n.findComponents({mainType: r + "Axis"}), r) + } + i && o(n.findComponents({ + mainType: "singleAxis", filter: function (t) { + return t.get("orient", !0) === e + } + }), "single"); + + function o(e, n) { + var r = e[0]; + if (r) { + var o = new CE; + if (o.add(r.componentIndex), t.set(n, o), i = !1, "x" === n || "y" === n) { + var a = r.getReferringComponents("grid", Co).models[0]; + a && E(e, (function (t) { + r.componentIndex !== t.componentIndex && a === t.getReferringComponents("grid", Co).models[0] && o.add(t.componentIndex) + })) + } + } + } + + i && E(wE, (function (e) { + if (i) { + var r = n.findComponents({ + mainType: ME(e), filter: function (t) { + return "category" === t.get("type", !0) + } + }); + if (r[0]) { + var o = new CE; + o.add(r[0].componentIndex), t.set(e, o), i = !1 + } + } + }), this) + }, e.prototype._makeAutoOrientByTargetAxis = function () { + var t; + return this.eachTargetAxis((function (e) { + !t && (t = e) + }), this), "y" === t ? "vertical" : "horizontal" + }, e.prototype._setDefaultThrottle = function (t) { + if (t.hasOwnProperty("throttle") && (this._autoThrottle = !1), this._autoThrottle) { + var e = this.ecModel.option; + this.option.throttle = e.animation && e.animationDurationUpdate > 0 ? 100 : 20 + } + }, e.prototype._updateRangeUse = function (t) { + var e = this._rangePropMode, n = this.get("rangeMode"); + E([["start", "startValue"], ["end", "endValue"]], (function (i, r) { + var o = null != t[i[0]], a = null != t[i[1]]; + o && !a ? e[r] = "percent" : !o && a ? e[r] = "value" : n ? e[r] = n[r] : o && (e[r] = "percent") + })) + }, e.prototype.noTarget = function () { + return this._noTarget + }, e.prototype.getFirstTargetAxisModel = function () { + var t; + return this.eachTargetAxis((function (e, n) { + null == t && (t = this.ecModel.getComponent(ME(e), n)) + }), this), t + }, e.prototype.eachTargetAxis = function (t, e) { + this._targetAxisInfoMap.each((function (n, i) { + E(n.indexList, (function (n) { + t.call(e, i, n) + })) + })) + }, e.prototype.getAxisProxy = function (t, e) { + var n = this.getAxisModel(t, e); + if (n) return n.__dzAxisProxy + }, e.prototype.getAxisModel = function (t, e) { + var n = this._targetAxisInfoMap.get(t); + if (n && n.indexMap[e]) return this.ecModel.getComponent(ME(t), e) + }, e.prototype.setRawRange = function (t) { + var e = this.option, n = this.settledOption; + E([["start", "startValue"], ["end", "endValue"]], (function (i) { + null == t[i[0]] && null == t[i[1]] || (e[i[0]] = n[i[0]] = t[i[0]], e[i[1]] = n[i[1]] = t[i[1]]) + }), this), this._updateRangeUse(t) + }, e.prototype.setCalculatedRange = function (t) { + var e = this.option; + E(["start", "startValue", "end", "endValue"], (function (n) { + e[n] = t[n] + })) + }, e.prototype.getPercentRange = function () { + var t = this.findRepresentativeAxisProxy(); + if (t) return t.getDataPercentWindow() + }, e.prototype.getValueRange = function (t, e) { + if (null != t || null != e) return this.getAxisProxy(t, e).getDataValueWindow(); + var n = this.findRepresentativeAxisProxy(); + return n ? n.getDataValueWindow() : void 0 + }, e.prototype.findRepresentativeAxisProxy = function (t) { + if (t) return t.__dzAxisProxy; + for (var e, n = this._targetAxisInfoMap.keys(), i = 0; i < n.length; i++) for (var r = n[i], o = this._targetAxisInfoMap.get(r), a = 0; a < o.indexList.length; a++) { + var s = this.getAxisProxy(r, o.indexList[a]); + if (s.hostedBy(this)) return s; + e || (e = s) + } + return e + }, e.prototype.getRangePropMode = function () { + return this._rangePropMode.slice() + }, e.prototype.getOrient = function () { + return this._orient + }, e.type = "dataZoom", e.dependencies = ["xAxis", "yAxis", "radiusAxis", "angleAxis", "singleAxis", "series", "toolbox"], e.defaultOption = { + z: 4, + filterMode: "filter", + start: 0, + end: 100 + }, e + }(Ip); + + function AE(t) { + var e = {}; + return E(["start", "end", "startValue", "endValue", "throttle"], (function (n) { + t.hasOwnProperty(n) && (e[n] = t[n]) + })), e + } + + var kE = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "dataZoom.select", e + }(DE), LE = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n, i) { + this.dataZoomModel = t, this.ecModel = e, this.api = n + }, e.type = "dataZoom", e + }(fg), PE = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "dataZoom.select", e + }(LE), OE = E, RE = Vr, NE = function () { + function t(t, e, n, i) { + this._dimName = t, this._axisIndex = e, this.ecModel = i, this._dataZoomModel = n + } + + return t.prototype.hostedBy = function (t) { + return this._dataZoomModel === t + }, t.prototype.getDataValueWindow = function () { + return this._valueWindow.slice() + }, t.prototype.getDataPercentWindow = function () { + return this._percentWindow.slice() + }, t.prototype.getTargetSeriesModels = function () { + var t = []; + return this.ecModel.eachSeries((function (e) { + if (function (t) { + var e = t.get("coordinateSystem"); + return P(SE, e) >= 0 + }(e)) { + var n = ME(this._dimName), i = e.getReferringComponents(n, Co).models[0]; + i && this._axisIndex === i.componentIndex && t.push(e) + } + }), this), t + }, t.prototype.getAxisModel = function () { + return this.ecModel.getComponent(this._dimName + "Axis", this._axisIndex) + }, t.prototype.getMinMaxSpan = function () { + return T(this._minMaxSpan) + }, t.prototype.calculateDataWindow = function (t) { + var e, n = this._dataExtent, i = this.getAxisModel().axis.scale, r = this._dataZoomModel.getRangePropMode(), + o = [0, 100], a = [], s = []; + OE(["start", "end"], (function (l, u) { + var h = t[l], c = t[l + "Value"]; + "percent" === r[u] ? (null == h && (h = o[u]), c = i.parse(Nr(h, o, n))) : (e = !0, h = Nr(c = null == c ? n[u] : i.parse(c), n, o)), s[u] = c, a[u] = h + })), RE(s), RE(a); + var l = this._minMaxSpan; + + function u(t, e, n, r, o) { + var a = o ? "Span" : "ValueSpan"; + sk(0, t, n, "all", l["min" + a], l["max" + a]); + for (var s = 0; s < 2; s++) e[s] = Nr(t[s], n, r, !0), o && (e[s] = i.parse(e[s])) + } + + return e ? u(s, a, n, o, !1) : u(a, s, o, n, !0), {valueWindow: s, percentWindow: a} + }, t.prototype.reset = function (t) { + if (t === this._dataZoomModel) { + var e = this.getTargetSeriesModels(); + this._dataExtent = function (t, e, n) { + var i = [1 / 0, -1 / 0]; + OE(n, (function (t) { + !function (t, e, n) { + e && E(u_(e, n), (function (n) { + var i = e.getApproximateExtent(n); + i[0] < t[0] && (t[0] = i[0]), i[1] > t[1] && (t[1] = i[1]) + })) + }(i, t.getData(), e) + })); + var r = t.getAxisModel(), o = Qx(r.axis.scale, r, i).calculate(); + return [o.min, o.max] + }(this, this._dimName, e), this._updateMinMaxSpan(); + var n = this.calculateDataWindow(t.settledOption); + this._valueWindow = n.valueWindow, this._percentWindow = n.percentWindow, this._setAxisModel() + } + }, t.prototype.filterData = function (t, e) { + if (t === this._dataZoomModel) { + var n = this._dimName, i = this.getTargetSeriesModels(), r = t.get("filterMode"), o = this._valueWindow; + "none" !== r && OE(i, (function (t) { + var e = t.getData(), i = e.mapDimensionsAll(n); + if (i.length) { + if ("weakFilter" === r) { + var a = e.getStore(), s = z(i, (function (t) { + return e.getDimensionIndex(t) + }), e); + e.filterSelf((function (t) { + for (var e, n, r, l = 0; l < i.length; l++) { + var u = a.get(s[l], t), h = !isNaN(u), c = u < o[0], p = u > o[1]; + if (h && !c && !p) return !0; + h && (r = !0), c && (e = !0), p && (n = !0) + } + return r && e && n + })) + } else OE(i, (function (n) { + if ("empty" === r) t.setData(e = e.map(n, (function (t) { + return function (t) { + return t >= o[0] && t <= o[1] + }(t) ? t : NaN + }))); else { + var i = {}; + i[n] = o, e.selectRange(i) + } + })); + OE(i, (function (t) { + e.setApproximateExtent(o, t) + })) + } + })) + } + }, t.prototype._updateMinMaxSpan = function () { + var t = this._minMaxSpan = {}, e = this._dataZoomModel, n = this._dataExtent; + OE(["min", "max"], (function (i) { + var r = e.get(i + "Span"), o = e.get(i + "ValueSpan"); + null != o && (o = this.getAxisModel().axis.scale.parse(o)), null != o ? r = Nr(n[0] + o, n, [0, 100], !0) : null != r && (o = Nr(r, [0, 100], n, !0) - n[0]), t[i + "Span"] = r, t[i + "ValueSpan"] = o + }), this) + }, t.prototype._setAxisModel = function () { + var t = this.getAxisModel(), e = this._percentWindow, n = this._valueWindow; + if (e) { + var i = Gr(n, [0, 500]); + i = Math.min(i, 20); + var r = t.axis.scale.rawExtentInfo; + 0 !== e[0] && r.setDeterminedMinMax("min", +n[0].toFixed(i)), 100 !== e[1] && r.setDeterminedMinMax("max", +n[1].toFixed(i)), r.freeze() + } + }, t + }(); + var EE = { + getTargetSeries: function (t) { + function e(e) { + t.eachComponent("dataZoom", (function (n) { + n.eachTargetAxis((function (i, r) { + var o = t.getComponent(ME(i), r); + e(i, r, o, n) + })) + })) + } + + e((function (t, e, n, i) { + n.__dzAxisProxy = null + })); + var n = []; + e((function (e, i, r, o) { + r.__dzAxisProxy || (r.__dzAxisProxy = new NE(e, i, o, t), n.push(r.__dzAxisProxy)) + })); + var i = ft(); + return E(n, (function (t) { + E(t.getTargetSeriesModels(), (function (t) { + i.set(t.uid, t) + })) + })), i + }, overallReset: function (t, e) { + t.eachComponent("dataZoom", (function (t) { + t.eachTargetAxis((function (e, n) { + t.getAxisProxy(e, n).reset(t) + })), t.eachTargetAxis((function (n, i) { + t.getAxisProxy(n, i).filterData(t, e) + })) + })), t.eachComponent("dataZoom", (function (t) { + var e = t.findRepresentativeAxisProxy(); + if (e) { + var n = e.getDataPercentWindow(), i = e.getDataValueWindow(); + t.setCalculatedRange({start: n[0], end: n[1], startValue: i[0], endValue: i[1]}) + } + })) + } + }; + var zE = !1; + + function VE(t) { + zE || (zE = !0, t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER, EE), function (t) { + t.registerAction("dataZoom", (function (t, e) { + E(IE(e, t), (function (e) { + e.setRawRange({start: t.start, end: t.end, startValue: t.startValue, endValue: t.endValue}) + })) + })) + }(t), t.registerSubTypeDefaulter("dataZoom", (function () { + return "slider" + }))) + } + + function BE(t) { + t.registerComponentModel(kE), t.registerComponentView(PE), VE(t) + } + + var FE = function () { + }, GE = {}; + + function WE(t, e) { + GE[t] = e + } + + function HE(t) { + return GE[t] + } + + var YE = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.optionUpdated = function () { + t.prototype.optionUpdated.apply(this, arguments); + var e = this.ecModel; + E(this.option.feature, (function (t, n) { + var i = HE(n); + i && (i.getDefaultOption && (i.defaultOption = i.getDefaultOption(e)), C(t, i.defaultOption)) + })) + }, e.type = "toolbox", e.layoutMode = {type: "box", ignoreSize: !0}, e.defaultOption = { + show: !0, + z: 6, + orient: "horizontal", + left: "right", + top: "top", + backgroundColor: "transparent", + borderColor: "#ccc", + borderRadius: 0, + borderWidth: 0, + padding: 5, + itemSize: 15, + itemGap: 8, + showTitle: !0, + iconStyle: {borderColor: "#666", color: "none"}, + emphasis: {iconStyle: {borderColor: "#3E98C5"}}, + tooltip: {show: !1, position: "bottom"} + }, e + }(Ip); + + function UE(t, e) { + var n = np(e.get("padding")), i = e.getItemStyle(["color", "opacity"]); + return i.fill = e.get("backgroundColor"), t = new Ts({ + shape: { + x: t.x - n[3], + y: t.y - n[0], + width: t.width + n[1] + n[3], + height: t.height + n[0] + n[2], + r: e.get("borderRadius") + }, style: i, silent: !0, z2: -1 + }) + } + + var XE = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.render = function (t, e, n, i) { + var r = this.group; + if (r.removeAll(), t.get("show")) { + var o = +t.get("itemSize"), a = t.get("feature") || {}, s = this._features || (this._features = {}), + l = []; + E(a, (function (t, e) { + l.push(e) + })), new Sm(this._featureNames || [], l).add(u).update(u).remove(H(u, null)).execute(), this._featureNames = l, function (t, e, n) { + var i = e.getBoxLayoutParams(), r = e.get("padding"), + o = {width: n.getWidth(), height: n.getHeight()}, a = mp(i, o, r); + vp(e.get("orient"), t, e.get("itemGap"), a.width, a.height), xp(t, i, o, r) + }(r, t, n), r.add(UE(r.getBoundingRect(), t)), r.eachChild((function (t) { + var e = t.__title, i = t.ensureState("emphasis"), a = i.textConfig || (i.textConfig = {}), + s = t.getTextContent(), l = s && s.states.emphasis; + if (l && !U(l) && e) { + var u = l.style || (l.style = {}), h = cr(e, As.makeFont(u)), c = t.x + r.x, p = !1; + t.y + r.y + o + h.height > n.getHeight() && (a.position = "top", p = !0); + var d = p ? -5 - h.height : o + 8; + c + h.width / 2 > n.getWidth() ? (a.position = ["100%", d], u.align = "right") : c - h.width / 2 < 0 && (a.position = [0, d], u.align = "left") + } + })) + } + + function u(u, h) { + var c, p = l[u], d = l[h], f = a[p], g = new pc(f, t, t.ecModel); + if (i && null != i.newTitle && i.featureName === p && (f.title = i.newTitle), p && !d) { + if (function (t) { + return 0 === t.indexOf("my") + }(p)) c = {onclick: g.option.onclick, featureName: p}; else { + var y = HE(p); + if (!y) return; + c = new y + } + s[p] = c + } else if (!(c = s[d])) return; + c.uid = fc("toolbox-feature"), c.model = g, c.ecModel = e, c.api = n; + var v = c instanceof FE; + p || !d ? !g.get("show") || v && c.unusable ? v && c.remove && c.remove(e, n) : (!function (i, a, s) { + var l, u, h = i.getModel("iconStyle"), c = i.getModel(["emphasis", "iconStyle"]), + p = a instanceof FE && a.getIcons ? a.getIcons() : i.get("icon"), d = i.get("title") || {}; + X(p) ? (l = {})[s] = p : l = p; + X(d) ? (u = {})[s] = d : u = d; + var f = i.iconPaths = {}; + E(l, (function (s, l) { + var p = Lh(s, {}, {x: -o / 2, y: -o / 2, width: o, height: o}); + p.setStyle(h.getItemStyle()), p.ensureState("emphasis").style = c.getItemStyle(); + var d = new As({ + style: { + text: u[l], + align: c.get("textAlign"), + borderRadius: c.get("textBorderRadius"), + padding: c.get("textPadding"), + fill: null + }, ignore: !0 + }); + p.setTextContent(d), Nh({ + el: p, + componentModel: t, + itemName: l, + formatterParamsExtra: {title: u[l]} + }), p.__title = u[l], p.on("mouseover", (function () { + var e = c.getItemStyle(), + n = "vertical" === t.get("orient") ? null == t.get("right") ? "right" : "left" : null == t.get("bottom") ? "bottom" : "top"; + d.setStyle({ + fill: c.get("textFill") || e.fill || e.stroke || "#000", + backgroundColor: c.get("textBackgroundColor") + }), p.setTextConfig({position: c.get("textPosition") || n}), d.ignore = !t.get("showTitle"), xl(this) + })).on("mouseout", (function () { + "emphasis" !== i.get(["iconStatus", l]) && _l(this), d.hide() + })), ("emphasis" === i.get(["iconStatus", l]) ? xl : _l)(p), r.add(p), p.on("click", W(a.onclick, a, e, n, l)), f[l] = p + })) + }(g, c, p), g.setIconStatus = function (t, e) { + var n = this.option, i = this.iconPaths; + n.iconStatus = n.iconStatus || {}, n.iconStatus[t] = e, i[t] && ("emphasis" === e ? xl : _l)(i[t]) + }, c instanceof FE && c.render && c.render(g, e, n, i)) : v && c.dispose && c.dispose(e, n) + } + }, e.prototype.updateView = function (t, e, n, i) { + E(this._features, (function (t) { + t instanceof FE && t.updateView && t.updateView(t.model, e, n, i) + })) + }, e.prototype.remove = function (t, e) { + E(this._features, (function (n) { + n instanceof FE && n.remove && n.remove(t, e) + })), this.group.removeAll() + }, e.prototype.dispose = function (t, e) { + E(this._features, (function (n) { + n instanceof FE && n.dispose && n.dispose(t, e) + })) + }, e.type = "toolbox", e + }(fg); + var ZE = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.onclick = function (t, e) { + var n = this.model, i = n.get("name") || t.get("title.0.text") || "echarts", + o = "svg" === e.getZr().painter.getType(), a = o ? "svg" : n.get("type", !0) || "png", + s = e.getConnectedDataURL({ + type: a, + backgroundColor: n.get("backgroundColor", !0) || t.get("backgroundColor") || "#fff", + connectedBackgroundColor: n.get("connectedBackgroundColor"), + excludeComponents: n.get("excludeComponents"), + pixelRatio: n.get("pixelRatio") + }), l = r.browser; + if (U(MouseEvent) && (l.newEdge || !l.ie && !l.edge)) { + var u = document.createElement("a"); + u.download = i + "." + a, u.target = "_blank", u.href = s; + var h = new MouseEvent("click", {view: document.defaultView, bubbles: !0, cancelable: !1}); + u.dispatchEvent(h) + } else if (window.navigator.msSaveOrOpenBlob || o) { + var c = s.split(","), p = c[0].indexOf("base64") > -1, d = o ? decodeURIComponent(c[1]) : c[1]; + p && (d = window.atob(d)); + var f = i + "." + a; + if (window.navigator.msSaveOrOpenBlob) { + for (var g = d.length, y = new Uint8Array(g); g--;) y[g] = d.charCodeAt(g); + var v = new Blob([y]); + window.navigator.msSaveOrOpenBlob(v, f) + } else { + var m = document.createElement("iframe"); + document.body.appendChild(m); + var x = m.contentWindow, _ = x.document; + _.open("image/svg+xml", "replace"), _.write(d), _.close(), x.focus(), _.execCommand("SaveAs", !0, f), document.body.removeChild(m) + } + } else { + var b = n.get("lang"), + w = '', + S = window.open(); + S.document.write(w), S.document.title = i + } + }, e.getDefaultOption = function (t) { + return { + show: !0, + icon: "M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0", + title: t.getLocaleModel().get(["toolbox", "saveAsImage", "title"]), + type: "png", + connectedBackgroundColor: "#fff", + name: "", + excludeComponents: ["toolbox"], + lang: t.getLocaleModel().get(["toolbox", "saveAsImage", "lang"]) + } + }, e + }(FE), jE = "__ec_magicType_stack__", qE = [["line", "bar"], ["stack"]], KE = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.getIcons = function () { + var t = this.model, e = t.get("icon"), n = {}; + return E(t.get("type"), (function (t) { + e[t] && (n[t] = e[t]) + })), n + }, e.getDefaultOption = function (t) { + return { + show: !0, + type: [], + icon: { + line: "M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4", + bar: "M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7", + stack: "M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z" + }, + title: t.getLocaleModel().get(["toolbox", "magicType", "title"]), + option: {}, + seriesIndex: {} + } + }, e.prototype.onclick = function (t, e, n) { + var i = this.model, r = i.get(["seriesIndex", n]); + if ($E[n]) { + var o, a = {series: []}; + E(qE, (function (t) { + P(t, n) >= 0 && E(t, (function (t) { + i.setIconStatus(t, "normal") + })) + })), i.setIconStatus(n, "emphasis"), t.eachComponent({ + mainType: "series", + query: null == r ? null : {seriesIndex: r} + }, (function (t) { + var e = t.subType, r = t.id, o = $E[n](e, r, t, i); + o && (k(o, t.option), a.series.push(o)); + var s = t.coordinateSystem; + if (s && "cartesian2d" === s.type && ("line" === n || "bar" === n)) { + var l = s.getAxesByScale("ordinal")[0]; + if (l) { + var u = l.dim + "Axis", h = t.getReferringComponents(u, Co).models[0].componentIndex; + a[u] = a[u] || []; + for (var c = 0; c <= h; c++) a[u][h] = a[u][h] || {}; + a[u][h].boundaryGap = "bar" === n + } + } + })); + var s = n; + "stack" === n && (o = C({ + stack: i.option.title.tiled, + tiled: i.option.title.stack + }, i.option.title), "emphasis" !== i.get(["iconStatus", n]) && (s = "tiled")), e.dispatchAction({ + type: "changeMagicType", + currentType: s, + newOption: a, + newTitle: o, + featureName: "magicType" + }) + } + }, e + }(FE), $E = { + line: function (t, e, n, i) { + if ("bar" === t) return C({ + id: e, + type: "line", + data: n.get("data"), + stack: n.get("stack"), + markPoint: n.get("markPoint"), + markLine: n.get("markLine") + }, i.get(["option", "line"]) || {}, !0) + }, bar: function (t, e, n, i) { + if ("line" === t) return C({ + id: e, + type: "bar", + data: n.get("data"), + stack: n.get("stack"), + markPoint: n.get("markPoint"), + markLine: n.get("markLine") + }, i.get(["option", "bar"]) || {}, !0) + }, stack: function (t, e, n, i) { + var r = n.get("stack") === jE; + if ("line" === t || "bar" === t) return i.setIconStatus("stack", r ? "normal" : "emphasis"), C({ + id: e, + stack: r ? "" : jE + }, i.get(["option", "stack"]) || {}, !0) + } + }; + um({type: "changeMagicType", event: "magicTypeChanged", update: "prepareAndUpdate"}, (function (t, e) { + e.mergeOption(t.newOption) + })); + var JE = new Array(60).join("-"), QE = "\t"; + + function tz(t) { + return t.replace(/^\s\s*/, "").replace(/\s\s*$/, "") + } + + var ez = new RegExp("[\t]+", "g"); + + function nz(t, e) { + var n = t.split(new RegExp("\n*" + JE + "\n*", "g")), i = {series: []}; + return E(n, (function (t, n) { + if (function (t) { + if (t.slice(0, t.indexOf("\n")).indexOf(QE) >= 0) return !0 + }(t)) { + var r = function (t) { + for (var e = t.split(/\n+/g), n = [], i = z(tz(e.shift()).split(ez), (function (t) { + return {name: t, data: []} + })), r = 0; r < e.length; r++) { + var o = tz(e[r]).split(ez); + n.push(o.shift()); + for (var a = 0; a < o.length; a++) i[a] && (i[a].data[r] = o[a]) + } + return {series: i, categories: n} + }(t), o = e[n], a = o.axisDim + "Axis"; + o && (i[a] = i[a] || [], i[a][o.axisIndex] = {data: r.categories}, i.series = i.series.concat(r.series)) + } else { + r = function (t) { + for (var e = t.split(/\n+/g), n = tz(e.shift()), i = [], r = 0; r < e.length; r++) { + var o = tz(e[r]); + if (o) { + var a = o.split(ez), s = "", l = void 0, u = !1; + isNaN(a[0]) ? (u = !0, s = a[0], a = a.slice(1), i[r] = { + name: s, + value: [] + }, l = i[r].value) : l = i[r] = []; + for (var h = 0; h < a.length; h++) l.push(+a[h]); + 1 === l.length && (u ? i[r].value = l[0] : i[r] = l[0]) + } + } + return {name: n, data: i} + }(t); + i.series.push(r) + } + })), i + } + + var iz = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.onclick = function (t, e) { + var n = e.getDom(), i = this.model; + this._dom && n.removeChild(this._dom); + var r = document.createElement("div"); + r.style.cssText = "position:absolute;left:5px;top:5px;bottom:5px;right:5px;", r.style.backgroundColor = i.get("backgroundColor") || "#fff"; + var o = document.createElement("h4"), a = i.get("lang") || []; + o.innerHTML = a[0] || i.get("title"), o.style.cssText = "margin: 10px 20px;", o.style.color = i.get("textColor"); + var s = document.createElement("div"), l = document.createElement("textarea"); + s.style.cssText = "display:block;width:100%;overflow:auto;"; + var u = i.get("optionToContent"), h = i.get("contentToOption"), c = function (t) { + var e, n, i, r = function (t) { + var e = {}, n = [], i = []; + return t.eachRawSeries((function (t) { + var r = t.coordinateSystem; + if (!r || "cartesian2d" !== r.type && "polar" !== r.type) n.push(t); else { + var o = r.getBaseAxis(); + if ("category" === o.type) { + var a = o.dim + "_" + o.index; + e[a] || (e[a] = { + categoryAxis: o, + valueAxis: r.getOtherAxis(o), + series: [] + }, i.push({axisDim: o.dim, axisIndex: o.index})), e[a].series.push(t) + } else n.push(t) + } + })), {seriesGroupByCategoryAxis: e, other: n, meta: i} + }(t); + return { + value: B([(n = r.seriesGroupByCategoryAxis, i = [], E(n, (function (t, e) { + var n = t.categoryAxis, r = t.valueAxis.dim, o = [" "].concat(z(t.series, (function (t) { + return t.name + }))), a = [n.model.getCategories()]; + E(t.series, (function (t) { + var e = t.getRawData(); + a.push(t.getRawData().mapArray(e.mapDimension(r), (function (t) { + return t + }))) + })); + for (var s = [o.join(QE)], l = 0; l < a[0].length; l++) { + for (var u = [], h = 0; h < a.length; h++) u.push(a[h][l]); + s.push(u.join(QE)) + } + i.push(s.join("\n")) + })), i.join("\n\n" + JE + "\n\n")), (e = r.other, z(e, (function (t) { + var e = t.getRawData(), n = [t.name], i = []; + return e.each(e.dimensions, (function () { + for (var t = arguments.length, r = arguments[t - 1], o = e.getName(r), a = 0; a < t - 1; a++) i[a] = arguments[a]; + n.push((o ? o + QE : "") + i.join(QE)) + })), n.join("\n") + })).join("\n\n" + JE + "\n\n"))], (function (t) { + return !!t.replace(/[\n\t\s]/g, "") + })).join("\n\n" + JE + "\n\n"), meta: r.meta + } + }(t); + if (U(u)) { + var p = u(e.getOption()); + X(p) ? s.innerHTML = p : J(p) && s.appendChild(p) + } else s.appendChild(l), l.readOnly = i.get("readOnly"), l.style.cssText = "width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;", l.style.color = i.get("textColor"), l.style.borderColor = i.get("textareaBorderColor"), l.style.backgroundColor = i.get("textareaColor"), l.value = c.value; + var d = c.meta, f = document.createElement("div"); + f.style.cssText = "position:absolute;bottom:0;left:0;right:0;"; + var g = "float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px", + y = document.createElement("div"), v = document.createElement("div"); + g += ";background-color:" + i.get("buttonColor"), g += ";color:" + i.get("buttonTextColor"); + var m = this; + + function x() { + n.removeChild(r), m._dom = null + } + + ae(y, "click", x), ae(v, "click", (function () { + if (null == h && null != u || null != h && null == u) x(); else { + var t; + try { + t = U(h) ? h(s, e.getOption()) : nz(l.value, d) + } catch (t) { + throw x(), new Error("Data view format error " + t) + } + t && e.dispatchAction({type: "changeDataView", newOption: t}), x() + } + })), y.innerHTML = a[1], v.innerHTML = a[2], v.style.cssText = g, y.style.cssText = g, !i.get("readOnly") && f.appendChild(v), f.appendChild(y), r.appendChild(o), r.appendChild(s), r.appendChild(f), s.style.height = n.clientHeight - 80 + "px", n.appendChild(r), this._dom = r + }, e.prototype.remove = function (t, e) { + this._dom && e.getDom().removeChild(this._dom) + }, e.prototype.dispose = function (t, e) { + this.remove(t, e) + }, e.getDefaultOption = function (t) { + return { + show: !0, + readOnly: !1, + optionToContent: null, + contentToOption: null, + icon: "M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28", + title: t.getLocaleModel().get(["toolbox", "dataView", "title"]), + lang: t.getLocaleModel().get(["toolbox", "dataView", "lang"]), + backgroundColor: "#fff", + textColor: "#000", + textareaColor: "#fff", + textareaBorderColor: "#333", + buttonColor: "#c23531", + buttonTextColor: "#fff" + } + }, e + }(FE); + + function rz(t, e) { + return z(t, (function (t, n) { + var i = e && e[n]; + if (q(i) && !Y(i)) { + q(t) && !Y(t) || (t = {value: t}); + var r = null != i.name && null == t.name; + return t = k(t, i), r && delete t.name, t + } + return t + })) + } + + um({type: "changeDataView", event: "dataViewChanged", update: "prepareAndUpdate"}, (function (t, e) { + var n = []; + E(t.newOption.series, (function (t) { + var i = e.getSeriesByName(t.name)[0]; + if (i) { + var r = i.get("data"); + n.push({name: t.name, data: rz(t.data, r)}) + } else n.push(A({type: "scatter"}, t)) + })), e.mergeOption(k({series: n}, t.newOption)) + })); + var oz = E, az = So(); + + function sz(t) { + var e = az(t); + return e.snapshots || (e.snapshots = [{}]), e.snapshots + } + + var lz = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.onclick = function (t, e) { + !function (t) { + az(t).snapshots = null + }(t), e.dispatchAction({type: "restore", from: this.uid}) + }, e.getDefaultOption = function (t) { + return { + show: !0, + icon: "M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5", + title: t.getLocaleModel().get(["toolbox", "restore", "title"]) + } + }, e + }(FE); + um({type: "restore", event: "restore", update: "prepareAndUpdate"}, (function (t, e) { + e.resetOption("recreate") + })); + var uz = ["grid", "xAxis", "yAxis", "geo", "graph", "polar", "radiusAxis", "angleAxis", "bmap"], hz = function () { + function t(t, e, n) { + var i = this; + this._targetInfoList = []; + var r = pz(e, t); + E(dz, (function (t, e) { + (!n || !n.include || P(n.include, e) >= 0) && t(r, i._targetInfoList) + })) + } + + return t.prototype.setOutputRanges = function (t, e) { + return this.matchOutputRanges(t, e, (function (t, e, n) { + if ((t.coordRanges || (t.coordRanges = [])).push(e), !t.coordRange) { + t.coordRange = e; + var i = yz[t.brushType](0, n, e); + t.__rangeOffset = {offset: mz[t.brushType](i.values, t.range, [1, 1]), xyMinMax: i.xyMinMax} + } + })), t + }, t.prototype.matchOutputRanges = function (t, e, n) { + E(t, (function (t) { + var i = this.findTargetInfo(t, e); + i && !0 !== i && E(i.coordSyses, (function (i) { + var r = yz[t.brushType](1, i, t.range, !0); + n(t, r.values, i, e) + })) + }), this) + }, t.prototype.setInputRanges = function (t, e) { + E(t, (function (t) { + var n, i, r, o, a, s = this.findTargetInfo(t, e); + if (t.range = t.range || [], s && !0 !== s) { + t.panelId = s.panelId; + var l = yz[t.brushType](0, s.coordSys, t.coordRange), u = t.__rangeOffset; + t.range = u ? mz[t.brushType](l.values, u.offset, (n = l.xyMinMax, i = u.xyMinMax, r = _z(n), o = _z(i), a = [r[0] / o[0], r[1] / o[1]], isNaN(a[0]) && (a[0] = 1), isNaN(a[1]) && (a[1] = 1), a)) : l.values + } + }), this) + }, t.prototype.makePanelOpts = function (t, e) { + return z(this._targetInfoList, (function (n) { + var i = n.getPanelRect(); + return { + panelId: n.panelId, + defaultBrushType: e ? e(n) : null, + clipPath: uL(i), + isTargetByCursor: cL(i, t, n.coordSysModel), + getLinearBrushOtherExtent: hL(i) + } + })) + }, t.prototype.controlSeries = function (t, e, n) { + var i = this.findTargetInfo(t, n); + return !0 === i || i && P(i.coordSyses, e.coordinateSystem) >= 0 + }, t.prototype.findTargetInfo = function (t, e) { + for (var n = this._targetInfoList, i = pz(e, t), r = 0; r < n.length; r++) { + var o = n[r], a = t.panelId; + if (a) { + if (o.panelId === a) return o + } else for (var s = 0; s < fz.length; s++) if (fz[s](i, o)) return o + } + return !0 + }, t + }(); + + function cz(t) { + return t[0] > t[1] && t.reverse(), t + } + + function pz(t, e) { + return Io(t, e, {includeMainTypes: uz}) + } + + var dz = { + grid: function (t, e) { + var n = t.xAxisModels, i = t.yAxisModels, r = t.gridModels, o = ft(), a = {}, s = {}; + (n || i || r) && (E(n, (function (t) { + var e = t.axis.grid.model; + o.set(e.id, e), a[e.id] = !0 + })), E(i, (function (t) { + var e = t.axis.grid.model; + o.set(e.id, e), s[e.id] = !0 + })), E(r, (function (t) { + o.set(t.id, t), a[t.id] = !0, s[t.id] = !0 + })), o.each((function (t) { + var r = t.coordinateSystem, o = []; + E(r.getCartesians(), (function (t, e) { + (P(n, t.getAxis("x").model) >= 0 || P(i, t.getAxis("y").model) >= 0) && o.push(t) + })), e.push({ + panelId: "grid--" + t.id, + gridModel: t, + coordSysModel: t, + coordSys: o[0], + coordSyses: o, + getPanelRect: gz.grid, + xAxisDeclared: a[t.id], + yAxisDeclared: s[t.id] + }) + }))) + }, geo: function (t, e) { + E(t.geoModels, (function (t) { + var n = t.coordinateSystem; + e.push({ + panelId: "geo--" + t.id, + geoModel: t, + coordSysModel: t, + coordSys: n, + coordSyses: [n], + getPanelRect: gz.geo + }) + })) + } + }, fz = [function (t, e) { + var n = t.xAxisModel, i = t.yAxisModel, r = t.gridModel; + return !r && n && (r = n.axis.grid.model), !r && i && (r = i.axis.grid.model), r && r === e.gridModel + }, function (t, e) { + var n = t.geoModel; + return n && n === e.geoModel + }], gz = { + grid: function () { + return this.coordSys.master.getRect().clone() + }, geo: function () { + var t = this.coordSys, e = t.getBoundingRect().clone(); + return e.applyTransform(Mh(t)), e + } + }, yz = { + lineX: H(vz, 0), lineY: H(vz, 1), rect: function (t, e, n, i) { + var r = t ? e.pointToData([n[0][0], n[1][0]], i) : e.dataToPoint([n[0][0], n[1][0]], i), + o = t ? e.pointToData([n[0][1], n[1][1]], i) : e.dataToPoint([n[0][1], n[1][1]], i), + a = [cz([r[0], o[0]]), cz([r[1], o[1]])]; + return {values: a, xyMinMax: a} + }, polygon: function (t, e, n, i) { + var r = [[1 / 0, -1 / 0], [1 / 0, -1 / 0]]; + return { + values: z(n, (function (n) { + var o = t ? e.pointToData(n, i) : e.dataToPoint(n, i); + return r[0][0] = Math.min(r[0][0], o[0]), r[1][0] = Math.min(r[1][0], o[1]), r[0][1] = Math.max(r[0][1], o[0]), r[1][1] = Math.max(r[1][1], o[1]), o + })), xyMinMax: r + } + } + }; + + function vz(t, e, n, i) { + var r = n.getAxis(["x", "y"][t]), o = cz(z([0, 1], (function (t) { + return e ? r.coordToData(r.toLocalCoord(i[t]), !0) : r.toGlobalCoord(r.dataToCoord(i[t])) + }))), a = []; + return a[t] = o, a[1 - t] = [NaN, NaN], {values: o, xyMinMax: a} + } + + var mz = { + lineX: H(xz, 0), lineY: H(xz, 1), rect: function (t, e, n) { + return [[t[0][0] - n[0] * e[0][0], t[0][1] - n[0] * e[0][1]], [t[1][0] - n[1] * e[1][0], t[1][1] - n[1] * e[1][1]]] + }, polygon: function (t, e, n) { + return z(t, (function (t, i) { + return [t[0] - n[0] * e[i][0], t[1] - n[1] * e[i][1]] + })) + } + }; + + function xz(t, e, n, i) { + return [e[0] - i[t] * n[0], e[1] - i[t] * n[1]] + } + + function _z(t) { + return t ? [t[0][1] - t[0][0], t[1][1] - t[1][0]] : [NaN, NaN] + } + + var bz, wz, Sz = E, Mz = uo + "toolbox-dataZoom_", Iz = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.render = function (t, e, n, i) { + this._brushController || (this._brushController = new Pk(n.getZr()), this._brushController.on("brush", W(this._onBrush, this)).mount()), function (t, e, n, i, r) { + var o = n._isZoomActive; + i && "takeGlobalCursor" === i.type && (o = "dataZoomSelect" === i.key && i.dataZoomSelectActive); + n._isZoomActive = o, t.setIconStatus("zoom", o ? "emphasis" : "normal"); + var a = new hz(Cz(t), e, {include: ["grid"]}).makePanelOpts(r, (function (t) { + return t.xAxisDeclared && !t.yAxisDeclared ? "lineX" : !t.xAxisDeclared && t.yAxisDeclared ? "lineY" : "rect" + })); + n._brushController.setPanels(a).enableBrush(!(!o || !a.length) && { + brushType: "auto", + brushStyle: t.getModel("brushStyle").getItemStyle() + }) + }(t, e, this, i, n), function (t, e) { + t.setIconStatus("back", function (t) { + return sz(t).length + }(e) > 1 ? "emphasis" : "normal") + }(t, e) + }, e.prototype.onclick = function (t, e, n) { + Tz[n].call(this) + }, e.prototype.remove = function (t, e) { + this._brushController && this._brushController.unmount() + }, e.prototype.dispose = function (t, e) { + this._brushController && this._brushController.dispose() + }, e.prototype._onBrush = function (t) { + var e = t.areas; + if (t.isEnd && e.length) { + var n = {}, i = this.ecModel; + this._brushController.updateCovers([]), new hz(Cz(this.model), i, {include: ["grid"]}).matchOutputRanges(e, i, (function (t, e, n) { + if ("cartesian2d" === n.type) { + var i = t.brushType; + "rect" === i ? (r("x", n, e[0]), r("y", n, e[1])) : r({lineX: "x", lineY: "y"}[i], n, e) + } + })), function (t, e) { + var n = sz(t); + oz(e, (function (e, i) { + for (var r = n.length - 1; r >= 0 && !n[r][i]; r--) ; + if (r < 0) { + var o = t.queryComponents({mainType: "dataZoom", subType: "select", id: i})[0]; + if (o) { + var a = o.getPercentRange(); + n[0][i] = {dataZoomId: i, start: a[0], end: a[1]} + } + } + })), n.push(e) + }(i, n), this._dispatchZoomAction(n) + } + + function r(t, e, r) { + var o = e.getAxis(t), a = o.model, s = function (t, e, n) { + var i; + return n.eachComponent({mainType: "dataZoom", subType: "select"}, (function (n) { + n.getAxisModel(t, e.componentIndex) && (i = n) + })), i + }(t, a, i), l = s.findRepresentativeAxisProxy(a).getMinMaxSpan(); + null == l.minValueSpan && null == l.maxValueSpan || (r = sk(0, r.slice(), o.scale.getExtent(), 0, l.minValueSpan, l.maxValueSpan)), s && (n[s.id] = { + dataZoomId: s.id, + startValue: r[0], + endValue: r[1] + }) + } + }, e.prototype._dispatchZoomAction = function (t) { + var e = []; + Sz(t, (function (t, n) { + e.push(T(t)) + })), e.length && this.api.dispatchAction({type: "dataZoom", from: this.uid, batch: e}) + }, e.getDefaultOption = function (t) { + return { + show: !0, + filterMode: "filter", + icon: { + zoom: "M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1", + back: "M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26" + }, + title: t.getLocaleModel().get(["toolbox", "dataZoom", "title"]), + brushStyle: {borderWidth: 0, color: "rgba(210,219,238,0.2)"} + } + }, e + }(FE), Tz = { + zoom: function () { + var t = !this._isZoomActive; + this.api.dispatchAction({type: "takeGlobalCursor", key: "dataZoomSelect", dataZoomSelectActive: t}) + }, back: function () { + this._dispatchZoomAction(function (t) { + var e = sz(t), n = e[e.length - 1]; + e.length > 1 && e.pop(); + var i = {}; + return oz(n, (function (t, n) { + for (var r = e.length - 1; r >= 0; r--) if (t = e[r][n]) { + i[n] = t; + break + } + })), i + }(this.ecModel)) + } + }; + + function Cz(t) { + var e = { + xAxisIndex: t.get("xAxisIndex", !0), + yAxisIndex: t.get("yAxisIndex", !0), + xAxisId: t.get("xAxisId", !0), + yAxisId: t.get("yAxisId", !0) + }; + return null == e.xAxisIndex && null == e.xAxisId && (e.xAxisIndex = "all"), null == e.yAxisIndex && null == e.yAxisId && (e.yAxisIndex = "all"), e + } + + bz = "dataZoom", wz = function (t) { + var e = t.getComponent("toolbox", 0), n = ["feature", "dataZoom"]; + if (e && null != e.get(n)) { + var i = e.getModel(n), r = [], o = Io(t, Cz(i)); + return Sz(o.xAxisModels, (function (t) { + return a(t, "xAxis", "xAxisIndex") + })), Sz(o.yAxisModels, (function (t) { + return a(t, "yAxis", "yAxisIndex") + })), r + } + + function a(t, e, n) { + var o = t.componentIndex, + a = {type: "select", $fromToolbox: !0, filterMode: i.get("filterMode", !0) || "filter", id: Mz + e + o}; + a[n] = o, r.push(a) + } + }, lt(null == Zp.get(bz) && wz), Zp.set(bz, wz); + var Dz = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "tooltip", e.dependencies = ["axisPointer"], e.defaultOption = { + z: 60, + show: !0, + showContent: !0, + trigger: "item", + triggerOn: "mousemove|click", + alwaysShowContent: !1, + displayMode: "single", + renderMode: "auto", + confine: null, + showDelay: 0, + hideDelay: 100, + transitionDuration: .4, + enterable: !1, + backgroundColor: "#fff", + shadowBlur: 10, + shadowColor: "rgba(0, 0, 0, .2)", + shadowOffsetX: 1, + shadowOffsetY: 2, + borderRadius: 4, + borderWidth: 1, + padding: null, + extraCssText: "", + axisPointer: { + type: "line", + axis: "auto", + animation: "auto", + animationDurationUpdate: 200, + animationEasingUpdate: "exponentialOut", + crossStyle: {color: "#999", width: 1, type: "dashed", textStyle: {}} + }, + textStyle: {color: "#666", fontSize: 14} + }, e + }(Ip); + + function Az(t) { + var e = t.get("confine"); + return null != e ? !!e : "richText" === t.get("renderMode") + } + + function kz(t) { + if (r.domSupported) for (var e = document.documentElement.style, n = 0, i = t.length; n < i; n++) if (t[n] in e) return t[n] + } + + var Lz = kz(["transform", "webkitTransform", "OTransform", "MozTransform", "msTransform"]); + + function Pz(t, e) { + if (!t) return e; + e = ep(e, !0); + var n = t.indexOf(e); + return (t = -1 === n ? e : "-" + t.slice(0, n) + "-" + e).toLowerCase() + } + + var Oz = Pz(kz(["webkitTransition", "transition", "OTransition", "MozTransition", "msTransition"]), "transition"), + Rz = Pz(Lz, "transform"), + Nz = "position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;" + (r.transform3dSupported ? "will-change:transform;" : ""); + + function Ez(t, e, n) { + var i = t.toFixed(0) + "px", o = e.toFixed(0) + "px"; + if (!r.transformSupported) return n ? "top:" + o + ";left:" + i + ";" : [["top", o], ["left", i]]; + var a = r.transform3dSupported, s = "translate" + (a ? "3d" : "") + "(" + i + "," + o + (a ? ",0" : "") + ")"; + return n ? "top:0;left:0;" + Rz + ":" + s + ";" : [["top", 0], ["left", 0], [Lz, s]] + } + + function zz(t, e, n) { + var i = [], o = t.get("transitionDuration"), a = t.get("backgroundColor"), s = t.get("shadowBlur"), + l = t.get("shadowColor"), u = t.get("shadowOffsetX"), h = t.get("shadowOffsetY"), + c = t.getModel("textStyle"), p = eg(t, "html"), d = u + "px " + h + "px " + s + "px " + l; + return i.push("box-shadow:" + d), e && o && i.push(function (t, e) { + var n = "cubic-bezier(0.23,1,0.32,1)", i = " " + t / 2 + "s " + n, o = "opacity" + i + ",visibility" + i; + return e || (i = " " + t + "s " + n, o += r.transformSupported ? "," + Rz + i : ",left" + i + ",top" + i), Oz + ":" + o + }(o, n)), a && i.push("background-color:" + a), E(["width", "color", "radius"], (function (e) { + var n = "border-" + e, r = ep(n), o = t.get(r); + null != o && i.push(n + ":" + o + ("color" === e ? "" : "px")) + })), i.push(function (t) { + var e = [], n = t.get("fontSize"), i = t.getTextColor(); + i && e.push("color:" + i), e.push("font:" + t.getFont()), n && e.push("line-height:" + Math.round(3 * n / 2) + "px"); + var r = t.get("textShadowColor"), o = t.get("textShadowBlur") || 0, a = t.get("textShadowOffsetX") || 0, + s = t.get("textShadowOffsetY") || 0; + return r && o && e.push("text-shadow:" + a + "px " + s + "px " + o + "px " + r), E(["decoration", "align"], (function (n) { + var i = t.get(n); + i && e.push("text-" + n + ":" + i) + })), e.join(";") + }(c)), null != p && i.push("padding:" + np(p).join("px ") + "px"), i.join(";") + ";" + } + + function Vz(t, e, n, i, r) { + var o = e && e.painter; + if (n) { + var a = o && o.getViewportRoot(); + a && function (t, e, n, i, r) { + $t(Kt, e, i, r, !0) && $t(t, n, Kt[0], Kt[1]) + }(t, a, document.body, i, r) + } else { + t[0] = i, t[1] = r; + var s = o && o.getViewportRootOffset(); + s && (t[0] += s.offsetLeft, t[1] += s.offsetTop) + } + t[2] = t[0] / e.getWidth(), t[3] = t[1] / e.getHeight() + } + + var Bz = function () { + function t(t, e, n) { + if (this._show = !1, this._styleCoord = [0, 0, 0, 0], this._enterable = !0, this._firstShow = !0, this._longHide = !0, r.wxa) return null; + var i = document.createElement("div"); + i.domBelongToZr = !0, this.el = i; + var o = this._zr = e.getZr(), a = this._appendToBody = n && n.appendToBody; + Vz(this._styleCoord, o, a, e.getWidth() / 2, e.getHeight() / 2), a ? document.body.appendChild(i) : t.appendChild(i), this._container = t; + var s = this; + i.onmouseenter = function () { + s._enterable && (clearTimeout(s._hideTimeout), s._show = !0), s._inContent = !0 + }, i.onmousemove = function (t) { + if (t = t || window.event, !s._enterable) { + var e = o.handler; + oe(o.painter.getViewportRoot(), t, !0), e.dispatch("mousemove", t) + } + }, i.onmouseleave = function () { + s._inContent = !1, s._enterable && s._show && s.hideLater(s._hideDelay) + } + } + + return t.prototype.update = function (t) { + var e, n, i, r = this._container, + o = (n = "position", (i = (e = r).currentStyle || document.defaultView && document.defaultView.getComputedStyle(e)) ? n ? i[n] : i : null), + a = r.style; + "absolute" !== a.position && "absolute" !== o && (a.position = "relative"), t.get("alwaysShowContent") && this._moveIfResized(), this.el.className = t.get("className") || "" + }, t.prototype.show = function (t, e) { + clearTimeout(this._hideTimeout), clearTimeout(this._longHideTimeout); + var n = this.el, i = n.style, r = this._styleCoord; + n.innerHTML ? i.cssText = Nz + zz(t, !this._firstShow, this._longHide) + Ez(r[0], r[1], !0) + "border-color:" + cp(e) + ";" + (t.get("extraCssText") || "") + ";pointer-events:" + (this._enterable ? "auto" : "none") : i.display = "none", this._show = !0, this._firstShow = !1, this._longHide = !1 + }, t.prototype.setContent = function (t, e, n, i, r) { + var o = this.el; + if (null != t) { + var a = ""; + if (X(r) && "item" === n.get("trigger") && !Az(n) && (a = function (t, e, n) { + if (!X(n) || "inside" === n) return ""; + var i = t.get("backgroundColor"), r = t.get("borderWidth"); + e = cp(e); + var o, a, + s = "left" === (o = n) ? "right" : "right" === o ? "left" : "top" === o ? "bottom" : "top", + l = Math.max(1.5 * Math.round(r), 6), u = "", h = Rz + ":"; + P(["left", "right"], s) > -1 ? (u += "top:50%", h += "translateY(-50%) rotate(" + (a = "left" === s ? -225 : -45) + "deg)") : (u += "left:50%", h += "translateX(-50%) rotate(" + (a = "top" === s ? 225 : 45) + "deg)"); + var c = a * Math.PI / 180, p = l + r, d = p * Math.abs(Math.cos(c)) + p * Math.abs(Math.sin(c)), + f = e + " solid " + r + "px;"; + return '
    ' + }(n, i, r)), X(t)) o.innerHTML = t + a; else if (t) { + o.innerHTML = "", Y(t) || (t = [t]); + for (var s = 0; s < t.length; s++) J(t[s]) && t[s].parentNode !== o && o.appendChild(t[s]); + if (a && o.childNodes.length) { + var l = document.createElement("div"); + l.innerHTML = a, o.appendChild(l) + } + } + } else o.innerHTML = "" + }, t.prototype.setEnterable = function (t) { + this._enterable = t + }, t.prototype.getSize = function () { + var t = this.el; + return [t.offsetWidth, t.offsetHeight] + }, t.prototype.moveTo = function (t, e) { + var n = this._styleCoord; + if (Vz(n, this._zr, this._appendToBody, t, e), null != n[0] && null != n[1]) { + var i = this.el.style; + E(Ez(n[0], n[1]), (function (t) { + i[t[0]] = t[1] + })) + } + }, t.prototype._moveIfResized = function () { + var t = this._styleCoord[2], e = this._styleCoord[3]; + this.moveTo(t * this._zr.getWidth(), e * this._zr.getHeight()) + }, t.prototype.hide = function () { + var t = this, e = this.el.style; + e.visibility = "hidden", e.opacity = "0", r.transform3dSupported && (e.willChange = ""), this._show = !1, this._longHideTimeout = setTimeout((function () { + return t._longHide = !0 + }), 500) + }, t.prototype.hideLater = function (t) { + !this._show || this._inContent && this._enterable || (t ? (this._hideDelay = t, this._show = !1, this._hideTimeout = setTimeout(W(this.hide, this), t)) : this.hide()) + }, t.prototype.isShow = function () { + return this._show + }, t.prototype.dispose = function () { + this.el.parentNode.removeChild(this.el) + }, t + }(), Fz = function () { + function t(t) { + this._show = !1, this._styleCoord = [0, 0, 0, 0], this._enterable = !0, this._zr = t.getZr(), Hz(this._styleCoord, this._zr, t.getWidth() / 2, t.getHeight() / 2) + } + + return t.prototype.update = function (t) { + t.get("alwaysShowContent") && this._moveIfResized() + }, t.prototype.show = function () { + this._hideTimeout && clearTimeout(this._hideTimeout), this.el.show(), this._show = !0 + }, t.prototype.setContent = function (t, e, n, i, r) { + var o = this; + q(t) && ao(""), this.el && this._zr.remove(this.el); + var a = n.getModel("textStyle"); + this.el = new As({ + style: { + rich: e.richTextStyles, + text: t, + lineHeight: 22, + borderWidth: 1, + borderColor: i, + textShadowColor: a.get("textShadowColor"), + fill: n.get(["textStyle", "color"]), + padding: eg(n, "richText"), + verticalAlign: "top", + align: "left" + }, z: n.get("z") + }), E(["backgroundColor", "borderRadius", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY"], (function (t) { + o.el.style[t] = n.get(t) + })), E(["textShadowBlur", "textShadowOffsetX", "textShadowOffsetY"], (function (t) { + o.el.style[t] = a.get(t) || 0 + })), this._zr.add(this.el); + var s = this; + this.el.on("mouseover", (function () { + s._enterable && (clearTimeout(s._hideTimeout), s._show = !0), s._inContent = !0 + })), this.el.on("mouseout", (function () { + s._enterable && s._show && s.hideLater(s._hideDelay), s._inContent = !1 + })) + }, t.prototype.setEnterable = function (t) { + this._enterable = t + }, t.prototype.getSize = function () { + var t = this.el, e = this.el.getBoundingRect(), n = Wz(t.style); + return [e.width + n.left + n.right, e.height + n.top + n.bottom] + }, t.prototype.moveTo = function (t, e) { + var n = this.el; + if (n) { + var i = this._styleCoord; + Hz(i, this._zr, t, e), t = i[0], e = i[1]; + var r = n.style, o = Gz(r.borderWidth || 0), a = Wz(r); + n.x = t + o + a.left, n.y = e + o + a.top, n.markRedraw() + } + }, t.prototype._moveIfResized = function () { + var t = this._styleCoord[2], e = this._styleCoord[3]; + this.moveTo(t * this._zr.getWidth(), e * this._zr.getHeight()) + }, t.prototype.hide = function () { + this.el && this.el.hide(), this._show = !1 + }, t.prototype.hideLater = function (t) { + !this._show || this._inContent && this._enterable || (t ? (this._hideDelay = t, this._show = !1, this._hideTimeout = setTimeout(W(this.hide, this), t)) : this.hide()) + }, t.prototype.isShow = function () { + return this._show + }, t.prototype.dispose = function () { + this._zr.remove(this.el) + }, t + }(); + + function Gz(t) { + return Math.max(0, t) + } + + function Wz(t) { + var e = Gz(t.shadowBlur || 0), n = Gz(t.shadowOffsetX || 0), i = Gz(t.shadowOffsetY || 0); + return {left: Gz(e - n), right: Gz(e + n), top: Gz(e - i), bottom: Gz(e + i)} + } + + function Hz(t, e, n, i) { + t[0] = n, t[1] = i, t[2] = t[0] / e.getWidth(), t[3] = t[1] / e.getHeight() + } + + var Yz = new Ts({shape: {x: -1, y: -1, width: 2, height: 2}}), Uz = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function (t, e) { + if (!r.node && e.getDom()) { + var n, i = t.getComponent("tooltip"), + o = this._renderMode = "auto" === (n = i.get("renderMode")) ? r.domSupported ? "html" : "richText" : n || "html"; + this._tooltipContent = "richText" === o ? new Fz(e) : new Bz(e.getDom(), e, {appendToBody: i.get("appendToBody", !0)}) + } + }, e.prototype.render = function (t, e, n) { + if (!r.node && n.getDom()) { + this.group.removeAll(), this._tooltipModel = t, this._ecModel = e, this._api = n, this._alwaysShowContent = t.get("alwaysShowContent"); + var i = this._tooltipContent; + i.update(t), i.setEnterable(t.get("enterable")), this._initGlobalListener(), this._keepShow(), "richText" !== this._renderMode && t.get("transitionDuration") ? Dg(this, "_updatePosition", 50, "fixRate") : Ag(this, "_updatePosition") + } + }, e.prototype._initGlobalListener = function () { + var t = this._tooltipModel.get("triggerOn"); + qR("itemTooltip", this._api, W((function (e, n, i) { + "none" !== t && (t.indexOf(e) >= 0 ? this._tryShow(n, i) : "leave" === e && this._hide(i)) + }), this)) + }, e.prototype._keepShow = function () { + var t = this._tooltipModel, e = this._ecModel, n = this._api; + if (null != this._lastX && null != this._lastY && "none" !== t.get("triggerOn")) { + var i = this; + clearTimeout(this._refreshUpdateTimeout), this._refreshUpdateTimeout = setTimeout((function () { + !n.isDisposed() && i.manuallyShowTip(t, e, n, { + x: i._lastX, + y: i._lastY, + dataByCoordSys: i._lastDataByCoordSys + }) + })) + } + }, e.prototype.manuallyShowTip = function (t, e, n, i) { + if (i.from !== this.uid && !r.node && n.getDom()) { + var o = Zz(i, n); + this._ticket = ""; + var a = i.dataByCoordSys, s = function (t, e, n) { + var i = To(t).queryOptionMap, r = i.keys()[0]; + if (!r || "series" === r) return; + var o, a = Ao(e, r, i.get(r), {useDefault: !1, enableAll: !1, enableNone: !1}).models[0]; + if (!a) return; + if (n.getViewOfComponentModel(a).group.traverse((function (e) { + var n = Ws(e).tooltipConfig; + if (n && n.name === t.name) return o = e, !0 + })), o) return {componentMainType: r, componentIndex: a.componentIndex, el: o} + }(i, e, n); + if (s) { + var l = s.el.getBoundingRect().clone(); + l.applyTransform(s.el.transform), this._tryShow({ + offsetX: l.x + l.width / 2, + offsetY: l.y + l.height / 2, + target: s.el, + position: i.position, + positionDefault: "bottom" + }, o) + } else if (i.tooltip && null != i.x && null != i.y) { + var u = Yz; + u.x = i.x, u.y = i.y, u.update(), Ws(u).tooltipConfig = { + name: null, + option: i.tooltip + }, this._tryShow({offsetX: i.x, offsetY: i.y, target: u}, o) + } else if (a) this._tryShow({ + offsetX: i.x, + offsetY: i.y, + position: i.position, + dataByCoordSys: a, + tooltipOption: i.tooltipOption + }, o); else if (null != i.seriesIndex) { + if (this._manuallyAxisShowTip(t, e, n, i)) return; + var h = tN(i, e), c = h.point[0], p = h.point[1]; + null != c && null != p && this._tryShow({ + offsetX: c, + offsetY: p, + target: h.el, + position: i.position, + positionDefault: "bottom" + }, o) + } else null != i.x && null != i.y && (n.dispatchAction({ + type: "updateAxisPointer", + x: i.x, + y: i.y + }), this._tryShow({ + offsetX: i.x, + offsetY: i.y, + position: i.position, + target: n.getZr().findHover(i.x, i.y).target + }, o)) + } + }, e.prototype.manuallyHideTip = function (t, e, n, i) { + var r = this._tooltipContent; + !this._alwaysShowContent && this._tooltipModel && r.hideLater(this._tooltipModel.get("hideDelay")), this._lastX = this._lastY = this._lastDataByCoordSys = null, i.from !== this.uid && this._hide(Zz(i, n)) + }, e.prototype._manuallyAxisShowTip = function (t, e, n, i) { + var r = i.seriesIndex, o = i.dataIndex, a = e.getComponent("axisPointer").coordSysAxesInfo; + if (null != r && null != o && null != a) { + var s = e.getSeriesByIndex(r); + if (s) if ("axis" === Xz([s.getData().getItemModel(o), s, (s.coordinateSystem || {}).model], this._tooltipModel).get("trigger")) return n.dispatchAction({ + type: "updateAxisPointer", + seriesIndex: r, + dataIndex: o, + position: i.position + }), !0 + } + }, e.prototype._tryShow = function (t, e) { + var n = t.target; + if (this._tooltipModel) { + this._lastX = t.offsetX, this._lastY = t.offsetY; + var i = t.dataByCoordSys; + if (i && i.length) this._showAxisTooltip(i, t); else if (n) { + var r, o; + this._lastDataByCoordSys = null, my(n, (function (t) { + return null != Ws(t).dataIndex ? (r = t, !0) : null != Ws(t).tooltipConfig ? (o = t, !0) : void 0 + }), !0), r ? this._showSeriesItemTooltip(t, r, e) : o ? this._showComponentItemTooltip(t, o, e) : this._hide(e) + } else this._lastDataByCoordSys = null, this._hide(e) + } + }, e.prototype._showOrMove = function (t, e) { + var n = t.get("showDelay"); + e = W(e, this), clearTimeout(this._showTimout), n > 0 ? this._showTimout = setTimeout(e, n) : e() + }, e.prototype._showAxisTooltip = function (t, e) { + var n = this._ecModel, i = this._tooltipModel, r = [e.offsetX, e.offsetY], o = Xz([e.tooltipOption], i), + a = this._renderMode, s = [], l = Uf("section", {blocks: [], noHeader: !0}), u = [], h = new ng; + E(t, (function (t) { + E(t.dataByAxis, (function (t) { + var e = n.getComponent(t.axisDim + "Axis", t.axisIndex), r = t.value; + if (e && null != r) { + var o = ER(r, e.axis, n, t.seriesDataIndices, t.valueLabelOpt), + c = Uf("section", {header: o, noHeader: !ut(o), sortBlocks: !0, blocks: []}); + l.blocks.push(c), E(t.seriesDataIndices, (function (l) { + var p = n.getSeriesByIndex(l.seriesIndex), d = l.dataIndexInside, f = p.getDataParams(d); + if (!(f.dataIndex < 0)) { + f.axisDim = t.axisDim, f.axisIndex = t.axisIndex, f.axisType = t.axisType, f.axisId = t.axisId, f.axisValue = o_(e.axis, {value: r}), f.axisValueLabel = o, f.marker = h.makeTooltipMarker("item", cp(f.color), a); + var g = lf(p.formatTooltip(d, !0, null)), y = g.frag; + if (y) { + var v = Xz([p], i).get("valueFormatter"); + c.blocks.push(v ? A({valueFormatter: v}, y) : y) + } + g.text && u.push(g.text), s.push(f) + } + })) + } + })) + })), l.blocks.reverse(), u.reverse(); + var c = e.position, p = o.get("order"), d = $f(l, h, a, p, n.get("useUTC"), o.get("textStyle")); + d && u.unshift(d); + var f = "richText" === a ? "\n\n" : "
    ", g = u.join(f); + this._showOrMove(o, (function () { + this._updateContentNotChangedOnAxis(t, s) ? this._updatePosition(o, c, r[0], r[1], this._tooltipContent, s) : this._showTooltipContent(o, g, s, Math.random() + "", r[0], r[1], c, null, h) + })) + }, e.prototype._showSeriesItemTooltip = function (t, e, n) { + var i = this._ecModel, r = Ws(e), o = r.seriesIndex, a = i.getSeriesByIndex(o), s = r.dataModel || a, + l = r.dataIndex, u = r.dataType, h = s.getData(u), c = this._renderMode, p = t.positionDefault, + d = Xz([h.getItemModel(l), s, a && (a.coordinateSystem || {}).model], this._tooltipModel, p ? {position: p} : null), + f = d.get("trigger"); + if (null == f || "item" === f) { + var g = s.getDataParams(l, u), y = new ng; + g.marker = y.makeTooltipMarker("item", cp(g.color), c); + var v = lf(s.formatTooltip(l, !1, u)), m = d.get("order"), x = d.get("valueFormatter"), _ = v.frag, + b = _ ? $f(x ? A({valueFormatter: x}, _) : _, y, c, m, i.get("useUTC"), d.get("textStyle")) : v.text, + w = "item_" + s.name + "_" + l; + this._showOrMove(d, (function () { + this._showTooltipContent(d, b, g, w, t.offsetX, t.offsetY, t.position, t.target, y) + })), n({ + type: "showTip", + dataIndexInside: l, + dataIndex: h.getRawIndex(l), + seriesIndex: o, + from: this.uid + }) + } + }, e.prototype._showComponentItemTooltip = function (t, e, n) { + var i = Ws(e), r = i.tooltipConfig.option || {}; + if (X(r)) { + r = {content: r, formatter: r} + } + var o = [r], a = this._ecModel.getComponent(i.componentMainType, i.componentIndex); + a && o.push(a), o.push({formatter: r.content}); + var s = t.positionDefault, l = Xz(o, this._tooltipModel, s ? {position: s} : null), u = l.get("content"), + h = Math.random() + "", c = new ng; + this._showOrMove(l, (function () { + var n = T(l.get("formatterParams") || {}); + this._showTooltipContent(l, u, n, h, t.offsetX, t.offsetY, t.position, e, c) + })), n({type: "showTip", from: this.uid}) + }, e.prototype._showTooltipContent = function (t, e, n, i, r, o, a, s, l) { + if (this._ticket = "", t.get("showContent") && t.get("show")) { + var u = this._tooltipContent, h = t.get("formatter"); + a = a || t.get("position"); + var c = e, p = this._getNearestPoint([r, o], n, t.get("trigger"), t.get("borderColor")).color; + if (h) if (X(h)) { + var d = t.ecModel.get("useUTC"), f = Y(n) ? n[0] : n; + c = h, f && f.axisType && f.axisType.indexOf("time") >= 0 && (c = zc(f.axisValue, c, d)), c = up(c, n, !0) + } else if (U(h)) { + var g = W((function (e, i) { + e === this._ticket && (u.setContent(i, l, t, p, a), this._updatePosition(t, a, r, o, u, n, s)) + }), this); + this._ticket = i, c = h(n, i, g) + } else c = h; + u.setContent(c, l, t, p, a), u.show(t, p), this._updatePosition(t, a, r, o, u, n, s) + } + }, e.prototype._getNearestPoint = function (t, e, n, i) { + return "axis" === n || Y(e) ? {color: i || ("html" === this._renderMode ? "#fff" : "none")} : Y(e) ? void 0 : {color: i || e.color || e.borderColor} + }, e.prototype._updatePosition = function (t, e, n, i, r, o, a) { + var s = this._api.getWidth(), l = this._api.getHeight(); + e = e || t.get("position"); + var u = r.getSize(), h = t.get("align"), c = t.get("verticalAlign"), p = a && a.getBoundingRect().clone(); + if (a && p.applyTransform(a.transform), U(e) && (e = e([n, i], o, r.el, p, { + viewSize: [s, l], + contentSize: u.slice() + })), Y(e)) n = Er(e[0], s), i = Er(e[1], l); else if (q(e)) { + var d = e; + d.width = u[0], d.height = u[1]; + var f = mp(d, {width: s, height: l}); + n = f.x, i = f.y, h = null, c = null + } else if (X(e) && a) { + var g = function (t, e, n, i) { + var r = n[0], o = n[1], a = Math.ceil(Math.SQRT2 * i) + 8, s = 0, l = 0, u = e.width, h = e.height; + switch (t) { + case"inside": + s = e.x + u / 2 - r / 2, l = e.y + h / 2 - o / 2; + break; + case"top": + s = e.x + u / 2 - r / 2, l = e.y - o - a; + break; + case"bottom": + s = e.x + u / 2 - r / 2, l = e.y + h + a; + break; + case"left": + s = e.x - r - a, l = e.y + h / 2 - o / 2; + break; + case"right": + s = e.x + u + a, l = e.y + h / 2 - o / 2 + } + return [s, l] + }(e, p, u, t.get("borderWidth")); + n = g[0], i = g[1] + } else { + g = function (t, e, n, i, r, o, a) { + var s = n.getSize(), l = s[0], u = s[1]; + null != o && (t + l + o + 2 > i ? t -= l + o : t += o); + null != a && (e + u + a > r ? e -= u + a : e += a); + return [t, e] + }(n, i, r, s, l, h ? null : 20, c ? null : 20); + n = g[0], i = g[1] + } + if (h && (n -= jz(h) ? u[0] / 2 : "right" === h ? u[0] : 0), c && (i -= jz(c) ? u[1] / 2 : "bottom" === c ? u[1] : 0), Az(t)) { + g = function (t, e, n, i, r) { + var o = n.getSize(), a = o[0], s = o[1]; + return t = Math.min(t + a, i) - a, e = Math.min(e + s, r) - s, t = Math.max(t, 0), e = Math.max(e, 0), [t, e] + }(n, i, r, s, l); + n = g[0], i = g[1] + } + r.moveTo(n, i) + }, e.prototype._updateContentNotChangedOnAxis = function (t, e) { + var n = this._lastDataByCoordSys, i = this._cbParamsList, r = !!n && n.length === t.length; + return r && E(n, (function (n, o) { + var a = n.dataByAxis || [], s = (t[o] || {}).dataByAxis || []; + (r = r && a.length === s.length) && E(a, (function (t, n) { + var o = s[n] || {}, a = t.seriesDataIndices || [], l = o.seriesDataIndices || []; + (r = r && t.value === o.value && t.axisType === o.axisType && t.axisId === o.axisId && a.length === l.length) && E(a, (function (t, e) { + var n = l[e]; + r = r && t.seriesIndex === n.seriesIndex && t.dataIndex === n.dataIndex + })), i && E(t.seriesDataIndices, (function (t) { + var n = t.seriesIndex, o = e[n], a = i[n]; + o && a && a.data !== o.data && (r = !1) + })) + })) + })), this._lastDataByCoordSys = t, this._cbParamsList = e, !!r + }, e.prototype._hide = function (t) { + this._lastDataByCoordSys = null, t({type: "hideTip", from: this.uid}) + }, e.prototype.dispose = function (t, e) { + !r.node && e.getDom() && (Ag(this, "_updatePosition"), this._tooltipContent.dispose(), JR("itemTooltip", e)) + }, e.type = "tooltip", e + }(fg); + + function Xz(t, e, n) { + var i, r = e.ecModel; + n ? (i = new pc(n, r, r), i = new pc(e.option, i, r)) : i = e; + for (var o = t.length - 1; o >= 0; o--) { + var a = t[o]; + a && (a instanceof pc && (a = a.get("tooltip", !0)), X(a) && (a = {formatter: a}), a && (i = new pc(a, i, r))) + } + return i + } + + function Zz(t, e) { + return t.dispatchAction || W(e.dispatchAction, e) + } + + function jz(t) { + return "center" === t || "middle" === t + } + + var qz = ["rect", "polygon", "keep", "clear"]; + + function Kz(t, e) { + var n = ho(t ? t.brush : []); + if (n.length) { + var i = []; + E(n, (function (t) { + var e = t.hasOwnProperty("toolbox") ? t.toolbox : []; + e instanceof Array && (i = i.concat(e)) + })); + var r = t && t.toolbox; + Y(r) && (r = r[0]), r || (r = {feature: {}}, t.toolbox = [r]); + var o = r.feature || (r.feature = {}), a = o.brush || (o.brush = {}), s = a.type || (a.type = []); + s.push.apply(s, i), function (t) { + var e = {}; + E(t, (function (t) { + e[t] = 1 + })), t.length = 0, E(e, (function (e, n) { + t.push(n) + })) + }(s), e && !s.length && s.push.apply(s, qz) + } + } + + var $z = E; + + function Jz(t) { + if (t) for (var e in t) if (t.hasOwnProperty(e)) return !0 + } + + function Qz(t, e, n) { + var i = {}; + return $z(e, (function (e) { + var r, o = i[e] = ((r = function () { + }).prototype.__hidden = r.prototype, new r); + $z(t[e], (function (t, i) { + if (eD.isValidType(i)) { + var r = {type: i, visual: t}; + n && n(r, e), o[i] = new eD(r), "opacity" === i && ((r = T(r)).type = "colorAlpha", o.__hidden.__alphaForOpacity = new eD(r)) + } + })) + })), i + } + + function tV(t, e, n) { + var i; + E(n, (function (t) { + e.hasOwnProperty(t) && Jz(e[t]) && (i = !0) + })), i && E(n, (function (n) { + e.hasOwnProperty(n) && Jz(e[n]) ? t[n] = T(e[n]) : delete t[n] + })) + } + + var eV = { + lineX: nV(0), lineY: nV(1), rect: { + point: function (t, e, n) { + return t && n.boundingRect.contain(t[0], t[1]) + }, rect: function (t, e, n) { + return t && n.boundingRect.intersect(t) + } + }, polygon: { + point: function (t, e, n) { + return t && n.boundingRect.contain(t[0], t[1]) && f_(n.range, t[0], t[1]) + }, rect: function (t, e, n) { + var i = n.range; + if (!t || i.length <= 1) return !1; + var r = t.x, o = t.y, a = t.width, s = t.height, l = i[0]; + return !!(f_(i, r, o) || f_(i, r + a, o) || f_(i, r, o + s) || f_(i, r + a, o + s) || sr.create(t).contain(l[0], l[1]) || Ph(r, o, r + a, o, i) || Ph(r, o, r, o + s, i) || Ph(r + a, o, r + a, o + s, i) || Ph(r, o + s, r + a, o + s, i)) || void 0 + } + } + }; + + function nV(t) { + var e = ["x", "y"], n = ["width", "height"]; + return { + point: function (e, n, i) { + if (e) { + var r = i.range; + return iV(e[t], r) + } + }, rect: function (i, r, o) { + if (i) { + var a = o.range, s = [i[e[t]], i[e[t]] + i[n[t]]]; + return s[1] < s[0] && s.reverse(), iV(s[0], a) || iV(s[1], a) || iV(a[0], s) || iV(a[1], s) + } + } + } + } + + function iV(t, e) { + return e[0] <= t && t <= e[1] + } + + var rV = ["inBrush", "outOfBrush"], oV = "__ecBrushSelect", aV = "__ecInBrushSelectEvent"; + + function sV(t) { + t.eachComponent({mainType: "brush"}, (function (e) { + (e.brushTargetManager = new hz(e.option, t)).setInputRanges(e.areas, t) + })) + } + + function lV(t, e, n) { + var i, r, o = []; + t.eachComponent({mainType: "brush"}, (function (t) { + n && "takeGlobalCursor" === n.type && t.setBrushOption("brush" === n.key ? n.brushOption : {brushType: !1}) + })), sV(t), t.eachComponent({mainType: "brush"}, (function (e, n) { + var a = {brushId: e.id, brushIndex: n, brushName: e.name, areas: T(e.areas), selected: []}; + o.push(a); + var s = e.option, l = s.brushLink, u = [], h = [], c = [], p = !1; + n || (i = s.throttleType, r = s.throttleDelay); + var d = z(e.areas, (function (t) { + var e = cV[t.brushType], n = k({boundingRect: e ? e(t) : void 0}, t); + return n.selectors = function (t) { + var e = t.brushType, n = { + point: function (i) { + return eV[e].point(i, n, t) + }, rect: function (i) { + return eV[e].rect(i, n, t) + } + }; + return n + }(n), n + })), f = Qz(e.option, rV, (function (t) { + t.mappingMethod = "fixed" + })); + + function g(t) { + return "all" === l || !!u[t] + } + + function y(t) { + return !!t.length + } + + Y(l) && E(l, (function (t) { + u[t] = 1 + })), t.eachSeries((function (n, i) { + var r = c[i] = []; + "parallel" === n.subType ? function (t, e) { + var n = t.coordinateSystem; + p = p || n.hasAxisBrushed(), g(e) && n.eachActiveState(t.getData(), (function (t, e) { + "active" === t && (h[e] = 1) + })) + }(n, i) : function (n, i, r) { + if (!n.brushSelector || function (t, e) { + var n = t.option.seriesIndex; + return null != n && "all" !== n && (Y(n) ? P(n, e) < 0 : e !== n) + }(e, i)) return; + if (E(d, (function (i) { + e.brushTargetManager.controlSeries(i, n, t) && r.push(i), p = p || y(r) + })), g(i) && y(r)) { + var o = n.getData(); + o.each((function (t) { + hV(n, r, o, t) && (h[t] = 1) + })) + } + }(n, i, r) + })), t.eachSeries((function (t, e) { + var n = {seriesId: t.id, seriesIndex: e, seriesName: t.name, dataIndex: []}; + a.selected.push(n); + var i = c[e], r = t.getData(), o = g(e) ? function (t) { + return h[t] ? (n.dataIndex.push(r.getRawIndex(t)), "inBrush") : "outOfBrush" + } : function (e) { + return hV(t, i, r, e) ? (n.dataIndex.push(r.getRawIndex(e)), "inBrush") : "outOfBrush" + }; + (g(e) ? p : y(i)) && function (t, e, n, i, r, o) { + var a, s = {}; + + function l(t) { + return dy(n, a, t) + } + + function u(t, e) { + gy(n, a, t, e) + } + + function h(t, h) { + a = null == o ? t : h; + var c = n.getRawDataItem(a); + if (!c || !1 !== c.visualMap) for (var p = i.call(r, t), d = e[p], f = s[p], g = 0, y = f.length; g < y; g++) { + var v = f[g]; + d[v] && d[v].applyVisual(t, l, u) + } + } + + E(t, (function (t) { + var n = eD.prepareVisualTypes(e[t]); + s[t] = n + })), null == o ? n.each(h) : n.each([o], h) + }(rV, f, r, o) + })) + })), function (t, e, n, i, r) { + if (!r) return; + var o = t.getZr(); + if (o[aV]) return; + o.__ecBrushSelect || (o.__ecBrushSelect = uV); + Dg(o, oV, n, e)(t, i) + }(e, i, r, o, n) + } + + function uV(t, e) { + if (!t.isDisposed()) { + var n = t.getZr(); + n[aV] = !0, t.dispatchAction({type: "brushSelect", batch: e}), n[aV] = !1 + } + } + + function hV(t, e, n, i) { + for (var r = 0, o = e.length; r < o; r++) { + var a = e[r]; + if (t.brushSelector(i, n, a.selectors, a)) return !0 + } + } + + var cV = { + rect: function (t) { + return pV(t.range) + }, polygon: function (t) { + for (var e, n = t.range, i = 0, r = n.length; i < r; i++) { + e = e || [[1 / 0, -1 / 0], [1 / 0, -1 / 0]]; + var o = n[i]; + o[0] < e[0][0] && (e[0][0] = o[0]), o[0] > e[0][1] && (e[0][1] = o[0]), o[1] < e[1][0] && (e[1][0] = o[1]), o[1] > e[1][1] && (e[1][1] = o[1]) + } + return e && pV(e) + } + }; + + function pV(t) { + return new sr(t[0][0], t[1][0], t[0][1] - t[0][0], t[1][1] - t[1][0]) + } + + var dV = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function (t, e) { + this.ecModel = t, this.api = e, this.model, (this._brushController = new Pk(e.getZr())).on("brush", W(this._onBrush, this)).mount() + }, e.prototype.render = function (t, e, n, i) { + this.model = t, this._updateController(t, e, n, i) + }, e.prototype.updateTransform = function (t, e, n, i) { + sV(e), this._updateController(t, e, n, i) + }, e.prototype.updateVisual = function (t, e, n, i) { + this.updateTransform(t, e, n, i) + }, e.prototype.updateView = function (t, e, n, i) { + this._updateController(t, e, n, i) + }, e.prototype._updateController = function (t, e, n, i) { + (!i || i.$from !== t.id) && this._brushController.setPanels(t.brushTargetManager.makePanelOpts(n)).enableBrush(t.brushOption).updateCovers(t.areas.slice()) + }, e.prototype.dispose = function () { + this._brushController.dispose() + }, e.prototype._onBrush = function (t) { + var e = this.model.id, n = this.model.brushTargetManager.setOutputRanges(t.areas, this.ecModel); + (!t.isEnd || t.removeOnClick) && this.api.dispatchAction({ + type: "brush", + brushId: e, + areas: T(n), + $from: e + }), t.isEnd && this.api.dispatchAction({type: "brushEnd", brushId: e, areas: T(n), $from: e}) + }, e.type = "brush", e + }(fg), fV = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.areas = [], n.brushOption = {}, n + } + + return n(e, t), e.prototype.optionUpdated = function (t, e) { + var n = this.option; + !e && tV(n, t, ["inBrush", "outOfBrush"]); + var i = n.inBrush = n.inBrush || {}; + n.outOfBrush = n.outOfBrush || {color: "#ddd"}, i.hasOwnProperty("liftZ") || (i.liftZ = 5) + }, e.prototype.setAreas = function (t) { + t && (this.areas = z(t, (function (t) { + return gV(this.option, t) + }), this)) + }, e.prototype.setBrushOption = function (t) { + this.brushOption = gV(this.option, t), this.brushType = this.brushOption.brushType + }, e.type = "brush", e.dependencies = ["geo", "grid", "xAxis", "yAxis", "parallel", "series"], e.defaultOption = { + seriesIndex: "all", + brushType: "rect", + brushMode: "single", + transformable: !0, + brushStyle: {borderWidth: 1, color: "rgba(210,219,238,0.3)", borderColor: "#D2DBEE"}, + throttleType: "fixRate", + throttleDelay: 0, + removeOnClick: !0, + z: 1e4 + }, e + }(Ip); + + function gV(t, e) { + return C({ + brushType: t.brushType, + brushMode: t.brushMode, + transformable: t.transformable, + brushStyle: new pc(t.brushStyle).getItemStyle(), + removeOnClick: t.removeOnClick, + z: t.z + }, e, !0) + } + + var yV = ["rect", "polygon", "lineX", "lineY", "keep", "clear"], vV = function (t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + + return n(e, t), e.prototype.render = function (t, e, n) { + var i, r, o; + e.eachComponent({mainType: "brush"}, (function (t) { + i = t.brushType, r = t.brushOption.brushMode || "single", o = o || !!t.areas.length + })), this._brushType = i, this._brushMode = r, E(t.get("type", !0), (function (e) { + t.setIconStatus(e, ("keep" === e ? "multiple" === r : "clear" === e ? o : e === i) ? "emphasis" : "normal") + })) + }, e.prototype.updateView = function (t, e, n) { + this.render(t, e, n) + }, e.prototype.getIcons = function () { + var t = this.model, e = t.get("icon", !0), n = {}; + return E(t.get("type", !0), (function (t) { + e[t] && (n[t] = e[t]) + })), n + }, e.prototype.onclick = function (t, e, n) { + var i = this._brushType, r = this._brushMode; + "clear" === n ? (e.dispatchAction({type: "axisAreaSelect", intervals: []}), e.dispatchAction({ + type: "brush", + command: "clear", + areas: [] + })) : e.dispatchAction({ + type: "takeGlobalCursor", + key: "brush", + brushOption: { + brushType: "keep" === n ? i : i !== n && n, + brushMode: "keep" === n ? "multiple" === r ? "single" : "multiple" : r + } + }) + }, e.getDefaultOption = function (t) { + return { + show: !0, type: yV.slice(), icon: { + rect: "M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13", + polygon: "M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2", + lineX: "M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4", + lineY: "M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4", + keep: "M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z", + clear: "M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2" + }, title: t.getLocaleModel().get(["toolbox", "brush", "title"]) + } + }, e + }(FE); + var mV = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.layoutMode = {type: "box", ignoreSize: !0}, n + } + + return n(e, t), e.type = "title", e.defaultOption = { + z: 6, + show: !0, + text: "", + target: "blank", + subtext: "", + subtarget: "blank", + left: 0, + top: 0, + backgroundColor: "rgba(0,0,0,0)", + borderColor: "#ccc", + borderWidth: 0, + padding: 5, + itemGap: 10, + textStyle: {fontSize: 18, fontWeight: "bold", color: "#464646"}, + subtextStyle: {fontSize: 12, color: "#6E7079"} + }, e + }(Ip), xV = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.render = function (t, e, n) { + if (this.group.removeAll(), t.get("show")) { + var i = this.group, r = t.getModel("textStyle"), o = t.getModel("subtextStyle"), a = t.get("textAlign"), + s = rt(t.get("textBaseline"), t.get("textVerticalAlign")), + l = new As({style: Yh(r, {text: t.get("text"), fill: r.getTextColor()}, {disableBox: !0}), z2: 10}), + u = l.getBoundingRect(), h = t.get("subtext"), c = new As({ + style: Yh(o, { + text: h, + fill: o.getTextColor(), + y: u.height + t.get("itemGap"), + verticalAlign: "top" + }, {disableBox: !0}), z2: 10 + }), p = t.get("link"), d = t.get("sublink"), f = t.get("triggerEvent", !0); + l.silent = !p && !f, c.silent = !d && !f, p && l.on("click", (function () { + pp(p, "_" + t.get("target")) + })), d && c.on("click", (function () { + pp(d, "_" + t.get("subtarget")) + })), Ws(l).eventData = Ws(c).eventData = f ? { + componentType: "title", + componentIndex: t.componentIndex + } : null, i.add(l), h && i.add(c); + var g = i.getBoundingRect(), y = t.getBoxLayoutParams(); + y.width = g.width, y.height = g.height; + var v = mp(y, {width: n.getWidth(), height: n.getHeight()}, t.get("padding")); + a || ("middle" === (a = t.get("left") || t.get("right")) && (a = "center"), "right" === a ? v.x += v.width : "center" === a && (v.x += v.width / 2)), s || ("center" === (s = t.get("top") || t.get("bottom")) && (s = "middle"), "bottom" === s ? v.y += v.height : "middle" === s && (v.y += v.height / 2), s = s || "top"), i.x = v.x, i.y = v.y, i.markRedraw(); + var m = {align: a, verticalAlign: s}; + l.setStyle(m), c.setStyle(m), g = i.getBoundingRect(); + var x = v.margin, _ = t.getItemStyle(["color", "opacity"]); + _.fill = t.get("backgroundColor"); + var b = new Ts({ + shape: { + x: g.x - x[3], + y: g.y - x[0], + width: g.width + x[1] + x[3], + height: g.height + x[0] + x[2], + r: t.get("borderRadius") + }, style: _, subPixelOptimize: !0, silent: !0 + }); + i.add(b) + } + }, e.type = "title", e + }(fg); + var _V = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.layoutMode = "box", n + } + + return n(e, t), e.prototype.init = function (t, e, n) { + this.mergeDefaultAndTheme(t, n), this._initData() + }, e.prototype.mergeOption = function (e) { + t.prototype.mergeOption.apply(this, arguments), this._initData() + }, e.prototype.setCurrentIndex = function (t) { + null == t && (t = this.option.currentIndex); + var e = this._data.count(); + this.option.loop ? t = (t % e + e) % e : (t >= e && (t = e - 1), t < 0 && (t = 0)), this.option.currentIndex = t + }, e.prototype.getCurrentIndex = function () { + return this.option.currentIndex + }, e.prototype.isIndexMax = function () { + return this.getCurrentIndex() >= this._data.count() - 1 + }, e.prototype.setPlayState = function (t) { + this.option.autoPlay = !!t + }, e.prototype.getPlayState = function () { + return !!this.option.autoPlay + }, e.prototype._initData = function () { + var t, e = this.option, n = e.data || [], i = e.axisType, r = this._names = []; + "category" === i ? (t = [], E(n, (function (e, n) { + var i, o = xo(fo(e), ""); + q(e) ? (i = T(e)).value = n : i = n, t.push(i), r.push(o) + }))) : t = n; + var o = {category: "ordinal", time: "time", value: "number"}[i] || "number"; + (this._data = new Zm([{name: "value", type: o}], this)).initData(t, r) + }, e.prototype.getData = function () { + return this._data + }, e.prototype.getCategories = function () { + if ("category" === this.get("axisType")) return this._names.slice() + }, e.type = "timeline", e.defaultOption = { + z: 4, + show: !0, + axisType: "time", + realtime: !0, + left: "20%", + top: null, + right: "20%", + bottom: 0, + width: null, + height: 40, + padding: 5, + controlPosition: "left", + autoPlay: !1, + rewind: !1, + loop: !0, + playInterval: 2e3, + currentIndex: 0, + itemStyle: {}, + label: {color: "#000"}, + data: [] + }, e + }(Ip), bV = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "timeline.slider", e.defaultOption = gc(_V.defaultOption, { + backgroundColor: "rgba(0,0,0,0)", + borderColor: "#ccc", + borderWidth: 0, + orient: "horizontal", + inverse: !1, + tooltip: {trigger: "item"}, + symbol: "circle", + symbolSize: 12, + lineStyle: {show: !0, width: 2, color: "#DAE1F5"}, + label: {position: "auto", show: !0, interval: "auto", rotate: 0, color: "#A4B1D7"}, + itemStyle: {color: "#A4B1D7", borderWidth: 1}, + checkpointStyle: { + symbol: "circle", + symbolSize: 15, + color: "#316bf3", + borderColor: "#fff", + borderWidth: 2, + shadowBlur: 2, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: "rgba(0, 0, 0, 0.3)", + animation: !0, + animationDuration: 300, + animationEasing: "quinticInOut" + }, + controlStyle: { + show: !0, + showPlayBtn: !0, + showPrevBtn: !0, + showNextBtn: !0, + itemSize: 24, + itemGap: 12, + position: "left", + playIcon: "path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z", + stopIcon: "path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z", + nextIcon: "M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z", + prevIcon: "M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z", + prevBtnSize: 18, + nextBtnSize: 18, + color: "#A4B1D7", + borderColor: "#A4B1D7", + borderWidth: 1 + }, + emphasis: { + label: {show: !0, color: "#6f778d"}, + itemStyle: {color: "#316BF3"}, + controlStyle: {color: "#316BF3", borderColor: "#316BF3", borderWidth: 2} + }, + progress: {lineStyle: {color: "#316BF3"}, itemStyle: {color: "#316BF3"}, label: {color: "#6f778d"}}, + data: [] + }), e + }(_V); + R(bV, sf.prototype); + var wV = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "timeline", e + }(fg), SV = function (t) { + function e(e, n, i, r) { + var o = t.call(this, e, n, i) || this; + return o.type = r || "value", o + } + + return n(e, t), e.prototype.getLabelModel = function () { + return this.model.getModel("label") + }, e.prototype.isHorizontal = function () { + return "horizontal" === this.model.get("orient") + }, e + }(G_), MV = Math.PI, IV = So(), TV = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function (t, e) { + this.api = e + }, e.prototype.render = function (t, e, n) { + if (this.model = t, this.api = n, this.ecModel = e, this.group.removeAll(), t.get("show", !0)) { + var i = this._layout(t, n), r = this._createGroup("_mainGroup"), o = this._createGroup("_labelGroup"), + a = this._axis = this._createAxis(i, t); + t.formatTooltip = function (t) { + return Uf("nameValue", {noName: !0, value: a.scale.getLabel({value: t})}) + }, E(["AxisLine", "AxisTick", "Control", "CurrentPointer"], (function (e) { + this["_render" + e](i, r, a, t) + }), this), this._renderAxisLabel(i, o, a, t), this._position(i, t) + } + this._doPlayStop(), this._updateTicksStatus() + }, e.prototype.remove = function () { + this._clearTimer(), this.group.removeAll() + }, e.prototype.dispose = function () { + this._clearTimer() + }, e.prototype._layout = function (t, e) { + var n, i, r, o, a = t.get(["label", "position"]), s = t.get("orient"), l = function (t, e) { + return mp(t.getBoxLayoutParams(), {width: e.getWidth(), height: e.getHeight()}, t.get("padding")) + }(t, e), u = { + horizontal: "center", + vertical: (n = null == a || "auto" === a ? "horizontal" === s ? l.y + l.height / 2 < e.getHeight() / 2 ? "-" : "+" : l.x + l.width / 2 < e.getWidth() / 2 ? "+" : "-" : X(a) ? { + horizontal: { + top: "-", + bottom: "+" + }, vertical: {left: "-", right: "+"} + }[s][a] : a) >= 0 || "+" === n ? "left" : "right" + }, h = {horizontal: n >= 0 || "+" === n ? "top" : "bottom", vertical: "middle"}, + c = {horizontal: 0, vertical: MV / 2}, p = "vertical" === s ? l.height : l.width, + d = t.getModel("controlStyle"), f = d.get("show", !0), g = f ? d.get("itemSize") : 0, + y = f ? d.get("itemGap") : 0, v = g + y, m = t.get(["label", "rotate"]) || 0; + m = m * MV / 180; + var x = d.get("position", !0), _ = f && d.get("showPlayBtn", !0), b = f && d.get("showPrevBtn", !0), + w = f && d.get("showNextBtn", !0), S = 0, M = p; + "left" === x || "bottom" === x ? (_ && (i = [0, 0], S += v), b && (r = [S, 0], S += v), w && (o = [M - g, 0], M -= v)) : (_ && (i = [M - g, 0], M -= v), b && (r = [0, 0], S += v), w && (o = [M - g, 0], M -= v)); + var I = [S, M]; + return t.get("inverse") && I.reverse(), { + viewRect: l, + mainLength: p, + orient: s, + rotation: c[s], + labelRotation: m, + labelPosOpt: n, + labelAlign: t.get(["label", "align"]) || u[s], + labelBaseline: t.get(["label", "verticalAlign"]) || t.get(["label", "baseline"]) || h[s], + playPosition: i, + prevBtnPosition: r, + nextBtnPosition: o, + axisExtent: I, + controlSize: g, + controlGap: y + } + }, e.prototype._position = function (t, e) { + var n = this._mainGroup, i = this._labelGroup, r = t.viewRect; + if ("vertical" === t.orient) { + var o = [1, 0, 0, 1, 0, 0], a = r.x, s = r.y + r.height; + Ei(o, o, [-a, -s]), zi(o, o, -MV / 2), Ei(o, o, [a, s]), (r = r.clone()).applyTransform(o) + } + var l = y(r), u = y(n.getBoundingRect()), h = y(i.getBoundingRect()), c = [n.x, n.y], p = [i.x, i.y]; + p[0] = c[0] = l[0][0]; + var d, f = t.labelPosOpt; + null == f || X(f) ? (v(c, u, l, 1, d = "+" === f ? 0 : 1), v(p, h, l, 1, 1 - d)) : (v(c, u, l, 1, d = f >= 0 ? 0 : 1), p[1] = c[1] + f); + + function g(t) { + t.originX = l[0][0] - t.x, t.originY = l[1][0] - t.y + } + + function y(t) { + return [[t.x, t.x + t.width], [t.y, t.y + t.height]] + } + + function v(t, e, n, i, r) { + t[i] += n[i][r] - e[i][r] + } + + n.setPosition(c), i.setPosition(p), n.rotation = i.rotation = t.rotation, g(n), g(i) + }, e.prototype._createAxis = function (t, e) { + var n = e.getData(), i = e.get("axisType"), r = function (t, e) { + if (e = e || t.get("type")) switch (e) { + case"category": + return new gx({ordinalMeta: t.getCategories(), extent: [1 / 0, -1 / 0]}); + case"time": + return new Px({locale: t.ecModel.getLocaleModel(), useUTC: t.ecModel.get("useUTC")}); + default: + return new vx + } + }(e, i); + r.getTicks = function () { + return n.mapArray(["value"], (function (t) { + return {value: t} + })) + }; + var o = n.getDataExtent("value"); + r.setExtent(o[0], o[1]), r.calcNiceTicks(); + var a = new SV("value", r, t.axisExtent, i); + return a.model = e, a + }, e.prototype._createGroup = function (t) { + var e = this[t] = new Cr; + return this.group.add(e), e + }, e.prototype._renderAxisLine = function (t, e, n, i) { + var r = n.getExtent(); + if (i.get(["lineStyle", "show"])) { + var o = new Eu({ + shape: {x1: r[0], y1: 0, x2: r[1], y2: 0}, + style: A({lineCap: "round"}, i.getModel("lineStyle").getLineStyle()), + silent: !0, + z2: 1 + }); + e.add(o); + var a = this._progressLine = new Eu({ + shape: { + x1: r[0], + x2: this._currentPointer ? this._currentPointer.x : r[0], + y1: 0, + y2: 0 + }, + style: k({ + lineCap: "round", + lineWidth: o.style.lineWidth + }, i.getModel(["progress", "lineStyle"]).getLineStyle()), + silent: !0, + z2: 1 + }); + e.add(a) + } + }, e.prototype._renderAxisTick = function (t, e, n, i) { + var r = this, o = i.getData(), a = n.scale.getTicks(); + this._tickSymbols = [], E(a, (function (t) { + var a = n.dataToCoord(t.value), s = o.getItemModel(t.value), l = s.getModel("itemStyle"), + u = s.getModel(["emphasis", "itemStyle"]), h = s.getModel(["progress", "itemStyle"]), + c = {x: a, y: 0, onclick: W(r._changeTimeline, r, t.value)}, p = CV(s, l, e, c); + p.ensureState("emphasis").style = u.getItemStyle(), p.ensureState("progress").style = h.getItemStyle(), Pl(p); + var d = Ws(p); + s.get("tooltip") ? (d.dataIndex = t.value, d.dataModel = i) : d.dataIndex = d.dataModel = null, r._tickSymbols.push(p) + })) + }, e.prototype._renderAxisLabel = function (t, e, n, i) { + var r = this; + if (n.getLabelModel().get("show")) { + var o = i.getData(), a = n.getViewLabels(); + this._tickLabels = [], E(a, (function (i) { + var a = i.tickValue, s = o.getItemModel(a), l = s.getModel("label"), + u = s.getModel(["emphasis", "label"]), h = s.getModel(["progress", "label"]), + c = n.dataToCoord(i.tickValue), p = new As({ + x: c, + y: 0, + rotation: t.labelRotation - t.rotation, + onclick: W(r._changeTimeline, r, a), + silent: !1, + style: Yh(l, {text: i.formattedLabel, align: t.labelAlign, verticalAlign: t.labelBaseline}) + }); + p.ensureState("emphasis").style = Yh(u), p.ensureState("progress").style = Yh(h), e.add(p), Pl(p), IV(p).dataIndex = a, r._tickLabels.push(p) + })) + } + }, e.prototype._renderControl = function (t, e, n, i) { + var r = t.controlSize, o = t.rotation, a = i.getModel("controlStyle").getItemStyle(), + s = i.getModel(["emphasis", "controlStyle"]).getItemStyle(), l = i.getPlayState(), + u = i.get("inverse", !0); + + function h(t, n, l, u) { + if (t) { + var h = gr(rt(i.get(["controlStyle", n + "BtnSize"]), r), r), c = function (t, e, n, i) { + var r = i.style, o = Lh(t.get(["controlStyle", e]), i || {}, new sr(n[0], n[1], n[2], n[3])); + r && o.setStyle(r); + return o + }(i, n + "Icon", [0, -h / 2, h, h], { + x: t[0], + y: t[1], + originX: r / 2, + originY: 0, + rotation: u ? -o : 0, + rectHover: !0, + style: a, + onclick: l + }); + c.ensureState("emphasis").style = s, e.add(c), Pl(c) + } + } + + h(t.nextBtnPosition, "next", W(this._changeTimeline, this, u ? "-" : "+")), h(t.prevBtnPosition, "prev", W(this._changeTimeline, this, u ? "+" : "-")), h(t.playPosition, l ? "stop" : "play", W(this._handlePlayClick, this, !l), !0) + }, e.prototype._renderCurrentPointer = function (t, e, n, i) { + var r = i.getData(), o = i.getCurrentIndex(), a = r.getItemModel(o).getModel("checkpointStyle"), s = this, + l = { + onCreate: function (t) { + t.draggable = !0, t.drift = W(s._handlePointerDrag, s), t.ondragend = W(s._handlePointerDragend, s), DV(t, s._progressLine, o, n, i, !0) + }, onUpdate: function (t) { + DV(t, s._progressLine, o, n, i) + } + }; + this._currentPointer = CV(a, a, this._mainGroup, {}, this._currentPointer, l) + }, e.prototype._handlePlayClick = function (t) { + this._clearTimer(), this.api.dispatchAction({type: "timelinePlayChange", playState: t, from: this.uid}) + }, e.prototype._handlePointerDrag = function (t, e, n) { + this._clearTimer(), this._pointerChangeTimeline([n.offsetX, n.offsetY]) + }, e.prototype._handlePointerDragend = function (t) { + this._pointerChangeTimeline([t.offsetX, t.offsetY], !0) + }, e.prototype._pointerChangeTimeline = function (t, e) { + var n = this._toAxisCoord(t)[0], i = Vr(this._axis.getExtent().slice()); + n > i[1] && (n = i[1]), n < i[0] && (n = i[0]), this._currentPointer.x = n, this._currentPointer.markRedraw(), this._progressLine.shape.x2 = n, this._progressLine.dirty(); + var r = this._findNearestTick(n), o = this.model; + (e || r !== o.getCurrentIndex() && o.get("realtime")) && this._changeTimeline(r) + }, e.prototype._doPlayStop = function () { + var t = this; + this._clearTimer(), this.model.getPlayState() && (this._timer = setTimeout((function () { + var e = t.model; + t._changeTimeline(e.getCurrentIndex() + (e.get("rewind", !0) ? -1 : 1)) + }), this.model.get("playInterval"))) + }, e.prototype._toAxisCoord = function (t) { + return Ih(t, this._mainGroup.getLocalTransform(), !0) + }, e.prototype._findNearestTick = function (t) { + var e, n = this.model.getData(), i = 1 / 0, r = this._axis; + return n.each(["value"], (function (n, o) { + var a = r.dataToCoord(n), s = Math.abs(a - t); + s < i && (i = s, e = o) + })), e + }, e.prototype._clearTimer = function () { + this._timer && (clearTimeout(this._timer), this._timer = null) + }, e.prototype._changeTimeline = function (t) { + var e = this.model.getCurrentIndex(); + "+" === t ? t = e + 1 : "-" === t && (t = e - 1), this.api.dispatchAction({ + type: "timelineChange", + currentIndex: t, + from: this.uid + }) + }, e.prototype._updateTicksStatus = function () { + var t = this.model.getCurrentIndex(), e = this._tickSymbols, n = this._tickLabels; + if (e) for (var i = 0; i < e.length; i++) e && e[i] && e[i].toggleState("progress", i < t); + if (n) for (i = 0; i < n.length; i++) n && n[i] && n[i].toggleState("progress", IV(n[i]).dataIndex <= t) + }, e.type = "timeline.slider", e + }(wV); + + function CV(t, e, n, i, r, o) { + var a = e.get("color"); + r ? (r.setColor(a), n.add(r), o && o.onUpdate(r)) : ((r = ky(t.get("symbol"), -1, -1, 2, 2, a)).setStyle("strokeNoScale", !0), n.add(r), o && o.onCreate(r)); + var s = e.getItemStyle(["color"]); + r.setStyle(s), i = C({rectHover: !0, z2: 100}, i, !0); + var l = Ly(t.get("symbolSize")); + i.scaleX = l[0] / 2, i.scaleY = l[1] / 2; + var u = Py(t.get("symbolOffset"), l); + u && (i.x = (i.x || 0) + u[0], i.y = (i.y || 0) + u[1]); + var h = t.get("symbolRotate"); + return i.rotation = (h || 0) * Math.PI / 180 || 0, r.attr(i), r.updateTransform(), r + } + + function DV(t, e, n, i, r, o) { + if (!t.dragging) { + var a = r.getModel("checkpointStyle"), s = i.dataToCoord(r.getData().get("value", n)); + if (o || !a.get("animation", !0)) t.attr({x: s, y: 0}), e && e.attr({shape: {x2: s}}); else { + var l = {duration: a.get("animationDuration", !0), easing: a.get("animationEasing", !0)}; + t.stopAnimation(null, !0), t.animateTo({x: s, y: 0}, l), e && e.animateTo({shape: {x2: s}}, l) + } + } + } + + function AV(t) { + var e = t && t.timeline; + Y(e) || (e = e ? [e] : []), E(e, (function (t) { + t && function (t) { + var e = t.type, n = {number: "value", time: "time"}; + n[e] && (t.axisType = n[e], delete t.type); + if (kV(t), LV(t, "controlPosition")) { + var i = t.controlStyle || (t.controlStyle = {}); + LV(i, "position") || (i.position = t.controlPosition), "none" !== i.position || LV(i, "show") || (i.show = !1, delete i.position), delete t.controlPosition + } + E(t.data || [], (function (t) { + q(t) && !Y(t) && (!LV(t, "value") && LV(t, "name") && (t.value = t.name), kV(t)) + })) + }(t) + })) + } + + function kV(t) { + var e = t.itemStyle || (t.itemStyle = {}), n = e.emphasis || (e.emphasis = {}), i = t.label || t.label || {}, + r = i.normal || (i.normal = {}), o = {normal: 1, emphasis: 1}; + E(i, (function (t, e) { + o[e] || LV(r, e) || (r[e] = t) + })), n.label && !LV(i, "emphasis") && (i.emphasis = n.label, delete n.label) + } + + function LV(t, e) { + return t.hasOwnProperty(e) + } + + function PV(t, e) { + if (!t) return !1; + for (var n = Y(t) ? t : [t], i = 0; i < n.length; i++) if (n[i] && n[i][e]) return !0; + return !1 + } + + function OV(t) { + co(t, "label", ["show"]) + } + + var RV = So(), NV = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.createdBySelf = !1, n + } + + return n(e, t), e.prototype.init = function (t, e, n) { + this.mergeDefaultAndTheme(t, n), this._mergeOption(t, n, !1, !0) + }, e.prototype.isAnimationEnabled = function () { + if (r.node) return !1; + var t = this.__hostSeries; + return this.getShallow("animation") && t && t.isAnimationEnabled() + }, e.prototype.mergeOption = function (t, e) { + this._mergeOption(t, e, !1, !1) + }, e.prototype._mergeOption = function (t, e, n, i) { + var r = this.mainType; + n || e.eachSeries((function (t) { + var n = t.get(this.mainType, !0), o = RV(t)[r]; + n && n.data ? (o ? o._mergeOption(n, e, !0) : (i && OV(n), E(n.data, (function (t) { + t instanceof Array ? (OV(t[0]), OV(t[1])) : OV(t) + })), A(o = this.createMarkerModelFromSeries(n, this, e), { + mainType: this.mainType, + seriesIndex: t.seriesIndex, + name: t.name, + createdBySelf: !0 + }), o.__hostSeries = t), RV(t)[r] = o) : RV(t)[r] = null + }), this) + }, e.prototype.formatTooltip = function (t, e, n) { + var i = this.getData(), r = this.getRawValue(t), o = i.getName(t); + return Uf("section", { + header: this.name, + blocks: [Uf("nameValue", {name: o, value: r, noName: !o, noValue: null == r})] + }) + }, e.prototype.getData = function () { + return this._data + }, e.prototype.setData = function (t) { + this._data = t + }, e.getMarkerModelFromSeries = function (t, e) { + return RV(t)[e] + }, e.type = "marker", e.dependencies = ["series", "grid", "polar", "geo"], e + }(Ip); + R(NV, sf.prototype); + var EV = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.createMarkerModelFromSeries = function (t, n, i) { + return new e(t, n, i) + }, e.type = "markPoint", e.defaultOption = { + z: 5, + symbol: "pin", + symbolSize: 50, + tooltip: {trigger: "item"}, + label: {show: !0, position: "inside"}, + itemStyle: {borderWidth: 2}, + emphasis: {label: {show: !0}} + }, e + }(NV); + + function zV(t, e, n, i, r, o) { + var a = [], s = tx(e, i) ? e.getCalculationInfo("stackResultDimension") : i, l = HV(e, s, t), + u = e.indicesOfNearest(s, l)[0]; + a[r] = e.get(n, u), a[o] = e.get(s, u); + var h = e.get(i, u), c = Br(e.get(i, u)); + return (c = Math.min(c, 20)) >= 0 && (a[o] = +a[o].toFixed(c)), [a, h] + } + + var VV = {min: H(zV, "min"), max: H(zV, "max"), average: H(zV, "average"), median: H(zV, "median")}; + + function BV(t, e) { + var n = t.getData(), i = t.coordinateSystem; + if (e && !function (t) { + return !isNaN(parseFloat(t.x)) && !isNaN(parseFloat(t.y)) + }(e) && !Y(e.coord) && i) { + var r = i.dimensions, o = FV(e, n, i, t); + if ((e = T(e)).type && VV[e.type] && o.baseAxis && o.valueAxis) { + var a = P(r, o.baseAxis.dim), s = P(r, o.valueAxis.dim), + l = VV[e.type](n, o.baseDataDim, o.valueDataDim, a, s); + e.coord = l[0], e.value = l[1] + } else { + for (var u = [null != e.xAxis ? e.xAxis : e.radiusAxis, null != e.yAxis ? e.yAxis : e.angleAxis], h = 0; h < 2; h++) VV[u[h]] && (u[h] = HV(n, n.mapDimension(r[h]), u[h])); + e.coord = u + } + } + return e + } + + function FV(t, e, n, i) { + var r = {}; + return null != t.valueIndex || null != t.valueDim ? (r.valueDataDim = null != t.valueIndex ? e.getDimension(t.valueIndex) : t.valueDim, r.valueAxis = n.getAxis(function (t, e) { + var n = t.getData().getDimensionInfo(e); + return n && n.coordDim + }(i, r.valueDataDim)), r.baseAxis = n.getOtherAxis(r.valueAxis), r.baseDataDim = e.mapDimension(r.baseAxis.dim)) : (r.baseAxis = i.getBaseAxis(), r.valueAxis = n.getOtherAxis(r.baseAxis), r.baseDataDim = e.mapDimension(r.baseAxis.dim), r.valueDataDim = e.mapDimension(r.valueAxis.dim)), r + } + + function GV(t, e) { + return !(t && t.containData && e.coord && !function (t) { + return !(isNaN(parseFloat(t.x)) && isNaN(parseFloat(t.y))) + }(e)) || t.containData(e.coord) + } + + function WV(t, e) { + return t ? function (t, n, i, r) { + return pf(r < 2 ? t.coord && t.coord[r] : t.value, e[r]) + } : function (t, n, i, r) { + return pf(t.value, e[r]) + } + } + + function HV(t, e, n) { + if ("average" === n) { + var i = 0, r = 0; + return t.each(e, (function (t, e) { + isNaN(t) || (i += t, r++) + })), i / r + } + return "median" === n ? t.getMedian(e) : t.getDataExtent(e)["max" === n ? 1 : 0] + } + + var YV = So(), UV = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.init = function () { + this.markerGroupMap = ft() + }, e.prototype.render = function (t, e, n) { + var i = this, r = this.markerGroupMap; + r.each((function (t) { + YV(t).keep = !1 + })), e.eachSeries((function (t) { + var r = NV.getMarkerModelFromSeries(t, i.type); + r && i.renderSeries(t, r, e, n) + })), r.each((function (t) { + !YV(t).keep && i.group.remove(t.group) + })) + }, e.prototype.markKeep = function (t) { + YV(t).keep = !0 + }, e.prototype.blurSeries = function (t) { + var e = this; + E(t, (function (t) { + var n = NV.getMarkerModelFromSeries(t, e.type); + n && n.getData().eachItemGraphicEl((function (t) { + t && bl(t) + })) + })) + }, e.type = "marker", e + }(fg); + + function XV(t, e, n) { + var i = e.coordinateSystem; + t.each((function (r) { + var o, a = t.getItemModel(r), s = Er(a.get("x"), n.getWidth()), l = Er(a.get("y"), n.getHeight()); + if (isNaN(s) || isNaN(l)) { + if (e.getMarkerPosition) o = e.getMarkerPosition(t.getValues(t.dimensions, r)); else if (i) { + var u = t.get(i.dimensions[0], r), h = t.get(i.dimensions[1], r); + o = i.dataToPoint([u, h]) + } + } else o = [s, l]; + isNaN(s) || (o[0] = s), isNaN(l) || (o[1] = l), t.setItemLayout(r, o) + })) + } + + var ZV = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.updateTransform = function (t, e, n) { + e.eachSeries((function (t) { + var e = NV.getMarkerModelFromSeries(t, "markPoint"); + e && (XV(e.getData(), t, n), this.markerGroupMap.get(t.id).updateLayout()) + }), this) + }, e.prototype.renderSeries = function (t, e, n, i) { + var r = t.coordinateSystem, o = t.id, a = t.getData(), s = this.markerGroupMap, + l = s.get(o) || s.set(o, new Zw), u = function (t, e, n) { + var i; + i = t ? z(t && t.dimensions, (function (t) { + return A(A({}, e.getData().getDimensionInfo(e.getData().mapDimension(t)) || {}), { + name: t, + ordinalMeta: null + }) + })) : [{name: "value", type: "float"}]; + var r = new Zm(i, n), o = z(n.get("data"), H(BV, e)); + t && (o = B(o, H(GV, t))); + var a = WV(!!t, i); + return r.initData(o, null, a), r + }(r, t, e); + e.setData(u), XV(e.getData(), t, i), u.each((function (t) { + var n = u.getItemModel(t), i = n.getShallow("symbol"), r = n.getShallow("symbolSize"), + o = n.getShallow("symbolRotate"), s = n.getShallow("symbolOffset"), + l = n.getShallow("symbolKeepAspect"); + if (U(i) || U(r) || U(o) || U(s)) { + var h = e.getRawValue(t), c = e.getDataParams(t); + U(i) && (i = i(h, c)), U(r) && (r = r(h, c)), U(o) && (o = o(h, c)), U(s) && (s = s(h, c)) + } + var p = n.getModel("itemStyle").getItemStyle(), d = fy(a, "color"); + p.fill || (p.fill = d), u.setItemVisual(t, { + symbol: i, + symbolSize: r, + symbolRotate: o, + symbolOffset: s, + symbolKeepAspect: l, + style: p + }) + })), l.updateData(u), this.group.add(l.group), u.eachItemGraphicEl((function (t) { + t.traverse((function (t) { + Ws(t).dataModel = e + })) + })), this.markKeep(l), l.group.silent = e.get("silent") || t.get("silent") + }, e.type = "markPoint", e + }(UV); + var jV = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.createMarkerModelFromSeries = function (t, n, i) { + return new e(t, n, i) + }, e.type = "markLine", e.defaultOption = { + z: 5, + symbol: ["circle", "arrow"], + symbolSize: [8, 16], + symbolOffset: 0, + precision: 2, + tooltip: {trigger: "item"}, + label: {show: !0, position: "end", distance: 5}, + lineStyle: {type: "dashed"}, + emphasis: {label: {show: !0}, lineStyle: {width: 3}}, + animationEasing: "linear" + }, e + }(NV), qV = So(), KV = function (t, e, n, i) { + var r, o = t.getData(); + if (Y(i)) r = i; else { + var a = i.type; + if ("min" === a || "max" === a || "average" === a || "median" === a || null != i.xAxis || null != i.yAxis) { + var s = void 0, l = void 0; + if (null != i.yAxis || null != i.xAxis) s = e.getAxis(null != i.yAxis ? "y" : "x"), l = it(i.yAxis, i.xAxis); else { + var u = FV(i, o, e, t); + s = u.valueAxis, l = HV(o, ex(o, u.valueDataDim), a) + } + var h = "x" === s.dim ? 0 : 1, c = 1 - h, p = T(i), d = {coord: []}; + p.type = null, p.coord = [], p.coord[c] = -1 / 0, d.coord[c] = 1 / 0; + var f = n.get("precision"); + f >= 0 && j(l) && (l = +l.toFixed(Math.min(f, 20))), p.coord[h] = d.coord[h] = l, r = [p, d, { + type: a, + valueIndex: i.valueIndex, + value: l + }] + } else r = [] + } + var g = [BV(t, r[0]), BV(t, r[1]), A({}, r[2])]; + return g[2].type = g[2].type || null, C(g[2], g[0]), C(g[2], g[1]), g + }; + + function $V(t) { + return !isNaN(t) && !isFinite(t) + } + + function JV(t, e, n, i) { + var r = 1 - t, o = i.dimensions[t]; + return $V(e[r]) && $V(n[r]) && e[t] === n[t] && i.getAxis(o).containData(e[t]) + } + + function QV(t, e) { + if ("cartesian2d" === t.type) { + var n = e[0].coord, i = e[1].coord; + if (n && i && (JV(1, n, i, t) || JV(0, n, i, t))) return !0 + } + return GV(t, e[0]) && GV(t, e[1]) + } + + function tB(t, e, n, i, r) { + var o, a = i.coordinateSystem, s = t.getItemModel(e), l = Er(s.get("x"), r.getWidth()), + u = Er(s.get("y"), r.getHeight()); + if (isNaN(l) || isNaN(u)) { + if (i.getMarkerPosition) o = i.getMarkerPosition(t.getValues(t.dimensions, e)); else { + var h = a.dimensions, c = t.get(h[0], e), p = t.get(h[1], e); + o = a.dataToPoint([c, p]) + } + if (sS(a, "cartesian2d")) { + var d = a.getAxis("x"), f = a.getAxis("y"); + h = a.dimensions; + $V(t.get(h[0], e)) ? o[0] = d.toGlobalCoord(d.getExtent()[n ? 0 : 1]) : $V(t.get(h[1], e)) && (o[1] = f.toGlobalCoord(f.getExtent()[n ? 0 : 1])) + } + isNaN(l) || (o[0] = l), isNaN(u) || (o[1] = u) + } else o = [l, u]; + t.setItemLayout(e, o) + } + + var eB = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.updateTransform = function (t, e, n) { + e.eachSeries((function (t) { + var e = NV.getMarkerModelFromSeries(t, "markLine"); + if (e) { + var i = e.getData(), r = qV(e).from, o = qV(e).to; + r.each((function (e) { + tB(r, e, !0, t, n), tB(o, e, !1, t, n) + })), i.each((function (t) { + i.setItemLayout(t, [r.getItemLayout(t), o.getItemLayout(t)]) + })), this.markerGroupMap.get(t.id).updateLayout() + } + }), this) + }, e.prototype.renderSeries = function (t, e, n, i) { + var r = t.coordinateSystem, o = t.id, a = t.getData(), s = this.markerGroupMap, + l = s.get(o) || s.set(o, new dA); + this.group.add(l.group); + var u = function (t, e, n) { + var i; + i = t ? z(t && t.dimensions, (function (t) { + return A(A({}, e.getData().getDimensionInfo(e.getData().mapDimension(t)) || {}), { + name: t, + ordinalMeta: null + }) + })) : [{name: "value", type: "float"}]; + var r = new Zm(i, n), o = new Zm(i, n), a = new Zm([], n), s = z(n.get("data"), H(KV, e, t, n)); + t && (s = B(s, H(QV, t))); + var l = WV(!!t, i); + return r.initData(z(s, (function (t) { + return t[0] + })), null, l), o.initData(z(s, (function (t) { + return t[1] + })), null, l), a.initData(z(s, (function (t) { + return t[2] + }))), a.hasItemOption = !0, {from: r, to: o, line: a} + }(r, t, e), h = u.from, c = u.to, p = u.line; + qV(e).from = h, qV(e).to = c, e.setData(p); + var d = e.get("symbol"), f = e.get("symbolSize"), g = e.get("symbolRotate"), y = e.get("symbolOffset"); + + function v(e, n, r) { + var o = e.getItemModel(n); + tB(e, n, r, t, i); + var s = o.getModel("itemStyle").getItemStyle(); + null == s.fill && (s.fill = fy(a, "color")), e.setItemVisual(n, { + symbolKeepAspect: o.get("symbolKeepAspect"), + symbolOffset: rt(o.get("symbolOffset", !0), y[r ? 0 : 1]), + symbolRotate: rt(o.get("symbolRotate", !0), g[r ? 0 : 1]), + symbolSize: rt(o.get("symbolSize"), f[r ? 0 : 1]), + symbol: rt(o.get("symbol", !0), d[r ? 0 : 1]), + style: s + }) + } + + Y(d) || (d = [d, d]), Y(f) || (f = [f, f]), Y(g) || (g = [g, g]), Y(y) || (y = [y, y]), u.from.each((function (t) { + v(h, t, !0), v(c, t, !1) + })), p.each((function (t) { + var e = p.getItemModel(t).getModel("lineStyle").getLineStyle(); + p.setItemLayout(t, [h.getItemLayout(t), c.getItemLayout(t)]), null == e.stroke && (e.stroke = h.getItemVisual(t, "style").fill), p.setItemVisual(t, { + fromSymbolKeepAspect: h.getItemVisual(t, "symbolKeepAspect"), + fromSymbolOffset: h.getItemVisual(t, "symbolOffset"), + fromSymbolRotate: h.getItemVisual(t, "symbolRotate"), + fromSymbolSize: h.getItemVisual(t, "symbolSize"), + fromSymbol: h.getItemVisual(t, "symbol"), + toSymbolKeepAspect: c.getItemVisual(t, "symbolKeepAspect"), + toSymbolOffset: c.getItemVisual(t, "symbolOffset"), + toSymbolRotate: c.getItemVisual(t, "symbolRotate"), + toSymbolSize: c.getItemVisual(t, "symbolSize"), + toSymbol: c.getItemVisual(t, "symbol"), + style: e + }) + })), l.updateData(p), u.line.eachItemGraphicEl((function (t, n) { + t.traverse((function (t) { + Ws(t).dataModel = e + })) + })), this.markKeep(l), l.group.silent = e.get("silent") || t.get("silent") + }, e.type = "markLine", e + }(UV); + var nB = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.createMarkerModelFromSeries = function (t, n, i) { + return new e(t, n, i) + }, e.type = "markArea", e.defaultOption = { + z: 1, + tooltip: {trigger: "item"}, + animation: !1, + label: {show: !0, position: "top"}, + itemStyle: {borderWidth: 0}, + emphasis: {label: {show: !0, position: "top"}} + }, e + }(NV), iB = So(), rB = function (t, e, n, i) { + var r = BV(t, i[0]), o = BV(t, i[1]), a = r.coord, s = o.coord; + a[0] = it(a[0], -1 / 0), a[1] = it(a[1], -1 / 0), s[0] = it(s[0], 1 / 0), s[1] = it(s[1], 1 / 0); + var l = D([{}, r, o]); + return l.coord = [r.coord, o.coord], l.x0 = r.x, l.y0 = r.y, l.x1 = o.x, l.y1 = o.y, l + }; + + function oB(t) { + return !isNaN(t) && !isFinite(t) + } + + function aB(t, e, n, i) { + var r = 1 - t; + return oB(e[r]) && oB(n[r]) + } + + function sB(t, e) { + var n = e.coord[0], i = e.coord[1]; + return !!(sS(t, "cartesian2d") && n && i && (aB(1, n, i) || aB(0, n, i))) || (GV(t, { + coord: n, + x: e.x0, + y: e.y0 + }) || GV(t, {coord: i, x: e.x1, y: e.y1})) + } + + function lB(t, e, n, i, r) { + var o, a = i.coordinateSystem, s = t.getItemModel(e), l = Er(s.get(n[0]), r.getWidth()), + u = Er(s.get(n[1]), r.getHeight()); + if (isNaN(l) || isNaN(u)) { + if (i.getMarkerPosition) o = i.getMarkerPosition(t.getValues(n, e)); else { + var h = [d = t.get(n[0], e), f = t.get(n[1], e)]; + a.clampData && a.clampData(h, h), o = a.dataToPoint(h, !0) + } + if (sS(a, "cartesian2d")) { + var c = a.getAxis("x"), p = a.getAxis("y"), d = t.get(n[0], e), f = t.get(n[1], e); + oB(d) ? o[0] = c.toGlobalCoord(c.getExtent()["x0" === n[0] ? 0 : 1]) : oB(f) && (o[1] = p.toGlobalCoord(p.getExtent()["y0" === n[1] ? 0 : 1])) + } + isNaN(l) || (o[0] = l), isNaN(u) || (o[1] = u) + } else o = [l, u]; + return o + } + + var uB = [["x0", "y0"], ["x1", "y0"], ["x1", "y1"], ["x0", "y1"]], hB = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.updateTransform = function (t, e, n) { + e.eachSeries((function (t) { + var e = NV.getMarkerModelFromSeries(t, "markArea"); + if (e) { + var i = e.getData(); + i.each((function (e) { + var r = z(uB, (function (r) { + return lB(i, e, r, t, n) + })); + i.setItemLayout(e, r), i.getItemGraphicEl(e).setShape("points", r) + })) + } + }), this) + }, e.prototype.renderSeries = function (t, e, n, i) { + var r = t.coordinateSystem, o = t.id, a = t.getData(), s = this.markerGroupMap, + l = s.get(o) || s.set(o, {group: new Cr}); + this.group.add(l.group), this.markKeep(l); + var u = function (t, e, n) { + var i, r, o = ["x0", "y0", "x1", "y1"]; + if (t) { + var a = z(t && t.dimensions, (function (t) { + var n = e.getData(); + return A(A({}, n.getDimensionInfo(n.mapDimension(t)) || {}), {name: t, ordinalMeta: null}) + })); + r = z(o, (function (t, e) { + return {name: t, type: a[e % 2].type} + })), i = new Zm(r, n) + } else i = new Zm(r = [{name: "value", type: "float"}], n); + var s = z(n.get("data"), H(rB, e, t, n)); + t && (s = B(s, H(sB, t))); + var l = t ? function (t, e, n, i) { + return pf(t.coord[Math.floor(i / 2)][i % 2], r[i]) + } : function (t, e, n, i) { + return pf(t.value, r[i]) + }; + return i.initData(s, null, l), i.hasItemOption = !0, i + }(r, t, e); + e.setData(u), u.each((function (e) { + var n = z(uB, (function (n) { + return lB(u, e, n, t, i) + })), o = r.getAxis("x").scale, s = r.getAxis("y").scale, l = o.getExtent(), h = s.getExtent(), + c = [o.parse(u.get("x0", e)), o.parse(u.get("x1", e))], + p = [s.parse(u.get("y0", e)), s.parse(u.get("y1", e))]; + Vr(c), Vr(p); + var d = !!(l[0] > c[1] || l[1] < c[0] || h[0] > p[1] || h[1] < p[0]); + u.setItemLayout(e, {points: n, allClipped: d}); + var f = u.getItemModel(e).getModel("itemStyle").getItemStyle(), g = fy(a, "color"); + f.fill || (f.fill = g, X(f.fill) && (f.fill = An(f.fill, .4))), f.stroke || (f.stroke = g), u.setItemVisual(e, "style", f) + })), u.diff(iB(l).data).add((function (t) { + var e = u.getItemLayout(t); + if (!e.allClipped) { + var n = new Lu({shape: {points: e.points}}); + u.setItemGraphicEl(t, n), l.group.add(n) + } + })).update((function (t, n) { + var i = iB(l).data.getItemGraphicEl(n), r = u.getItemLayout(t); + r.allClipped ? i && l.group.remove(i) : (i ? ih(i, {shape: {points: r.points}}, e, t) : i = new Lu({shape: {points: r.points}}), u.setItemGraphicEl(t, i), l.group.add(i)) + })).remove((function (t) { + var e = iB(l).data.getItemGraphicEl(t); + l.group.remove(e) + })).execute(), u.eachItemGraphicEl((function (t, n) { + var i = u.getItemModel(n), r = u.getItemVisual(n, "style"); + t.useStyle(u.getItemVisual(n, "style")), Wh(t, Hh(i), { + labelFetcher: e, + labelDataIndex: n, + defaultText: u.getName(n) || "", + inheritColor: X(r.fill) ? An(r.fill, 1) : "#000" + }), zl(t, i), Ol(t, null, null, i.get(["emphasis", "disabled"])), Ws(t).dataModel = e + })), iB(l).data = u, l.group.silent = e.get("silent") || t.get("silent") + }, e.type = "markArea", e + }(UV); + var cB = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.layoutMode = {type: "box", ignoreSize: !0}, n + } + + return n(e, t), e.prototype.init = function (t, e, n) { + this.mergeDefaultAndTheme(t, n), t.selected = t.selected || {}, this._updateSelector(t) + }, e.prototype.mergeOption = function (e, n) { + t.prototype.mergeOption.call(this, e, n), this._updateSelector(e) + }, e.prototype._updateSelector = function (t) { + var e = t.selector, n = this.ecModel; + !0 === e && (e = t.selector = ["all", "inverse"]), Y(e) && E(e, (function (t, i) { + X(t) && (t = {type: t}), e[i] = C(t, function (t, e) { + return "all" === e ? { + type: "all", + title: t.getLocaleModel().get(["legend", "selector", "all"]) + } : "inverse" === e ? { + type: "inverse", + title: t.getLocaleModel().get(["legend", "selector", "inverse"]) + } : void 0 + }(n, t.type)) + })) + }, e.prototype.optionUpdated = function () { + this._updateData(this.ecModel); + var t = this._data; + if (t[0] && "single" === this.get("selectedMode")) { + for (var e = !1, n = 0; n < t.length; n++) { + var i = t[n].get("name"); + if (this.isSelected(i)) { + this.select(i), e = !0; + break + } + } + !e && this.select(t[0].get("name")) + } + }, e.prototype._updateData = function (t) { + var e = [], n = []; + t.eachRawSeries((function (i) { + var r, o = i.name; + if (n.push(o), i.legendVisualProvider) { + var a = i.legendVisualProvider.getAllNames(); + t.isSeriesFiltered(i) || (n = n.concat(a)), a.length ? e = e.concat(a) : r = !0 + } else r = !0; + r && _o(i) && e.push(i.name) + })), this._availableNames = n; + var i = z(this.get("data") || e, (function (t) { + return (X(t) || j(t)) && (t = {name: t}), new pc(t, this, this.ecModel) + }), this); + this._data = i + }, e.prototype.getData = function () { + return this._data + }, e.prototype.select = function (t) { + var e = this.option.selected; + "single" === this.get("selectedMode") && E(this._data, (function (t) { + e[t.get("name")] = !1 + })); + e[t] = !0 + }, e.prototype.unSelect = function (t) { + "single" !== this.get("selectedMode") && (this.option.selected[t] = !1) + }, e.prototype.toggleSelected = function (t) { + var e = this.option.selected; + e.hasOwnProperty(t) || (e[t] = !0), this[e[t] ? "unSelect" : "select"](t) + }, e.prototype.allSelect = function () { + var t = this._data, e = this.option.selected; + E(t, (function (t) { + e[t.get("name", !0)] = !0 + })) + }, e.prototype.inverseSelect = function () { + var t = this._data, e = this.option.selected; + E(t, (function (t) { + var n = t.get("name", !0); + e.hasOwnProperty(n) || (e[n] = !0), e[n] = !e[n] + })) + }, e.prototype.isSelected = function (t) { + var e = this.option.selected; + return !(e.hasOwnProperty(t) && !e[t]) && P(this._availableNames, t) >= 0 + }, e.prototype.getOrient = function () { + return "vertical" === this.get("orient") ? {index: 1, name: "vertical"} : {index: 0, name: "horizontal"} + }, e.type = "legend.plain", e.dependencies = ["series"], e.defaultOption = { + z: 4, + show: !0, + orient: "horizontal", + left: "center", + top: 0, + align: "auto", + backgroundColor: "rgba(0,0,0,0)", + borderColor: "#ccc", + borderRadius: 0, + borderWidth: 0, + padding: 5, + itemGap: 10, + itemWidth: 25, + itemHeight: 14, + symbolRotate: "inherit", + symbolKeepAspect: !0, + inactiveColor: "#ccc", + inactiveBorderColor: "#ccc", + inactiveBorderWidth: "auto", + itemStyle: { + color: "inherit", + opacity: "inherit", + borderColor: "inherit", + borderWidth: "auto", + borderCap: "inherit", + borderJoin: "inherit", + borderDashOffset: "inherit", + borderMiterLimit: "inherit" + }, + lineStyle: { + width: "auto", + color: "inherit", + inactiveColor: "#ccc", + inactiveWidth: 2, + opacity: "inherit", + type: "inherit", + cap: "inherit", + join: "inherit", + dashOffset: "inherit", + miterLimit: "inherit" + }, + textStyle: {color: "#333"}, + selectedMode: !0, + selector: !1, + selectorLabel: { + show: !0, + borderRadius: 10, + padding: [3, 5, 3, 5], + fontSize: 12, + fontFamily: "sans-serif", + color: "#666", + borderWidth: 1, + borderColor: "#666" + }, + emphasis: {selectorLabel: {show: !0, color: "#eee", backgroundColor: "#666"}}, + selectorPosition: "auto", + selectorItemGap: 7, + selectorButtonGap: 10, + tooltip: {show: !1} + }, e + }(Ip), pB = H, dB = E, fB = Cr, gB = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.newlineDisabled = !1, n + } + + return n(e, t), e.prototype.init = function () { + this.group.add(this._contentGroup = new fB), this.group.add(this._selectorGroup = new fB), this._isFirstRender = !0 + }, e.prototype.getContentGroup = function () { + return this._contentGroup + }, e.prototype.getSelectorGroup = function () { + return this._selectorGroup + }, e.prototype.render = function (t, e, n) { + var i = this._isFirstRender; + if (this._isFirstRender = !1, this.resetInner(), t.get("show", !0)) { + var r = t.get("align"), o = t.get("orient"); + r && "auto" !== r || (r = "right" === t.get("left") && "vertical" === o ? "right" : "left"); + var a = t.get("selector", !0), s = t.get("selectorPosition", !0); + !a || s && "auto" !== s || (s = "horizontal" === o ? "end" : "start"), this.renderInner(r, t, e, n, a, o, s); + var l = t.getBoxLayoutParams(), u = {width: n.getWidth(), height: n.getHeight()}, h = t.get("padding"), + c = mp(l, u, h), p = this.layoutInner(t, r, c, i, a, s), + d = mp(k({width: p.width, height: p.height}, l), u, h); + this.group.x = d.x - p.x, this.group.y = d.y - p.y, this.group.markRedraw(), this.group.add(this._backgroundEl = UE(p, t)) + } + }, e.prototype.resetInner = function () { + this.getContentGroup().removeAll(), this._backgroundEl && this.group.remove(this._backgroundEl), this.getSelectorGroup().removeAll() + }, e.prototype.renderInner = function (t, e, n, i, r, o, a) { + var s = this.getContentGroup(), l = ft(), u = e.get("selectedMode"), h = []; + n.eachRawSeries((function (t) { + !t.get("legendHoverLink") && h.push(t.id) + })), dB(e.getData(), (function (r, o) { + var a = r.get("name"); + if (!this.newlineDisabled && ("" === a || "\n" === a)) { + var c = new fB; + return c.newline = !0, void s.add(c) + } + var p = n.getSeriesByName(a)[0]; + if (!l.get(a)) { + if (p) { + var d = p.getData(), f = d.getVisual("legendLineStyle") || {}, g = d.getVisual("legendIcon"), + y = d.getVisual("style"); + this._createItem(p, a, o, r, e, t, f, y, g, u).on("click", pB(yB, a, null, i, h)).on("mouseover", pB(mB, p.name, null, i, h)).on("mouseout", pB(xB, p.name, null, i, h)), l.set(a, !0) + } else n.eachRawSeries((function (n) { + if (!l.get(a) && n.legendVisualProvider) { + var s = n.legendVisualProvider; + if (!s.containName(a)) return; + var c = s.indexOfName(a), p = s.getItemVisual(c, "style"), + d = s.getItemVisual(c, "legendIcon"), f = bn(p.fill); + f && 0 === f[3] && (f[3] = .2, p = A(A({}, p), {fill: kn(f, "rgba")})), this._createItem(n, a, o, r, e, t, {}, p, d, u).on("click", pB(yB, null, a, i, h)).on("mouseover", pB(mB, null, a, i, h)).on("mouseout", pB(xB, null, a, i, h)), l.set(a, !0) + } + }), this); + 0 + } + }), this), r && this._createSelector(r, e, i, o, a) + }, e.prototype._createSelector = function (t, e, n, i, r) { + var o = this.getSelectorGroup(); + dB(t, (function (t) { + var i = t.type, r = new As({ + style: {x: 0, y: 0, align: "center", verticalAlign: "middle"}, onclick: function () { + n.dispatchAction({type: "all" === i ? "legendAllSelect" : "legendInverseSelect"}) + } + }); + o.add(r), Wh(r, { + normal: e.getModel("selectorLabel"), + emphasis: e.getModel(["emphasis", "selectorLabel"]) + }, {defaultText: t.title}), Pl(r) + })) + }, e.prototype._createItem = function (t, e, n, i, r, o, a, s, l, u) { + var h = t.visualDrawType, c = r.get("itemWidth"), p = r.get("itemHeight"), d = r.isSelected(e), + f = i.get("symbolRotate"), g = i.get("symbolKeepAspect"), y = i.get("icon"), + v = function (t, e, n, i, r, o) { + function a(t, e) { + "auto" === t.lineWidth && (t.lineWidth = e.lineWidth > 0 ? 2 : 0), dB(t, (function (n, i) { + "inherit" === t[i] && (t[i] = e[i]) + })) + } + + var s = e.getModel("itemStyle").getItemStyle(), + l = 0 === t.lastIndexOf("empty", 0) ? "fill" : "stroke"; + s.decal = i.decal, "inherit" === s.fill && (s.fill = i[r]); + "inherit" === s.stroke && (s.stroke = i[l]); + "inherit" === s.opacity && (s.opacity = ("fill" === r ? i : n).opacity); + a(s, i); + var u = e.getModel("lineStyle"), h = u.getLineStyle(); + if (a(h, n), "auto" === s.fill && (s.fill = i.fill), "auto" === s.stroke && (s.stroke = i.fill), "auto" === h.stroke && (h.stroke = i.fill), !o) { + var c = e.get("inactiveBorderWidth"), p = s[l]; + s.lineWidth = "auto" === c ? i.lineWidth > 0 && p ? 2 : 0 : s.lineWidth, s.fill = e.get("inactiveColor"), s.stroke = e.get("inactiveBorderColor"), h.stroke = u.get("inactiveColor"), h.lineWidth = u.get("inactiveWidth") + } + return {itemStyle: s, lineStyle: h} + }(l = y || l || "roundRect", i, a, s, h, d), m = new fB, x = i.getModel("textStyle"); + if (!U(t.getLegendIcon) || y && "inherit" !== y) { + var _ = "inherit" === y && t.getData().getVisual("symbol") ? "inherit" === f ? t.getData().getVisual("symbolRotate") : f : 0; + m.add(function (t) { + var e = t.icon || "roundRect", + n = ky(e, 0, 0, t.itemWidth, t.itemHeight, t.itemStyle.fill, t.symbolKeepAspect); + n.setStyle(t.itemStyle), n.rotation = (t.iconRotate || 0) * Math.PI / 180, n.setOrigin([t.itemWidth / 2, t.itemHeight / 2]), e.indexOf("empty") > -1 && (n.style.stroke = n.style.fill, n.style.fill = "#fff", n.style.lineWidth = 2); + return n + }({ + itemWidth: c, + itemHeight: p, + icon: l, + iconRotate: _, + itemStyle: v.itemStyle, + lineStyle: v.lineStyle, + symbolKeepAspect: g + })) + } else m.add(t.getLegendIcon({ + itemWidth: c, + itemHeight: p, + icon: l, + iconRotate: f, + itemStyle: v.itemStyle, + lineStyle: v.lineStyle, + symbolKeepAspect: g + })); + var b = "left" === o ? c + 5 : -5, w = o, S = r.get("formatter"), M = e; + X(S) && S ? M = S.replace("{name}", null != e ? e : "") : U(S) && (M = S(e)); + var I = i.get("inactiveColor"); + m.add(new As({ + style: Yh(x, { + text: M, + x: b, + y: p / 2, + fill: d ? x.getTextColor() : I, + align: w, + verticalAlign: "middle" + }) + })); + var T = new Ts({shape: m.getBoundingRect(), invisible: !0}), C = i.getModel("tooltip"); + return C.get("show") && Nh({ + el: T, + componentModel: r, + itemName: e, + itemTooltipOption: C.option + }), m.add(T), m.eachChild((function (t) { + t.silent = !0 + })), T.silent = !u, this.getContentGroup().add(m), Pl(m), m.__legendDataIndex = n, m + }, e.prototype.layoutInner = function (t, e, n, i, r, o) { + var a = this.getContentGroup(), s = this.getSelectorGroup(); + vp(t.get("orient"), a, t.get("itemGap"), n.width, n.height); + var l = a.getBoundingRect(), u = [-l.x, -l.y]; + if (s.markRedraw(), a.markRedraw(), r) { + vp("horizontal", s, t.get("selectorItemGap", !0)); + var h = s.getBoundingRect(), c = [-h.x, -h.y], p = t.get("selectorButtonGap", !0), + d = t.getOrient().index, f = 0 === d ? "width" : "height", g = 0 === d ? "height" : "width", + y = 0 === d ? "y" : "x"; + "end" === o ? c[d] += l[f] + p : u[d] += h[f] + p, c[1 - d] += l[g] / 2 - h[g] / 2, s.x = c[0], s.y = c[1], a.x = u[0], a.y = u[1]; + var v = {x: 0, y: 0}; + return v[f] = l[f] + p + h[f], v[g] = Math.max(l[g], h[g]), v[y] = Math.min(0, h[y] + c[1 - d]), v + } + return a.x = u[0], a.y = u[1], this.group.getBoundingRect() + }, e.prototype.remove = function () { + this.getContentGroup().removeAll(), this._isFirstRender = !0 + }, e.type = "legend.plain", e + }(fg); + + function yB(t, e, n, i) { + xB(t, e, n, i), n.dispatchAction({type: "legendToggleSelect", name: null != t ? t : e}), mB(t, e, n, i) + } + + function vB(t) { + for (var e, n = t.getZr().storage.getDisplayList(), i = 0, r = n.length; i < r && !(e = n[i].states.emphasis);) i++; + return e && e.hoverLayer + } + + function mB(t, e, n, i) { + vB(n) || n.dispatchAction({type: "highlight", seriesName: t, name: e, excludeSeriesId: i}) + } + + function xB(t, e, n, i) { + vB(n) || n.dispatchAction({type: "downplay", seriesName: t, name: e, excludeSeriesId: i}) + } + + function _B(t) { + var e = t.findComponents({mainType: "legend"}); + e && e.length && t.filterSeries((function (t) { + for (var n = 0; n < e.length; n++) if (!e[n].isSelected(t.name)) return !1; + return !0 + })) + } + + function bB(t, e, n) { + var i, r = {}, o = "toggleSelected" === t; + return n.eachComponent("legend", (function (n) { + o && null != i ? n[i ? "select" : "unSelect"](e.name) : "allSelect" === t || "inverseSelect" === t ? n[t]() : (n[t](e.name), i = n.isSelected(e.name)), E(n.getData(), (function (t) { + var e = t.get("name"); + if ("\n" !== e && "" !== e) { + var i = n.isSelected(e); + r.hasOwnProperty(e) ? r[e] = r[e] && i : r[e] = i + } + })) + })), "allSelect" === t || "inverseSelect" === t ? {selected: r} : {name: e.name, selected: r} + } + + function wB(t) { + t.registerComponentModel(cB), t.registerComponentView(gB), t.registerProcessor(t.PRIORITY.PROCESSOR.SERIES_FILTER, _B), t.registerSubTypeDefaulter("legend", (function () { + return "plain" + })), function (t) { + t.registerAction("legendToggleSelect", "legendselectchanged", H(bB, "toggleSelected")), t.registerAction("legendAllSelect", "legendselectall", H(bB, "allSelect")), t.registerAction("legendInverseSelect", "legendinverseselect", H(bB, "inverseSelect")), t.registerAction("legendSelect", "legendselected", H(bB, "select")), t.registerAction("legendUnSelect", "legendunselected", H(bB, "unSelect")) + }(t) + } + + var SB = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.setScrollDataIndex = function (t) { + this.option.scrollDataIndex = t + }, e.prototype.init = function (e, n, i) { + var r = wp(e); + t.prototype.init.call(this, e, n, i), MB(this, e, r) + }, e.prototype.mergeOption = function (e, n) { + t.prototype.mergeOption.call(this, e, n), MB(this, this.option, e) + }, e.type = "legend.scroll", e.defaultOption = gc(cB.defaultOption, { + scrollDataIndex: 0, + pageButtonItemGap: 5, + pageButtonGap: null, + pageButtonPosition: "end", + pageFormatter: "{current}/{total}", + pageIcons: { + horizontal: ["M0,0L12,-10L12,10z", "M0,0L-12,-10L-12,10z"], + vertical: ["M0,0L20,0L10,-20z", "M0,0L20,0L10,20z"] + }, + pageIconColor: "#2f4554", + pageIconInactiveColor: "#aaa", + pageIconSize: 15, + pageTextStyle: {color: "#333"}, + animationDurationUpdate: 800 + }), e + }(cB); + + function MB(t, e, n) { + var i = [1, 1]; + i[t.getOrient().index] = 0, bp(e, n, {type: "box", ignoreSize: !!i}) + } + + var IB = Cr, TB = ["width", "height"], CB = ["x", "y"], DB = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.newlineDisabled = !0, n._currentIndex = 0, n + } + + return n(e, t), e.prototype.init = function () { + t.prototype.init.call(this), this.group.add(this._containerGroup = new IB), this._containerGroup.add(this.getContentGroup()), this.group.add(this._controllerGroup = new IB) + }, e.prototype.resetInner = function () { + t.prototype.resetInner.call(this), this._controllerGroup.removeAll(), this._containerGroup.removeClipPath(), this._containerGroup.__rectSize = null + }, e.prototype.renderInner = function (e, n, i, r, o, a, s) { + var l = this; + t.prototype.renderInner.call(this, e, n, i, r, o, a, s); + var u = this._controllerGroup, h = n.get("pageIconSize", !0), c = Y(h) ? h : [h, h]; + d("pagePrev", 0); + var p = n.getModel("pageTextStyle"); + + function d(t, e) { + var i = t + "DataIndex", + o = Lh(n.get("pageIcons", !0)[n.getOrient().name][e], {onclick: W(l._pageGo, l, i, n, r)}, { + x: -c[0] / 2, + y: -c[1] / 2, + width: c[0], + height: c[1] + }); + o.name = t, u.add(o) + } + + u.add(new As({ + name: "pageText", + style: { + text: "xx/xx", + fill: p.getTextColor(), + font: p.getFont(), + verticalAlign: "middle", + align: "center" + }, + silent: !0 + })), d("pageNext", 1) + }, e.prototype.layoutInner = function (t, e, n, i, r, o) { + var a = this.getSelectorGroup(), s = t.getOrient().index, l = TB[s], u = CB[s], h = TB[1 - s], + c = CB[1 - s]; + r && vp("horizontal", a, t.get("selectorItemGap", !0)); + var p = t.get("selectorButtonGap", !0), d = a.getBoundingRect(), f = [-d.x, -d.y], g = T(n); + r && (g[l] = n[l] - d[l] - p); + var y = this._layoutContentAndController(t, i, g, s, l, h, c, u); + if (r) { + if ("end" === o) f[s] += y[l] + p; else { + var v = d[l] + p; + f[s] -= v, y[u] -= v + } + y[l] += d[l] + p, f[1 - s] += y[c] + y[h] / 2 - d[h] / 2, y[h] = Math.max(y[h], d[h]), y[c] = Math.min(y[c], d[c] + f[1 - s]), a.x = f[0], a.y = f[1], a.markRedraw() + } + return y + }, e.prototype._layoutContentAndController = function (t, e, n, i, r, o, a, s) { + var l = this.getContentGroup(), u = this._containerGroup, h = this._controllerGroup; + vp(t.get("orient"), l, t.get("itemGap"), i ? n.width : null, i ? null : n.height), vp("horizontal", h, t.get("pageButtonItemGap", !0)); + var c = l.getBoundingRect(), p = h.getBoundingRect(), d = this._showController = c[r] > n[r], + f = [-c.x, -c.y]; + e || (f[i] = l[s]); + var g = [0, 0], y = [-p.x, -p.y], v = rt(t.get("pageButtonGap", !0), t.get("itemGap", !0)); + d && ("end" === t.get("pageButtonPosition", !0) ? y[i] += n[r] - p[r] : g[i] += p[r] + v); + y[1 - i] += c[o] / 2 - p[o] / 2, l.setPosition(f), u.setPosition(g), h.setPosition(y); + var m = {x: 0, y: 0}; + if (m[r] = d ? n[r] : c[r], m[o] = Math.max(c[o], p[o]), m[a] = Math.min(0, p[a] + y[1 - i]), u.__rectSize = n[r], d) { + var x = {x: 0, y: 0}; + x[r] = Math.max(n[r] - p[r] - v, 0), x[o] = m[o], u.setClipPath(new Ts({shape: x})), u.__rectSize = x[r] + } else h.eachChild((function (t) { + t.attr({invisible: !0, silent: !0}) + })); + var _ = this._getPageInfo(t); + return null != _.pageIndex && ih(l, { + x: _.contentPosition[0], + y: _.contentPosition[1] + }, d ? t : null), this._updatePageInfoView(t, _), m + }, e.prototype._pageGo = function (t, e, n) { + var i = this._getPageInfo(e)[t]; + null != i && n.dispatchAction({type: "legendScroll", scrollDataIndex: i, legendId: e.id}) + }, e.prototype._updatePageInfoView = function (t, e) { + var n = this._controllerGroup; + E(["pagePrev", "pageNext"], (function (i) { + var r = null != e[i + "DataIndex"], o = n.childOfName(i); + o && (o.setStyle("fill", r ? t.get("pageIconColor", !0) : t.get("pageIconInactiveColor", !0)), o.cursor = r ? "pointer" : "default") + })); + var i = n.childOfName("pageText"), r = t.get("pageFormatter"), o = e.pageIndex, a = null != o ? o + 1 : 0, + s = e.pageCount; + i && r && i.setStyle("text", X(r) ? r.replace("{current}", null == a ? "" : a + "").replace("{total}", null == s ? "" : s + "") : r({ + current: a, + total: s + })) + }, e.prototype._getPageInfo = function (t) { + var e = t.get("scrollDataIndex", !0), n = this.getContentGroup(), i = this._containerGroup.__rectSize, + r = t.getOrient().index, o = TB[r], a = CB[r], s = this._findTargetItemIndex(e), l = n.children(), + u = l[s], h = l.length, c = h ? 1 : 0, p = { + contentPosition: [n.x, n.y], + pageCount: c, + pageIndex: c - 1, + pagePrevDataIndex: null, + pageNextDataIndex: null + }; + if (!u) return p; + var d = m(u); + p.contentPosition[r] = -d.s; + for (var f = s + 1, g = d, y = d, v = null; f <= h; ++f) (!(v = m(l[f])) && y.e > g.s + i || v && !x(v, g.s)) && (g = y.i > g.i ? y : v) && (null == p.pageNextDataIndex && (p.pageNextDataIndex = g.i), ++p.pageCount), y = v; + for (f = s - 1, g = d, y = d, v = null; f >= -1; --f) (v = m(l[f])) && x(y, v.s) || !(g.i < y.i) || (y = g, null == p.pagePrevDataIndex && (p.pagePrevDataIndex = g.i), ++p.pageCount, ++p.pageIndex), g = v; + return p; + + function m(t) { + if (t) { + var e = t.getBoundingRect(), n = e[a] + t[a]; + return {s: n, e: n + e[o], i: t.__legendDataIndex} + } + } + + function x(t, e) { + return t.e >= e && t.s <= e + i + } + }, e.prototype._findTargetItemIndex = function (t) { + return this._showController ? (this.getContentGroup().eachChild((function (i, r) { + var o = i.__legendDataIndex; + null == n && null != o && (n = r), o === t && (e = r) + })), null != e ? e : n) : 0; + var e, n + }, e.type = "legend.scroll", e + }(gB); + + function AB(t) { + _m(wB), t.registerComponentModel(SB), t.registerComponentView(DB), function (t) { + t.registerAction("legendScroll", "legendscroll", (function (t, e) { + var n = t.scrollDataIndex; + null != n && e.eachComponent({mainType: "legend", subType: "scroll", query: t}, (function (t) { + t.setScrollDataIndex(n) + })) + })) + }(t) + } + + var kB = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "dataZoom.inside", e.defaultOption = gc(DE.defaultOption, { + disabled: !1, + zoomLock: !1, + zoomOnMouseWheel: !0, + moveOnMouseMove: !0, + moveOnMouseWheel: !1, + preventDefaultMouseMove: !0 + }), e + }(DE), LB = So(); + + function PB(t, e, n) { + LB(t).coordSysRecordMap.each((function (t) { + var i = t.dataZoomInfoMap.get(e.uid); + i && (i.getRange = n) + })) + } + + function OB(t, e) { + if (e) { + t.removeKey(e.model.uid); + var n = e.controller; + n && n.dispose() + } + } + + function RB(t, e) { + t.isDisposed() || t.dispatchAction({type: "dataZoom", animation: {easing: "cubicOut", duration: 100}, batch: e}) + } + + function NB(t, e, n, i) { + return t.coordinateSystem.containPoint([n, i]) + } + + function EB(t) { + t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER, (function (t, e) { + var n = LB(e), i = n.coordSysRecordMap || (n.coordSysRecordMap = ft()); + i.each((function (t) { + t.dataZoomInfoMap = null + })), t.eachComponent({mainType: "dataZoom", subType: "inside"}, (function (t) { + E(TE(t).infoList, (function (n) { + var r = n.model.uid, o = i.get(r) || i.set(r, function (t, e) { + var n = { + model: e, + containsPoint: H(NB, e), + dispatchAction: H(RB, t), + dataZoomInfoMap: null, + controller: null + }, i = n.controller = new DI(t.getZr()); + return E(["pan", "zoom", "scrollMove"], (function (t) { + i.on(t, (function (e) { + var i = []; + n.dataZoomInfoMap.each((function (r) { + if (e.isAvailableBehavior(r.model.option)) { + var o = (r.getRange || {})[t], + a = o && o(r.dzReferCoordSysInfo, n.model.mainType, n.controller, e); + !r.model.get("disabled", !0) && a && i.push({ + dataZoomId: r.model.id, + start: a[0], + end: a[1] + }) + } + })), i.length && n.dispatchAction(i) + })) + })), n + }(e, n.model)); + (o.dataZoomInfoMap || (o.dataZoomInfoMap = ft())).set(t.uid, { + dzReferCoordSysInfo: n, + model: t, + getRange: null + }) + })) + })), i.each((function (t) { + var e, n = t.controller, r = t.dataZoomInfoMap; + if (r) { + var o = r.keys()[0]; + null != o && (e = r.get(o)) + } + if (e) { + var a = function (t) { + var e, n = "type_", i = {type_true: 2, type_move: 1, type_false: 0, type_undefined: -1}, r = !0; + return t.each((function (t) { + var o = t.model, a = !o.get("disabled", !0) && (!o.get("zoomLock", !0) || "move"); + i[n + a] > i[n + e] && (e = a), r = r && o.get("preventDefaultMouseMove", !0) + })), { + controlType: e, + opt: { + zoomOnMouseWheel: !0, + moveOnMouseMove: !0, + moveOnMouseWheel: !0, + preventDefaultMouseMove: !!r + } + } + }(r); + n.enable(a.controlType, a.opt), n.setPointerChecker(t.containsPoint), Dg(t, "dispatchAction", e.model.get("throttle", !0), "fixRate") + } else OB(i, t) + })) + })) + } + + var zB = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.type = "dataZoom.inside", e + } + + return n(e, t), e.prototype.render = function (e, n, i) { + t.prototype.render.apply(this, arguments), e.noTarget() ? this._clear() : (this.range = e.getPercentRange(), PB(i, e, { + pan: W(VB.pan, this), + zoom: W(VB.zoom, this), + scrollMove: W(VB.scrollMove, this) + })) + }, e.prototype.dispose = function () { + this._clear(), t.prototype.dispose.apply(this, arguments) + }, e.prototype._clear = function () { + !function (t, e) { + for (var n = LB(t).coordSysRecordMap, i = n.keys(), r = 0; r < i.length; r++) { + var o = i[r], a = n.get(o), s = a.dataZoomInfoMap; + if (s) { + var l = e.uid; + s.get(l) && (s.removeKey(l), s.keys().length || OB(n, a)) + } + } + }(this.api, this.dataZoomModel), this.range = null + }, e.type = "dataZoom.inside", e + }(LE), VB = { + zoom: function (t, e, n, i) { + var r = this.range, o = r.slice(), a = t.axisModels[0]; + if (a) { + var s = FB[e](null, [i.originX, i.originY], a, n, t), + l = (s.signal > 0 ? s.pixelStart + s.pixelLength - s.pixel : s.pixel - s.pixelStart) / s.pixelLength * (o[1] - o[0]) + o[0], + u = Math.max(1 / i.scale, 0); + o[0] = (o[0] - l) * u + l, o[1] = (o[1] - l) * u + l; + var h = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan(); + return sk(0, o, [0, 100], 0, h.minSpan, h.maxSpan), this.range = o, r[0] !== o[0] || r[1] !== o[1] ? o : void 0 + } + }, pan: BB((function (t, e, n, i, r, o) { + var a = FB[i]([o.oldX, o.oldY], [o.newX, o.newY], e, r, n); + return a.signal * (t[1] - t[0]) * a.pixel / a.pixelLength + })), scrollMove: BB((function (t, e, n, i, r, o) { + return FB[i]([0, 0], [o.scrollDelta, o.scrollDelta], e, r, n).signal * (t[1] - t[0]) * o.scrollDelta + })) + }; + + function BB(t) { + return function (e, n, i, r) { + var o = this.range, a = o.slice(), s = e.axisModels[0]; + if (s) return sk(t(a, s, e, n, i, r), a, [0, 100], "all"), this.range = a, o[0] !== a[0] || o[1] !== a[1] ? a : void 0 + } + } + + var FB = { + grid: function (t, e, n, i, r) { + var o = n.axis, a = {}, s = r.model.coordinateSystem.getRect(); + return t = t || [0, 0], "x" === o.dim ? (a.pixel = e[0] - t[0], a.pixelLength = s.width, a.pixelStart = s.x, a.signal = o.inverse ? 1 : -1) : (a.pixel = e[1] - t[1], a.pixelLength = s.height, a.pixelStart = s.y, a.signal = o.inverse ? -1 : 1), a + }, polar: function (t, e, n, i, r) { + var o = n.axis, a = {}, s = r.model.coordinateSystem, l = s.getRadiusAxis().getExtent(), + u = s.getAngleAxis().getExtent(); + return t = t ? s.pointToCoord(t) : [0, 0], e = s.pointToCoord(e), "radiusAxis" === n.mainType ? (a.pixel = e[0] - t[0], a.pixelLength = l[1] - l[0], a.pixelStart = l[0], a.signal = o.inverse ? 1 : -1) : (a.pixel = e[1] - t[1], a.pixelLength = u[1] - u[0], a.pixelStart = u[0], a.signal = o.inverse ? -1 : 1), a + }, singleAxis: function (t, e, n, i, r) { + var o = n.axis, a = r.model.coordinateSystem.getRect(), s = {}; + return t = t || [0, 0], "horizontal" === o.orient ? (s.pixel = e[0] - t[0], s.pixelLength = a.width, s.pixelStart = a.x, s.signal = o.inverse ? 1 : -1) : (s.pixel = e[1] - t[1], s.pixelLength = a.height, s.pixelStart = a.y, s.signal = o.inverse ? -1 : 1), s + } + }; + + function GB(t) { + VE(t), t.registerComponentModel(kB), t.registerComponentView(zB), EB(t) + } + + var WB = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.type = "dataZoom.slider", e.layoutMode = "box", e.defaultOption = gc(DE.defaultOption, { + show: !0, + right: "ph", + top: "ph", + width: "ph", + height: "ph", + left: null, + bottom: null, + borderColor: "#d2dbee", + borderRadius: 3, + backgroundColor: "rgba(47,69,84,0)", + dataBackground: {lineStyle: {color: "#d2dbee", width: .5}, areaStyle: {color: "#d2dbee", opacity: .2}}, + selectedDataBackground: { + lineStyle: {color: "#8fb0f7", width: .5}, + areaStyle: {color: "#8fb0f7", opacity: .2} + }, + fillerColor: "rgba(135,175,274,0.2)", + handleIcon: "path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z", + handleSize: "100%", + handleStyle: {color: "#fff", borderColor: "#ACB8D1"}, + moveHandleSize: 7, + moveHandleIcon: "path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z", + moveHandleStyle: {color: "#D2DBEE", opacity: .7}, + showDetail: !0, + showDataShadow: "auto", + realtime: !0, + zoomLock: !1, + textStyle: {color: "#6E7079"}, + brushSelect: !0, + brushStyle: {color: "rgba(135,175,274,0.15)"}, + emphasis: {handleStyle: {borderColor: "#8FB0F7"}, moveHandleStyle: {color: "#8FB0F7"}} + }), e + }(DE), HB = Ts, YB = "horizontal", UB = "vertical", XB = ["line", "bar", "candlestick", "scatter"], + ZB = {easing: "cubicOut", duration: 100, delay: 0}, jB = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n._displayables = {}, n + } + + return n(e, t), e.prototype.init = function (t, e) { + this.api = e, this._onBrush = W(this._onBrush, this), this._onBrushEnd = W(this._onBrushEnd, this) + }, e.prototype.render = function (e, n, i, r) { + if (t.prototype.render.apply(this, arguments), Dg(this, "_dispatchZoomAction", e.get("throttle"), "fixRate"), this._orient = e.getOrient(), !1 !== e.get("show")) { + if (e.noTarget()) return this._clear(), void this.group.removeAll(); + r && "dataZoom" === r.type && r.from === this.uid || this._buildView(), this._updateView() + } else this.group.removeAll() + }, e.prototype.dispose = function () { + this._clear(), t.prototype.dispose.apply(this, arguments) + }, e.prototype._clear = function () { + Ag(this, "_dispatchZoomAction"); + var t = this.api.getZr(); + t.off("mousemove", this._onBrush), t.off("mouseup", this._onBrushEnd) + }, e.prototype._buildView = function () { + var t = this.group; + t.removeAll(), this._brushing = !1, this._displayables.brushRect = null, this._resetLocation(), this._resetInterval(); + var e = this._displayables.sliderGroup = new Cr; + this._renderBackground(), this._renderHandle(), this._renderDataShadow(), t.add(e), this._positionGroup() + }, e.prototype._resetLocation = function () { + var t = this.dataZoomModel, e = this.api, n = t.get("brushSelect") ? 7 : 0, i = this._findCoordRect(), + r = {width: e.getWidth(), height: e.getHeight()}, o = this._orient === YB ? { + right: r.width - i.x - i.width, + top: r.height - 30 - 7 - n, + width: i.width, + height: 30 + } : {right: 7, top: i.y, width: 30, height: i.height}, a = wp(t.option); + E(["right", "top", "width", "height"], (function (t) { + "ph" === a[t] && (a[t] = o[t]) + })); + var s = mp(a, r); + this._location = { + x: s.x, + y: s.y + }, this._size = [s.width, s.height], this._orient === UB && this._size.reverse() + }, e.prototype._positionGroup = function () { + var t = this.group, e = this._location, n = this._orient, i = this.dataZoomModel.getFirstTargetAxisModel(), + r = i && i.get("inverse"), o = this._displayables.sliderGroup, + a = (this._dataShadowInfo || {}).otherAxisInverse; + o.attr(n !== YB || r ? n === YB && r ? { + scaleY: a ? 1 : -1, + scaleX: -1 + } : n !== UB || r ? {scaleY: a ? -1 : 1, scaleX: -1, rotation: Math.PI / 2} : { + scaleY: a ? -1 : 1, + scaleX: 1, + rotation: Math.PI / 2 + } : {scaleY: a ? 1 : -1, scaleX: 1}); + var s = t.getBoundingRect([o]); + t.x = e.x - s.x, t.y = e.y - s.y, t.markRedraw() + }, e.prototype._getViewExtent = function () { + return [0, this._size[0]] + }, e.prototype._renderBackground = function () { + var t = this.dataZoomModel, e = this._size, n = this._displayables.sliderGroup, i = t.get("brushSelect"); + n.add(new HB({ + silent: !0, + shape: {x: 0, y: 0, width: e[0], height: e[1]}, + style: {fill: t.get("backgroundColor")}, + z2: -40 + })); + var r = new HB({ + shape: {x: 0, y: 0, width: e[0], height: e[1]}, + style: {fill: "transparent"}, + z2: 0, + onclick: W(this._onClickPanel, this) + }), o = this.api.getZr(); + i ? (r.on("mousedown", this._onBrushStart, this), r.cursor = "crosshair", o.on("mousemove", this._onBrush), o.on("mouseup", this._onBrushEnd)) : (o.off("mousemove", this._onBrush), o.off("mouseup", this._onBrushEnd)), n.add(r) + }, e.prototype._renderDataShadow = function () { + var t = this._dataShadowInfo = this._prepareDataShadowInfo(); + if (this._displayables.dataShadowSegs = [], t) { + var e = this._size, n = this._shadowSize || [], i = t.series, r = i.getRawData(), + o = i.getShadowDim ? i.getShadowDim() : t.otherDim; + if (null != o) { + var a = this._shadowPolygonPts, s = this._shadowPolylinePts; + if (r !== this._shadowData || o !== this._shadowDim || e[0] !== n[0] || e[1] !== n[1]) { + var l = r.getDataExtent(o), u = .3 * (l[1] - l[0]); + l = [l[0] - u, l[1] + u]; + var h, c = [0, e[1]], p = [0, e[0]], d = [[e[0], 0], [0, 0]], f = [], + g = p[1] / (r.count() - 1), y = 0, v = Math.round(r.count() / e[0]); + r.each([o], (function (t, e) { + if (v > 0 && e % v) y += g; else { + var n = null == t || isNaN(t) || "" === t, i = n ? 0 : Nr(t, l, c, !0); + n && !h && e ? (d.push([d[d.length - 1][0], 0]), f.push([f[f.length - 1][0], 0])) : !n && h && (d.push([y, 0]), f.push([y, 0])), d.push([y, i]), f.push([y, i]), y += g, h = n + } + })), a = this._shadowPolygonPts = d, s = this._shadowPolylinePts = f + } + this._shadowData = r, this._shadowDim = o, this._shadowSize = [e[0], e[1]]; + for (var m = this.dataZoomModel, x = 0; x < 3; x++) { + var _ = b(1 === x); + this._displayables.sliderGroup.add(_), this._displayables.dataShadowSegs.push(_) + } + } + } + + function b(t) { + var e = m.getModel(t ? "selectedDataBackground" : "dataBackground"), n = new Cr, i = new Lu({ + shape: {points: a}, + segmentIgnoreThreshold: 1, + style: e.getModel("areaStyle").getAreaStyle(), + silent: !0, + z2: -20 + }), r = new Ou({ + shape: {points: s}, + segmentIgnoreThreshold: 1, + style: e.getModel("lineStyle").getLineStyle(), + silent: !0, + z2: -19 + }); + return n.add(i), n.add(r), n + } + }, e.prototype._prepareDataShadowInfo = function () { + var t = this.dataZoomModel, e = t.get("showDataShadow"); + if (!1 !== e) { + var n, i = this.ecModel; + return t.eachTargetAxis((function (r, o) { + E(t.getAxisProxy(r, o).getTargetSeriesModels(), (function (t) { + if (!(n || !0 !== e && P(XB, t.get("type")) < 0)) { + var a, s = i.getComponent(ME(r), o).axis, + l = {x: "y", y: "x", radius: "angle", angle: "radius"}[r], u = t.coordinateSystem; + null != l && u.getOtherAxis && (a = u.getOtherAxis(s).inverse), l = t.getData().mapDimension(l), n = { + thisAxis: s, + series: t, + thisDim: r, + otherDim: l, + otherAxisInverse: a + } + } + }), this) + }), this), n + } + }, e.prototype._renderHandle = function () { + var t = this.group, e = this._displayables, n = e.handles = [null, null], i = e.handleLabels = [null, null], + r = this._displayables.sliderGroup, o = this._size, a = this.dataZoomModel, s = this.api, + l = a.get("borderRadius") || 0, u = a.get("brushSelect"), h = e.filler = new HB({ + silent: u, + style: {fill: a.get("fillerColor")}, + textConfig: {position: "inside"} + }); + r.add(h), r.add(new HB({ + silent: !0, + subPixelOptimize: !0, + shape: {x: 0, y: 0, width: o[0], height: o[1], r: l}, + style: { + stroke: a.get("dataBackgroundColor") || a.get("borderColor"), + lineWidth: 1, + fill: "rgba(0,0,0,0)" + } + })), E([0, 1], (function (e) { + var o = a.get("handleIcon"); + !Cy[o] && o.indexOf("path://") < 0 && o.indexOf("image://") < 0 && (o = "path://" + o); + var s = ky(o, -1, 0, 2, 2, null, !0); + s.attr({ + cursor: qB(this._orient), + draggable: !0, + drift: W(this._onDragMove, this, e), + ondragend: W(this._onDragEnd, this), + onmouseover: W(this._showDataInfo, this, !0), + onmouseout: W(this._showDataInfo, this, !1), + z2: 5 + }); + var l = s.getBoundingRect(), u = a.get("handleSize"); + this._handleHeight = Er(u, this._size[1]), this._handleWidth = l.width / l.height * this._handleHeight, s.setStyle(a.getModel("handleStyle").getItemStyle()), s.style.strokeNoScale = !0, s.rectHover = !0, s.ensureState("emphasis").style = a.getModel(["emphasis", "handleStyle"]).getItemStyle(), Pl(s); + var h = a.get("handleColor"); + null != h && (s.style.fill = h), r.add(n[e] = s); + var c = a.getModel("textStyle"); + t.add(i[e] = new As({ + silent: !0, + invisible: !0, + style: Yh(c, { + x: 0, + y: 0, + text: "", + verticalAlign: "middle", + align: "center", + fill: c.getTextColor(), + font: c.getFont() + }), + z2: 10 + })) + }), this); + var c = h; + if (u) { + var p = Er(a.get("moveHandleSize"), o[1]), d = e.moveHandle = new Ts({ + style: a.getModel("moveHandleStyle").getItemStyle(), + silent: !0, + shape: {r: [0, 0, 2, 2], y: o[1] - .5, height: p} + }), f = .8 * p, g = e.moveHandleIcon = ky(a.get("moveHandleIcon"), -f / 2, -f / 2, f, f, "#fff", !0); + g.silent = !0, g.y = o[1] + p / 2 - .5, d.ensureState("emphasis").style = a.getModel(["emphasis", "moveHandleStyle"]).getItemStyle(); + var y = Math.min(o[1] / 2, Math.max(p, 10)); + (c = e.moveZone = new Ts({ + invisible: !0, + shape: {y: o[1] - y, height: p + y} + })).on("mouseover", (function () { + s.enterEmphasis(d) + })).on("mouseout", (function () { + s.leaveEmphasis(d) + })), r.add(d), r.add(g), r.add(c) + } + c.attr({ + draggable: !0, + cursor: qB(this._orient), + drift: W(this._onDragMove, this, "all"), + ondragstart: W(this._showDataInfo, this, !0), + ondragend: W(this._onDragEnd, this), + onmouseover: W(this._showDataInfo, this, !0), + onmouseout: W(this._showDataInfo, this, !1) + }) + }, e.prototype._resetInterval = function () { + var t = this._range = this.dataZoomModel.getPercentRange(), e = this._getViewExtent(); + this._handleEnds = [Nr(t[0], [0, 100], e, !0), Nr(t[1], [0, 100], e, !0)] + }, e.prototype._updateInterval = function (t, e) { + var n = this.dataZoomModel, i = this._handleEnds, r = this._getViewExtent(), + o = n.findRepresentativeAxisProxy().getMinMaxSpan(), a = [0, 100]; + sk(e, i, r, n.get("zoomLock") ? "all" : t, null != o.minSpan ? Nr(o.minSpan, a, r, !0) : null, null != o.maxSpan ? Nr(o.maxSpan, a, r, !0) : null); + var s = this._range, l = this._range = Vr([Nr(i[0], r, a, !0), Nr(i[1], r, a, !0)]); + return !s || s[0] !== l[0] || s[1] !== l[1] + }, e.prototype._updateView = function (t) { + var e = this._displayables, n = this._handleEnds, i = Vr(n.slice()), r = this._size; + E([0, 1], (function (t) { + var i = e.handles[t], o = this._handleHeight; + i.attr({scaleX: o / 2, scaleY: o / 2, x: n[t] + (t ? -1 : 1), y: r[1] / 2 - o / 2}) + }), this), e.filler.setShape({x: i[0], y: 0, width: i[1] - i[0], height: r[1]}); + var o = {x: i[0], width: i[1] - i[0]}; + e.moveHandle && (e.moveHandle.setShape(o), e.moveZone.setShape(o), e.moveZone.getBoundingRect(), e.moveHandleIcon && e.moveHandleIcon.attr("x", o.x + o.width / 2)); + for (var a = e.dataShadowSegs, s = [0, i[0], i[1], r[0]], l = 0; l < a.length; l++) { + var u = a[l], h = u.getClipPath(); + h || (h = new Ts, u.setClipPath(h)), h.setShape({x: s[l], y: 0, width: s[l + 1] - s[l], height: r[1]}) + } + this._updateDataInfo(t) + }, e.prototype._updateDataInfo = function (t) { + var e = this.dataZoomModel, n = this._displayables, i = n.handleLabels, r = this._orient, o = ["", ""]; + if (e.get("showDetail")) { + var a = e.findRepresentativeAxisProxy(); + if (a) { + var s = a.getAxisModel().axis, l = this._range, + u = t ? a.calculateDataWindow({start: l[0], end: l[1]}).valueWindow : a.getDataValueWindow(); + o = [this._formatLabel(u[0], s), this._formatLabel(u[1], s)] + } + } + var h = Vr(this._handleEnds.slice()); + + function c(t) { + var e = Mh(n.handles[t].parent, this.group), a = Th(0 === t ? "right" : "left", e), + s = this._handleWidth / 2 + 5, l = Ih([h[t] + (0 === t ? -s : s), this._size[1] / 2], e); + i[t].setStyle({ + x: l[0], + y: l[1], + verticalAlign: r === YB ? "middle" : a, + align: r === YB ? a : "center", + text: o[t] + }) + } + + c.call(this, 0), c.call(this, 1) + }, e.prototype._formatLabel = function (t, e) { + var n = this.dataZoomModel, i = n.get("labelFormatter"), r = n.get("labelPrecision"); + null != r && "auto" !== r || (r = e.getPixelPrecision()); + var o = null == t || isNaN(t) ? "" : "category" === e.type || "time" === e.type ? e.scale.getLabel({value: Math.round(t)}) : t.toFixed(Math.min(r, 20)); + return U(i) ? i(t, o) : X(i) ? i.replace("{value}", o) : o + }, e.prototype._showDataInfo = function (t) { + t = this._dragging || t; + var e = this._displayables, n = e.handleLabels; + n[0].attr("invisible", !t), n[1].attr("invisible", !t), e.moveHandle && this.api[t ? "enterEmphasis" : "leaveEmphasis"](e.moveHandle, 1) + }, e.prototype._onDragMove = function (t, e, n, i) { + this._dragging = !0, se(i.event); + var r = Ih([e, n], this._displayables.sliderGroup.getLocalTransform(), !0), + o = this._updateInterval(t, r[0]), a = this.dataZoomModel.get("realtime"); + this._updateView(!a), o && a && this._dispatchZoomAction(!0) + }, e.prototype._onDragEnd = function () { + this._dragging = !1, this._showDataInfo(!1), !this.dataZoomModel.get("realtime") && this._dispatchZoomAction(!1) + }, e.prototype._onClickPanel = function (t) { + var e = this._size, n = this._displayables.sliderGroup.transformCoordToLocal(t.offsetX, t.offsetY); + if (!(n[0] < 0 || n[0] > e[0] || n[1] < 0 || n[1] > e[1])) { + var i = this._handleEnds, r = (i[0] + i[1]) / 2, o = this._updateInterval("all", n[0] - r); + this._updateView(), o && this._dispatchZoomAction(!1) + } + }, e.prototype._onBrushStart = function (t) { + var e = t.offsetX, n = t.offsetY; + this._brushStart = new Ji(e, n), this._brushing = !0, this._brushStartTime = +new Date + }, e.prototype._onBrushEnd = function (t) { + if (this._brushing) { + var e = this._displayables.brushRect; + if (this._brushing = !1, e) { + e.attr("ignore", !0); + var n = e.shape; + if (!(+new Date - this._brushStartTime < 200 && Math.abs(n.width) < 5)) { + var i = this._getViewExtent(), r = [0, 100]; + this._range = Vr([Nr(n.x, i, r, !0), Nr(n.x + n.width, i, r, !0)]), this._handleEnds = [n.x, n.x + n.width], this._updateView(), this._dispatchZoomAction(!1) + } + } + } + }, e.prototype._onBrush = function (t) { + this._brushing && (se(t.event), this._updateBrushRect(t.offsetX, t.offsetY)) + }, e.prototype._updateBrushRect = function (t, e) { + var n = this._displayables, i = this.dataZoomModel, r = n.brushRect; + r || (r = n.brushRect = new HB({ + silent: !0, + style: i.getModel("brushStyle").getItemStyle() + }), n.sliderGroup.add(r)), r.attr("ignore", !1); + var o = this._brushStart, a = this._displayables.sliderGroup, s = a.transformCoordToLocal(t, e), + l = a.transformCoordToLocal(o.x, o.y), u = this._size; + s[0] = Math.max(Math.min(u[0], s[0]), 0), r.setShape({x: l[0], y: 0, width: s[0] - l[0], height: u[1]}) + }, e.prototype._dispatchZoomAction = function (t) { + var e = this._range; + this.api.dispatchAction({ + type: "dataZoom", + from: this.uid, + dataZoomId: this.dataZoomModel.id, + animation: t ? ZB : null, + start: e[0], + end: e[1] + }) + }, e.prototype._findCoordRect = function () { + var t, e = TE(this.dataZoomModel).infoList; + if (!t && e.length) { + var n = e[0].model.coordinateSystem; + t = n.getRect && n.getRect() + } + if (!t) { + var i = this.api.getWidth(), r = this.api.getHeight(); + t = {x: .2 * i, y: .2 * r, width: .6 * i, height: .6 * r} + } + return t + }, e.type = "dataZoom.slider", e + }(LE); + + function qB(t) { + return "vertical" === t ? "ns-resize" : "ew-resize" + } + + function KB(t) { + t.registerComponentModel(WB), t.registerComponentView(jB), VE(t) + } + + var $B = function (t, e, n) { + var i = T((JB[t] || {})[e]); + return n && Y(i) ? i[i.length - 1] : i + }, JB = { + color: {active: ["#006edd", "#e0ffff"], inactive: ["rgba(0,0,0,0)"]}, + colorHue: {active: [0, 360], inactive: [0, 0]}, + colorSaturation: {active: [.3, 1], inactive: [0, 0]}, + colorLightness: {active: [.9, .5], inactive: [0, 0]}, + colorAlpha: {active: [.3, 1], inactive: [0, 0]}, + opacity: {active: [.3, 1], inactive: [0, 0]}, + symbol: {active: ["circle", "roundRect", "diamond"], inactive: ["none"]}, + symbolSize: {active: [10, 50], inactive: [0, 0]} + }, QB = eD.mapVisual, tF = eD.eachVisual, eF = Y, nF = E, iF = Vr, rF = Nr, oF = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.stateList = ["inRange", "outOfRange"], n.replacableOptionKeys = ["inRange", "outOfRange", "target", "controller", "color"], n.layoutMode = { + type: "box", + ignoreSize: !0 + }, n.dataBound = [-1 / 0, 1 / 0], n.targetVisuals = {}, n.controllerVisuals = {}, n + } + + return n(e, t), e.prototype.init = function (t, e, n) { + this.mergeDefaultAndTheme(t, n) + }, e.prototype.optionUpdated = function (t, e) { + var n = this.option; + !e && tV(n, t, this.replacableOptionKeys), this.textStyleModel = this.getModel("textStyle"), this.resetItemSize(), this.completeVisualOption() + }, e.prototype.resetVisual = function (t) { + var e = this.stateList; + t = W(t, this), this.controllerVisuals = Qz(this.option.controller, e, t), this.targetVisuals = Qz(this.option.target, e, t) + }, e.prototype.getItemSymbol = function () { + return null + }, e.prototype.getTargetSeriesIndices = function () { + var t = this.option.seriesIndex, e = []; + return null == t || "all" === t ? this.ecModel.eachSeries((function (t, n) { + e.push(n) + })) : e = ho(t), e + }, e.prototype.eachTargetSeries = function (t, e) { + E(this.getTargetSeriesIndices(), (function (n) { + var i = this.ecModel.getSeriesByIndex(n); + i && t.call(e, i) + }), this) + }, e.prototype.isTargetSeries = function (t) { + var e = !1; + return this.eachTargetSeries((function (n) { + n === t && (e = !0) + })), e + }, e.prototype.formatValueText = function (t, e, n) { + var i, r = this.option, o = r.precision, a = this.dataBound, s = r.formatter; + n = n || ["<", ">"], Y(t) && (t = t.slice(), i = !0); + var l = e ? t : i ? [u(t[0]), u(t[1])] : u(t); + return X(s) ? s.replace("{value}", i ? l[0] : l).replace("{value2}", i ? l[1] : l) : U(s) ? i ? s(t[0], t[1]) : s(t) : i ? t[0] === a[0] ? n[0] + " " + l[1] : t[1] === a[1] ? n[1] + " " + l[0] : l[0] + " - " + l[1] : l; + + function u(t) { + return t === a[0] ? "min" : t === a[1] ? "max" : (+t).toFixed(Math.min(o, 20)) + } + }, e.prototype.resetExtent = function () { + var t = this.option, e = iF([t.min, t.max]); + this._dataExtent = e + }, e.prototype.getDataDimensionIndex = function (t) { + var e = this.option.dimension; + if (null != e) return t.getDimensionIndex(e); + for (var n = t.dimensions, i = n.length - 1; i >= 0; i--) { + var r = n[i], o = t.getDimensionInfo(r); + if (!o.isCalculationCoord) return o.storeDimIndex + } + }, e.prototype.getExtent = function () { + return this._dataExtent.slice() + }, e.prototype.completeVisualOption = function () { + var t = this.ecModel, e = this.option, n = {inRange: e.inRange, outOfRange: e.outOfRange}, + i = e.target || (e.target = {}), r = e.controller || (e.controller = {}); + C(i, n), C(r, n); + var o = this.isCategory(); + + function a(n) { + eF(e.color) && !n.inRange && (n.inRange = {color: e.color.slice().reverse()}), n.inRange = n.inRange || {color: t.get("gradientColor")} + } + + a.call(this, i), a.call(this, r), function (t, e, n) { + var i = t[e], r = t[n]; + i && !r && (r = t[n] = {}, nF(i, (function (t, e) { + if (eD.isValidType(e)) { + var n = $B(e, "inactive", o); + null != n && (r[e] = n, "color" !== e || r.hasOwnProperty("opacity") || r.hasOwnProperty("colorAlpha") || (r.opacity = [0, 0])) + } + }))) + }.call(this, i, "inRange", "outOfRange"), function (t) { + var e = (t.inRange || {}).symbol || (t.outOfRange || {}).symbol, + n = (t.inRange || {}).symbolSize || (t.outOfRange || {}).symbolSize, i = this.get("inactiveColor"), + r = this.getItemSymbol() || "roundRect"; + nF(this.stateList, (function (a) { + var s = this.itemSize, l = t[a]; + l || (l = t[a] = {color: o ? i : [i]}), null == l.symbol && (l.symbol = e && T(e) || (o ? r : [r])), null == l.symbolSize && (l.symbolSize = n && T(n) || (o ? s[0] : [s[0], s[0]])), l.symbol = QB(l.symbol, (function (t) { + return "none" === t ? r : t + })); + var u = l.symbolSize; + if (null != u) { + var h = -1 / 0; + tF(u, (function (t) { + t > h && (h = t) + })), l.symbolSize = QB(u, (function (t) { + return rF(t, [0, h], [0, s[0]], !0) + })) + } + }), this) + }.call(this, r) + }, e.prototype.resetItemSize = function () { + this.itemSize = [parseFloat(this.get("itemWidth")), parseFloat(this.get("itemHeight"))] + }, e.prototype.isCategory = function () { + return !!this.option.categories + }, e.prototype.setSelected = function (t) { + }, e.prototype.getSelected = function () { + return null + }, e.prototype.getValueState = function (t) { + return null + }, e.prototype.getVisualMeta = function (t) { + return null + }, e.type = "visualMap", e.dependencies = ["series"], e.defaultOption = { + show: !0, + z: 4, + seriesIndex: "all", + min: 0, + max: 200, + left: 0, + right: null, + top: null, + bottom: 0, + itemWidth: null, + itemHeight: null, + inverse: !1, + orient: "vertical", + backgroundColor: "rgba(0,0,0,0)", + borderColor: "#ccc", + contentColor: "#5793f3", + inactiveColor: "#aaa", + borderWidth: 0, + padding: 5, + textGap: 10, + precision: 0, + textStyle: {color: "#333"} + }, e + }(Ip), aF = [20, 140], sF = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.optionUpdated = function (e, n) { + t.prototype.optionUpdated.apply(this, arguments), this.resetExtent(), this.resetVisual((function (t) { + t.mappingMethod = "linear", t.dataExtent = this.getExtent() + })), this._resetRange() + }, e.prototype.resetItemSize = function () { + t.prototype.resetItemSize.apply(this, arguments); + var e = this.itemSize; + (null == e[0] || isNaN(e[0])) && (e[0] = aF[0]), (null == e[1] || isNaN(e[1])) && (e[1] = aF[1]) + }, e.prototype._resetRange = function () { + var t = this.getExtent(), e = this.option.range; + !e || e.auto ? (t.auto = 1, this.option.range = t) : Y(e) && (e[0] > e[1] && e.reverse(), e[0] = Math.max(e[0], t[0]), e[1] = Math.min(e[1], t[1])) + }, e.prototype.completeVisualOption = function () { + t.prototype.completeVisualOption.apply(this, arguments), E(this.stateList, (function (t) { + var e = this.option.controller[t].symbolSize; + e && e[0] !== e[1] && (e[0] = e[1] / 3) + }), this) + }, e.prototype.setSelected = function (t) { + this.option.range = t.slice(), this._resetRange() + }, e.prototype.getSelected = function () { + var t = this.getExtent(), e = Vr((this.get("range") || []).slice()); + return e[0] > t[1] && (e[0] = t[1]), e[1] > t[1] && (e[1] = t[1]), e[0] < t[0] && (e[0] = t[0]), e[1] < t[0] && (e[1] = t[0]), e + }, e.prototype.getValueState = function (t) { + var e = this.option.range, n = this.getExtent(); + return (e[0] <= n[0] || e[0] <= t) && (e[1] >= n[1] || t <= e[1]) ? "inRange" : "outOfRange" + }, e.prototype.findTargetDataIndices = function (t) { + var e = []; + return this.eachTargetSeries((function (n) { + var i = [], r = n.getData(); + r.each(this.getDataDimensionIndex(r), (function (e, n) { + t[0] <= e && e <= t[1] && i.push(n) + }), this), e.push({seriesId: n.id, dataIndex: i}) + }), this), e + }, e.prototype.getVisualMeta = function (t) { + var e = lF(this, "outOfRange", this.getExtent()), n = lF(this, "inRange", this.option.range.slice()), + i = []; + + function r(e, n) { + i.push({value: e, color: t(e, n)}) + } + + for (var o = 0, a = 0, s = n.length, l = e.length; a < l && (!n.length || e[a] <= n[0]); a++) e[a] < n[o] && r(e[a], "outOfRange"); + for (var u = 1; o < s; o++, u = 0) u && i.length && r(n[o], "outOfRange"), r(n[o], "inRange"); + for (u = 1; a < l; a++) (!n.length || n[n.length - 1] < e[a]) && (u && (i.length && r(i[i.length - 1].value, "outOfRange"), u = 0), r(e[a], "outOfRange")); + var h = i.length; + return {stops: i, outerColors: [h ? i[0].color : "transparent", h ? i[h - 1].color : "transparent"]} + }, e.type = "visualMap.continuous", e.defaultOption = gc(oF.defaultOption, { + align: "auto", + calculable: !1, + hoverLink: !0, + realtime: !0, + handleIcon: "path://M-11.39,9.77h0a3.5,3.5,0,0,1-3.5,3.5h-22a3.5,3.5,0,0,1-3.5-3.5h0a3.5,3.5,0,0,1,3.5-3.5h22A3.5,3.5,0,0,1-11.39,9.77Z", + handleSize: "120%", + handleStyle: {borderColor: "#fff", borderWidth: 1}, + indicatorIcon: "circle", + indicatorSize: "50%", + indicatorStyle: { + borderColor: "#fff", + borderWidth: 2, + shadowBlur: 2, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: "rgba(0,0,0,0.2)" + } + }), e + }(oF); + + function lF(t, e, n) { + if (n[0] === n[1]) return n.slice(); + for (var i = (n[1] - n[0]) / 200, r = n[0], o = [], a = 0; a <= 200 && r < n[1]; a++) o.push(r), r += i; + return o.push(n[1]), o + } + + var uF = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n.autoPositionValues = {left: 1, right: 1, top: 1, bottom: 1}, n + } + + return n(e, t), e.prototype.init = function (t, e) { + this.ecModel = t, this.api = e + }, e.prototype.render = function (t, e, n, i) { + this.visualMapModel = t, !1 !== t.get("show") ? this.doRender(t, e, n, i) : this.group.removeAll() + }, e.prototype.renderBackground = function (t) { + var e = this.visualMapModel, n = np(e.get("padding") || 0), i = t.getBoundingRect(); + t.add(new Ts({ + z2: -1, + silent: !0, + shape: {x: i.x - n[3], y: i.y - n[0], width: i.width + n[3] + n[1], height: i.height + n[0] + n[2]}, + style: {fill: e.get("backgroundColor"), stroke: e.get("borderColor"), lineWidth: e.get("borderWidth")} + })) + }, e.prototype.getControllerVisual = function (t, e, n) { + var i = (n = n || {}).forceState, r = this.visualMapModel, o = {}; + if ("color" === e) { + var a = r.get("contentColor"); + o.color = a + } + + function s(t) { + return o[t] + } + + function l(t, e) { + o[t] = e + } + + var u = r.controllerVisuals[i || r.getValueState(t)]; + return E(eD.prepareVisualTypes(u), (function (i) { + var r = u[i]; + n.convertOpacityToAlpha && "opacity" === i && (i = "colorAlpha", r = u.__alphaForOpacity), eD.dependsOn(i, e) && r && r.applyVisual(t, s, l) + })), o[e] + }, e.prototype.positionGroup = function (t) { + var e = this.visualMapModel, n = this.api; + xp(t, e.getBoxLayoutParams(), {width: n.getWidth(), height: n.getHeight()}) + }, e.prototype.doRender = function (t, e, n, i) { + }, e.type = "visualMap", e + }(fg), hF = [["left", "right", "width"], ["top", "bottom", "height"]]; + + function cF(t, e, n) { + var i = t.option, r = i.align; + if (null != r && "auto" !== r) return r; + for (var o = { + width: e.getWidth(), + height: e.getHeight() + }, a = "horizontal" === i.orient ? 1 : 0, s = hF[a], l = [0, null, 10], u = {}, h = 0; h < 3; h++) u[hF[1 - a][h]] = l[h], u[s[h]] = 2 === h ? n[0] : i[s[h]]; + var c = [["x", "width", 3], ["y", "height", 0]][a], p = mp(u, o, i.padding); + return s[(p.margin[c[2]] || 0) + p[c[0]] + .5 * p[c[1]] < .5 * o[c[1]] ? 0 : 1] + } + + function pF(t, e) { + return E(t || [], (function (t) { + null != t.dataIndex && (t.dataIndexInside = t.dataIndex, t.dataIndex = null), t.highlightKey = "visualMap" + (e ? e.componentIndex : "") + })), t + } + + var dF = Nr, fF = E, gF = Math.min, yF = Math.max, vF = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n._shapes = {}, n._dataInterval = [], n._handleEnds = [], n._hoverLinkDataIndices = [], n + } + + return n(e, t), e.prototype.doRender = function (t, e, n, i) { + this._api = n, i && "selectDataRange" === i.type && i.from === this.uid || this._buildView() + }, e.prototype._buildView = function () { + this.group.removeAll(); + var t = this.visualMapModel, e = this.group; + this._orient = t.get("orient"), this._useHandle = t.get("calculable"), this._resetInterval(), this._renderBar(e); + var n = t.get("text"); + this._renderEndsText(e, n, 0), this._renderEndsText(e, n, 1), this._updateView(!0), this.renderBackground(e), this._updateView(), this._enableHoverLinkToSeries(), this._enableHoverLinkFromSeries(), this.positionGroup(e) + }, e.prototype._renderEndsText = function (t, e, n) { + if (e) { + var i = e[1 - n]; + i = null != i ? i + "" : ""; + var r = this.visualMapModel, o = r.get("textGap"), a = r.itemSize, s = this._shapes.mainGroup, + l = this._applyTransform([a[0] / 2, 0 === n ? -o : a[1] + o], s), + u = this._applyTransform(0 === n ? "bottom" : "top", s), h = this._orient, + c = this.visualMapModel.textStyleModel; + this.group.add(new As({ + style: { + x: l[0], + y: l[1], + verticalAlign: "horizontal" === h ? "middle" : u, + align: "horizontal" === h ? u : "center", + text: i, + font: c.getFont(), + fill: c.getTextColor() + } + })) + } + }, e.prototype._renderBar = function (t) { + var e = this.visualMapModel, n = this._shapes, i = e.itemSize, r = this._orient, o = this._useHandle, + a = cF(e, this.api, i), s = n.mainGroup = this._createBarGroup(a), l = new Cr; + s.add(l), l.add(n.outOfRange = mF()), l.add(n.inRange = mF(null, o ? _F(this._orient) : null, W(this._dragHandle, this, "all", !1), W(this._dragHandle, this, "all", !0))), l.setClipPath(new Ts({ + shape: { + x: 0, + y: 0, + width: i[0], + height: i[1], + r: 3 + } + })); + var u = e.textStyleModel.getTextRect("国"), h = yF(u.width, u.height); + o && (n.handleThumbs = [], n.handleLabels = [], n.handleLabelPoints = [], this._createHandle(e, s, 0, i, h, r), this._createHandle(e, s, 1, i, h, r)), this._createIndicator(e, s, i, h, r), t.add(s) + }, e.prototype._createHandle = function (t, e, n, i, r, o) { + var a = W(this._dragHandle, this, n, !1), s = W(this._dragHandle, this, n, !0), + l = gr(t.get("handleSize"), i[0]), u = ky(t.get("handleIcon"), -l / 2, -l / 2, l, l, null, !0), + h = _F(this._orient); + u.attr({ + cursor: h, draggable: !0, drift: a, ondragend: s, onmousemove: function (t) { + se(t.event) + } + }), u.x = i[0] / 2, u.useStyle(t.getModel("handleStyle").getItemStyle()), u.setStyle({ + strokeNoScale: !0, + strokeFirst: !0 + }), u.style.lineWidth *= 2, u.ensureState("emphasis").style = t.getModel(["emphasis", "handleStyle"]).getItemStyle(), Vl(u, !0), e.add(u); + var c = this.visualMapModel.textStyleModel, p = new As({ + cursor: h, draggable: !0, drift: a, onmousemove: function (t) { + se(t.event) + }, ondragend: s, style: {x: 0, y: 0, text: "", font: c.getFont(), fill: c.getTextColor()} + }); + p.ensureState("blur").style = {opacity: .1}, p.stateTransition = {duration: 200}, this.group.add(p); + var d = [l, 0], f = this._shapes; + f.handleThumbs[n] = u, f.handleLabelPoints[n] = d, f.handleLabels[n] = p + }, e.prototype._createIndicator = function (t, e, n, i, r) { + var o = gr(t.get("indicatorSize"), n[0]), a = ky(t.get("indicatorIcon"), -o / 2, -o / 2, o, o, null, !0); + a.attr({cursor: "move", invisible: !0, silent: !0, x: n[0] / 2}); + var s = t.getModel("indicatorStyle").getItemStyle(); + if (a instanceof xs) { + var l = a.style; + a.useStyle(A({image: l.image, x: l.x, y: l.y, width: l.width, height: l.height}, s)) + } else a.useStyle(s); + e.add(a); + var u = this.visualMapModel.textStyleModel, h = new As({ + silent: !0, + invisible: !0, + style: {x: 0, y: 0, text: "", font: u.getFont(), fill: u.getTextColor()} + }); + this.group.add(h); + var c = [("horizontal" === r ? i / 2 : 6) + n[0] / 2, 0], p = this._shapes; + p.indicator = a, p.indicatorLabel = h, p.indicatorLabelPoint = c, this._firstShowIndicator = !0 + }, e.prototype._dragHandle = function (t, e, n, i) { + if (this._useHandle) { + if (this._dragging = !e, !e) { + var r = this._applyTransform([n, i], this._shapes.mainGroup, !0); + this._updateInterval(t, r[1]), this._hideIndicator(), this._updateView() + } + e === !this.visualMapModel.get("realtime") && this.api.dispatchAction({ + type: "selectDataRange", + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: this._dataInterval.slice() + }), e ? !this._hovering && this._clearHoverLinkToSeries() : xF(this.visualMapModel) && this._doHoverLinkToSeries(this._handleEnds[t], !1) + } + }, e.prototype._resetInterval = function () { + var t = this.visualMapModel, e = this._dataInterval = t.getSelected(), n = t.getExtent(), + i = [0, t.itemSize[1]]; + this._handleEnds = [dF(e[0], n, i, !0), dF(e[1], n, i, !0)] + }, e.prototype._updateInterval = function (t, e) { + e = e || 0; + var n = this.visualMapModel, i = this._handleEnds, r = [0, n.itemSize[1]]; + sk(e, i, r, t, 0); + var o = n.getExtent(); + this._dataInterval = [dF(i[0], r, o, !0), dF(i[1], r, o, !0)] + }, e.prototype._updateView = function (t) { + var e = this.visualMapModel, n = e.getExtent(), i = this._shapes, r = [0, e.itemSize[1]], + o = t ? r : this._handleEnds, a = this._createBarVisual(this._dataInterval, n, o, "inRange"), + s = this._createBarVisual(n, n, r, "outOfRange"); + i.inRange.setStyle({fill: a.barColor}).setShape("points", a.barPoints), i.outOfRange.setStyle({fill: s.barColor}).setShape("points", s.barPoints), this._updateHandle(o, a) + }, e.prototype._createBarVisual = function (t, e, n, i) { + var r = {forceState: i, convertOpacityToAlpha: !0}, o = this._makeColorGradient(t, r), + a = [this.getControllerVisual(t[0], "symbolSize", r), this.getControllerVisual(t[1], "symbolSize", r)], + s = this._createBarPoints(n, a); + return {barColor: new Uu(0, 0, 0, 1, o), barPoints: s, handlesColor: [o[0].color, o[o.length - 1].color]} + }, e.prototype._makeColorGradient = function (t, e) { + var n = [], i = (t[1] - t[0]) / 100; + n.push({color: this.getControllerVisual(t[0], "color", e), offset: 0}); + for (var r = 1; r < 100; r++) { + var o = t[0] + i * r; + if (o > t[1]) break; + n.push({color: this.getControllerVisual(o, "color", e), offset: r / 100}) + } + return n.push({color: this.getControllerVisual(t[1], "color", e), offset: 1}), n + }, e.prototype._createBarPoints = function (t, e) { + var n = this.visualMapModel.itemSize; + return [[n[0] - e[0], t[0]], [n[0], t[0]], [n[0], t[1]], [n[0] - e[1], t[1]]] + }, e.prototype._createBarGroup = function (t) { + var e = this._orient, n = this.visualMapModel.get("inverse"); + return new Cr("horizontal" !== e || n ? "horizontal" === e && n ? { + scaleX: "bottom" === t ? -1 : 1, + rotation: -Math.PI / 2 + } : "vertical" !== e || n ? {scaleX: "left" === t ? 1 : -1} : { + scaleX: "left" === t ? 1 : -1, + scaleY: -1 + } : {scaleX: "bottom" === t ? 1 : -1, rotation: Math.PI / 2}) + }, e.prototype._updateHandle = function (t, e) { + if (this._useHandle) { + var n = this._shapes, i = this.visualMapModel, r = n.handleThumbs, o = n.handleLabels, a = i.itemSize, + s = i.getExtent(); + fF([0, 1], (function (l) { + var u = r[l]; + u.setStyle("fill", e.handlesColor[l]), u.y = t[l]; + var h = dF(t[l], [0, a[1]], s, !0), c = this.getControllerVisual(h, "symbolSize"); + u.scaleX = u.scaleY = c / a[0], u.x = a[0] - c / 2; + var p = Ih(n.handleLabelPoints[l], Mh(u, this.group)); + o[l].setStyle({ + x: p[0], + y: p[1], + text: i.formatValueText(this._dataInterval[l]), + verticalAlign: "middle", + align: "vertical" === this._orient ? this._applyTransform("left", n.mainGroup) : "center" + }) + }), this) + } + }, e.prototype._showIndicator = function (t, e, n, i) { + var r = this.visualMapModel, o = r.getExtent(), a = r.itemSize, s = [0, a[1]], l = this._shapes, + u = l.indicator; + if (u) { + u.attr("invisible", !1); + var h = this.getControllerVisual(t, "color", {convertOpacityToAlpha: !0}), + c = this.getControllerVisual(t, "symbolSize"), p = dF(t, o, s, !0), d = a[0] - c / 2, + f = {x: u.x, y: u.y}; + u.y = p, u.x = d; + var g = Ih(l.indicatorLabelPoint, Mh(u, this.group)), y = l.indicatorLabel; + y.attr("invisible", !1); + var v = this._applyTransform("left", l.mainGroup), m = "horizontal" === this._orient; + y.setStyle({ + text: (n || "") + r.formatValueText(e), + verticalAlign: m ? v : "middle", + align: m ? "center" : v + }); + var x = {x: d, y: p, style: {fill: h}}, _ = {style: {x: g[0], y: g[1]}}; + if (r.ecModel.isAnimationEnabled() && !this._firstShowIndicator) { + var b = {duration: 100, easing: "cubicInOut", additive: !0}; + u.x = f.x, u.y = f.y, u.animateTo(x, b), y.animateTo(_, b) + } else u.attr(x), y.attr(_); + this._firstShowIndicator = !1; + var w = this._shapes.handleLabels; + if (w) for (var S = 0; S < w.length; S++) this._api.enterBlur(w[S]) + } + }, e.prototype._enableHoverLinkToSeries = function () { + var t = this; + this._shapes.mainGroup.on("mousemove", (function (e) { + if (t._hovering = !0, !t._dragging) { + var n = t.visualMapModel.itemSize, + i = t._applyTransform([e.offsetX, e.offsetY], t._shapes.mainGroup, !0, !0); + i[1] = gF(yF(0, i[1]), n[1]), t._doHoverLinkToSeries(i[1], 0 <= i[0] && i[0] <= n[0]) + } + })).on("mouseout", (function () { + t._hovering = !1, !t._dragging && t._clearHoverLinkToSeries() + })) + }, e.prototype._enableHoverLinkFromSeries = function () { + var t = this.api.getZr(); + this.visualMapModel.option.hoverLink ? (t.on("mouseover", this._hoverLinkFromSeriesMouseOver, this), t.on("mouseout", this._hideIndicator, this)) : this._clearHoverLinkFromSeries() + }, e.prototype._doHoverLinkToSeries = function (t, e) { + var n = this.visualMapModel, i = n.itemSize; + if (n.option.hoverLink) { + var r = [0, i[1]], o = n.getExtent(); + t = gF(yF(r[0], t), r[1]); + var a = function (t, e, n) { + var i = 6, r = t.get("hoverLinkDataSize"); + r && (i = dF(r, e, n, !0) / 2); + return i + }(n, o, r), s = [t - a, t + a], l = dF(t, r, o, !0), u = [dF(s[0], r, o, !0), dF(s[1], r, o, !0)]; + s[0] < r[0] && (u[0] = -1 / 0), s[1] > r[1] && (u[1] = 1 / 0), e && (u[0] === -1 / 0 ? this._showIndicator(l, u[1], "< ", a) : u[1] === 1 / 0 ? this._showIndicator(l, u[0], "> ", a) : this._showIndicator(l, l, "≈ ", a)); + var h = this._hoverLinkDataIndices, c = []; + (e || xF(n)) && (c = this._hoverLinkDataIndices = n.findTargetDataIndices(u)); + var p = function (t, e) { + var n = {}, i = {}; + return r(t || [], n), r(e || [], i, n), [o(n), o(i)]; + + function r(t, e, n) { + for (var i = 0, r = t.length; i < r; i++) { + var o = xo(t[i].seriesId, null); + if (null == o) return; + for (var a = ho(t[i].dataIndex), s = n && n[o], l = 0, u = a.length; l < u; l++) { + var h = a[l]; + s && s[h] ? s[h] = null : (e[o] || (e[o] = {}))[h] = 1 + } + } + } + + function o(t, e) { + var n = []; + for (var i in t) if (t.hasOwnProperty(i) && null != t[i]) if (e) n.push(+i); else { + var r = o(t[i], !0); + r.length && n.push({seriesId: i, dataIndex: r}) + } + return n + } + }(h, c); + this._dispatchHighDown("downplay", pF(p[0], n)), this._dispatchHighDown("highlight", pF(p[1], n)) + } + }, e.prototype._hoverLinkFromSeriesMouseOver = function (t) { + var e = t.target, n = this.visualMapModel; + if (e && null != Ws(e).dataIndex) { + var i = Ws(e), r = this.ecModel.getSeriesByIndex(i.seriesIndex); + if (n.isTargetSeries(r)) { + var o = r.getData(i.dataType), a = o.getStore().get(n.getDataDimensionIndex(o), i.dataIndex); + isNaN(a) || this._showIndicator(a, a) + } + } + }, e.prototype._hideIndicator = function () { + var t = this._shapes; + t.indicator && t.indicator.attr("invisible", !0), t.indicatorLabel && t.indicatorLabel.attr("invisible", !0); + var e = this._shapes.handleLabels; + if (e) for (var n = 0; n < e.length; n++) this._api.leaveBlur(e[n]) + }, e.prototype._clearHoverLinkToSeries = function () { + this._hideIndicator(); + var t = this._hoverLinkDataIndices; + this._dispatchHighDown("downplay", pF(t, this.visualMapModel)), t.length = 0 + }, e.prototype._clearHoverLinkFromSeries = function () { + this._hideIndicator(); + var t = this.api.getZr(); + t.off("mouseover", this._hoverLinkFromSeriesMouseOver), t.off("mouseout", this._hideIndicator) + }, e.prototype._applyTransform = function (t, e, n, i) { + var r = Mh(e, i ? null : this.group); + return Y(t) ? Ih(t, r, n) : Th(t, r, n) + }, e.prototype._dispatchHighDown = function (t, e) { + e && e.length && this.api.dispatchAction({type: t, batch: e}) + }, e.prototype.dispose = function () { + this._clearHoverLinkFromSeries(), this._clearHoverLinkToSeries() + }, e.prototype.remove = function () { + this._clearHoverLinkFromSeries(), this._clearHoverLinkToSeries() + }, e.type = "visualMap.continuous", e + }(uF); + + function mF(t, e, n, i) { + return new Lu({ + shape: {points: t}, draggable: !!n, cursor: e, drift: n, onmousemove: function (t) { + se(t.event) + }, ondragend: i + }) + } + + function xF(t) { + var e = t.get("hoverLinkOnHandle"); + return !!(null == e ? t.get("realtime") : e) + } + + function _F(t) { + return "vertical" === t ? "ns-resize" : "ew-resize" + } + + var bF = {type: "selectDataRange", event: "dataRangeSelected", update: "update"}, wF = function (t, e) { + e.eachComponent({mainType: "visualMap", query: t}, (function (e) { + e.setSelected(t.selected) + })) + }, SF = [{ + createOnAllSeries: !0, reset: function (t, e) { + var n = []; + return e.eachComponent("visualMap", (function (e) { + var i, r, o, a, s, l = t.pipelineContext; + !e.isTargetSeries(t) || l && l.large || n.push((i = e.stateList, r = e.targetVisuals, o = W(e.getValueState, e), a = e.getDataDimensionIndex(t.getData()), s = {}, E(i, (function (t) { + var e = eD.prepareVisualTypes(r[t]); + s[t] = e + })), { + progress: function (t, e) { + var n, i; + + function l(t) { + return dy(e, i, t) + } + + function u(t, n) { + gy(e, i, t, n) + } + + null != a && (n = e.getDimensionIndex(a)); + for (var h = e.getStore(); null != (i = t.next());) { + var c = e.getRawDataItem(i); + if (!c || !1 !== c.visualMap) for (var p = null != a ? h.get(n, i) : i, d = o(p), f = r[d], g = s[d], y = 0, v = g.length; y < v; y++) { + var m = g[y]; + f[m] && f[m].applyVisual(p, l, u) + } + } + } + })) + })), n + } + }, { + createOnAllSeries: !0, reset: function (t, e) { + var n = t.getData(), i = []; + e.eachComponent("visualMap", (function (e) { + if (e.isTargetSeries(t)) { + var r = e.getVisualMeta(W(MF, null, t, e)) || {stops: [], outerColors: []}, + o = e.getDataDimensionIndex(n); + o >= 0 && (r.dimension = o, i.push(r)) + } + })), t.getData().setVisual("visualMeta", i) + } + }]; + + function MF(t, e, n, i) { + for (var r = e.targetVisuals[i], o = eD.prepareVisualTypes(r), a = {color: fy(t.getData(), "color")}, s = 0, l = o.length; s < l; s++) { + var u = o[s], h = r["opacity" === u ? "__alphaForOpacity" : u]; + h && h.applyVisual(n, c, p) + } + return a.color; + + function c(t) { + return a[t] + } + + function p(t, e) { + a[t] = e + } + } + + var IF = E; + + function TF(t) { + var e = t && t.visualMap; + Y(e) || (e = e ? [e] : []), IF(e, (function (t) { + if (t) { + CF(t, "splitList") && !CF(t, "pieces") && (t.pieces = t.splitList, delete t.splitList); + var e = t.pieces; + e && Y(e) && IF(e, (function (t) { + q(t) && (CF(t, "start") && !CF(t, "min") && (t.min = t.start), CF(t, "end") && !CF(t, "max") && (t.max = t.end)) + })) + } + })) + } + + function CF(t, e) { + return t && t.hasOwnProperty && t.hasOwnProperty(e) + } + + var DF = !1; + + function AF(t) { + DF || (DF = !0, t.registerSubTypeDefaulter("visualMap", (function (t) { + return t.categories || (t.pieces ? t.pieces.length > 0 : t.splitNumber > 0) && !t.calculable ? "piecewise" : "continuous" + })), t.registerAction(bF, wF), E(SF, (function (e) { + t.registerVisual(t.PRIORITY.VISUAL.COMPONENT, e) + })), t.registerPreprocessor(TF)) + } + + function kF(t) { + t.registerComponentModel(sF), t.registerComponentView(vF), AF(t) + } + + var LF = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n._pieceList = [], n + } + + return n(e, t), e.prototype.optionUpdated = function (e, n) { + t.prototype.optionUpdated.apply(this, arguments), this.resetExtent(); + var i = this._mode = this._determineMode(); + this._pieceList = [], PF[this._mode].call(this, this._pieceList), this._resetSelected(e, n); + var r = this.option.categories; + this.resetVisual((function (t, e) { + "categories" === i ? (t.mappingMethod = "category", t.categories = T(r)) : (t.dataExtent = this.getExtent(), t.mappingMethod = "piecewise", t.pieceList = z(this._pieceList, (function (t) { + return t = T(t), "inRange" !== e && (t.visual = null), t + }))) + })) + }, e.prototype.completeVisualOption = function () { + var e = this.option, n = {}, i = eD.listVisualTypes(), r = this.isCategory(); + + function o(t, e, n) { + return t && t[e] && t[e].hasOwnProperty(n) + } + + E(e.pieces, (function (t) { + E(i, (function (e) { + t.hasOwnProperty(e) && (n[e] = 1) + })) + })), E(n, (function (t, n) { + var i = !1; + E(this.stateList, (function (t) { + i = i || o(e, t, n) || o(e.target, t, n) + }), this), !i && E(this.stateList, (function (t) { + (e[t] || (e[t] = {}))[n] = $B(n, "inRange" === t ? "active" : "inactive", r) + })) + }), this), t.prototype.completeVisualOption.apply(this, arguments) + }, e.prototype._resetSelected = function (t, e) { + var n = this.option, i = this._pieceList, r = (e ? n : t).selected || {}; + if (n.selected = r, E(i, (function (t, e) { + var n = this.getSelectedMapKey(t); + r.hasOwnProperty(n) || (r[n] = !0) + }), this), "single" === n.selectedMode) { + var o = !1; + E(i, (function (t, e) { + var n = this.getSelectedMapKey(t); + r[n] && (o ? r[n] = !1 : o = !0) + }), this) + } + }, e.prototype.getItemSymbol = function () { + return this.get("itemSymbol") + }, e.prototype.getSelectedMapKey = function (t) { + return "categories" === this._mode ? t.value + "" : t.index + "" + }, e.prototype.getPieceList = function () { + return this._pieceList + }, e.prototype._determineMode = function () { + var t = this.option; + return t.pieces && t.pieces.length > 0 ? "pieces" : this.option.categories ? "categories" : "splitNumber" + }, e.prototype.setSelected = function (t) { + this.option.selected = T(t) + }, e.prototype.getValueState = function (t) { + var e = eD.findPieceIndex(t, this._pieceList); + return null != e && this.option.selected[this.getSelectedMapKey(this._pieceList[e])] ? "inRange" : "outOfRange" + }, e.prototype.findTargetDataIndices = function (t) { + var e = [], n = this._pieceList; + return this.eachTargetSeries((function (i) { + var r = [], o = i.getData(); + o.each(this.getDataDimensionIndex(o), (function (e, i) { + eD.findPieceIndex(e, n) === t && r.push(i) + }), this), e.push({seriesId: i.id, dataIndex: r}) + }), this), e + }, e.prototype.getRepresentValue = function (t) { + var e; + if (this.isCategory()) e = t.value; else if (null != t.value) e = t.value; else { + var n = t.interval || []; + e = n[0] === -1 / 0 && n[1] === 1 / 0 ? 0 : (n[0] + n[1]) / 2 + } + return e + }, e.prototype.getVisualMeta = function (t) { + if (!this.isCategory()) { + var e = [], n = ["", ""], i = this, r = this._pieceList.slice(); + if (r.length) { + var o = r[0].interval[0]; + o !== -1 / 0 && r.unshift({interval: [-1 / 0, o]}), (o = r[r.length - 1].interval[1]) !== 1 / 0 && r.push({interval: [o, 1 / 0]}) + } else r.push({interval: [-1 / 0, 1 / 0]}); + var a = -1 / 0; + return E(r, (function (t) { + var e = t.interval; + e && (e[0] > a && s([a, e[0]], "outOfRange"), s(e.slice()), a = e[1]) + }), this), {stops: e, outerColors: n} + } + + function s(r, o) { + var a = i.getRepresentValue({interval: r}); + o || (o = i.getValueState(a)); + var s = t(a, o); + r[0] === -1 / 0 ? n[0] = s : r[1] === 1 / 0 ? n[1] = s : e.push({value: r[0], color: s}, { + value: r[1], + color: s + }) + } + }, e.type = "visualMap.piecewise", e.defaultOption = gc(oF.defaultOption, { + selected: null, + minOpen: !1, + maxOpen: !1, + align: "auto", + itemWidth: 20, + itemHeight: 14, + itemSymbol: "roundRect", + pieces: null, + categories: null, + splitNumber: 5, + selectedMode: "multiple", + itemGap: 10, + hoverLink: !0 + }), e + }(oF), PF = { + splitNumber: function (t) { + var e = this.option, n = Math.min(e.precision, 20), i = this.getExtent(), r = e.splitNumber; + r = Math.max(parseInt(r, 10), 1), e.splitNumber = r; + for (var o = (i[1] - i[0]) / r; +o.toFixed(n) !== o && n < 5;) n++; + e.precision = n, o = +o.toFixed(n), e.minOpen && t.push({interval: [-1 / 0, i[0]], close: [0, 0]}); + for (var a = 0, s = i[0]; a < r; s += o, a++) { + var l = a === r - 1 ? i[1] : s + o; + t.push({interval: [s, l], close: [1, 1]}) + } + e.maxOpen && t.push({interval: [i[1], 1 / 0], close: [0, 0]}), Qr(t), E(t, (function (t, e) { + t.index = e, t.text = this.formatValueText(t.interval) + }), this) + }, categories: function (t) { + var e = this.option; + E(e.categories, (function (e) { + t.push({text: this.formatValueText(e, !0), value: e}) + }), this), OF(e, t) + }, pieces: function (t) { + var e = this.option; + E(e.pieces, (function (e, n) { + q(e) || (e = {value: e}); + var i = {text: "", index: n}; + if (null != e.label && (i.text = e.label), e.hasOwnProperty("value")) { + var r = i.value = e.value; + i.interval = [r, r], i.close = [1, 1] + } else { + for (var o = i.interval = [], a = i.close = [0, 0], s = [1, 0, 1], l = [-1 / 0, 1 / 0], u = [], h = 0; h < 2; h++) { + for (var c = [["gte", "gt", "min"], ["lte", "lt", "max"]][h], p = 0; p < 3 && null == o[h]; p++) o[h] = e[c[p]], a[h] = s[p], u[h] = 2 === p; + null == o[h] && (o[h] = l[h]) + } + u[0] && o[1] === 1 / 0 && (a[0] = 0), u[1] && o[0] === -1 / 0 && (a[1] = 0), o[0] === o[1] && a[0] && a[1] && (i.value = o[0]) + } + i.visual = eD.retrieveVisuals(e), t.push(i) + }), this), OF(e, t), Qr(t), E(t, (function (t) { + var e = t.close, n = [["<", "≤"][e[1]], [">", "≥"][e[0]]]; + t.text = t.text || this.formatValueText(null != t.value ? t.value : t.interval, !1, n) + }), this) + } + }; + + function OF(t, e) { + var n = t.inverse; + ("vertical" === t.orient ? !n : n) && e.reverse() + } + + var RF = function (t) { + function e() { + var n = null !== t && t.apply(this, arguments) || this; + return n.type = e.type, n + } + + return n(e, t), e.prototype.doRender = function () { + var t = this.group; + t.removeAll(); + var e = this.visualMapModel, n = e.get("textGap"), i = e.textStyleModel, r = i.getFont(), + o = i.getTextColor(), a = this._getItemAlign(), s = e.itemSize, l = this._getViewData(), u = l.endsText, + h = it(e.get("showLabel", !0), !u); + u && this._renderEndsText(t, u[0], s, h, a), E(l.viewPieceList, (function (i) { + var l = i.piece, u = new Cr; + u.onclick = W(this._onItemClick, this, l), this._enableHoverLink(u, i.indexInModelPieceList); + var c = e.getRepresentValue(l); + if (this._createItemSymbol(u, c, [0, 0, s[0], s[1]]), h) { + var p = this.visualMapModel.getValueState(c); + u.add(new As({ + style: { + x: "right" === a ? -n : s[0] + n, + y: s[1] / 2, + text: l.text, + verticalAlign: "middle", + align: a, + font: r, + fill: o, + opacity: "outOfRange" === p ? .5 : 1 + } + })) + } + t.add(u) + }), this), u && this._renderEndsText(t, u[1], s, h, a), vp(e.get("orient"), t, e.get("itemGap")), this.renderBackground(t), this.positionGroup(t) + }, e.prototype._enableHoverLink = function (t, e) { + var n = this; + t.on("mouseover", (function () { + return i("highlight") + })).on("mouseout", (function () { + return i("downplay") + })); + var i = function (t) { + var i = n.visualMapModel; + i.option.hoverLink && n.api.dispatchAction({type: t, batch: pF(i.findTargetDataIndices(e), i)}) + } + }, e.prototype._getItemAlign = function () { + var t = this.visualMapModel, e = t.option; + if ("vertical" === e.orient) return cF(t, this.api, t.itemSize); + var n = e.align; + return n && "auto" !== n || (n = "left"), n + }, e.prototype._renderEndsText = function (t, e, n, i, r) { + if (e) { + var o = new Cr, a = this.visualMapModel.textStyleModel; + o.add(new As({ + style: { + x: i ? "right" === r ? n[0] : 0 : n[0] / 2, + y: n[1] / 2, + verticalAlign: "middle", + align: i ? r : "center", + text: e, + font: a.getFont(), + fill: a.getTextColor() + } + })), t.add(o) + } + }, e.prototype._getViewData = function () { + var t = this.visualMapModel, e = z(t.getPieceList(), (function (t, e) { + return {piece: t, indexInModelPieceList: e} + })), n = t.get("text"), i = t.get("orient"), r = t.get("inverse"); + return ("horizontal" === i ? r : !r) ? e.reverse() : n && (n = n.slice().reverse()), { + viewPieceList: e, + endsText: n + } + }, e.prototype._createItemSymbol = function (t, e, n) { + t.add(ky(this.getControllerVisual(e, "symbol"), n[0], n[1], n[2], n[3], this.getControllerVisual(e, "color"))) + }, e.prototype._onItemClick = function (t) { + var e = this.visualMapModel, n = e.option, i = T(n.selected), r = e.getSelectedMapKey(t); + "single" === n.selectedMode ? (i[r] = !0, E(i, (function (t, e) { + i[e] = e === r + }))) : i[r] = !i[r], this.api.dispatchAction({ + type: "selectDataRange", + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: i + }) + }, e.type = "visualMap.piecewise", e + }(uF); + + function NF(t) { + t.registerComponentModel(LF), t.registerComponentView(RF), AF(t) + } + + var EF = {label: {enabled: !0}, decal: {show: !1}}, zF = So(), VF = {}; + + function BF(t, e) { + var n = t.getModel("aria"); + if (n.get("enabled")) { + var i = T(EF); + C(i.label, t.getLocaleModel().get("aria"), !1), C(n.option, i, !1), function () { + if (n.getModel("decal").get("show")) { + var e = ft(); + t.eachSeries((function (t) { + if (!t.isColorBySeries()) { + var n = e.get(t.type); + n || (n = {}, e.set(t.type, n)), zF(t).scope = n + } + })), t.eachRawSeries((function (e) { + if (!t.isSeriesFiltered(e)) if (U(e.enableAriaDecal)) e.enableAriaDecal(); else { + var n = e.getData(); + if (e.isColorBySeries()) { + var i = td(e.ecModel, e.name, VF, t.getSeriesCount()), r = n.getVisual("decal"); + n.setVisual("decal", u(r, i)) + } else { + var o = e.getRawData(), a = {}, s = zF(e).scope; + n.each((function (t) { + var e = n.getRawIndex(t); + a[e] = t + })); + var l = o.count(); + o.each((function (t) { + var i = a[t], r = o.getName(t) || t + "", h = td(e.ecModel, r, s, l), + c = n.getItemVisual(i, "decal"); + n.setItemVisual(i, "decal", u(c, h)) + })) + } + } + + function u(t, e) { + var n = t ? A(A({}, e), t) : e; + return n.dirty = !0, n + } + })) + } + }(), function () { + var i = t.getLocaleModel().get("aria"), o = n.getModel("label"); + if (o.option = k(o.option, i), !o.get("enabled")) return; + var a = e.getZr().dom; + if (o.get("description")) return void a.setAttribute("aria-label", o.get("description")); + var s, l = t.getSeriesCount(), u = o.get(["data", "maxCount"]) || 10, + h = o.get(["series", "maxCount"]) || 10, c = Math.min(l, h); + if (l < 1) return; + var p = function () { + var e = t.get("title"); + e && e.length && (e = e[0]); + return e && e.text + }(); + if (p) { + var d = o.get(["general", "withTitle"]); + s = r(d, {title: p}) + } else s = o.get(["general", "withoutTitle"]); + var f = [], g = l > 1 ? o.get(["series", "multiple", "prefix"]) : o.get(["series", "single", "prefix"]); + s += r(g, {seriesCount: l}), t.eachSeries((function (e, n) { + if (n < c) { + var i = void 0, a = e.get("name") ? "withName" : "withoutName"; + i = r(i = l > 1 ? o.get(["series", "multiple", a]) : o.get(["series", "single", a]), { + seriesId: e.seriesIndex, + seriesName: e.get("name"), + seriesType: (x = e.subType, t.getLocaleModel().get(["series", "typeNames"])[x] || "自定义图") + }); + var s = e.getData(); + if (s.count() > u) i += r(o.get(["data", "partialData"]), {displayCnt: u}); else i += o.get(["data", "allData"]); + for (var h = o.get(["data", "separator", "middle"]), p = o.get(["data", "separator", "end"]), d = [], g = 0; g < s.count(); g++) if (g < u) { + var y = s.getName(g), v = s.getValues(g), + m = o.get(["data", y ? "withName" : "withoutName"]); + d.push(r(m, {name: y, value: v.join(h)})) + } + i += d.join(h) + p, f.push(i) + } + var x + })); + var y = o.getModel(["series", "multiple", "separator"]), v = y.get("middle"), m = y.get("end"); + s += f.join(v) + m, a.setAttribute("aria-label", s) + }() + } + + function r(t, e) { + if (!X(t)) return t; + var n = t; + return E(e, (function (t, e) { + n = n.replace(new RegExp("\\{\\s*" + e + "\\s*\\}", "g"), t) + })), n + } + } + + function FF(t) { + if (t && t.aria) { + var e = t.aria; + null != e.show && (e.enabled = e.show), e.label = e.label || {}, E(["description", "general", "series", "data"], (function (t) { + null != e[t] && (e.label[t] = e[t]) + })) + } + } + + var GF = {value: "eq", "<": "lt", "<=": "lte", ">": "gt", ">=": "gte", "=": "eq", "!=": "ne", "<>": "ne"}, + WF = function () { + function t(t) { + if (null == (this._condVal = X(t) ? new RegExp(t) : et(t) ? t : null)) { + var e = ""; + 0, ao(e) + } + } + + return t.prototype.evaluate = function (t) { + var e = typeof t; + return X(e) ? this._condVal.test(t) : !!j(e) && this._condVal.test(t + "") + }, t + }(), HF = function () { + function t() { + } + + return t.prototype.evaluate = function () { + return this.value + }, t + }(), YF = function () { + function t() { + } + + return t.prototype.evaluate = function () { + for (var t = this.children, e = 0; e < t.length; e++) if (!t[e].evaluate()) return !1; + return !0 + }, t + }(), UF = function () { + function t() { + } + + return t.prototype.evaluate = function () { + for (var t = this.children, e = 0; e < t.length; e++) if (t[e].evaluate()) return !0; + return !1 + }, t + }(), XF = function () { + function t() { + } + + return t.prototype.evaluate = function () { + return !this.child.evaluate() + }, t + }(), ZF = function () { + function t() { + } + + return t.prototype.evaluate = function () { + for (var t = !!this.valueParser, e = (0, this.getValue)(this.valueGetterParam), n = t ? this.valueParser(e) : null, i = 0; i < this.subCondList.length; i++) if (!this.subCondList[i].evaluate(t ? n : e)) return !1; + return !0 + }, t + }(); + + function jF(t, e) { + if (!0 === t || !1 === t) { + var n = new HF; + return n.value = t, n + } + var i = ""; + return KF(t) || ao(i), t.and ? qF("and", t, e) : t.or ? qF("or", t, e) : t.not ? function (t, e) { + var n = t.not, i = ""; + 0; + KF(n) || ao(i); + var r = new XF; + r.child = jF(n, e), r.child || ao(i); + return r + }(t, e) : function (t, e) { + for (var n = "", i = e.prepareGetValue(t), r = [], o = G(t), a = t.parser, s = a ? ff(a) : null, l = 0; l < o.length; l++) { + var u = o[l]; + if ("parser" !== u && !e.valueGetterAttrMap.get(u)) { + var h = mt(GF, u) ? GF[u] : u, c = t[u], p = s ? s(c) : c, d = xf(h, p) || "reg" === h && new WF(p); + d || ao(n), r.push(d) + } + } + r.length || ao(n); + var f = new ZF; + return f.valueGetterParam = i, f.valueParser = s, f.getValue = e.getValue, f.subCondList = r, f + }(t, e) + } + + function qF(t, e, n) { + var i = e[t], r = ""; + Y(i) || ao(r), i.length || ao(r); + var o = "and" === t ? new YF : new UF; + return o.children = z(i, (function (t) { + return jF(t, n) + })), o.children.length || ao(r), o + } + + function KF(t) { + return q(t) && !N(t) + } + + var $F = function () { + function t(t, e) { + this._cond = jF(t, e) + } + + return t.prototype.evaluate = function () { + return this._cond.evaluate() + }, t + }(); + var JF = { + type: "echarts:filter", transform: function (t) { + for (var e, n, i, r = t.upstream, o = (n = t.config, i = { + valueGetterAttrMap: ft({dimension: !0}), + prepareGetValue: function (t) { + var e = "", n = t.dimension; + mt(t, "dimension") || ao(e); + var i = r.getDimensionInfo(n); + return i || ao(e), {dimIdx: i.index} + }, + getValue: function (t) { + return r.retrieveValueFromItem(e, t.dimIdx) + } + }, new $F(n, i)), a = [], s = 0, l = r.count(); s < l; s++) e = r.getRawDataItem(s), o.evaluate() && a.push(e); + return {data: a} + } + }; + var QF = { + type: "echarts:sort", transform: function (t) { + var e = t.upstream, n = t.config, i = "", r = ho(n); + r.length || ao(i); + var o = []; + E(r, (function (t) { + var n = t.dimension, r = t.order, a = t.parser, s = t.incomparable; + if (null == n && ao(i), "asc" !== r && "desc" !== r && ao(i), s && "min" !== s && "max" !== s) { + var l = ""; + 0, ao(l) + } + if ("asc" !== r && "desc" !== r) { + var u = ""; + 0, ao(u) + } + var h = e.getDimensionInfo(n); + h || ao(i); + var c = a ? ff(a) : null; + a && !c && ao(i), o.push({dimIdx: h.index, parser: c, comparator: new vf(r, s)}) + })); + var a = e.sourceFormat; + a !== Lp && a !== Pp && ao(i); + for (var s = [], l = 0, u = e.count(); l < u; l++) s.push(e.getRawDataItem(l)); + return s.sort((function (t, n) { + for (var i = 0; i < o.length; i++) { + var r = o[i], a = e.retrieveValueFromItem(t, r.dimIdx), s = e.retrieveValueFromItem(n, r.dimIdx); + r.parser && (a = r.parser(a), s = r.parser(s)); + var l = r.comparator.evaluate(a, s); + if (0 !== l) return l + } + return 0 + })), {data: s} + } + }; + var tG = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.type = "dataset", e + } + + return n(e, t), e.prototype.init = function (e, n, i) { + t.prototype.init.call(this, e, n, i), this._sourceManager = new Vf(this), Bf(this) + }, e.prototype.mergeOption = function (e, n) { + t.prototype.mergeOption.call(this, e, n), Bf(this) + }, e.prototype.optionUpdated = function () { + this._sourceManager.dirty() + }, e.prototype.getSourceManager = function () { + return this._sourceManager + }, e.type = "dataset", e.defaultOption = {seriesLayoutBy: Ep}, e + }(Ip), eG = function (t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.type = "dataset", e + } + + return n(e, t), e.type = "dataset", e + }(fg); + var nG = ja.CMD; + + function iG(t, e) { + return Math.abs(t - e) < 1e-5 + } + + function rG(t) { + var e, n, i, r, o, a = t.data, s = t.len(), l = [], u = 0, h = 0, c = 0, p = 0; + + function d(t, n) { + e && e.length > 2 && l.push(e), e = [t, n] + } + + function f(t, n, i, r) { + iG(t, i) && iG(n, r) || e.push(t, n, i, r, i, r) + } + + function g(t, n, i, r, o, a) { + var s = Math.abs(n - t), l = 4 * Math.tan(s / 4) / 3, u = n < t ? -1 : 1, h = Math.cos(t), c = Math.sin(t), + p = Math.cos(n), d = Math.sin(n), f = h * o + i, g = c * a + r, y = p * o + i, v = d * a + r, + m = o * l * u, x = a * l * u; + e.push(f - m * c, g + x * h, y + m * d, v - x * p, y, v) + } + + for (var y = 0; y < s;) { + var v = a[y++], m = 1 === y; + switch (m && (c = u = a[y], p = h = a[y + 1], v !== nG.L && v !== nG.C && v !== nG.Q || (e = [c, p])), v) { + case nG.M: + u = c = a[y++], h = p = a[y++], d(c, p); + break; + case nG.L: + f(u, h, n = a[y++], i = a[y++]), u = n, h = i; + break; + case nG.C: + e.push(a[y++], a[y++], a[y++], a[y++], u = a[y++], h = a[y++]); + break; + case nG.Q: + n = a[y++], i = a[y++], r = a[y++], o = a[y++], e.push(u + 2 / 3 * (n - u), h + 2 / 3 * (i - h), r + 2 / 3 * (n - r), o + 2 / 3 * (i - o), r, o), u = r, h = o; + break; + case nG.A: + var x = a[y++], _ = a[y++], b = a[y++], w = a[y++], S = a[y++], M = a[y++] + S; + y += 1; + var I = !a[y++]; + n = Math.cos(S) * b + x, i = Math.sin(S) * w + _, m ? d(c = n, p = i) : f(u, h, n, i), u = Math.cos(M) * b + x, h = Math.sin(M) * w + _; + for (var T = (I ? -1 : 1) * Math.PI / 2, C = S; I ? C > M : C < M; C += T) { + g(C, I ? Math.max(C + T, M) : Math.min(C + T, M), x, _, b, w) + } + break; + case nG.R: + c = u = a[y++], p = h = a[y++], n = c + a[y++], i = p + a[y++], d(n, p), f(n, p, n, i), f(n, i, c, i), f(c, i, c, p), f(c, p, n, p); + break; + case nG.Z: + e && f(u, h, c, p), u = c, h = p + } + } + return e && e.length > 2 && l.push(e), l + } + + function oG(t, e, n, i, r, o, a, s, l, u) { + if (iG(t, n) && iG(e, i) && iG(r, a) && iG(o, s)) l.push(a, s); else { + var h = 2 / u, c = h * h, p = a - t, d = s - e, f = Math.sqrt(p * p + d * d); + p /= f, d /= f; + var g = n - t, y = i - e, v = r - a, m = o - s, x = g * g + y * y, _ = v * v + m * m; + if (x < c && _ < c) l.push(a, s); else { + var b = p * g + d * y, w = -p * v - d * m; + if (x - b * b < c && b >= 0 && _ - w * w < c && w >= 0) l.push(a, s); else { + var S = [], M = []; + Ze(t, n, r, a, .5, S), Ze(e, i, o, s, .5, M), oG(S[0], M[0], S[1], M[1], S[2], M[2], S[3], M[3], l, u), oG(S[4], M[4], S[5], M[5], S[6], M[6], S[7], M[7], l, u) + } + } + } + } + + function aG(t, e, n) { + var i = t[e], r = t[1 - e], o = Math.abs(i / r), a = Math.ceil(Math.sqrt(o * n)), s = Math.floor(n / a); + 0 === s && (s = 1, a = n); + for (var l = [], u = 0; u < a; u++) l.push(s); + var h = n - a * s; + if (h > 0) for (u = 0; u < h; u++) l[u % a] += 1; + return l + } + + function sG(t, e, n) { + for (var i = t.r0, r = t.r, o = t.startAngle, a = t.endAngle, s = Math.abs(a - o), l = s * r, u = r - i, h = l > Math.abs(u), c = aG([l, u], h ? 0 : 1, e), p = (h ? s : u) / c.length, d = 0; d < c.length; d++) for (var f = (h ? u : s) / c[d], g = 0; g < c[d]; g++) { + var y = {}; + h ? (y.startAngle = o + p * d, y.endAngle = o + p * (d + 1), y.r0 = i + f * g, y.r = i + f * (g + 1)) : (y.startAngle = o + f * g, y.endAngle = o + f * (g + 1), y.r0 = i + p * d, y.r = i + p * (d + 1)), y.clockwise = t.clockwise, y.cx = t.cx, y.cy = t.cy, n.push(y) + } + } + + function lG(t, e, n, i) { + return t * i - n * e + } + + function uG(t, e, n, i, r, o, a, s) { + var l = n - t, u = i - e, h = a - r, c = s - o, p = lG(h, c, l, u); + if (Math.abs(p) < 1e-6) return null; + var d = lG(t - r, e - o, h, c) / p; + return d < 0 || d > 1 ? null : new Ji(d * l + t, d * u + e) + } + + function hG(t, e, n) { + var i = new Ji; + Ji.sub(i, n, e), i.normalize(); + var r = new Ji; + return Ji.sub(r, t, e), r.dot(i) + } + + function cG(t, e) { + var n = t[t.length - 1]; + n && n[0] === e[0] && n[1] === e[1] || t.push(e) + } + + function pG(t) { + var e = t.points, n = [], i = []; + Ma(e, n, i); + var r = new sr(n[0], n[1], i[0] - n[0], i[1] - n[1]), o = r.width, a = r.height, s = r.x, l = r.y, u = new Ji, + h = new Ji; + return o > a ? (u.x = h.x = s + o / 2, u.y = l, h.y = l + a) : (u.y = h.y = l + a / 2, u.x = s, h.x = s + o), function (t, e, n) { + for (var i = t.length, r = [], o = 0; o < i; o++) { + var a = t[o], s = t[(o + 1) % i], l = uG(a[0], a[1], s[0], s[1], e.x, e.y, n.x, n.y); + l && r.push({projPt: hG(l, e, n), pt: l, idx: o}) + } + if (r.length < 2) return [{points: t}, {points: t}]; + r.sort((function (t, e) { + return t.projPt - e.projPt + })); + var u = r[0], h = r[r.length - 1]; + if (h.idx < u.idx) { + var c = u; + u = h, h = c + } + var p = [u.pt.x, u.pt.y], d = [h.pt.x, h.pt.y], f = [p], g = [d]; + for (o = u.idx + 1; o <= h.idx; o++) cG(f, t[o].slice()); + for (cG(f, d), cG(f, p), o = h.idx + 1; o <= u.idx + i; o++) cG(g, t[o % i].slice()); + return cG(g, p), cG(g, d), [{points: f}, {points: g}] + }(e, u, h) + } + + function dG(t, e, n, i) { + if (1 === n) i.push(e); else { + var r = Math.floor(n / 2), o = t(e); + dG(t, o[0], r, i), dG(t, o[1], n - r, i) + } + return i + } + + function fG(t, e) { + e.setStyle(t.style), e.z = t.z, e.z2 = t.z2, e.zlevel = t.zlevel + } + + function gG(t, e) { + var n, i = [], r = t.shape; + switch (t.type) { + case"rect": + !function (t, e, n) { + for (var i = t.width, r = t.height, o = i > r, a = aG([i, r], o ? 0 : 1, e), s = o ? "width" : "height", l = o ? "height" : "width", u = o ? "x" : "y", h = o ? "y" : "x", c = t[s] / a.length, p = 0; p < a.length; p++) for (var d = t[l] / a[p], f = 0; f < a[p]; f++) { + var g = {}; + g[u] = p * c, g[h] = f * d, g[s] = c, g[l] = d, g.x += t.x, g.y += t.y, n.push(g) + } + }(r, e, i), n = Ts; + break; + case"sector": + sG(r, e, i), n = Tu; + break; + case"circle": + sG({r0: 0, r: r.r, startAngle: 0, endAngle: 2 * Math.PI, cx: r.cx, cy: r.cy}, e, i), n = Tu; + break; + default: + var o = t.getComputedTransform(), + a = o ? Math.sqrt(Math.max(o[0] * o[0] + o[1] * o[1], o[2] * o[2] + o[3] * o[3])) : 1, + s = z(function (t, e) { + var n = rG(t), i = []; + e = e || 1; + for (var r = 0; r < n.length; r++) { + var o = n[r], a = [], s = o[0], l = o[1]; + a.push(s, l); + for (var u = 2; u < o.length;) { + var h = o[u++], c = o[u++], p = o[u++], d = o[u++], f = o[u++], g = o[u++]; + oG(s, l, h, c, p, d, f, g, a, e), s = f, l = g + } + i.push(a) + } + return i + }(t.getUpdatedPathProxy(), a), (function (t) { + return function (t) { + for (var e = [], n = 0; n < t.length;) e.push([t[n++], t[n++]]); + return e + }(t) + })), l = s.length; + if (0 === l) dG(pG, {points: s[0]}, e, i); else if (l === e) for (var u = 0; u < l; u++) i.push({points: s[u]}); else { + var h = 0, c = z(s, (function (t) { + var e = [], n = []; + Ma(t, e, n); + var i = (n[1] - e[1]) * (n[0] - e[0]); + return h += i, {poly: t, area: i} + })); + c.sort((function (t, e) { + return e.area - t.area + })); + var p = e; + for (u = 0; u < l; u++) { + var d = c[u]; + if (p <= 0) break; + var f = u === l - 1 ? p : Math.ceil(d.area / h * e); + f < 0 || (dG(pG, {points: d.poly}, f, i), p -= f) + } + } + n = Lu + } + if (!n) return function (t, e) { + for (var n = [], i = 0; i < e; i++) n.push(su(t)); + return n + }(t, e); + var g = []; + for (u = 0; u < i.length; u++) { + var y = new n; + y.setShape(i[u]), fG(t, y), g.push(y) + } + return g + } + + function yG(t, e) { + var n = t.length, i = e.length; + if (n === i) return [t, e]; + for (var r = [], o = [], a = n < i ? t : e, s = Math.min(n, i), l = Math.abs(i - n) / 6, u = (s - 2) / 6, h = Math.ceil(l / u) + 1, c = [a[0], a[1]], p = l, d = 2; d < s;) { + var f = a[d - 2], g = a[d - 1], y = a[d++], v = a[d++], m = a[d++], x = a[d++], _ = a[d++], b = a[d++]; + if (p <= 0) c.push(y, v, m, x, _, b); else { + for (var w = Math.min(p, h - 1) + 1, S = 1; S <= w; S++) { + var M = S / w; + Ze(f, y, m, _, M, r), Ze(g, v, x, b, M, o), f = r[3], g = o[3], c.push(r[1], o[1], r[2], o[2], f, g), y = r[5], v = o[5], m = r[6], x = o[6] + } + p -= w - 1 + } + } + return a === t ? [c, e] : [t, c] + } + + function vG(t, e) { + for (var n = t.length, i = t[n - 2], r = t[n - 1], o = [], a = 0; a < e.length;) o[a++] = i, o[a++] = r; + return o + } + + function mG(t) { + for (var e = 0, n = 0, i = 0, r = t.length, o = 0, a = r - 2; o < r; a = o, o += 2) { + var s = t[a], l = t[a + 1], u = t[o], h = t[o + 1], c = s * h - u * l; + e += c, n += (s + u) * c, i += (l + h) * c + } + return 0 === e ? [t[0] || 0, t[1] || 0] : [n / e / 3, i / e / 3, e] + } + + function xG(t, e, n, i) { + for (var r = (t.length - 2) / 6, o = 1 / 0, a = 0, s = t.length, l = s - 2, u = 0; u < r; u++) { + for (var h = 6 * u, c = 0, p = 0; p < s; p += 2) { + var d = 0 === p ? h : (h + p - 2) % l + 2, f = t[d] - n[0], g = t[d + 1] - n[1], y = e[p] - i[0] - f, + v = e[p + 1] - i[1] - g; + c += y * y + v * v + } + c < o && (o = c, a = u) + } + return a + } + + function _G(t) { + for (var e = [], n = t.length, i = 0; i < n; i += 2) e[i] = t[n - i - 2], e[i + 1] = t[n - i - 1]; + return e + } + + function bG(t) { + return t.__isCombineMorphing + } + + var wG = "__mOriginal_"; + + function SG(t, e, n) { + var i = wG + e, r = t[i] || t[e]; + t[i] || (t[i] = t[e]); + var o = n.replace, a = n.after, s = n.before; + t[e] = function () { + var t, e = arguments; + return s && s.apply(this, e), t = o ? o.apply(this, e) : r.apply(this, e), a && a.apply(this, e), t + } + } + + function MG(t, e) { + var n = wG + e; + t[n] && (t[e] = t[n], t[n] = null) + } + + function IG(t, e) { + for (var n = 0; n < t.length; n++) for (var i = t[n], r = 0; r < i.length;) { + var o = i[r], a = i[r + 1]; + i[r++] = e[0] * o + e[2] * a + e[4], i[r++] = e[1] * o + e[3] * a + e[5] + } + } + + function TG(t, e) { + var n = t.getUpdatedPathProxy(), i = e.getUpdatedPathProxy(), r = function (t, e) { + for (var n, i, r, o = [], a = [], s = 0; s < Math.max(t.length, e.length); s++) { + var l = t[s], u = e[s], h = void 0, c = void 0; + l ? u ? (i = h = (n = yG(l, u))[0], r = c = n[1]) : (c = vG(r || l, l), h = l) : (h = vG(i || u, u), c = u), o.push(h), a.push(c) + } + return [o, a] + }(rG(n), rG(i)), o = r[0], a = r[1], s = t.getComputedTransform(), l = e.getComputedTransform(); + s && IG(o, s), l && IG(a, l), SG(e, "updateTransform", { + replace: function () { + this.transform = null + } + }), e.transform = null; + var u = function (t, e, n, i) { + for (var r, o = [], a = 0; a < t.length; a++) { + var s = t[a], l = e[a], u = mG(s), h = mG(l); + null == r && (r = u[2] < 0 != h[2] < 0); + var c = [], p = [], d = 0, f = 1 / 0, g = [], y = s.length; + r && (s = _G(s)); + for (var v = 6 * xG(s, l, u, h), m = y - 2, x = 0; x < m; x += 2) { + var _ = (v + x) % m + 2; + c[x + 2] = s[_] - u[0], c[x + 3] = s[_ + 1] - u[1] + } + if (c[0] = s[v] - u[0], c[1] = s[v + 1] - u[1], n > 0) for (var b = i / n, w = -i / 2; w <= i / 2; w += b) { + var S = Math.sin(w), M = Math.cos(w), I = 0; + for (x = 0; x < s.length; x += 2) { + var T = c[x], C = c[x + 1], D = l[x] - h[0], A = l[x + 1] - h[1], k = D * M - A * S, + L = D * S + A * M; + g[x] = k, g[x + 1] = L; + var P = k - T, O = L - C; + I += P * P + O * O + } + if (I < f) { + f = I, d = w; + for (var R = 0; R < g.length; R++) p[R] = g[R] + } + } else for (var N = 0; N < y; N += 2) p[N] = l[N] - h[0], p[N + 1] = l[N + 1] - h[1]; + o.push({from: c, to: p, fromCp: u, toCp: h, rotation: -d}) + } + return o + }(o, a, 10, Math.PI), h = []; + SG(e, "buildPath", { + replace: function (t) { + for (var n = e.__morphT, i = 1 - n, r = [], o = 0; o < u.length; o++) { + var a = u[o], s = a.from, l = a.to, c = a.rotation * n, p = a.fromCp, d = a.toCp, f = Math.sin(c), + g = Math.cos(c); + Bt(r, p, d, n); + for (var y = 0; y < s.length; y += 2) { + var v = s[y], m = s[y + 1], x = v * i + (S = l[y]) * n, _ = m * i + (M = l[y + 1]) * n; + h[y] = x * g - _ * f + r[0], h[y + 1] = x * f + _ * g + r[1] + } + var b = h[0], w = h[1]; + t.moveTo(b, w); + for (y = 2; y < s.length;) { + var S = h[y++], M = h[y++], I = h[y++], T = h[y++], C = h[y++], D = h[y++]; + b === S && w === M && I === C && T === D ? t.lineTo(C, D) : t.bezierCurveTo(S, M, I, T, C, D), b = C, w = D + } + } + } + }) + } + + function CG(t, e, n) { + if (!t || !e) return e; + var i = n.done, r = n.during; + return TG(t, e), e.__morphT = 0, e.animateTo({__morphT: 1}, k({ + during: function (t) { + e.dirtyShape(), r && r(t) + }, done: function () { + MG(e, "buildPath"), MG(e, "updateTransform"), e.__morphT = -1, e.createPathProxy(), e.dirtyShape(), i && i() + } + }, n)), e + } + + function DG(t, e, n, i, r, o) { + t = r === n ? 0 : Math.round(32767 * (t - n) / (r - n)), e = o === i ? 0 : Math.round(32767 * (e - i) / (o - i)); + for (var a, s = 0, l = 32768; l > 0; l /= 2) { + var u = 0, h = 0; + (t & l) > 0 && (u = 1), (e & l) > 0 && (h = 1), s += l * l * (3 * u ^ h), 0 === h && (1 === u && (t = l - 1 - t, e = l - 1 - e), a = t, t = e, e = a) + } + return s + } + + function AG(t) { + var e = 1 / 0, n = 1 / 0, i = -1 / 0, r = -1 / 0, o = z(t, (function (t) { + var o = t.getBoundingRect(), a = t.getComputedTransform(), s = o.x + o.width / 2 + (a ? a[4] : 0), + l = o.y + o.height / 2 + (a ? a[5] : 0); + return e = Math.min(s, e), n = Math.min(l, n), i = Math.max(s, i), r = Math.max(l, r), [s, l] + })); + return z(o, (function (o, a) { + return {cp: o, z: DG(o[0], o[1], e, n, i, r), path: t[a]} + })).sort((function (t, e) { + return t.z - e.z + })).map((function (t) { + return t.path + })) + } + + function kG(t) { + return gG(t.path, t.count) + } + + function LG(t) { + return Y(t[0]) + } + + function PG(t, e) { + for (var n = [], i = t.length, r = 0; r < i; r++) n.push({one: t[r], many: []}); + for (r = 0; r < e.length; r++) { + var o = e[r].length, a = void 0; + for (a = 0; a < o; a++) n[a % i].many.push(e[r][a]) + } + var s = 0; + for (r = i - 1; r >= 0; r--) if (!n[r].many.length) { + var l = n[s].many; + if (l.length <= 1) { + if (!s) return n; + s = 0 + } + o = l.length; + var u = Math.ceil(o / 2); + n[r].many = l.slice(u, o), n[s].many = l.slice(0, u), s++ + } + return n + } + + var OG = { + clone: function (t) { + for (var e = [], n = 1 - Math.pow(1 - t.path.style.opacity, 1 / t.count), i = 0; i < t.count; i++) { + var r = su(t.path); + r.setStyle("opacity", n), e.push(r) + } + return e + }, split: null + }; + + function RG(t, e, n, i, r, o) { + if (t.length && e.length) { + var a = eh("update", i, r); + if (a && a.duration > 0) { + var s, l, u = i.getModel("universalTransition").get("delay"), h = Object.assign({setToFinal: !0}, a); + LG(t) && (s = t, l = e), LG(e) && (s = e, l = t); + for (var c = s ? s === t : t.length > e.length, p = s ? PG(l, s) : PG(c ? e : t, [c ? t : e]), d = 0, f = 0; f < p.length; f++) d += p[f].many.length; + var g = 0; + for (f = 0; f < p.length; f++) y(p[f], c, g, d), g += p[f].many.length + } + } + + function y(t, e, i, r, a) { + var s = t.many, l = t.one; + if (1 !== s.length || a) for (var c = k({ + dividePath: OG[n], individualDelay: u && function (t, e, n, o) { + return u(t + i, r) + } + }, h), p = e ? function (t, e, n) { + var i = []; + !function t(e) { + for (var n = 0; n < e.length; n++) { + var r = e[n]; + bG(r) ? t(r.childrenRef()) : r instanceof fs && i.push(r) + } + }(t); + var r = i.length; + if (!r) return {fromIndividuals: [], toIndividuals: [], count: 0}; + var o = (n.dividePath || kG)({path: e, count: r}); + if (o.length !== r) return console.error("Invalid morphing: unmatched splitted path"), { + fromIndividuals: [], + toIndividuals: [], + count: 0 + }; + i = AG(i), o = AG(o); + for (var a = n.done, s = n.during, l = n.individualDelay, u = new qi, h = 0; h < r; h++) { + var c = i[h], p = o[h]; + p.parent = e, p.copyTransform(u), l || TG(c, p) + } + + function d(t) { + for (var e = 0; e < o.length; e++) o[e].addSelfToZr(t) + } + + function f() { + e.__isCombineMorphing = !1, e.__morphT = -1, e.childrenRef = null, MG(e, "addSelfToZr"), MG(e, "removeSelfFromZr") + } + + e.__isCombineMorphing = !0, e.childrenRef = function () { + return o + }, SG(e, "addSelfToZr", { + after: function (t) { + d(t) + } + }), SG(e, "removeSelfFromZr", { + after: function (t) { + for (var e = 0; e < o.length; e++) o[e].removeSelfFromZr(t) + } + }); + var g = o.length; + if (l) { + var y = g, v = function () { + 0 == --y && (f(), a && a()) + }; + for (h = 0; h < g; h++) { + var m = l ? k({delay: (n.delay || 0) + l(h, g, i[h], o[h]), done: v}, n) : n; + CG(i[h], o[h], m) + } + } else e.__morphT = 0, e.animateTo({__morphT: 1}, k({ + during: function (t) { + for (var n = 0; n < g; n++) { + var i = o[n]; + i.__morphT = e.__morphT, i.dirtyShape() + } + s && s(t) + }, done: function () { + f(); + for (var e = 0; e < t.length; e++) MG(t[e], "updateTransform"); + a && a() + } + }, n)); + return e.__zr && d(e.__zr), {fromIndividuals: i, toIndividuals: o, count: g} + }(s, l, c) : function (t, e, n) { + var i = e.length, r = [], o = n.dividePath || kG; + if (bG(t)) { + !function t(e) { + for (var n = 0; n < e.length; n++) { + var i = e[n]; + bG(i) ? t(i.childrenRef()) : i instanceof fs && r.push(i) + } + }(t.childrenRef()); + var a = r.length; + if (a < i) for (var s = 0, l = a; l < i; l++) r.push(su(r[s++ % a])); + r.length = i + } else { + r = o({path: t, count: i}); + var u = t.getComputedTransform(); + for (l = 0; l < r.length; l++) r[l].setLocalTransform(u); + if (r.length !== i) return console.error("Invalid morphing: unmatched splitted path"), { + fromIndividuals: [], + toIndividuals: [], + count: 0 + } + } + r = AG(r), e = AG(e); + var h = n.individualDelay; + for (l = 0; l < i; l++) { + var c = h ? k({delay: (n.delay || 0) + h(l, i, r[l], e[l])}, n) : n; + CG(r[l], e[l], c) + } + return {fromIndividuals: r, toIndividuals: e, count: e.length} + }(l, s, c), d = p.fromIndividuals, f = p.toIndividuals, g = d.length, v = 0; v < g; v++) { + m = u ? k({delay: u(v, g)}, h) : h; + o(d[v], f[v], e ? s[v] : t.one, e ? t.one : s[v], m) + } else { + var m, x = e ? s[0] : l, _ = e ? l : s[0]; + if (bG(x)) y({ + many: [x], + one: _ + }, !0, i, r, !0); else CG(x, _, m = u ? k({delay: u(i, r)}, h) : h), o(x, _, x, _, m) + } + } + } + + function NG(t) { + if (!t) return []; + if (Y(t)) { + for (var e = [], n = 0; n < t.length; n++) e.push(NG(t[n])); + return e + } + var i = []; + return t.traverse((function (t) { + t instanceof fs && !t.disableMorphing && !t.invisible && !t.ignore && i.push(t) + })), i + } + + var EG = So(); + + function zG(t) { + var e = []; + return E(t, (function (t) { + var n = t.data; + if (!(n.count() > 1e4)) for (var i = n.getIndices(), r = function (t) { + for (var e = t.dimensions, n = 0; n < e.length; n++) { + var i = t.getDimensionInfo(e[n]); + if (i && 0 === i.otherDims.itemGroupId) return e[n] + } + }(n), o = 0; o < i.length; o++) e.push({data: n, dim: t.dim || r, divide: t.divide, dataIndex: o}) + })), e + } + + function VG(t, e, n) { + t.traverse((function (t) { + t instanceof fs && rh(t, {style: {opacity: 0}}, e, {dataIndex: n, isFrom: !0}) + })) + } + + function BG(t) { + if (t.parent) { + var e = t.getComputedTransform(); + t.setLocalTransform(e), t.parent.remove(t) + } + } + + function FG(t) { + t.stopAnimation(), t.isGroup && t.traverse((function (t) { + t.stopAnimation() + })) + } + + function GG(t, e, n) { + var i = eh("update", n, e); + i && t.traverse((function (t) { + if (t instanceof da) { + var e = function (t) { + return th(t).oldStyle + }(t); + e && t.animateFrom({style: e}, i) + } + })) + } + + function WG(t, e, n) { + var i = zG(t), r = zG(e); + + function o(t, e, n, i, r) { + (n || t) && e.animateFrom({style: n && n !== t ? A(A({}, n.style), t.style) : t.style}, r) + } + + function a(t) { + for (var e = 0; e < t.length; e++) if (t[e].dim) return t[e].dim + } + + var s = a(i), l = a(r), u = !1; + + function h(t, e) { + return function (n) { + var i = n.data, r = n.dataIndex; + if (e) return i.getId(r); + var o = i.hostModel && i.hostModel.get("dataGroupId"), a = t ? s || l : l || s, + u = a && i.getDimensionInfo(a), h = u && u.ordinalMeta; + if (u) { + var c = i.get(u.name, r); + return h && h.categories[c] || c + "" + } + var p = i.getRawDataItem(r); + return p && p.groupId ? p.groupId + "" : o || i.getId(r) + } + } + + var c = function (t, e) { + var n = t.length; + if (n !== e.length) return !1; + for (var i = 0; i < n; i++) { + var r = t[i], o = e[i]; + if (r.data.getId(r.dataIndex) !== o.data.getId(o.dataIndex)) return !1 + } + return !0 + }(i, r), p = {}; + if (!c) for (var d = 0; d < r.length; d++) { + var f = r[d], g = f.data.getItemGraphicEl(f.dataIndex); + g && (p[g.id] = !0) + } + + function y(t, e) { + var n = i[e], a = r[t], s = a.data.hostModel, l = n.data.getItemGraphicEl(n.dataIndex), + h = a.data.getItemGraphicEl(a.dataIndex); + l !== h ? l && p[l.id] || h && (FG(h), l ? (FG(l), BG(l), u = !0, RG(NG(l), NG(h), a.divide, s, t, o)) : VG(h, s, t)) : h && GG(h, a.dataIndex, s) + } + + new Sm(i, r, h(!0, c), h(!1, c), null, "multiple").update(y).updateManyToOne((function (t, e) { + var n = r[t], a = n.data, s = a.hostModel, l = a.getItemGraphicEl(n.dataIndex), h = B(z(e, (function (t) { + return i[t].data.getItemGraphicEl(i[t].dataIndex) + })), (function (t) { + return t && t !== l && !p[t.id] + })); + l && (FG(l), h.length ? (E(h, (function (t) { + FG(t), BG(t) + })), u = !0, RG(NG(h), NG(l), n.divide, s, t, o)) : VG(l, s, n.dataIndex)) + })).updateOneToMany((function (t, e) { + var n = i[e], a = n.data.getItemGraphicEl(n.dataIndex); + if (!a || !p[a.id]) { + var s = B(z(t, (function (t) { + return r[t].data.getItemGraphicEl(r[t].dataIndex) + })), (function (t) { + return t && t !== a + })), l = r[t[0]].data.hostModel; + s.length && (E(s, (function (t) { + return FG(t) + })), a ? (FG(a), BG(a), u = !0, RG(NG(a), NG(s), n.divide, l, t[0], o)) : E(s, (function (e) { + return VG(e, l, t[0]) + }))) + } + })).updateManyToMany((function (t, e) { + new Sm(e, t, (function (t) { + return i[t].data.getId(i[t].dataIndex) + }), (function (t) { + return r[t].data.getId(r[t].dataIndex) + })).update((function (n, i) { + y(t[n], e[i]) + })).execute() + })).execute(), u && E(e, (function (t) { + var e = t.data.hostModel, i = e && n.getViewOfSeriesModel(e), r = eh("update", e, 0); + i && e.isAnimationEnabled() && r && r.duration > 0 && i.group.traverse((function (t) { + t instanceof fs && !t.animators.length && t.animateFrom({style: {opacity: 0}}, r) + })) + })) + } + + function HG(t) { + var e = t.getModel("universalTransition").get("seriesKey"); + return e || t.id + } + + function YG(t) { + return Y(t) ? t.sort().join(",") : t + } + + function UG(t) { + if (t.hostModel) return t.hostModel.getModel("universalTransition").get("divideShape") + } + + function XG(t, e) { + for (var n = 0; n < t.length; n++) { + if (null != e.seriesIndex && e.seriesIndex === t[n].seriesIndex || null != e.seriesId && e.seriesId === t[n].id) return n + } + } + + _m([function (t) { + t.registerPainter("canvas", Vw) + }]), _m([function (t) { + t.registerPainter("svg", Lw) + }]), _m([function (t) { + t.registerChartView(mS), t.registerSeriesModel(Bw), t.registerLayout(xS("line", !0)), t.registerVisual({ + seriesType: "line", + reset: function (t) { + var e = t.getData(), n = t.getModel("lineStyle").getLineStyle(); + n && !n.stroke && (n.stroke = e.getVisual("style").fill), e.setVisual("legendLineStyle", n) + } + }), t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC, wS("line")) + }, function (t) { + t.registerChartView(LS), t.registerSeriesModel(MS), t.registerLayout(t.PRIORITY.VISUAL.LAYOUT, H(Dx, "bar")), t.registerLayout(t.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, Ax("bar")), t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC, wS("bar")), t.registerAction({ + type: "changeAxisOrder", + event: "changeAxisOrder", + update: "update" + }, (function (t, e) { + var n = t.componentType || "series"; + e.eachComponent({mainType: n, query: t}, (function (e) { + t.sortInfo && e.axis.setCategorySortInfo(t.sortInfo) + })) + })) + }, function (t) { + t.registerChartView(aM), t.registerSeriesModel(uM), yy("pie", t.registerAction), t.registerLayout(H($S, "pie")), t.registerProcessor(JS("pie")), t.registerProcessor(function (t) { + return { + seriesType: t, reset: function (t, e) { + var n = t.getData(); + n.filterSelf((function (t) { + var e = n.mapDimension("value"), i = n.get(e, t); + return !(j(i) && !isNaN(i) && i < 0) + })) + } + } + }("pie")) + }, function (t) { + _m(hI), t.registerSeriesModel(hM), t.registerChartView(fM), t.registerLayout(xS("scatter")) + }, function (t) { + _m(MI), t.registerChartView(gI), t.registerSeriesModel(yI), t.registerLayout(cI), t.registerProcessor(JS("radar")), t.registerPreprocessor(fI) + }, function (t) { + _m(JT), t.registerChartView(RT), t.registerSeriesModel(NT), t.registerLayout(zT), t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC, ET), yy("map", t.registerAction) + }, function (t) { + t.registerChartView(hC), t.registerSeriesModel(PC), t.registerLayout(RC), t.registerVisual(NC), function (t) { + t.registerAction({ + type: "treeExpandAndCollapse", + event: "treeExpandAndCollapse", + update: "update" + }, (function (t, e) { + e.eachComponent({mainType: "series", subType: "tree", query: t}, (function (e) { + var n = t.dataIndex, i = e.getData().tree.getNodeByDataIndex(n); + i.isExpand = !i.isExpand + })) + })), t.registerAction({type: "treeRoam", event: "treeRoam", update: "none"}, (function (t, e) { + e.eachComponent({mainType: "series", subType: "tree", query: t}, (function (e) { + var n = qT(e.coordinateSystem, t); + e.setCenter && e.setCenter(n.center), e.setZoom && e.setZoom(n.zoom) + })) + })) + }(t) + }, function (t) { + t.registerSeriesModel(VC), t.registerChartView($C), t.registerVisual(fD), t.registerLayout(CD), function (t) { + for (var e = 0; e < EC.length; e++) t.registerAction({type: EC[e], update: "updateView"}, xt); + t.registerAction({type: "treemapRootToNode", update: "updateView"}, (function (t, e) { + e.eachComponent({mainType: "series", subType: "treemap", query: t}, (function (e, n) { + var i = DC(t, ["treemapZoomToNode", "treemapRootToNode"], e); + if (i) { + var r = e.getViewRoot(); + r && (t.direction = kC(r, i.node) ? "rollUp" : "drillDown"), e.resetViewRoot(i.node) + } + })) + })) + }(t) + }, function (t) { + t.registerChartView(TA), t.registerSeriesModel(OA), t.registerProcessor(OD), t.registerVisual(RD), t.registerVisual(ED), t.registerLayout(XD), t.registerLayout(t.PRIORITY.VISUAL.POST_CHART_LAYOUT, QD), t.registerLayout(eA), t.registerCoordinateSystem("graphView", { + dimensions: BT.dimensions, + create: nA + }), t.registerAction({ + type: "focusNodeAdjacency", + event: "focusNodeAdjacency", + update: "series:focusNodeAdjacency" + }, xt), t.registerAction({ + type: "unfocusNodeAdjacency", + event: "unfocusNodeAdjacency", + update: "series:unfocusNodeAdjacency" + }, xt), t.registerAction(RA, (function (t, e) { + e.eachComponent({mainType: "series", query: t}, (function (e) { + var n = qT(e.coordinateSystem, t); + e.setCenter && e.setCenter(n.center), e.setZoom && e.setZoom(n.zoom) + })) + })) + }, function (t) { + t.registerChartView(BA), t.registerSeriesModel(FA) + }, function (t) { + t.registerChartView(HA), t.registerSeriesModel(YA), t.registerLayout(UA), t.registerProcessor(JS("funnel")) + }, function (t) { + _m(vL), t.registerChartView(XA), t.registerSeriesModel($A), t.registerVisual(t.PRIORITY.VISUAL.BRUSH, tk) + }, function (t) { + t.registerChartView(_L), t.registerSeriesModel(bL), t.registerLayout(wL), t.registerVisual(RL), t.registerAction({ + type: "dragNode", + event: "dragnode", + update: "update" + }, (function (t, e) { + e.eachComponent({mainType: "series", subType: "sankey", query: t}, (function (e) { + e.setNodePosition(t.dataIndex, [t.localX, t.localY]) + })) + })) + }, function (t) { + t.registerSeriesModel(EL), t.registerChartView(zL), t.registerVisual(HL), t.registerLayout(UL), t.registerTransform(XL) + }, function (t) { + t.registerChartView(jL), t.registerSeriesModel(oP), t.registerPreprocessor(aP), t.registerVisual(cP), t.registerLayout(pP) + }, function (t) { + t.registerChartView(yP), t.registerSeriesModel(vP), t.registerLayout(xS("effectScatter")) + }, function (t) { + t.registerChartView(IP), t.registerSeriesModel(AP), t.registerLayout(MP), t.registerVisual(LP) + }, function (t) { + t.registerChartView(RP), t.registerSeriesModel(NP) + }, function (t) { + t.registerChartView(BP), t.registerSeriesModel(iO), t.registerLayout(t.PRIORITY.VISUAL.LAYOUT, H(Dx, "pictorialBar")), t.registerLayout(t.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, Ax("pictorialBar")) + }, function (t) { + t.registerChartView(rO), t.registerSeriesModel(oO), t.registerLayout(aO), t.registerProcessor(JS("themeRiver")) + }, function (t) { + t.registerChartView(cO), t.registerSeriesModel(pO), t.registerLayout(H(gO, "sunburst")), t.registerProcessor(H(JS, "sunburst")), t.registerVisual(vO), function (t) { + t.registerAction({type: uO, update: "updateView"}, (function (t, e) { + e.eachComponent({mainType: "series", subType: "sunburst", query: t}, (function (e, n) { + var i = DC(t, [uO], e); + if (i) { + var r = e.getViewRoot(); + r && (t.direction = kC(r, i.node) ? "rollUp" : "drillDown"), e.resetViewRoot(i.node) + } + })) + })), t.registerAction({type: hO, update: "none"}, (function (t, e, n) { + t = A({}, t), e.eachComponent({mainType: "series", subType: "sunburst", query: t}, (function (e) { + var n = DC(t, [hO], e); + n && (t.dataIndex = n.node.dataIndex) + })), n.dispatchAction(A(t, {type: "highlight"})) + })), t.registerAction({type: "sunburstUnhighlight", update: "updateView"}, (function (t, e, n) { + t = A({}, t), n.dispatchAction(A(t, {type: "downplay"})) + })) + }(t) + }, function (t) { + t.registerChartView(lR), t.registerSeriesModel(bO) + }]), _m((function (t) { + _m(hI), _m(lN) + })), _m((function (t) { + _m(lN), JM.registerAxisPointerClass("PolarAxisPointer", uN), t.registerCoordinateSystem("polar", SN), t.registerComponentModel(cN), t.registerComponentView(BN), wM(t, "angle", dN, zN), wM(t, "radius", fN, VN), t.registerComponentView(DN), t.registerComponentView(PN), t.registerLayout(H(EN, "bar")) + })), _m(JT), _m((function (t) { + _m(lN), JM.registerAxisPointerClass("SingleAxisPointer", QN), t.registerComponentView(iE), t.registerComponentView(HN), t.registerComponentModel(UN), wM(t, "single", UN, UN.defaultOption), t.registerCoordinateSystem("single", KN) + })), _m(vL), _m((function (t) { + t.registerComponentModel(rE), t.registerComponentView(aE), t.registerCoordinateSystem("calendar", lE) + })), _m((function (t) { + t.registerComponentModel(fE), t.registerComponentView(vE), t.registerPreprocessor((function (t) { + var e = t.graphic; + Y(e) ? e[0] && e[0].elements ? t.graphic = [t.graphic[0]] : t.graphic = [{elements: e}] : e && !e.elements && (t.graphic = [{elements: [e]}]) + })) + })), _m((function (t) { + t.registerComponentModel(YE), t.registerComponentView(XE), WE("saveAsImage", ZE), WE("magicType", KE), WE("dataView", iz), WE("dataZoom", Iz), WE("restore", lz), _m(BE) + })), _m((function (t) { + _m(lN), t.registerComponentModel(Dz), t.registerComponentView(Uz), t.registerAction({ + type: "showTip", + event: "showTip", + update: "tooltip:manuallyShowTip" + }, xt), t.registerAction({type: "hideTip", event: "hideTip", update: "tooltip:manuallyHideTip"}, xt) + })), _m(lN), _m((function (t) { + t.registerComponentView(dV), t.registerComponentModel(fV), t.registerPreprocessor(Kz), t.registerVisual(t.PRIORITY.VISUAL.BRUSH, lV), t.registerAction({ + type: "brush", + event: "brush", + update: "updateVisual" + }, (function (t, e) { + e.eachComponent({mainType: "brush", query: t}, (function (e) { + e.setAreas(t.areas) + })) + })), t.registerAction({ + type: "brushSelect", + event: "brushSelected", + update: "none" + }, xt), t.registerAction({type: "brushEnd", event: "brushEnd", update: "none"}, xt), WE("brush", vV) + })), _m((function (t) { + t.registerComponentModel(mV), t.registerComponentView(xV) + })), _m((function (t) { + t.registerComponentModel(bV), t.registerComponentView(TV), t.registerSubTypeDefaulter("timeline", (function () { + return "slider" + })), function (t) { + t.registerAction({ + type: "timelineChange", + event: "timelineChanged", + update: "prepareAndUpdate" + }, (function (t, e, n) { + var i = e.getComponent("timeline"); + return i && null != t.currentIndex && (i.setCurrentIndex(t.currentIndex), !i.get("loop", !0) && i.isIndexMax() && i.getPlayState() && (i.setPlayState(!1), n.dispatchAction({ + type: "timelinePlayChange", + playState: !1, + from: t.from + }))), e.resetOption("timeline", {replaceMerge: i.get("replaceMerge", !0)}), k({currentIndex: i.option.currentIndex}, t) + })), t.registerAction({ + type: "timelinePlayChange", + event: "timelinePlayChanged", + update: "update" + }, (function (t, e) { + var n = e.getComponent("timeline"); + n && null != t.playState && n.setPlayState(t.playState) + })) + }(t), t.registerPreprocessor(AV) + })), _m((function (t) { + t.registerComponentModel(EV), t.registerComponentView(ZV), t.registerPreprocessor((function (t) { + PV(t.series, "markPoint") && (t.markPoint = t.markPoint || {}) + })) + })), _m((function (t) { + t.registerComponentModel(jV), t.registerComponentView(eB), t.registerPreprocessor((function (t) { + PV(t.series, "markLine") && (t.markLine = t.markLine || {}) + })) + })), _m((function (t) { + t.registerComponentModel(nB), t.registerComponentView(hB), t.registerPreprocessor((function (t) { + PV(t.series, "markArea") && (t.markArea = t.markArea || {}) + })) + })), _m((function (t) { + _m(wB), _m(AB) + })), _m((function (t) { + _m(GB), _m(KB) + })), _m(GB), _m(KB), _m((function (t) { + _m(kF), _m(NF) + })), _m(kF), _m(NF), _m((function (t) { + t.registerPreprocessor(FF), t.registerVisual(t.PRIORITY.VISUAL.ARIA, BF) + })), _m((function (t) { + t.registerTransform(JF), t.registerTransform(QF) + })), _m((function (t) { + t.registerComponentModel(tG), t.registerComponentView(eG) + })), _m((function (t) { + t.registerUpdateLifecycle("series:beforeupdate", (function (t, e, n) { + E(ho(n.seriesTransition), (function (t) { + E(ho(t.to), (function (t) { + for (var e = n.updatedSeries, i = 0; i < e.length; i++) (null != t.seriesIndex && t.seriesIndex === e[i].seriesIndex || null != t.seriesId && t.seriesId === e[i].id) && (e[i].__universalTransitionEnabled = !0) + })) + })) + })), t.registerUpdateLifecycle("series:transition", (function (t, e, n) { + var i = EG(e); + if (i.oldSeries && n.updatedSeries && n.optionChanged) { + var r = n.seriesTransition; + if (r) E(ho(r), (function (t) { + !function (t, e, n, i) { + var r = [], o = []; + E(ho(t.from), (function (t) { + var n = XG(e.oldSeries, t); + n >= 0 && r.push({data: e.oldData[n], divide: UG(e.oldData[n]), dim: t.dimension}) + })), E(ho(t.to), (function (t) { + var e = XG(n.updatedSeries, t); + if (e >= 0) { + var i = n.updatedSeries[e].getData(); + o.push({data: i, divide: UG(i), dim: t.dimension}) + } + })), r.length > 0 && o.length > 0 && WG(r, o, i) + }(t, i, n, e) + })); else { + var o = function (t, e) { + var n = ft(), i = ft(), r = ft(); + return E(t.oldSeries, (function (e, n) { + var o = t.oldData[n], a = HG(e), s = YG(a); + i.set(s, o), Y(a) && E(a, (function (t) { + r.set(t, {data: o, key: s}) + })) + })), E(e.updatedSeries, (function (t) { + if (t.isUniversalTransitionEnabled() && t.isAnimationEnabled()) { + var e = t.getData(), o = HG(t), a = YG(o), s = i.get(a); + if (s) n.set(a, { + oldSeries: [{divide: UG(s), data: s}], + newSeries: [{divide: UG(e), data: e}] + }); else if (Y(o)) { + var l = []; + E(o, (function (t) { + var e = i.get(t); + e && l.push({divide: UG(e), data: e}) + })), l.length && n.set(a, {oldSeries: l, newSeries: [{data: e, divide: UG(e)}]}) + } else { + var u = r.get(o); + if (u) { + var h = n.get(u.key); + h || (h = { + oldSeries: [{data: u.data, divide: UG(u.data)}], + newSeries: [] + }, n.set(u.key, h)), h.newSeries.push({data: e, divide: UG(e)}) + } + } + } + })), n + }(i, n); + E(o.keys(), (function (t) { + var n = o.get(t); + WG(n.oldSeries, n.newSeries, e) + })) + } + E(n.updatedSeries, (function (t) { + t.__universalTransitionEnabled && (t.__universalTransitionEnabled = !1) + })) + } + for (var a = t.getSeries(), s = i.oldSeries = [], l = i.oldData = [], u = 0; u < a.length; u++) { + var h = a[u].getData(); + h.count() < 1e4 && (s.push(a[u]), l.push(h)) + } + })) + })), _m((function (t) { + t.registerUpdateLifecycle("series:beforeupdate", (function (t, e, n) { + var i = Tb(e).labelManager; + i || (i = Tb(e).labelManager = new Ib), i.clearLabels() + })), t.registerUpdateLifecycle("series:layoutlabels", (function (t, e, n) { + var i = Tb(e).labelManager; + n.updatedSeries.forEach((function (t) { + i.addLabelsOfSeries(e.getViewOfSeriesModel(t)) + })), i.updateLayoutConfig(e), i.layout(e), i.processLabelsOverall() + })) + })), t.Axis = G_, t.ChartView = mg, t.ComponentModel = Ip, t.ComponentView = fg, t.List = Zm, t.Model = pc, t.PRIORITY = pv, t.SeriesModel = ag, t.color = Pn, t.connect = function (t) { + if (Y(t)) { + var e = t; + t = null, E(e, (function (e) { + null != e.group && (t = e.group) + })), t = t || "g_" + Jv++, E(e, (function (e) { + e.group = t + })) + } + return Kv[t] = !0, t + }, t.dataTool = {}, t.dependencies = {zrender: "5.3.0"}, t.disConnect = tm, t.disconnect = em, t.dispose = function (t) { + X(t) ? t = qv[t] : t instanceof Vv || (t = nm(t)), t instanceof Vv && !t.isDisposed() && t.dispose() + }, t.env = r, t.extendChartView = function (t) { + var e = mg.extend(t); + return mg.registerClass(e), e + }, t.extendComponentModel = function (t) { + var e = Ip.extend(t); + return Ip.registerClass(e), e + }, t.extendComponentView = function (t) { + var e = fg.extend(t); + return fg.registerClass(e), e + }, t.extendSeriesModel = function (t) { + var e = ag.extend(t); + return ag.registerClass(e), e + }, t.format = A_, t.getCoordinateSystemDimensions = function (t) { + var e = ud.get(t); + if (e) return e.getDimensionsInfo ? e.getDimensionsInfo() : e.dimensions.slice() + }, t.getInstanceByDom = nm, t.getInstanceById = function (t) { + return qv[t] + }, t.getMap = function (t) { + var e = lv("getMap"); + return e && e(t) + }, t.graphic = D_, t.helper = p_, t.init = function (t, e, n) { + var i = !(n && n.ssr); + if (i) { + 0; + var r = nm(t); + if (r) return r; + 0 + } + var o = new Vv(t, e, n); + return o.id = "ec_" + $v++, qv[o.id] = o, i && ko(t, Qv, o.id), Ov(o), av.trigger("afterinit", o), o + }, t.innerDrawElementOnCanvas = $y, t.matrix = Gi, t.number = T_, t.parseGeoJSON = I_, t.parseGeoJson = I_, t.registerAction = um, t.registerCoordinateSystem = hm, t.registerLayout = cm, t.registerLoading = gm, t.registerLocale = wc, t.registerMap = ym, t.registerPostInit = am, t.registerPostUpdate = sm, t.registerPreprocessor = rm, t.registerProcessor = om, t.registerTheme = im, t.registerTransform = vm, t.registerUpdateLifecycle = lm, t.registerVisual = pm, t.setCanvasCreator = function (t) { + c({createCanvas: t}) + }, t.setPlatformAPI = c, t.throttle = Cg, t.time = C_, t.use = _m, t.util = k_, t.vector = Ht, t.version = "5.3.0", t.zrUtil = bt, t.zrender = Or, Object.defineProperty(t, "__esModule", {value: !0}) +})); diff --git a/src/ruoyi-admin/src/main/resources/templates/ky/files/index.js b/src/ruoyi-admin/src/main/resources/templates/ky/files/index.js new file mode 100644 index 0000000..99b89e4 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/ky/files/index.js @@ -0,0 +1,24 @@ +$(function () { + $.ajaxSetup({ + beforeSend: function(xhr, options) { + console.log('请求前===========') + console.log(options) + var originalSuccess = options.success + console.log("originalSuccess") + console.log(originalSuccess) + options.success = function(data, textStatus, jqXhr) { + if ('result' in data) { + data = data.result + } + originalSuccess.apply(this, arguments) + } + }, + error: function(xhr,status,error){ + console.log('接口错误=====') + console.log("status:" + status) + console.log(error) + } + }) + + +}) diff --git a/src/ruoyi-admin/src/main/resources/templates/ky/files/jquery-3.7.1.min.js b/src/ruoyi-admin/src/main/resources/templates/ky/files/jquery-3.7.1.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/ky/files/jquery-3.7.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0 + + + + + 个人财务管理系统 - 收入管理 + + + + + + + + + + +
    +

    收入管理

    + + +
    + +
    + + +
    +
    + + + + + + + + + + + + + + + +
    序号收入来源收入类型金额收入日期操作
    + + +
    +

    数据导入与自动分类

    +

    导入个人财务数据,并根据收入、支出等类别自动分类。

    +
    +
    + +
    + +
    +
    + +
    + +

    导入类型:XLSX

    +
    + + + + +
    +
    +
    + 加载中 +
    +
    +
    + + + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/ky/index.html b/src/ruoyi-admin/src/main/resources/templates/ky/index.html new file mode 100644 index 0000000..1285b44 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/ky/index.html @@ -0,0 +1,187 @@ + + + + + + 个人财务管理系统 - 后台首页 + + + + + + + + + +
    +

    欢迎来到个人财务管理系统

    + + +
    +
    +
    +
    +
    +
    账户总余额
    +

    +
    +
    + 💰 +
    +
    +
    +
    + +
    +
    +
    +
    +
    本月收入
    +

    +
    +
    + 📈 +
    +
    +
    +
    + +
    +
    +
    +
    +
    本月支出
    +

    +
    +
    + 📉 +
    +
    +
    +
    +
    + + +

    最近的交易记录

    + + + + + + + + + + + + +
    日期描述收入/支出金额
    +
    + + + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/ky/jiance.html b/src/ruoyi-admin/src/main/resources/templates/ky/jiance.html new file mode 100644 index 0000000..2fa9f22 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/ky/jiance.html @@ -0,0 +1,578 @@ + + + + + + 个人财务管理系统 - 监测与管理提醒 + + + + + + + + + +
    +

    监测与管理提醒

    + + +
    +

    异常监测提醒

    +

    监测到您近期有以下异常财务活动:

    +
      +
    +
    + + +
    +

    目标管理提醒

    +

    设定您的财务目标,并实时跟踪进展:

    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    +
    + +
    已设定的目标:
    + + + + + + + + + + + + + +
    目标描述目标类型目标金额/次数检测天数截止日期操作
    +
    + +
    +
    +
    + 加载中 +
    +
    + + + + +
    + + + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/ky/login.html b/src/ruoyi-admin/src/main/resources/templates/ky/login.html new file mode 100644 index 0000000..9dd16c3 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/ky/login.html @@ -0,0 +1,85 @@ + + + + + + 个人财务管理系统 - 登录 + + + + + + + + + + + + + + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/ky/register.html b/src/ruoyi-admin/src/main/resources/templates/ky/register.html new file mode 100644 index 0000000..a7fe23e --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/ky/register.html @@ -0,0 +1,92 @@ + + + + + + 个人财务管理系统 - 注册 + + + + + +
    +

    创建新账户

    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    + 已有账户?登录 +
    +
    +
    + + + + + + + + + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/ky/zhichu.html b/src/ruoyi-admin/src/main/resources/templates/ky/zhichu.html new file mode 100644 index 0000000..f415608 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/ky/zhichu.html @@ -0,0 +1,610 @@ + + + + + + 个人财务管理系统 - 支出管理 + + + + + + + + + +
    +

    支出管理

    + + +
    + +
    + + + + +
    +
    + + + + + + + + + + + + + + + + +
    序号支出描述支出类型金额支出日期
    + + +
    +

    预算跟踪

    +
    + +
    +
    + + +
    +

    支出分析与节省建议

    +
      +
    • 考虑减少每月的餐厅就餐次数,建议每周至少在家做一次饭。
    • +
    • 超市购物时,建议提前列好购物清单,以避免冲动消费。
    • +
    • 通讯费用可以考虑选择更划算的套餐或优惠活动。
    • +
    • 在日常交通中,可以尝试步行或骑行,以减少交通费支出。
    • +
    +
    + + + + + + + +
    +
    +
    + 加载中 +
    +
    +
    + + + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/lock.html b/src/ruoyi-admin/src/main/resources/templates/lock.html new file mode 100644 index 0000000..1dce3ec --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/lock.html @@ -0,0 +1,208 @@ + + + + + + + 锁定屏幕 + + + + + + +
    +
    +
    [[ ${user.loginName} ]] / [[${#strings.defaultString(user.userName, '-')}]]
    + +
    +
    + User Image +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    系统锁屏,请输入密码登录!
    + +
    + + + + + + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/main.html b/src/ruoyi-admin/src/main/resources/templates/main.html new file mode 100644 index 0000000..8df6af6 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/main.html @@ -0,0 +1,1759 @@ + + + + + + + 若依介绍 + + + + + + + +
    +
    +
    + 领取阿里云通用云产品1888优惠券 +
    https://www.aliyun.com/minisite/goods?userCode=brki8iof
    + 领取腾讯云通用云产品2860优惠券 +
    https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console
    + 阿里云服务器折扣区 ☛☛点我进入☚☚     腾讯云服务器秒杀区 ☛☛点我进入☚☚
    +

    云产品通用红包,可叠加官网常规优惠使用。(仅限新用户)

    +
    + +
    +
    +
    +

    Hello,Guest

    + 移动设备访问请扫描以下二维码: +
    +
    + +
    +
    +
    +

    若依后台管理框架

    +

    一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。,她可以用于所有的Web应用程序,如网站管理后台网站会员中心CMSCRMOA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。

    +

    + 当前版本:v[[${version}]] +

    +

    + ¥免费开源 +

    +
    +

    + + 访问码云 + + + 访问主页 + +

    +
    +
    +

    技术选型:

    +
      +
    1. 核心框架:Spring Boot。
    2. +
    3. 安全框架:Apache Shiro。
    4. +
    5. 模板引擎:Thymeleaf。
    6. +
    7. 持久层框架:MyBatis。
    8. +
    9. 定时任务:Quartz。
    10. +
    11. 数据库连接池:Druid。
    12. +
    13. 工具类:Fastjson。
    14. +
    15. 更多……
    16. +
    +
    + +
    +
    +
    +
    + +
    +
    +
    联系信息
    + +
    +
    +

    官网:http://www.ruoyi.vip +

    +

    QQ群:满1389287 满1679294 满1529866 满1772718 满1366522 满1382251 满1145125 满86752435 满134072510 满210336300 满339522636 满130035985 满143151071 满158781320 满201531282 满101526938 满264355400 满298522656 满139845794 满185760789 满175104288 满174942938 满287843737 232896766 +

    +

    微信:/ *若依 +

    +

    支付宝:/ *若依 +

    +
    +
    +
    +
    +
    +
    +
    更新日志
    +
    +
    +
    +
    +
    +
    +
    + v4.7.92024.06.06 +
    +
    +
    +
    +
      +
    1. 通知公告新增详细显示
    2. +
    3. 新增数据脱敏过滤注解
    4. +
    5. 新增表格示例(虚拟滚动)
    6. +
    7. 新增表格示例(全文检索)
    8. +
    9. 新增表格示例(保存状态)
    10. +
    11. 代码生成支持表单布局选项
    12. +
    13. 限制用户操作数据权限范围
    14. +
    15. 用户密码新增非法字符验证
    16. +
    17. 默认加载layer扩展皮肤
    18. +
    19. 未修改初始密码弹框提醒
    20. +
    21. 定时任务白名单配置范围缩小
    22. +
    23. 操作日志列表重置回第一页
    24. +
    25. 定时任务日志默认按时间排序
    26. +
    27. Excel注解ColumnType类型新增文本
    28. +
    29. Excel注解新增属性comboReadDict
    30. +
    31. 新增Anonymous匿名访问不鉴权注解
    32. +
    33. 升级oshi到最新版本6.6.1
    34. +
    35. 升级druid到最新版本1.2.23
    36. +
    37. 升级commons.io到最新版本2.13.0
    38. +
    39. 升级spring-framework到安全版本
    40. +
    41. 升级bootstrap-table到最新版本1.22.6
    42. +
    43. 修复重置日期时出现的异常问题
    44. +
    45. 修复页签关闭后存在的跳转问题
    46. +
    47. 修复tooltip单击复制文本不生效的问题
    48. +
    49. 更新缓存管理键名排序方式
    50. +
    51. 更新HttpUtils中的User-Agent
    52. +
    53. 优化自定义XSS注解匹配方式
    54. +
    55. 优化登录注册页面验证码验证
    56. +
    57. 优化数据权限自定义匹配方式
    58. +
    59. 优化高频率定时任务不执行问题
    60. +
    61. 优化树表格align属性在标题生效
    62. +
    63. 优化代码生成主子表关联查询方式
    64. +
    65. 优化导入Excel时设置dictType属性重复查缓存问题
    66. +
    67. 其他细节优化
    68. +
    +
    +
    +
    +
    +
    +
    + v4.7.82023.11.23 +
    +
    +
    +
    +
      +
    1. 用户列表新增抽屉效果详细信息
    2. +
    3. 操作日志列表新增IP地址查询
    4. +
    5. 定时任务新增页去除状态选项
    6. +
    7. 系统管理角色列表显示数据权限
    8. +
    9. 通用排序属性orderBy参数限制长度
    10. +
    11. 新增isScrollToTop页签切换滚动到顶部
    12. +
    13. Excel自定义数据处理器增加单元格/工作簿对象
    14. +
    15. 新增表格参数(数据值为空时显示的内容undefinedText)
    16. +
    17. 升级oshi到最新版本6.4.7
    18. +
    19. 升级shiro到最新版本1.13.0
    20. +
    21. 升级druid到最新版本1.2.20
    22. +
    23. 升级pagehelper到最新版1.4.7
    24. +
    25. 升级spring-boot到最新版本2.5.15
    26. +
    27. 升级jquery到最新版v3.7.1
    28. +
    29. 升级layer到最新版本v3.7.0
    30. +
    31. 升级layui到最新版本v2.8.18
    32. +
    33. 升级x-editable到最新版本1.5.3
    34. +
    35. 修复自定义字典样式不生效的问题
    36. +
    37. 修复弹窗按钮启用禁用方法无效问题
    38. +
    39. 修复横向菜单关闭最后一个页签状态问题
    40. +
    41. 修复Excel导入数据临时文件无法删除问题
    42. +
    43. 修复表格行内编辑启用翻页记住选择无效问题
    44. +
    45. 修复Excels导入时无法获取到dictType字典值问题
    46. +
    47. 优化重置密码鼠标按下显示密码
    48. +
    49. 优化参数键值文本框改为文本域
    50. +
    51. 优化表格重置默认返回到第一页
    52. +
    53. 优化菜单管理类型为按钮状态可选
    54. +
    55. 优化数字金额大写转换精度丢失问题
    56. +
    57. 优化树表查询无数据时清除分页信息
    58. +
    59. 优化通用detail详细信息弹窗不显示按钮
    60. +
    61. 其他细节优化
    62. +
    +
    +
    +
    +
    +
    +
    + v4.7.72023.04.14 +
    +
    +
    +
    +
      +
    1. 操作日志新增消耗时间属性
    2. +
    3. 日志管理使用索引提升查询性能
    4. +
    5. 日志注解支持排除指定的请求参数
    6. +
    7. 新增监控页面图标显示
    8. +
    9. 新增支持登录IP黑名单限制
    10. +
    11. 更新fontawesome图标示例
    12. +
    13. 屏蔽定时任务bean违规的字符
    14. +
    15. 支持自定义隐藏属性列过滤子对象
    16. +
    17. 连接池Druid支持新的配置connectTimeout和socketTimeout
    18. +
    19. 升级jquery到最新版v3.6.3
    20. +
    21. 升级layui到最新版本2.7.6
    22. +
    23. 升级jasny-bootstrap到最新版4.0.0
    24. +
    25. 升级oshi到最新版本6.4.1
    26. +
    27. 升级druid到最新版本1.2.16
    28. +
    29. 修复异步表格树子项排序问题
    30. +
    31. 修复冻结列不支持IE浏览器的问题
    32. +
    33. 修复主子表使用suggest插件无法新增问题
    34. +
    35. 修复菜单栏快速点击导致展开折叠样式问题
    36. +
    37. 修复用户多角色数据权限可能出现权限抬升的情况
    38. +
    39. 修复异步加载表格树重置列表父节点展开异常问题
    40. +
    41. 修复页签属性refresh为undefined时页面被刷新问题
    42. +
    43. 移除apache/commons-fileupload依赖
    44. +
    45. 优化前端属性提醒说明
    46. +
    47. 优化用户导入更新时需获取用户编号问题
    48. +
    49. 优化主子表根据序号删除方法加入表格ID参数
    50. +
    51. 优化导出Excel时设置dictType属性重复查缓存问题
    52. +
    53. 优化在线用户服务缓存改为从Bean容器获取不使用自动装配
    54. +
    55. 优化表格示例行拖拽后列表底部总记录条数变成了undefined问题
    56. +
    57. 其他细节优化
    58. +
    +
    +
    +
    +
    +
    +
    + v4.7.62022.12.16 +
    +
    +
    +
    +
      +
    1. 定时任务违规的字符
    2. +
    3. 忽略不必要的属性数据返回
    4. +
    5. 导入更新用户数据前校验数据权限
    6. +
    7. 修改参数键名时移除前缓存配置
    8. +
    9. 修改用户登录账号进行重复验证
    10. +
    11. 兼容Excel下拉框内容过多无法显示
    12. +
    13. 升级oshi到最新版本6.4.0
    14. +
    15. 升级kaptcha到最新版2.3.3
    16. +
    17. 升级druid到最新版本1.2.15
    18. +
    19. 升级shiro到最新版本1.10.1
    20. +
    21. 升级pagehelper到最新版1.4.6
    22. +
    23. 升级bootstrap-fileinput到最新版本5.5.2
    24. +
    25. 修复sheet超出最大行数异常问题
    26. +
    27. 修复关闭父页签后提交无法跳转的问题
    28. +
    29. 修复操作日志类型多选导出不生效问题
    30. +
    31. 修复导出包含空子列表数据异常的问题
    32. +
    33. 优化树形表格层级显示
    34. +
    35. 优化SQL关键字检查防止注入
    36. +
    37. 优化用户管理重置时取消部门选择
    38. +
    39. 优化代码生成同步后字典值NULL问题
    40. +
    41. 优化导出对象的子列表为空会出现[]问题
    42. +
    43. 优化select2搜索下拉后校验必填样式问题
    44. +
    45. 其他细节优化
    46. +
    +
    +
    +
    +
    +
    +
    + v4.7.52022.09.05 +
    +
    +
    +
    +
      +
    1. Excel支持导出对象的子列表方法
    2. +
    3. 数据逻辑删除不进行唯一验证
    4. +
    5. 优化多角色数据权限匹配规则
    6. +
    7. 新增主子表提交校验示例
    8. +
    9. 支持自定义隐藏Excel属性列
    10. +
    11. Excel注解支持backgroundColor属性设置背景颜色
    12. +
    13. 菜单配置刷新时Tab页签切换时刷新
    14. +
    15. 增加对AjaxResult消息结果类型的判断
    16. +
    17. 新增示例(进度条)
    18. +
    19. 新增内容编码/解码方便插件集成使用
    20. +
    21. 升级jquery到最新版3.6.1
    22. +
    23. 升级layui到最新版本2.7.5
    24. +
    25. 升级shiro到最新版本1.9.1
    26. +
    27. 升级druid到最新版本1.2.11
    28. +
    29. 升级pagehelper到最新版1.4.3
    30. +
    31. 升级oshi到最新版本6.2.2
    32. +
    33. 修复树表onLoadSuccess不生效的问题
    34. +
    35. 修复用户分配角色大于默认页数丢失问题
    36. +
    37. 定时任务支持执行父类方法
    38. +
    39. 自动设置切换多个树表格实例配置
    40. +
    41. 页签创建标题优先data-title属性
    42. +
    43. 优化任务过期不执行调度
    44. +
    45. 优化横向菜单下激活菜单样式
    46. +
    47. 优化按钮打开窗口后按回车反复弹出
    48. +
    49. 优化excel/scale属性导出单元格数值类型
    50. +
    51. 优化druid开启wall过滤器出现的异常问题
    52. +
    53. 优化多个相同角色数据导致权限SQL重复问题
    54. +
    55. 其他细节优化
    56. +
    +
    +
    +
    +
    +
    +
    + v4.7.42022.06.01 +
    +
    +
    +
    +
      +
    1. 用户头像上传图片格式限制
    2. +
    3. Excel注解支持color属性设置字体颜色
    4. +
    5. 设置分页参数默认值
    6. +
    7. 主子表操作列新增单个删除
    8. +
    9. 定时任务检查Bean包名是否为白名单配置
    10. +
    11. 升级spring-boot到最新版本2.5.14
    12. +
    13. 升级shiro到最新版本1.9.0
    14. +
    15. 升级oshi到最新版本6.1.6
    16. +
    17. 升级fastjson到最新版1.2.83 安全修复版本
    18. +
    19. 文件上传兼容Weblogic环境
    20. +
    21. 新增清理分页的线程变量方法
    22. +
    23. 新增获取不带后缀文件名称方法
    24. +
    25. 用户缓存信息添加部门ancestors祖级列表
    26. +
    27. 自定义ShiroFilterFactoryBean防止中文请求被拦截
    28. +
    29. 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)
    30. +
    31. 优化IP地址获取到多个的问题
    32. +
    33. 优化表格冻结列阴影效果显示
    34. +
    35. 优化菜单侧边栏滚动条尺寸及颜色
    36. +
    37. 优化显示顺序orderNum类型为整型
    38. +
    39. 优化接口使用泛型使其看到响应属性字段
    40. +
    41. 优化导出数据LocalDateTime类型无数据问题
    42. +
    43. 修复导入Excel时字典字段类型为Long转义为空问题
    44. +
    45. 优化导出excel单元格验证,包含变更为开头.防止正常内容被替换
    46. +
    47. 修复URL类型回退键被禁止问题
    48. +
    49. 修复表格客户端分页序号显示错误问题
    50. +
    51. 修复代码生成拖拽多次出现的排序不正确问题
    52. +
    53. 修复表格打印组件不识别多层对象属性值问题
    54. +
    55. 修复操作日志查询类型条件为0时会查到所有数据
    56. +
    57. 修复Excel注解prompt/combo同时使用不生效问题
    58. +
    59. 修复初始化多表格处理回调函数时获取的表格配置不一致问题
    60. +
    61. 其他细节优化
    62. +
    +
    +
    +
    +
    +
    +
    + v4.7.32022.03.01 +
    +
    +
    +
    +
      +
    1. 表格树支持分页/异步加载
    2. +
    3. 代码生成预览支持复制内容
    4. +
    5. 定时任务默认保存到内存中执行
    6. +
    7. 代码生成同步保留必填/类型选项
    8. +
    9. 页面若未匹配到字典标签则返回原字典值
    10. +
    11. 用户访问控制时校验数据权限,防止越权
    12. +
    13. 导出Excel时屏蔽公式,防止CSV注入风险
    14. +
    15. 升级spring-boot到最新版本2.5.10
    16. +
    17. 升级spring-boot-mybatis到最新版2.2.2
    18. +
    19. 升级pagehelper到最新版1.4.1
    20. +
    21. 升级oshi到最新版本6.1.2
    22. +
    23. 升级bootstrap-table到最新版本1.19.1
    24. +
    25. 服务监控新增运行参数信息显示
    26. +
    27. 定时任务目标字符串验证包名白名单
    28. +
    29. 文件上传接口新增原/新文件名返回参数
    30. +
    31. 定时任务屏蔽违规的字符
    32. +
    33. 分页数据新增分页参数合理化参数
    34. +
    35. 表格父子视图添加点击事件打开示例
    36. +
    37. 优化上传文件名称命名规则
    38. +
    39. 优化加载字典缓存数据
    40. +
    41. 优化任务队列满时任务拒绝策略
    42. +
    43. 优化IE11上传预览不显示的问题
    44. +
    45. 优化Excel格式化不同类型的日期对象
    46. +
    47. 优化国际化配置多余的zh请求问题
    48. +
    49. 优化新版Chrome浏览器回退出现的遮罩层
    50. +
    51. 修复EMAIL类型回退键被禁止问题
    52. +
    53. 修复Xss注解字段值为空时的异常问题
    54. +
    55. 其他细节优化
    56. +
    +
    +
    +
    +
    +
    +
    + v4.7.22021.12.23 +
    +
    +
    +
    +
      +
    1. 自定义xss校验注解实现
    2. +
    3. 进入修改页面方法添加权限标识
    4. +
    5. 代码生成创建按钮添加超级管理员权限
    6. +
    7. 代码生成创建表检查关键字,防止注入风险
    8. +
    9. 修复定时任务多参数逗号分隔的问题
    10. +
    11. 修复表格插件一起使用出现的声明报错问题
    12. +
    13. 修复代码生成主子表模板删除方法缺少事务
    14. +
    15. 升级oshi到最新版本v5.8.6
    16. +
    17. 升级velocity到最新版本2.3
    18. +
    19. 升级fastjson到最新版1.2.79
    20. +
    21. 升级log4j2到最新版2.17.0 防止漏洞风险
    22. +
    23. 升级thymeleaf到最新版3.0.14 阻止远程代码执行漏洞
    24. +
    25. 优化修改/授权角色实时生效
    26. +
    27. 修整tomcat配置参数已过期问题
    28. +
    29. 前端添加单独的二代身份证校验
    30. +
    31. 优化新增部门时验证用户所属部门
    32. +
    33. 优化查询用户的角色组&岗位组代码
    34. +
    35. 请求分页方法设置成通用方便灵活调用
    36. +
    37. 优化日期类型错误提示与图标重叠问题
    38. +
    39. 其他细节优化
    40. +
    +
    +
    +
    +
    +
    +
    + v4.7.12021.11.10 +
    +
    +
    +
    +
      +
    1. 新增是否开启页签功能
    2. +
    3. 代码生成的模块增加创建表功能
    4. +
    5. Excel导入支持@Excels注解
    6. +
    7. Excel注解支持导入导出标题信息
    8. +
    9. Excel注解支持自定义数据处理器
    10. +
    11. 日志注解新增是否保存响应参数
    12. +
    13. 防重提交注解支持配置间隔时间/提示消息
    14. +
    15. 网页部分操作禁止使用后退键(Backspace)
    16. +
    17. 实例演示中增加多层窗口获取值
    18. +
    19. 弹出层openOptions增加动画属性
    20. +
    21. 升级spring-boot到最新版本2.5.6
    22. +
    23. 升级spring-boot-mybatis到最新版2.2.0
    24. +
    25. 升级pagehelper到最新版1.4.0
    26. +
    27. 升级oshi到最新版本v5.8.2
    28. +
    29. 升级druid到最新版1.2.8
    30. +
    31. 升级fastjson到最新版1.2.78
    32. +
    33. 升级thymeleaf-extras-shiro到最新版本v2.1.0
    34. +
    35. 升级bootstrap-fileinput到最新版本v5.2.4
    36. +
    37. 修改阿里云maven仓库地址为新版地址
    38. +
    39. 定时任务屏蔽违规字符
    40. +
    41. 增加sendGet无参请求方法
    42. +
    43. 代码生成去掉多余的排序字段
    44. +
    45. 优化启动脚本参数优化
    46. +
    47. 优化页签关闭右侧清除iframe元素
    48. +
    49. 优化多表格切换表单查询参数
    50. +
    51. 优化表格实例切换event不能为空
    52. +
    53. 优化mybatis全局默认的执行器
    54. +
    55. 优化导入Excel数据关闭时清理file
    56. +
    57. 优化Excel导入图片可能出现的异常
    58. +
    59. 优化记录登录信息,防止不必要的修改
    60. +
    61. 优化aop语法,使用spring自动注入注解
    62. +
    63. 修复无法被反转义问题
    64. +
    65. 修复拖拽行数据错位问题
    66. +
    67. 修复新窗口打开页面关闭弹窗报错
    68. +
    69. 修复富文本回退键被禁止&控制台报错问题
    70. +
    71. 修复自定义弹出层全屏参数无效问题
    72. +
    73. 修复树表代码生成短字段无法识别问题
    74. +
    75. 修复apple/webkit浏览器时间无法格式化
    76. +
    77. 修复后端主子表代码模板方法名生成错误问题
    78. +
    79. 修复swagger没有指定dataTypeClass导致启动出现warn日志
    80. +
    81. 其他细节优化
    82. +
    +
    +
    +
    +
    +
    +
    + v4.7.02021.09.01 +
    +
    +
    +
    +
      +
    1. 优化弹出层显示在顶层窗口
    2. +
    3. 定时任务支持在线生成cron表达式
    4. +
    5. Excel注解支持Image图片导入
    6. +
    7. 支持配置是否开启记住我功能
    8. +
    9. 修改时检查用户数据权限范围
    10. +
    11. 表单重置开始/结束时间控件
    12. +
    13. 新增多图上传示例
    14. +
    15. 启用父部门状态排除顶级节点
    16. +
    17. 富文本默认dialogsInBody属性
    18. +
    19. 去除默认分页合理化参数
    20. +
    21. 顶部菜单跳转添加绝对路径
    22. +
    23. 升级oshi到最新版本v5.8.0
    24. +
    25. 升级shiro到最新版本v1.8.0
    26. +
    27. 升级commons.io到最新版本v2.11.0
    28. +
    29. 升级jquery到最新版v3.6.0
    30. +
    31. 升级icheck到最新版v1.0.3
    32. +
    33. 升级layer到最新版本v3.5.1
    34. +
    35. 升级layui到最新版本v2.6.8
    36. +
    37. 升级laydate到最新版本v5.3.1
    38. +
    39. 升级select2到最新版v4.0.13
    40. +
    41. 升级cropper到最新版本v1.5.12
    42. +
    43. 升级summernote到最新版本v0.8.18
    44. +
    45. 升级duallistbox到最新版本v3.0.9
    46. +
    47. 升级jquery.validate到最新版本v1.19.3
    48. +
    49. 升级bootstrap-suggest到最新版本v0.1.29
    50. +
    51. 升级bootstrap-select到最新版本v1.13.18
    52. +
    53. 升级bootstrap-fileinput到最新版本v5.2.3
    54. +
    55. 查询表格指定列值增加是否去重属性
    56. +
    57. 删除sourceMappingURL源映射
    58. +
    59. 去除多余的favicon.ico引入
    60. +
    61. 优化代码生成模板
    62. +
    63. 优化XSS跨站脚本过滤
    64. +
    65. 补充定时任务表字段注释
    66. +
    67. 定时任务屏蔽ldap远程调用
    68. +
    69. 定时任务屏蔽http(s)远程调用
    70. +
    71. 定时任务对检查异常进行事务回滚
    72. +
    73. 调度日志详细页添加关闭按钮
    74. +
    75. 优化异常打印输出信息
    76. +
    77. 优化移动端进入首页样式
    78. +
    79. 优化用户操作不能删除自己
    80. +
    81. 默认开始/结束时间绑定控件选择类型
    82. +
    83. 其他细节优化
    84. +
    +
    +
    +
    +
    +
    +
    + v4.6.22021.07.01 +
    +
    +
    +
    +
      +
    1. 优化参数&字典缓存操作
    2. +
    3. 新增表格参数(导出方式&导出文件类型)
    4. +
    5. 新增表格示例(自定义视图分页)
    6. +
    7. 新增示例(表格列拖拽)
    8. +
    9. 集成yuicompressor实现(CSS/JS压缩)
    10. +
    11. 新增表格参数(是否支持打印页面showPrint)
    12. +
    13. 支持bat脚本执行应用
    14. +
    15. 修复存在的SQL注入漏洞问题
    16. +
    17. 定时任务屏蔽rmi远程调用
    18. +
    19. 导出Excel文件支持数据流下载方式
    20. +
    21. 实例演示弹层组件增加相册层示例
    22. +
    23. 删除操作日志记录信息
    24. +
    25. 增加表格重置分页的参数
    26. +
    27. 限制超级管理员不允许操作
    28. +
    29. 树级结构更新子节点使用replaceFirst
    30. +
    31. 支持动态生成密匙,防止默认密钥泄露
    32. +
    33. 升级pagehelper到最新版1.3.1
    34. +
    35. 升级oshi到最新版本v5.7.4
    36. +
    37. 升级swagger到最新版本v3.0.0
    38. +
    39. 升级commons.io到最新版本v2.10.0
    40. +
    41. 升级commons.fileupload到最新版本v1.4
    42. +
    43. 升级bootstrap-table到最新版本v1.18.3
    44. +
    45. 升级druid到最新版本v1.2.6
    46. +
    47. 升级fastjson到最新版1.2.76
    48. +
    49. 升级layui到最新版本v2.6.6
    50. +
    51. 升级layer到最新版本v3.5.0
    52. +
    53. 升级laydate到最新版本v5.3.0
    54. +
    55. 优化表格树移动端&边框显示
    56. +
    57. 新增表格刷新options配置方法
    58. +
    59. 优化图片工具类读取文件,防止异常
    60. +
    61. 修复表格图片预览移动端宽高无效问题
    62. +
    63. 主子表通用操作封装处理增加文本域类型
    64. +
    65. 日志注解兼容获取json类型的参数
    66. +
    67. 修复表单向导插件有滚动条时底部工具栏无法固定问题
    68. +
    69. 修复导出角色数据范围翻译缺少仅本人
    70. +
    71. 修正Velocity模板初始字符集
    72. +
    73. 升级mybatis到最新版3.5.6 阻止远程代码执行漏洞
    74. +
    75. 优化代码生成导出模板名称
    76. +
    77. 修改个人中心密码长度提醒
    78. +
    79. 实例演示中弹出表格增加以回调形式回显到父窗体
    80. +
    81. 修复登录页面弹窗文字不显示的问题
    82. +
    83. 其他细节优化
    84. +
    +
    +
    +
    +
    +
    +
    + v4.6.12021.04.12 +
    +
    +
    +
    +
      +
    1. 新增IE浏览器版本过低提示页面
    2. +
    3. 新增详细信息tab页签方式
    4. +
    5. 新增解锁屏幕打开上次页签
    6. +
    7. 数据监控默认账户密码防止越权访问
    8. +
    9. 新增表格示例(导出选择列)
    10. +
    11. 个人信息添加手机&邮箱重复验证
    12. +
    13. 个人中心刷新后样式问题
    14. +
    15. 操作日志返回参数添加非空验证
    16. +
    17. velocity剔除commons-collections版本,防止3.2.1版本的反序列化漏洞
    18. +
    19. 子表模板默认日期格式化
    20. +
    21. 代码生成预览语言根据后缀名高亮显示
    22. +
    23. 代码生成主子表相同字段导致数据问题
    24. +
    25. 升级SpringBoot到最新版本2.2.13
    26. +
    27. 升级shiro到最新版1.7.1 阻止身份认证绕过漏洞
    28. +
    29. 升级bootstrapTable到最新版本v1.18.2
    30. +
    31. 升级bootstrapTable相关组件到最新版本v1.18.2
    32. +
    33. 升级fastjson到最新版1.2.75
    34. +
    35. 升级druid到最新版本v1.2.4
    36. +
    37. 升级oshi到最新版本v5.6.0
    38. +
    39. 修改ip字段长度防止ipv6地址长度不够
    40. +
    41. 搜索建议示例选择后隐藏列表
    42. +
    43. 主子表示例增加初始化数据
    44. +
    45. 优化Excel导入增加空行判断
    46. +
    47. 修复横向菜单无法打开页签问题
    48. +
    49. 修复导入数据为负浮点数时,导入结果会丢失精度问题
    50. +
    51. 优化更多操作按钮左侧移入内容闪现消失情况
    52. +
    53. 修复主子表提交中列隐藏后出现列偏移问题
    54. +
    55. 单据打印网页时通过hidden-print隐藏元素
    56. +
    57. 表格销毁清除记住选择数据
    58. +
    59. 增加表格动态列示例
    60. +
    61. 代码生成选择主子表关联元素必填
    62. +
    63. tree根据Id和Name选中指定节点增加空判断
    64. +
    65. 其他细节优化
    66. +
    +
    +
    +
    +
    +
    +
    + v4.6.02021.01.01 +
    +
    +
    +
    +
      +
    1. 新增缓存监控管理
    2. +
    3. 新增锁定屏幕功能
    4. +
    5. 菜单新增是否刷新页面
    6. +
    7. 删除用户和角色解绑关联
    8. +
    9. 新增密码强度字符范围提示
    10. +
    11. 防止匿名访问进行过滤
    12. +
    13. 升级SpringBoot到最新版本2.2.12
    14. +
    15. 升级poi到最新版本4.1.2
    16. +
    17. 升级bitwalker到最新版本1.21
    18. +
    19. 升级bootstrap-fileinput到最新版本5.1.3
    20. +
    21. 升级bootstrapTable到最新版本v1.18.0
    22. +
    23. 升级bootstrapTable相关组件到最新版本v1.18.0
    24. +
    25. 升级oshi到最新版本v5.3.6
    26. +
    27. 新增示例(标签 & 提示)
    28. +
    29. 添加单据打印示例
    30. +
    31. 修改表格初始参数sortName默认值为undefined
    32. +
    33. 新增表格参数(自定义打印页面模板printPageBuilder)
    34. +
    35. 新增表格参数(是否显示行间隔色striped)
    36. +
    37. 新增表格参数(渲染完成后执行的事件onPostBody)
    38. +
    39. Excel注解支持Image图片导出
    40. +
    41. Excel支持注解align对齐方式
    42. +
    43. Excel支持导入Boolean型数据
    44. +
    45. 主子表操作添加通用addColumn方法
    46. +
    47. 代码生成日期控件区分范围
    48. +
    49. 代码生成数据库文本类型生成表单文本域
    50. +
    51. 修复生成主子表外键名错误
    52. +
    53. 选项卡新增是否刷新属性
    54. +
    55. 修复树表格表头跟表格宽度不同步的问题
    56. +
    57. 表格树加载完成触发tooltip方法
    58. +
    59. 使用widthUnit定义树表格选项单位
    60. +
    61. 修复主子表editColumn序列问题
    62. +
    63. 修复添加全屏在无参数时没有替换url参数问题
    64. +
    65. 弹出层openOptions移动端自适应
    66. +
    67. 防止错误页返回主页出现嵌套问题
    68. +
    69. 设置回显数据字典验证防止空值
    70. +
    71. 其他细节优化
    72. +
    +
    +
    +
    +
    +
    +
    + v4.5.12020.11.18 +
    +
    +
    +
    +
      +
    1. 阻止任意文件下载漏洞
    2. +
    3. 升级shiro到最新版1.7.0 阻止权限绕过漏洞
    4. +
    5. 升级druid到最新版本v1.2.2
    6. +
    7. 新增表格行触发事件(onCheck、onUncheck、onCheckAll、onUncheckAll)
    8. +
    9. 修复多页签关闭非当前选项出现空白问题
    10. +
    11. 代码生成预览支持高亮显示
    12. +
    13. mapperLocations配置支持分隔符
    14. +
    15. 权限信息调整
    16. +
    17. 个人中心头像和上传头像增加默认图片
    18. +
    19. 全局配置类保持和其他应用命名相同
    20. +
    +
    +
    +
    +
    +
    +
    + v4.5.02020.10.20 +
    +
    +
    +
    +
      +
    1. 新增菜单导航显示风格(default为左侧导航菜单,topnav为顶部导航菜单)
    2. +
    3. 菜单&数据权限新增(展开/折叠 全选/全不选 父子联动)
    4. +
    5. 账号密码支持自定义更新周期
    6. +
    7. 初始密码支持自定义修改策略
    8. +
    9. 新增校验用户修改新密码不能与旧密码相同
    10. +
    11. 添加检查密码范围支持的特殊字符包括:~!@#$%^&*()-=_+
    12. +
    13. 注册账号设置默认用户名称及密码最后更新时间
    14. +
    15. 去除用户手机邮箱部门必填验证
    16. +
    17. 新增日期格式化方法
    18. +
    19. 代码生成添加bit类型
    20. +
    21. 树结构加载添加callBack回调方法
    22. +
    23. 修复用户管理页面滚动返回顶部条失效
    24. +
    25. 修复代码生成模板文件上传组件缺少ctx的问题
    26. +
    27. 限制系统内置参数不允许删除
    28. +
    29. 新增表格列宽拖动插件
    30. +
    31. 新增Ajax局部刷新demo
    32. +
    33. 新增是否开启页脚功能
    34. +
    35. 新增表格参数(通过自定义函数设置标题样式headerStyle)
    36. +
    37. 新增表格参数(通过自定义函数设置页脚样式footerStyle)
    38. +
    39. 修复窗体大小改变后浮动提示框失效问题
    40. +
    41. 生成代码补充必填样式
    42. +
    43. 生成页面时不忽略remark属性
    44. +
    45. 字典数据列表页添加关闭按钮
    46. +
    47. Excel注解支持自动统计数据总和
    48. +
    49. 升级springboot到2.1.17 提升安全性
    50. +
    51. 升级pagehelper到最新版1.3.0
    52. +
    53. 升级druid到最新版本v1.2.1
    54. +
    55. 升级fastjson到最新版1.2.74
    56. +
    57. 升级bootstrap-fileinput到最新版本5.1.2
    58. +
    59. 升级oshi到最新版本v5.2.5
    60. +
    61. 表单向导插件更换为jquery-smartwizard
    62. +
    63. 修改主子表提交示例代码防止渲染失效
    64. +
    65. 添加导入数据弹出窗体自定义宽高
    66. +
    67. 用户信息参数返回忽略掉密码字段
    68. +
    69. 优化关闭窗体添加index参数
    70. +
    71. 回显数据字典(字符串数组)增加空值判断
    72. +
    73. 修改前端密码长度校验和错误提示不符问题
    74. +
    75. AjaxResult重写put方法,以方便链式调用
    76. +
    77. 增强验证码校验的语义,更易懂
    78. +
    79. 导入excel整形值校验优化
    80. +
    81. Excel导出类型NUMERIC支持精度浮点类型
    82. +
    83. 导出Excel调整targetAttr获取值方法,防止get方法不规范
    84. +
    85. 输入框组验证错误后置图标提示颜色
    86. +
    87. 上传媒体类型添加视频格式
    88. +
    89. 数据权限判断参数类型
    90. +
    91. 修正数据库字符串类型nvarchar
    92. +
    93. 优化递归子节点
    94. +
    95. 修复多表格搜索formId无效
    96. +
    97. 其他细节优化
    98. +
    +
    +
    +
    +
    +
    +
    + v4.4.02020.08.24 +
    +
    +
    +
    +
      +
    1. 升级bootstrapTable到最新版本1.17.1
    2. +
    3. 升级shiro到最新版1.6.0 阻止权限绕过漏洞
    4. +
    5. 升级fastjson到最新版1.2.73
    6. +
    7. 代码生成支持同步数据库
    8. +
    9. 代码生成支持富文本控件
    10. +
    11. 用户密码支持自定义配置规则
    12. +
    13. 新增表格自动刷新插件
    14. +
    15. 新增表格打印配置插件
    16. +
    17. 更换图片裁剪工具为cropper
    18. +
    19. Excel支持sort导出排序
    20. +
    21. 代码生成支持自定义路径
    22. +
    23. 代码生成支持选择上级菜单
    24. +
    25. 代码生成支持上传控件
    26. +
    27. 新增表格参数(自定义加载文本的字体大小loadingFontSize)
    28. +
    29. Excel注解支持设置BigDecimal精度&舍入规则
    30. +
    31. 操作日志记录排除敏感属性字段
    32. +
    33. 修复不同浏览器附件下载中文名乱码的问题
    34. +
    35. 用户分配角色不允许选择超级管理员角色
    36. +
    37. 更换表格冻结列插件
    38. +
    39. 添加右侧冻结列示例
    40. +
    41. 升级表格行编辑&移动端适应插件
    42. +
    43. 修复更新表格插件后无法设置实例配置问题
    44. +
    45. 修复更新表格插件后导致的主子表错误
    46. +
    47. 修复页面存在多表格,回调函数res数据不正确问题
    48. +
    49. 强退&过期清理登录帐号缓存会话
    50. +
    51. 表格树标题内容支持html语义化标签
    52. +
    53. 修复配置应用的访问路径首页页签重复问题
    54. +
    55. 优化openTab打开时滚动到当前页签
    56. +
    57. 表格请求方式method支持自定义配置
    58. +
    59. 菜单页签联动优化
    60. +
    61. 用户邮箱长度限制修改为50
    62. +
    63. 主子表示例添加日期格式案例
    64. +
    65. 修改表格行内编辑示例旧值参数
    66. +
    67. 操作日志查询方式调整
    68. +
    69. 唯一限制条件只返回单条数据
    70. +
    71. 修改Excel设置STRING单元格类型
    72. +
    73. 添加获取当前的环境配置方法
    74. +
    75. 截取返回参数长度,防止超出异常
    76. +
    77. 定时任务cron表达式验证
    78. +
    79. 拆分表格插件,按需引入
    80. +
    81. 多行文本框补齐必填错误提示背景
    82. +
    83. 其他细节优化
    84. +
    +
    +
    +
    +
    +
    +
    + v4.3.12020.07.05 +
    +
    +
    +
    +
      +
    1. 国家信息安全漏洞(请务必保持cipherKey密钥唯一性)
    2. +
    3. 升级shiro到最新版1.5.3 阻止权限绕过漏洞
    4. +
    5. 修改验证码在使用后清除,防止多次使用
    6. +
    7. 检查字符支持小数点&降级改成异常提醒
    8. +
    9. openOptions函数中加入自定义maxmin属性
    10. +
    11. 支持openOptions方法最大化
    12. +
    13. 支持openOptions方法多个按钮回调
    14. +
    15. 新增isLinkage支持页签与菜单联动
    16. +
    17. 修改代码生成导入表结构出现异常页面不提醒问题
    18. +
    19. 优化用户头像发生错误,则显示一个默认头像
    20. +
    21. Excel导出支持字典类型
    22. +
    +
    +
    +
    +
    +
    +
    + v4.3.02020.06.22 +
    +
    +
    +
    +
      +
    1. 代码生成模板支持主子表
    2. +
    3. 代码生成显示类型支持复选框
    4. +
    5. 前端表单样式修改成圆角
    6. +
    7. 新增回显数据字典(字符串数组)
    8. +
    9. 修复浏览器手动缩放比例后菜单无法自适应问题
    10. +
    11. 限制用户不允许选择系统管理员角色
    12. +
    13. 用户信息添加输入框组图标&鼠标按下显示密码
    14. +
    15. 升级fastjson到最新版1.2.70 修复高危安全漏洞
    16. +
    17. 升级Bootstrap版本到v3.3.7
    18. +
    19. 修复selectColumns方法获取子对象数据无效问题
    20. +
    21. 修改数据源类型优先级,先根据方法,再根据类
    22. +
    23. 修改上级部门(选择项排除本身和下级)
    24. +
    25. 首页菜单显示调整
    26. +
    27. 添加是否开启swagger配置
    28. +
    29. 新增示例(主子表提交)
    30. +
    31. 新增示例(多级联动下拉示例)
    32. +
    33. 新增示例(表格属性data数据加载)
    34. +
    35. 新增表格列参数(是否列选项可见ignore)
    36. +
    37. 新增表格参数(是否启用显示卡片视图cardView)
    38. +
    39. 新增表格参数(是否显示全屏按钮showFullscreen)
    40. +
    41. 新增表格参数(是否启用分页条无限循环的功能paginationLoop)
    42. +
    43. 新增表格参数(是否显示表头showHeader)
    44. +
    45. 表格添加显示/隐藏所有列方法 showAllColumns/hideAllColumns
    46. +
    47. 修复部分情况节点不展开问题
    48. +
    49. 修复关闭标签页后刷新还是上次地址问题
    50. +
    51. 修复选择菜单后刷新页面,菜单箭头显示不对问题
    52. +
    53. 修复jquery表单序列化时复选框未选中不会序列化到对象中问题
    54. +
    55. Excel支持readConverterExp读取字符串组内容
    56. +
    57. 更换IP地址查询接口
    58. +
    59. 默认关闭获取ip地址
    60. +
    61. 操作处理ajaxSuccess判断修正
    62. +
    63. HttpUtils.sendPost()方法,参数无需拼接参数到url
    64. +
    65. 通用http发送方法增加参数 contentType 编码类型
    66. +
    67. HTML过滤器不替换&实体
    68. +
    69. 代码生成浮点型改用BigDecimal
    70. +
    71. 修复表单构建单选和多选框渲染问题
    72. +
    73. 代码生成模板调整,字段为String并且必填则加空串条件
    74. +
    75. 字典数据查询列表根据dictSort升序排序
    76. +
    77. 修复树表对imageView和tooltip方法无效问题
    78. +
    79. 修复Long类型比较相等问题调整
    80. +
    81. 示例demo页面清除html链接,防止点击后跳转出现404
    82. +
    83. 在线用户强退方法合并
    84. +
    85. 添加校验部门包含未停用的子部门
    86. +
    87. 取消回车自动提交表单
    88. +
    89. 'A','I','BUTTON' 标签忽略clickToSelect事件,防止点击操作按钮时选中
    90. +
    91. 邮箱显示截取部分字符串,防止低分辨率错位
    92. +
    93. 代码生成列属性根据sort排序
    94. +
    95. 修复更多操作部分浏览器不兼容情况
    96. +
    97. 图片预览事件属性修正
    98. +
    99. 修复冻结列排序样式无效问题
    100. +
    101. 修复context-path的情况下个人中心刷新导致样式问题
    102. +
    103. 全屏editFull打开适配表树
    104. +
    105. 其他细节优化
    106. +
    +
    +
    +
    +
    +
    +
    + v4.2.02020.03.23 +
    +
    +
    +
    +
      +
    1. 用户管理添加分配角色页面
    2. +
    3. 定时任务添加调度日志按钮
    4. +
    5. 新增是否开启用户注册功能
    6. +
    7. 新增页面滚动显示返回顶部按钮
    8. +
    9. 用户&角色&任务添加更多操作按钮
    10. +
    11. iframe框架页会话过期弹出超时提示
    12. +
    13. 移动端登录不显示左侧菜单
    14. +
    15. 侧边栏添加一套深蓝色主题
    16. +
    17. 首页logo固定,不随菜单滚动
    18. +
    19. 支持mode配置history(表示去掉地址栏的#)
    20. +
    21. 任务分组字典翻译(调度日志详细)
    22. +
    23. 字典管理添加缓存读取
    24. +
    25. 字典数据列表标签显示样式
    26. +
    27. 参数管理支持缓存操作
    28. +
    29. 日期控件清空结束时间设置开始默认值为2099-12-31
    30. +
    31. 表格树添加获取数据后响应回调处理
    32. +
    33. 批量替换表前缀调整
    34. +
    35. 支持表格导入模板的弹窗表单加入其它输入控件
    36. +
    37. 表单重置刷新表格树
    38. +
    39. 新增支持导出数据字段排序
    40. +
    41. 新增表格参数(是否单选checkbox)
    42. +
    43. druid未授权不允许访问
    44. +
    45. 表格树父节点兼容0,'0','',null
    46. +
    47. 表单必填的项添加星号
    48. +
    49. 修复select2不显示校验错误信息
    50. +
    51. 添加自定义HTML过滤器
    52. +
    53. 修复多数据源下开关关闭出现异常问题
    54. +
    55. 修复翻页记住选择项数据问题
    56. +
    57. 用户邮箱长度限制20
    58. +
    59. 修改错误页面返回主页出现嵌套问题
    60. +
    61. 表格浮动提示单双引号转义
    62. +
    63. 支持配置四级菜单
    64. +
    65. 升级shiro到最新版1.4.2 阻止rememberMe漏洞攻击
    66. +
    67. 升级summernote到最新版本v0.8.12
    68. +
    69. 导入Excel根据dateFormat属性格式处理
    70. +
    71. 修复War部署无法正常shutdown,ehcache内存泄漏
    72. +
    73. 修复代码生成短字段无法识别问题
    74. +
    75. 修复serviceImpl模版,修改方法判断日期错误
    76. +
    77. 代码生成模板增加导出功能日志记录
    78. +
    79. 代码生成唯一编号调整为tableId
    80. +
    81. 代码生成查询时忽略大小写
    82. +
    83. 代码生成支持翻页记住选中
    84. +
    85. 代码生成表注释未填写也允许导入
    86. +
    87. Global全局配置类修改为注解,防止多环境配置下读取问题
    88. +
    89. 修复多表格情况下,firstLoad只对第一个表格生效
    90. +
    91. 处理Maven打包出现警告问题
    92. +
    93. 默认主题样式,防止网速慢情况下出现空白
    94. +
    95. 修复文件上传多级目录识别问题
    96. +
    97. 锚链接解码url,防止中文导致页面不能加载问题
    98. +
    99. 修复右键Tab页刷新事件重复请求问题
    100. +
    101. 角色禁用&菜单隐藏不查询权限
    102. +
    103. 其他细节优化
    104. +
    +
    +
    +
    +
    +
    +
    + v4.1.02019.10.22 +
    +
    +
    +
    +
      +
    1. 支持多表格实例操作
    2. +
    3. 浮动提示方法tooltip支持弹窗
    4. +
    5. 代码生成&字典数据支持模糊条件查询
    6. +
    7. 增加页签全屏方法
    8. +
    9. 增加清除表单验证错误信息方法
    10. +
    11. 支持iframe局部刷新页面
    12. +
    13. 支持在线切换主题
    14. +
    15. 修改图片预览设置的高宽参数颠倒问题
    16. +
    17. 操作日志新增解锁账户功能
    18. +
    19. 管理员用户&角色不允许操作
    20. +
    21. 去掉jsoup包调用自定义转义工具
    22. +
    23. 添加时间轴示例
    24. +
    25. 修复翻页记住选择时获取指定列值的问题
    26. +
    27. 代码生成sql脚本添加导出按钮
    28. +
    29. 添加表格父子视图示例
    30. +
    31. 添加表格行内编辑示例
    32. +
    33. 升级fastjson到最新版1.2.60 阻止漏洞攻击
    34. +
    35. 升级echarts到最新版4.2.1
    36. +
    37. 操作日志新增返回参数
    38. +
    39. 支持mybatis通配符扫描任意多个包
    40. +
    41. 权限验证多种情况处理
    42. +
    43. 修复树形类型的代码生成的部分必要属性无法显示
    44. +
    45. 修复非表格插件情况下重置出现异常
    46. +
    47. 修复富文本编辑器有序列表冲突
    48. +
    49. 代码生成表前缀配置支持多个
    50. +
    51. 修复自动去除表前缀配置无效问题
    52. +
    53. 菜单列表按钮数据可见不显示(权限标识控制)
    54. +
    55. 修复设置会话超时时间无效问题
    56. +
    57. 新增本地资源通用下载方法
    58. +
    59. 操作日志记录新增请求方式
    60. +
    61. 代码生成单选按钮属性重名修复
    62. +
    63. 优化select2下拉框宽度不会随浏览器改变
    64. +
    65. 修复代码生成树表异常
    66. +
    67. 其他细节优化
    68. +
    +
    +
    +
    +
    +
    +
    + v4.0.02019.08.08 +
    +
    +
    +
    +
      +
    1. 代码生成支持预览、编辑,保存方案
    2. +
    3. 新增防止表单重复提交注解
    4. +
    5. 新增后端校验(和前端保持一致)
    6. +
    7. 新增同一个用户最大会话数控制
    8. +
    9. Excel导出子对象支持多个字段
    10. +
    11. 定时任务支持静态调用和多参数
    12. +
    13. 定时任务增加分组条件查询
    14. +
    15. 字典类型增加任务分组数据
    16. +
    17. 新增表格是否首次加载数据
    18. +
    19. 新增parentTab选项卡可在同一页签打开
    20. +
    21. 多数据源支持类注解(允许继承父类的注解)
    22. +
    23. 部门及以下数据权限(调整为以下及所有子节点)
    24. +
    25. 新增角色数据权限配(仅本人数据权限)
    26. +
    27. 修改菜单权限显示问题
    28. +
    29. 上传文件修改路径及返回名称
    30. +
    31. 添加报表插件及示例
    32. +
    33. 添加首页统计模板
    34. +
    35. 添加表格拖拽示例
    36. +
    37. 添加卡片列表示例
    38. +
    39. 添加富文本编辑器示例
    40. +
    41. 添加表格动态增删改查示例
    42. +
    43. 添加用户页面岗位选择框提示
    44. +
    45. 点击菜单操作添加背景高亮显示
    46. +
    47. 表格树新增showSearch是否显示检索信息
    48. +
    49. 解决表格列设置sortName无效问题
    50. +
    51. 表格图片预览支持自定义设置宽高
    52. +
    53. 添加表格列浮动提示(单击文本复制)
    54. +
    55. PC端收起菜单后支持浮动显示
    56. +
    57. 详细操作样式调整
    58. +
    59. 修改用户更新描述空串不更新问题
    60. +
    61. 导入修改为模板渲染
    62. +
    63. 修改菜单及部门排序规则
    64. +
    65. 角色导出数据范围表达式翻译
    66. +
    67. 添加summernote富文本字体大小
    68. +
    69. 优化表格底部下边框防重叠&汇总像素问题
    70. +
    71. 树表格支持属性多层级访问
    72. +
    73. 修复IE浏览器用户管理界面右侧留白问题
    74. +
    75. 重置按钮刷新表格
    76. +
    77. 重置密码更新用户缓存
    78. +
    79. 优化验证码属性参数
    80. +
    81. 支持数据监控配置用户名和密码
    82. +
    83. 文件上传修改按钮背景及加载动画
    84. +
    85. 支持配置一级菜单href跳转
    86. +
    87. 侧边栏添加一套浅色主题
    88. +
    89. 树表格添加回调函数(校验异常状态)
    90. +
    91. 用户个人中心适配手机端显示
    92. +
    93. Excel支持设置导出类型&更换样式
    94. +
    95. 检查属性改变修改为克隆方式(防止热部署强转异常)
    96. +
    97. 其他细节优化
    98. +
    +
    +
    +
    +
    +
    +
    + v3.4.02019.06.03 +
    +
    +
    +
    +
      +
    1. 新增实例演示菜单及demo
    2. +
    3. 新增页签右键操作
    4. +
    5. 菜单管理新增打开方式
    6. +
    7. 新增点击某行触发的事件
    8. +
    9. 新增双击某行触发的事件
    10. +
    11. 新增单击某格触发的事件
    12. +
    13. 新增双击某格触发的事件
    14. +
    15. 新增是否启用显示细节视图
    16. +
    17. 支持上传任意格式文件
    18. +
    19. 修复角色权限注解失效问题
    20. +
    21. 左侧的菜单栏宽度调整
    22. +
    23. 新增响应完成后自定义回调函数
    24. +
    25. 支持前端及其他模块直接获取用户信息
    26. +
    27. 升级swagger到最新版2.9.2
    28. +
    29. 升级jquery.slimscroll到最新版1.3.8
    30. +
    31. 升级select2到最新版4.0.7
    32. +
    33. 新增角色配置本部门数据权限
    34. +
    35. 新增角色配置本部门及以下数据权限
    36. +
    37. 优化底部操作防止跳到页面顶端
    38. +
    39. 修改冻结列选框无效及样式问题
    40. +
    41. 修复部门四层级修改祖级无效问题
    42. +
    43. 更换开关切换按钮样式
    44. +
    45. 新增select2-bootstrap美化下拉框
    46. +
    47. 添加表格内图片预览方法
    48. +
    49. 修复权限校验失败跳转页面路径错误
    50. +
    51. 国际化资源文件调整
    52. +
    53. 通知公告布局调整
    54. +
    55. 删除页签操作功能
    56. +
    57. 表格树新增查询指定列值
    58. +
    59. 更改系统接口扫描方式及完善测试案例
    60. +
    61. 表格列浮动提示及字典回显默认去背景
    62. +
    63. 修复启用翻页记住前面的选择check没选中问题
    64. +
    65. 去除监控页面底部的广告
    66. +
    67. 日期控件功问题修复及data功能增强
    68. +
    69. 新增角色权限可见性(前端直接调用)
    70. +
    71. 新增获取当前登录用户方法(前端及子模块调用)
    72. +
    73. 修复热部署重启导致菜单丢失问题
    74. +
    75. 优化业务校验失败普通请求跳转页面
    76. +
    77. 操作日志新增状态条件查询
    78. +
    79. 操作类型支持多选条件查询
    80. +
    81. 通知公告防止滚动触底回弹优化
    82. +
    83. 其他细节优化
    84. +
    +
    +
    +
    +
    +
    +
    + v3.3.02019.04.01 +
    +
    +
    +
    +
      +
    1. 新增线程池统一管理
    2. +
    3. 新增支持左右冻结列
    4. +
    5. 新增表格字符超长浮动提示
    6. +
    7. 升级datepicker拓展并汉化
    8. +
    9. 升级druid到最新版本v1.1.14
    10. +
    11. 修复个人头像为图片服务器跨域问题
    12. +
    13. 修改上传文件按日期存储
    14. +
    15. 新增表格客户端分页选项
    16. +
    17. 新增表格的高度参数
    18. +
    19. 新增表格销毁方法
    20. +
    21. 新增表格下拉按钮切换方法
    22. +
    23. 新增表格分页跳转到指定页码
    24. +
    25. 新增表格启用点击选中行参数
    26. +
    27. 修复表格数据重新加载未触发部分按钮禁用
    28. +
    29. 使用jsonview展示操作日志参数
    30. +
    31. 新增方法(addTab、editTab)
    32. +
    33. 修改用户管理界面为Tab打开方式
    34. +
    35. 表单验证代码优化
    36. +
    37. 修复@Excel注解 prompt 属性使用报错
    38. +
    39. 修复combo属性Excel兼容性问题
    40. +
    41. 新增@Excel导入导出支持父类字段
    42. +
    43. 修复关闭最后选项卡无法激活滚动问题
    44. +
    45. 增加日期控件显示类型及回显格式扩展选项
    46. +
    47. 修复定时任务执行失败后入库状态为成功状态
    48. +
    49. 支持定时任务并发开关控制
    50. +
    51. 优化权限校验失败普通请求跳转页面
    52. +
    53. 捕获线程池执行任务抛出的异常
    54. +
    55. 修复IE浏览器导出功能报错
    56. +
    57. 新增角色管理分配用户功能
    58. +
    59. 新增表格翻页记住前面的选择
    60. +
    61. 调整用户个人中心页面
    62. +
    63. 修复界面存在的一些安全问题
    64. +
    65. 其他细节优化
    66. +
    +
    +
    +
    +
    +
    +
    + v3.2.02019.01.18 +
    +
    +
    +
    +
      +
    1. 部门修改时不允许选择最后节点
    2. +
    3. 修复部门菜单排序字段无效
    4. +
    5. 修复光驱磁盘导致服务监控异常
    6. +
    7. 登录界面去除check插件
    8. +
    9. 验证码文本字符间距修正
    10. +
    11. 升级SpringBoot到最新版本2.1.1
    12. +
    13. 升级MYSQL驱动
    14. +
    15. 修正登录必填项位置偏移
    16. +
    17. Session会话检查优化
    18. +
    19. Excel注解支持多级获取
    20. +
    21. 新增序列号生成方法
    22. +
    23. 修复WAR部署tomcat退出线程异常
    24. +
    25. 全屏操作增加默认确认/关闭
    26. +
    27. 修复个人信息可能导致漏洞
    28. +
    29. 字典数据根据下拉选择新增类型
    30. +
    31. 升级Summernote到最新版本v0.8.11
    32. +
    33. 新增用户数据导入
    34. +
    35. 首页主题样式更换
    36. +
    37. layer扩展主题更换
    38. +
    39. 用户管理移动端默认隐藏左侧布局
    40. +
    41. 详细信息弹出层显示在顶层
    42. +
    43. 表格支持切换状态(用户/角色/定时任务)
    44. +
    45. Druid数据源支持配置继承
    46. +
    47. 修正部分iPhone手机端表格适配问题
    48. +
    49. 新增防止重复提交表单方法
    50. +
    51. 新增表格数据统计汇总方法
    52. +
    53. 支持富文本上传图片文件
    54. +
    +
    +
    +
    +
    +
    +
    + v3.1.02018.12.03 +
    +
    +
    +
    +
      +
    1. 新增内网不获取IP地址
    2. +
    3. 新增cron表达式有效校验
    4. +
    5. 定时任务新增详细信息
    6. +
    7. 定时任务默认策略修改(不触发立即执行)
    8. +
    9. 定时任务显示下一个执行周期
    10. +
    11. 支持前端任意日期格式处理
    12. +
    13. 上传头像删除多余提交按钮
    14. +
    15. 表格增加行间隔色配置项
    16. +
    17. 表格增加转义HTML字符串配置项
    18. +
    19. 表格增加显示/隐藏指定列
    20. +
    21. 代码生成优化
    22. +
    23. 操作日志参数格式化显示
    24. +
    25. 页签新增新增全屏显示
    26. +
    27. 新增一键打包部署
    28. +
    29. Excel注解新增多个参数
    30. +
    31. 新增提交静默更新表格方法
    32. +
    33. 新增服务监控菜单
    34. +
    +
    +
    +
    +
    +
    +
    + v3.0.02018.10.08 +
    +
    +
    +
    +
      +
    1. 升级poi到最新版3.17
    2. +
    3. 导出修改临时目录绝对路径
    4. +
    5. 升级laydate到最新版5.0.9
    6. +
    7. 升级SpringBoot到最新版本2.0.5
    8. +
    9. 优化开始/结束时间校验限制
    10. +
    11. 重置密码参数表中获取默认值
    12. +
    13. 修复头像修改显示问题
    14. +
    15. 新增数据权限过滤注解
    16. +
    17. 新增表格检索折叠按钮
    18. +
    19. 新增清空(登录、操作、调度)日志
    20. +
    21. 固定按钮位置(提交/关闭)
    22. +
    23. 部门/菜单支持(展开/折叠)
    24. +
    25. 部分细节调整优化
    26. +
    27. 项目采用分模块
    28. +
    +
    +
    +
    +
    +
    +
    + v2.4.02018.09.03 +
    +
    +
    +
    +
      +
    1. 支持部门多级查询
    2. +
    3. 修复菜单状态查询无效
    4. +
    5. 支持IP地址开关
    6. +
    7. 支持XSS开关
    8. +
    9. 记录日志异步处理
    10. +
    11. 字典回显样式更改为下拉框
    12. +
    13. 菜单类型必填校验
    14. +
    15. 修复在线用户排序报错
    16. +
    17. 增加重置按钮
    18. +
    19. 支持注解导入数据
    20. +
    21. 支持弹层外区域关闭
    22. +
    23. 备注更换为文本区域
    24. +
    25. 新增角色逻辑删除
    26. +
    27. 新增部门逻辑删除
    28. +
    29. 支持部门数据权限
    30. +
    31. 管理员默认拥有所有授权
    32. +
    33. 字典数据采用分页
    34. +
    35. 部分细节调整优化
    36. +
    +
    +
    +
    +
    +
    +
    + v2.3.02018.08.06 +
    +
    +
    +
    +
      +
    1. 支持表格不分页开关控制
    2. +
    3. 修改字典类型同步修改字典数据
    4. +
    5. 代码生成新增修改后缀处理
    6. +
    7. 代码生成新增实体toString
    8. +
    9. 代码生成非字符串去除!=''
    10. +
    11. 导出数据前加载遮罩层
    12. +
    13. 部门删除校验条件修改
    14. +
    15. 搜索查询下载优化
    16. +
    17. 手机打开弹出层自适应
    18. +
    19. 角色岗位禁用显示置灰
    20. +
    21. 角色禁用不显示菜单
    22. +
    23. 新增导出权限
    24. +
    25. 角色权限唯一校验
    26. +
    27. 岗位名称编码唯一校验
    28. +
    29. TreeTable优化
    30. +
    31. 支持多数据源
    32. +
    33. 其他细节优化
    34. +
    +
    +
    +
    +
    +
    +
    + v2.2.02018.07.23 +
    +
    +
    +
    +
      +
    1. 修复批量生成代码异常问题
    2. +
    3. 修复定时器保存失败问题
    4. +
    5. 修复热部署转换问题
    6. +
    7. 支持查询菜单管理,部门管理
    8. +
    9. 大多数功能支持时间查询
    10. +
    11. 自定义导出注解自动匹配column
    12. +
    13. 新增任务执行策略
    14. +
    15. 操作详细动态显示类型
    16. +
    17. 支持动态回显字典数据
    18. +
    19. 后台代码优化调整
    20. +
    21. 其他细节优化
    22. +
    +
    +
    +
    +
    +
    +
    + v2.1.02018.07.10 +
    +
    +
    +
    +
      +
    1. 新增登录超时提醒
    2. +
    3. 修复定时器热部署转换问题
    4. +
    5. 修复登录验证码校验无效问题
    6. +
    7. 定时任务新增立即执行一次
    8. +
    9. 存在字典数据不允许删除字典
    10. +
    11. 字典数据支持按名称查询
    12. +
    13. 代码生成增加日志注解&表格优化
    14. +
    15. 修复用户逻辑删除后能登录问题
    16. +
    17. 表格支持多字段动态排序
    18. +
    19. 支持三级菜单显示
    20. +
    21. 新增ry.sh启动程序脚本
    22. +
    23. 其他细节优化
    24. +
    +
    +
    +
    +
    +
    +
    + v2.0.02018.07.02 +
    +
    +
    +
    +
      +
    1. 升级SpringBoot到最新版本2.0.3
    2. +
    3. 新增公告管理
    4. +
    5. 表单校验示提体验优化
    6. +
    7. 前端通用方法封装调整
    8. +
    9. 前端去除js文件,合并到html
    10. +
    11. 操作加载遮罩层
    12. +
    13. 支持全屏模式操作
    14. +
    15. 支持注解导出数据
    16. +
    17. 系统支持多查询&下载
    18. +
    19. 系统样式调整
    20. +
    +
    +
    +
    +
    +
    +
    + v1.1.62018.06.04 +
    +
    +
    +
    +
      +
    1. 新增用户列表部门列
    2. +
    3. 新增登录地点
    4. +
    5. 新增swagger
    6. +
    7. 修复排序数字校验
    8. +
    9. 优化头像上传文件类型限定为图片
    10. +
    11. 新增XSS过滤
    12. +
    13. 新增热部署提高开发效率
    14. +
    15. 修复treegrid居中无效
    16. +
    17. 角色多条件查询
    18. +
    +
    +
    +
    +
    +
    +
    + v1.1.52018.05.28 +
    +
    +
    +
    +
      +
    1. 优化登录失败刷新验证码
    2. +
    3. 新增用户登录地址时间
    4. +
    5. 修复ajax超时退出问题
    6. +
    7. 新增html调用数据字典(若依首创)
    8. +
    9. 调整系统部分样式
    10. +
    11. 新增用户逻辑删除
    12. +
    13. 新增管理员不允许删除修改
    14. +
    15. 升级bootstrapTable到最新版本1.12.1
    16. +
    17. 升级layer到最新版本3.1.1
    18. +
    +
    +
    +
    +
    +
    +
    + v1.1.42018.05.20 +
    +
    +
    +
    +
      +
    1. 新增参数管理
    2. +
    3. 修复头像上传bug
    4. +
    5. 手机邮箱唯一校验
    6. +
    7. 支持手机邮箱登录
    8. +
    9. 代码生成优化
    10. +
    11. 支持模糊查询
    12. +
    13. 支持切换主题皮肤
    14. +
    15. 修改权限即时生效
    16. +
    17. 修复页签Tab关闭问题
    18. +
    +
    +
    +
    +
    +
    +
    + v1.1.32018.05.14 +
    +
    +
    +
    +
      +
    1. 新增验证码(数组计算、字符验证)
    2. +
    3. 新增cookie记住我
    4. +
    5. 新增头像上传
    6. +
    7. 用户名密码长度限制
    8. +
    9. 通用字段提取
    10. +
    11. 支持自定义条件查询
    12. +
    13. 部门名称必填、时间格式调整
    14. +
    15. 其他细节优化
    16. +
    +
    +
    +
    +
    +
    +
    + v1.1.22018.05.07 +
    +
    +
    +
    +
      +
    1. 新增个人信息修改
    2. +
    3. 菜单存在子菜单不允许删除
    4. +
    5. 菜单分配角色不允许删除
    6. +
    7. 角色分配人员不允许删除
    8. +
    9. 岗位使用后不允许删除
    10. +
    11. 保证用户的数据完整性加入事物
    12. +
    13. 新增环境使用手册、数据建模
    14. +
    15. Thymeleaf升级到3.0
    16. +
    17. 支持非ROOT部署
    18. +
    +
    +
    +
    +
    +
    +
    + v1.1.12018.04.23 +
    +
    +
    +
    +
      +
    1. 新增表单构建器
    2. +
    3. 代码生成优化
    4. +
    5. 支持新增主部门
    6. +
    7. 支持选择上级部门、上级菜单
    8. +
    9. 新增字典管理单条删除
    10. +
    11. 优化一些其他细节
    12. +
    +
    +
    +
    +
    +
    +
    + v1.1.02018.04.20 +
    +
    +
    +
    +
      +
    1. 支持密码盐
    2. +
    3. 支持新增主目录
    4. +
    5. 支持批量生成代码
    6. +
    7. 支持表格导出(csv、txt、doc、excel)
    8. +
    9. 自动适应宽高模式窗体
    10. +
    11. 重复校验(角色名、菜单名、部门名)
    12. +
    13. 优化一些其他细节
    14. +
    +
    +
    +
    +
    +
    +
    + v1.0.92018.04.14 +
    +
    +
    +
    +
      +
    1. 新增代码生成(生成包括 java、html、js、xml、sql)
    2. +
    3. 新增按钮权限控制隐藏(若依首创)
    4. +
    +
    +
    +
    +
    +
    +
    + v1.0.82018.04.08 +
    +
    +
    +
    +
      +
    1. 新增定时任务(新增、修改、删除、查询、启动/暂停)
    2. +
    3. 新增调度日志(查询、删除)
    4. +
    +
    +
    +
    +
    +
    +
    + v1.0.72018.04.04 +
    +
    +
    +
    +
      +
    1. 新增岗位管理(新增、修改、删除、查询)
    2. +
    3. 优化用户管理,菜单管理部分细节
    4. +
    +
    +
    +
    +
    +
    +
    + v1.0.62018.03.15 +
    +
    +
    +
    +
      +
    1. 新增字典管理(新增、删除、修改、查询、数据选择)
    2. +
    3. 新增用户密码重置
    4. +
    5. 优化一些其他细节
    6. +
    +
    +
    +
    +
    +
    +
    + v1.0.52018.03.12 +
    +
    +
    +
    +
      +
    1. 新增菜单管理(新增、删除、修改、查询、图标选择)
    2. +
    3. 部门管理优化(添加责任人、联系电话、邮箱、修改者)
    4. +
    +
    +
    +
    +
    +
    +
    + v1.0.42018.03.11 +
    +
    +
    +
    +
      +
    1. 新增角色管理(新增、删除、修改、查询、菜单选择)
    2. +
    +
    +
    +
    +
    +
    +
    + v1.0.32018.03.08 +
    +
    +
    +
    +
      +
    1. 新增用户管理(新增、删除、修改、查询、部门选择)
    2. +
    +
    +
    +
    +
    +
    +
    + v1.0.22018.03.04 +
    +
    +
    +
    +
      +
    1. 新增部门管理 (新增、删除、修改、查询)
    2. +
    +
    +
    +
    +
    +
    +
    + v1.0.12018.03.03 +
    +
    +
    +
    +
      +
    1. 新增在线用户 (批量强退、单条强退、查询)
    2. +
    3. 新增登录日志 (批量删除、查询)
    4. +
    5. 新增操作日志 (批量删除、查询、详细)
    6. +
    7. 新增数据监控 (监控DB池连接和SQL的执行)
    8. +
    +
    +
    +
    +
    +
    +

    + v1.0.02018.03.01 +

    +
    +
    +
    +
      +
    1. 若依管理系统正式发布。
    2. +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    捐赠
    +
    +
    +
    + 请作者喝杯咖啡(点击图片放大) +
    +

    + 请使用手机支付宝或者微信扫码支付 + +

    + +
    +
    +
    +
    +
    + + + + + + diff --git a/src/ruoyi-admin/src/main/resources/templates/skin.html b/src/ruoyi-admin/src/main/resources/templates/skin.html new file mode 100644 index 0000000..370bb13 --- /dev/null +++ b/src/ruoyi-admin/src/main/resources/templates/skin.html @@ -0,0 +1,165 @@ + + + + + + + 主题选择 + + + + + + + + + + + + + diff --git a/src/ruoyi-common/pom.xml b/src/ruoyi-common/pom.xml new file mode 100644 index 0000000..17f63b8 --- /dev/null +++ b/src/ruoyi-common/pom.xml @@ -0,0 +1,100 @@ + + + + ruoyi + com.ruoyi + 4.7.9 + + 4.0.0 + + ruoyi-common + + + common通用工具 + + + + + + + org.springframework + spring-context-support + + + + + org.springframework + spring-web + + + + + org.apache.shiro + shiro-core + + + + + org.apache.shiro + shiro-ehcache + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.apache.commons + commons-lang3 + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.alibaba + fastjson + + + + + commons-io + commons-io + + + + + org.apache.poi + poi-ooxml + + + + + org.yaml + snakeyaml + + + + + javax.servlet + javax.servlet-api + + + + + \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java new file mode 100644 index 0000000..1d6d4f4 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 匿名访问不鉴权注解 + * + * @author ruoyi + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Anonymous +{ +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java new file mode 100644 index 0000000..bafce5b --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java @@ -0,0 +1,33 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 数据权限过滤注解 + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataScope +{ + /** + * 部门表的别名 + */ + public String deptAlias() default ""; + + /** + * 用户表的别名 + */ + public String userAlias() default ""; + + /** + * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@RequiresPermissions获取,多个权限用逗号分隔开来 + */ + public String permission() default ""; +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java new file mode 100644 index 0000000..79cd191 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java @@ -0,0 +1,28 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.ruoyi.common.enums.DataSourceType; + +/** + * 自定义多数据源切换注解 + * + * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准 + * + * @author ruoyi + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface DataSource +{ + /** + * 切换数据源名称 + */ + public DataSourceType value() default DataSourceType.MASTER; +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java new file mode 100644 index 0000000..27e587d --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java @@ -0,0 +1,192 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.math.BigDecimal; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import com.ruoyi.common.utils.poi.ExcelHandlerAdapter; + +/** + * 自定义导出Excel数据注解 + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel +{ + /** + * 导出时在excel中排序 + */ + public int sort() default Integer.MAX_VALUE; + + /** + * 导出到Excel中的名字. + */ + public String name() default ""; + + /** + * 日期格式, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + public String dictType() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + public String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + public String separator() default ","; + + /** + * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) + */ + public int scale() default -1; + + /** + * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN + */ + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; + + /** + * 导出时在excel中每个列的高度 + */ + public double height() default 14; + + /** + * 导出时在excel中每个列的宽度 + */ + public double width() default 16; + + /** + * 文字后缀,如% 90 变成90% + */ + public String suffix() default ""; + + /** + * 当值为空时,字段的默认值 + */ + public String defaultValue() default ""; + + /** + * 提示信息 + */ + public String prompt() default ""; + + /** + * 设置只能选择不能输入的列内容. + */ + public String[] combo() default {}; + + /** + * 是否从字典读数据到combo,默认不读取,如读取需要设置dictType注解. + */ + public boolean comboReadDict() default false; + + /** + * 是否需要纵向合并单元格,应对需求:含有list集合单元格) + */ + public boolean needMerge() default false; + + /** + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. + */ + public boolean isExport() default true; + + /** + * 另一个类中的属性名称,支持多级获取,以小数点隔开 + */ + public String targetAttr() default ""; + + /** + * 是否自动统计数据,在最后追加一行统计数据总和 + */ + public boolean isStatistics() default false; + + /** + * 导出类型(0数字 1字符串 2图片) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出列头背景颜色 + */ + public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT; + + /** + * 导出列头字体颜色 + */ + public IndexedColors headerColor() default IndexedColors.WHITE; + + /** + * 导出单元格背景颜色 + */ + public IndexedColors backgroundColor() default IndexedColors.WHITE; + + /** + * 导出单元格字体颜色 + */ + public IndexedColors color() default IndexedColors.BLACK; + + /** + * 导出字段对齐方式 + */ + public HorizontalAlignment align() default HorizontalAlignment.CENTER; + + /** + * 自定义数据处理器 + */ + public Class handler() default ExcelHandlerAdapter.class; + + /** + * 自定义数据处理器参数 + */ + public String[] args() default {}; + + /** + * 字段类型(0:导出导入;1:仅导出;2:仅导入) + */ + Type type() default Type.ALL; + + public enum Type + { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + public enum ColumnType + { + NUMERIC(0), STRING(1), IMAGE(2), TEXT(3); + private final int value; + + ColumnType(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java new file mode 100644 index 0000000..8c6870c --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel注解集 + * + * @author ruoyi + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels +{ + Excel[] value(); +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java new file mode 100644 index 0000000..e395169 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java @@ -0,0 +1,50 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.enums.OperatorType; + +/** + * 自定义操作日志记录注解 + * + * @author ruoyi + */ +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Log +{ + /** + * 模块 + */ + public String title() default ""; + + /** + * 功能 + */ + public BusinessType businessType() default BusinessType.OTHER; + + /** + * 操作人类别 + */ + public OperatorType operatorType() default OperatorType.MANAGE; + + /** + * 是否保存请求的参数 + */ + public boolean isSaveRequestData() default true; + + /** + * 是否保存响应的参数 + */ + public boolean isSaveResponseData() default true; + + /** + * 排除指定的请求参数 + */ + public String[] excludeParamNames() default {}; +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java new file mode 100644 index 0000000..3e06e95 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java @@ -0,0 +1,29 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义注解防止表单重复提交 + * + * @author ruoyi + * + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RepeatSubmit +{ + /** + * 间隔时间(ms),小于此时间视为重复提交 + */ + public int interval() default 5000; + + /** + * 提示消息 + */ + public String message() default "不允许重复提交,请稍后再试"; +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java new file mode 100644 index 0000000..c0621e9 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java @@ -0,0 +1,24 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ruoyi.common.config.serializer.SensitiveJsonSerializer; +import com.ruoyi.common.enums.DesensitizedType; + +/** + * 数据脱敏注解 + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@JacksonAnnotationsInside +@JsonSerialize(using = SensitiveJsonSerializer.class) +public @interface Sensitive +{ + DesensitizedType desensitizedType(); +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java new file mode 100644 index 0000000..46a5734 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java @@ -0,0 +1,124 @@ +package com.ruoyi.common.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 全局配置类 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "ruoyi") +public class RuoYiConfig +{ + /** 项目名称 */ + private static String name; + + /** 版本 */ + private static String version; + + /** 版权年份 */ + private static String copyrightYear; + + /** 实例演示开关 */ + private static boolean demoEnabled; + + /** 上传路径 */ + private static String profile; + + /** 获取地址开关 */ + private static boolean addressEnabled; + + public static String getName() + { + return name; + } + + public void setName(String name) + { + RuoYiConfig.name = name; + } + + public static String getVersion() + { + return version; + } + + public void setVersion(String version) + { + RuoYiConfig.version = version; + } + + public static String getCopyrightYear() + { + return copyrightYear; + } + + public void setCopyrightYear(String copyrightYear) + { + RuoYiConfig.copyrightYear = copyrightYear; + } + + public static boolean isDemoEnabled() + { + return demoEnabled; + } + + public void setDemoEnabled(boolean demoEnabled) + { + RuoYiConfig.demoEnabled = demoEnabled; + } + + public static String getProfile() + { + return profile; + } + + public void setProfile(String profile) + { + RuoYiConfig.profile = profile; + } + + public static boolean isAddressEnabled() + { + return addressEnabled; + } + + public void setAddressEnabled(boolean addressEnabled) + { + RuoYiConfig.addressEnabled = addressEnabled; + } + + /** + * 获取导入上传路径 + */ + public static String getImportPath() + { + return getProfile() + "/import"; + } + + /** + * 获取头像上传路径 + */ + public static String getAvatarPath() + { + return getProfile() + "/avatar"; + } + + /** + * 获取下载路径 + */ + public static String getDownloadPath() + { + return getProfile() + "/download/"; + } + + /** + * 获取上传路径 + */ + public static String getUploadPath() + { + return getProfile() + "/upload"; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/config/ServerConfig.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/config/ServerConfig.java new file mode 100644 index 0000000..b6b35e4 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/config/ServerConfig.java @@ -0,0 +1,33 @@ +package com.ruoyi.common.config; + +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Component; +import com.ruoyi.common.utils.ServletUtils; + +/** + * 服务相关配置 + * + * @author ruoyi + * + */ +@Component +public class ServerConfig +{ + /** + * 获取完整的请求路径,包括:域名,端口,上下文访问路径 + * + * @return 服务地址 + */ + public String getUrl() + { + HttpServletRequest request = ServletUtils.getRequest(); + return getDomain(request); + } + + public static String getDomain(HttpServletRequest request) + { + StringBuffer url = request.getRequestURL(); + String contextPath = request.getServletContext().getContextPath(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/config/datasource/DynamicDataSourceContextHolder.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/config/datasource/DynamicDataSourceContextHolder.java new file mode 100644 index 0000000..78e5dc4 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/config/datasource/DynamicDataSourceContextHolder.java @@ -0,0 +1,45 @@ +package com.ruoyi.common.config.datasource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 数据源切换处理 + * + * @author ruoyi + */ +public class DynamicDataSourceContextHolder +{ + public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class); + + /** + * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本, + * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 + */ + private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); + + /** + * 设置数据源的变量 + */ + public static void setDataSourceType(String dsType) + { + log.info("切换到{}数据源", dsType); + CONTEXT_HOLDER.set(dsType); + } + + /** + * 获得数据源的变量 + */ + public static String getDataSourceType() + { + return CONTEXT_HOLDER.get(); + } + + /** + * 清空数据源变量 + */ + public static void clearDataSourceType() + { + CONTEXT_HOLDER.remove(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/config/serializer/SensitiveJsonSerializer.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/config/serializer/SensitiveJsonSerializer.java new file mode 100644 index 0000000..02241c5 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/config/serializer/SensitiveJsonSerializer.java @@ -0,0 +1,64 @@ +package com.ruoyi.common.config.serializer; + +import java.io.IOException; +import java.util.Objects; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import com.ruoyi.common.annotation.Sensitive; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.enums.DesensitizedType; +import com.ruoyi.common.utils.ShiroUtils; + +/** + * 数据脱敏序列化过滤 + * + * @author ruoyi + */ +public class SensitiveJsonSerializer extends JsonSerializer implements ContextualSerializer +{ + private DesensitizedType desensitizedType; + + @Override + public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException + { + if (desensitization()) + { + gen.writeString(desensitizedType.desensitizer().apply(value)); + } + else + { + gen.writeString(value); + } + } + + @Override + public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) + throws JsonMappingException + { + Sensitive annotation = property.getAnnotation(Sensitive.class); + if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) + { + this.desensitizedType = annotation.desensitizedType(); + return this; + } + return prov.findValueSerializer(property.getType(), property); + } + + /** + * 是否需要脱敏处理 + */ + private boolean desensitization() + { + SysUser securityUser = ShiroUtils.getSysUser(); + if (securityUser == null) + { + return true; + } + // 管理员不脱敏 + return !securityUser.isAdmin(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/config/thread/ThreadPoolConfig.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/config/thread/ThreadPoolConfig.java new file mode 100644 index 0000000..955a4f9 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/config/thread/ThreadPoolConfig.java @@ -0,0 +1,63 @@ +package com.ruoyi.common.config.thread; + +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import com.ruoyi.common.utils.Threads; + +/** + * 线程池配置 + * + * @author ruoyi + **/ +@Configuration +public class ThreadPoolConfig +{ + // 核心线程池大小 + private int corePoolSize = 50; + + // 最大可创建的线程数 + private int maxPoolSize = 200; + + // 队列最大长度 + private int queueCapacity = 1000; + + // 线程池维护线程所允许的空闲时间 + private int keepAliveSeconds = 300; + + @Bean(name = "threadPoolTaskExecutor") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() + { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setMaxPoolSize(maxPoolSize); + executor.setCorePoolSize(corePoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setKeepAliveSeconds(keepAliveSeconds); + // 线程池对拒绝任务(无线程可用)的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + /** + * 执行周期性或定时任务 + */ + @Bean(name = "scheduledExecutorService") + protected ScheduledExecutorService scheduledExecutorService() + { + return new ScheduledThreadPoolExecutor(corePoolSize, + new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(), + new ThreadPoolExecutor.CallerRunsPolicy()) + { + @Override + protected void afterExecute(Runnable r, Throwable t) + { + super.afterExecute(r, t); + Threads.printException(r, t); + } + }; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java new file mode 100644 index 0000000..2229899 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -0,0 +1,122 @@ +package com.ruoyi.common.constant; + +import java.util.Locale; + +/** + * 通用常量信息 + * + * @author ruoyi + */ +public class Constants +{ + /** + * UTF-8 字符集 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + + /** + * 系统语言 + */ + public static final Locale DEFAULT_LOCALE = Locale.SIMPLIFIED_CHINESE; + + /** + * http请求 + */ + public static final String HTTP = "http://"; + + /** + * https请求 + */ + public static final String HTTPS = "https://"; + + /** + * 通用成功标识 + */ + public static final String SUCCESS = "0"; + + /** + * 通用失败标识 + */ + public static final String FAIL = "1"; + + /** + * 登录成功 + */ + public static final String LOGIN_SUCCESS = "Success"; + + /** + * 注销 + */ + public static final String LOGOUT = "Logout"; + + /** + * 注册 + */ + public static final String REGISTER = "Register"; + + /** + * 登录失败 + */ + public static final String LOGIN_FAIL = "Error"; + + /** + * 系统用户授权缓存 + */ + public static final String SYS_AUTH_CACHE = "sys-authCache"; + + /** + * 参数管理 cache name + */ + public static final String SYS_CONFIG_CACHE = "sys-config"; + + /** + * 参数管理 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache name + */ + public static final String SYS_DICT_CACHE = "sys-dict"; + + /** + * 字典管理 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/profile"; + + /** + * RMI 远程方法调用 + */ + public static final String LOOKUP_RMI = "rmi:"; + + /** + * LDAP 远程方法调用 + */ + public static final String LOOKUP_LDAP = "ldap:"; + + /** + * LDAPS 远程方法调用 + */ + public static final String LOOKUP_LDAPS = "ldaps:"; + + /** + * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) + */ + public static final String[] JOB_WHITELIST_STR = { "com.ruoyi.quartz.task" }; + + /** + * 定时任务违规的字符 + */ + public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", + "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator" }; +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java new file mode 100644 index 0000000..98b4711 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java @@ -0,0 +1,114 @@ +package com.ruoyi.common.constant; + +/** + * 代码生成通用常量 + * + * @author ruoyi + */ +public class GenConstants +{ + /** 单表(增删改查) */ + public static final String TPL_CRUD = "crud"; + + /** 树表(增删改查) */ + public static final String TPL_TREE = "tree"; + + /** 主子表(增删改查) */ + public static final String TPL_SUB = "sub"; + + /** 树编码字段 */ + public static final String TREE_CODE = "treeCode"; + + /** 树父编码字段 */ + public static final String TREE_PARENT_CODE = "treeParentCode"; + + /** 树名称字段 */ + public static final String TREE_NAME = "treeName"; + + /** 上级菜单ID字段 */ + public static final String PARENT_MENU_ID = "parentMenuId"; + + /** 上级菜单名称字段 */ + public static final String PARENT_MENU_NAME = "parentMenuName"; + + /** 数据库字符串类型 */ + public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; + + /** 数据库文本类型 */ + public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; + + /** 数据库时间类型 */ + public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; + + /** 数据库数字类型 */ + public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "double", "decimal" }; + + /** 页面不需要编辑字段 */ + public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; + + /** 页面不需要显示的列表字段 */ + public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time" }; + + /** 页面不需要查询字段 */ + public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark" }; + + /** Entity基类字段 */ + public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" }; + + /** Tree基类字段 */ + public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors" }; + + /** 文本框 */ + public static final String HTML_INPUT = "input"; + + /** 文本域 */ + public static final String HTML_TEXTAREA = "textarea"; + + /** 下拉框 */ + public static final String HTML_SELECT = "select"; + + /** 单选框 */ + public static final String HTML_RADIO = "radio"; + + /** 复选框 */ + public static final String HTML_CHECKBOX = "checkbox"; + + /** 日期控件 */ + public static final String HTML_DATETIME = "datetime"; + + /** 上传控件 */ + public static final String HTML_UPLOAD = "upload"; + + /** 富文本控件 */ + public static final String HTML_SUMMERNOTE = "summernote"; + + /** 字符串类型 */ + public static final String TYPE_STRING = "String"; + + /** 整型 */ + public static final String TYPE_INTEGER = "Integer"; + + /** 长整型 */ + public static final String TYPE_LONG = "Long"; + + /** 浮点型 */ + public static final String TYPE_DOUBLE = "Double"; + + /** 高精度计算类型 */ + public static final String TYPE_BIGDECIMAL = "BigDecimal"; + + /** 时间类型 */ + public static final String TYPE_DATE = "Date"; + + /** 模糊查询 */ + public static final String QUERY_LIKE = "LIKE"; + + /** 相等查询 */ + public static final String QUERY_EQ = "EQ"; + + /** 需要 */ + public static final String REQUIRE = "1"; +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/PermissionConstants.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/PermissionConstants.java new file mode 100644 index 0000000..8967214 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/PermissionConstants.java @@ -0,0 +1,27 @@ +package com.ruoyi.common.constant; + +/** + * 权限通用常量 + * + * @author ruoyi + */ +public class PermissionConstants +{ + /** 新增权限 */ + public static final String ADD_PERMISSION = "add"; + + /** 修改权限 */ + public static final String EDIT_PERMISSION = "edit"; + + /** 删除权限 */ + public static final String REMOVE_PERMISSION = "remove"; + + /** 导出权限 */ + public static final String EXPORT_PERMISSION = "export"; + + /** 显示权限 */ + public static final String VIEW_PERMISSION = "view"; + + /** 查询权限 */ + public static final String LIST_PERMISSION = "list"; +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java new file mode 100644 index 0000000..62ad815 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java @@ -0,0 +1,50 @@ +package com.ruoyi.common.constant; + +/** + * 任务调度通用常量 + * + * @author ruoyi + */ +public class ScheduleConstants +{ + public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; + + /** 执行目标key */ + public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; + + /** 默认 */ + public static final String MISFIRE_DEFAULT = "0"; + + /** 立即触发执行 */ + public static final String MISFIRE_IGNORE_MISFIRES = "1"; + + /** 触发一次执行 */ + public static final String MISFIRE_FIRE_AND_PROCEED = "2"; + + /** 不触发立即执行 */ + public static final String MISFIRE_DO_NOTHING = "3"; + + public enum Status + { + /** + * 正常 + */ + NORMAL("0"), + /** + * 暂停 + */ + PAUSE("1"); + + private String value; + + private Status(String value) + { + this.value = value; + } + + public String getValue() + { + return value; + } + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/ShiroConstants.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/ShiroConstants.java new file mode 100644 index 0000000..684e538 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/ShiroConstants.java @@ -0,0 +1,79 @@ +package com.ruoyi.common.constant; + +/** + * Shiro通用常量 + * + * @author ruoyi + */ +public class ShiroConstants +{ + /** + * 当前登录的用户 + */ + public static final String CURRENT_USER = "currentUser"; + + /** + * 用户名字段 + */ + public static final String CURRENT_USERNAME = "username"; + + /** + * 锁定屏幕字段 + */ + public static final String LOCK_SCREEN = "lockscreen"; + + /** + * 消息key + */ + public static final String MESSAGE = "message"; + + /** + * 错误key + */ + public static final String ERROR = "errorMsg"; + + /** + * 编码格式 + */ + public static final String ENCODING = "UTF-8"; + + /** + * 当前在线会话 + */ + public static final String ONLINE_SESSION = "online_session"; + + /** + * 验证码key + */ + public static final String CURRENT_CAPTCHA = "captcha"; + + /** + * 验证码开关 + */ + public static final String CURRENT_ENABLED = "captchaEnabled"; + + /** + * 验证码类型 + */ + public static final String CURRENT_TYPE = "captchaType"; + + /** + * 验证码 + */ + public static final String CURRENT_VALIDATECODE = "validateCode"; + + /** + * 验证码错误 + */ + public static final String CAPTCHA_ERROR = "captchaError"; + + /** + * 登录记录缓存 + */ + public static final String LOGIN_RECORD_CACHE = "loginRecordCache"; + + /** + * 系统活跃用户缓存 + */ + public static final String SYS_USERCACHE = "sys-userCache"; +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java new file mode 100644 index 0000000..5800d20 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java @@ -0,0 +1,73 @@ +package com.ruoyi.common.constant; + +/** + * 用户常量信息 + * + * @author ruoyi + */ +public class UserConstants +{ + /** + * 平台内系统用户的唯一标志 + */ + public static final String SYS_USER = "SYS_USER"; + + /** 正常状态 */ + public static final String NORMAL = "0"; + + /** 异常状态 */ + public static final String EXCEPTION = "1"; + + /** 用户封禁状态 */ + public static final String USER_DISABLE = "1"; + + /** 角色正常状态 */ + public static final String ROLE_NORMAL = "0"; + + /** 角色封禁状态 */ + public static final String ROLE_DISABLE = "1"; + + /** 部门正常状态 */ + public static final String DEPT_NORMAL = "0"; + + /** 部门停用状态 */ + public static final String DEPT_DISABLE = "1"; + + /** 字典正常状态 */ + public static final String DICT_NORMAL = "0"; + + /** 是否为系统默认(是) */ + public static final String YES = "Y"; + + /** 是否唯一的返回标识 */ + public final static boolean UNIQUE = true; + public final static boolean NOT_UNIQUE = false; + + /** + * 用户名长度限制 + */ + public static final int USERNAME_MIN_LENGTH = 2; + public static final int USERNAME_MAX_LENGTH = 20; + + /** + * 密码长度限制 + */ + public static final int PASSWORD_MIN_LENGTH = 5; + public static final int PASSWORD_MAX_LENGTH = 20; + + /** + * 用户类型 + */ + public static final String SYSTEM_USER_TYPE = "00"; + public static final String REGISTER_USER_TYPE = "01"; + + /** + * 手机号码格式限制 + */ + public static final String MOBILE_PHONE_NUMBER_PATTERN = "^0{0,1}(13[0-9]|15[0-9]|14[0-9]|18[0-9])[0-9]{8}$"; + + /** + * 邮箱格式限制 + */ + public static final String EMAIL_PATTERN = "^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?"; +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/context/PermissionContextHolder.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/context/PermissionContextHolder.java new file mode 100644 index 0000000..f06b8fa --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/context/PermissionContextHolder.java @@ -0,0 +1,27 @@ +package com.ruoyi.common.core.context; + +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import com.ruoyi.common.core.text.Convert; + +/** + * 权限信息 + * + * @author ruoyi + */ +public class PermissionContextHolder +{ + private static final String PERMISSION_CONTEXT_ATTRIBUTES = "PERMISSION_CONTEXT"; + + public static void setContext(String permission) + { + RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission, + RequestAttributes.SCOPE_REQUEST); + } + + public static String getContext() + { + return Convert.toStr(RequestContextHolder.currentRequestAttributes().getAttribute(PERMISSION_CONTEXT_ATTRIBUTES, + RequestAttributes.SCOPE_REQUEST)); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java new file mode 100644 index 0000000..9c3a7b2 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java @@ -0,0 +1,208 @@ +package com.ruoyi.common.core.controller; + +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.AjaxResult.Type; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.sql.SqlUtil; + +/** + * web层通用数据处理 + * + * @author ruoyi + */ +public class BaseController +{ + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + + /** + * 将前台传递过来的日期格式的字符串,自动转化为Date类型 + */ + @InitBinder + public void initBinder(WebDataBinder binder) + { + // Date 类型转换 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() + { + @Override + public void setAsText(String text) + { + setValue(DateUtils.parseDate(text)); + } + }); + } + + /** + * 设置请求分页数据 + */ + protected void startPage() + { + PageUtils.startPage(); + } + + /** + * 获取request + */ + public HttpServletRequest getRequest() + { + return ServletUtils.getRequest(); + } + + /** + * 获取response + */ + public HttpServletResponse getResponse() + { + return ServletUtils.getResponse(); + } + + /** + * 获取session + */ + public HttpSession getSession() + { + return getRequest().getSession(); + } + + /** + * 响应请求分页数据 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected TableDataInfo getDataTable(List list) + { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(0); + rspData.setRows(list); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } + + /** + * 响应返回结果 + * + * @param rows 影响行数 + * @return 操作结果 + */ + protected AjaxResult toAjax(int rows) + { + return rows > 0 ? success() : error(); + } + + /** + * 响应返回结果 + * + * @param result 结果 + * @return 操作结果 + */ + protected AjaxResult toAjax(boolean result) + { + return result ? success() : error(); + } + + /** + * 返回成功 + */ + public AjaxResult success() + { + return AjaxResult.success(); + } + + /** + * 返回失败消息 + */ + public AjaxResult error() + { + return AjaxResult.error(); + } + + /** + * 返回成功消息 + */ + public AjaxResult success(String message) + { + return AjaxResult.success(message); + } + + /** + * 返回成功数据 + */ + public static AjaxResult success(Object data) + { + return AjaxResult.success("操作成功", data); + } + + /** + * 返回失败消息 + */ + public AjaxResult error(String message) + { + return AjaxResult.error(message); + } + + /** + * 返回错误码消息 + */ + public AjaxResult error(Type type, String message) + { + return new AjaxResult(type, message); + } + + /** + * 页面跳转 + */ + public String redirect(String url) + { + return StringUtils.format("redirect:{}", url); + } + + /** + * 获取用户缓存信息 + */ + public SysUser getSysUser() + { + return ShiroUtils.getSysUser(); + } + + /** + * 设置用户缓存信息 + */ + public void setSysUser(SysUser user) + { + ShiroUtils.setSysUser(user); + } + + /** + * 获取登录用户id + */ + public Long getUserId() + { + return getSysUser().getUserId(); + } + + /** + * 获取登录用户名 + */ + public String getLoginName() + { + return getSysUser().getLoginName(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java new file mode 100644 index 0000000..2feaa13 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java @@ -0,0 +1,227 @@ +package com.ruoyi.common.core.domain; + +import java.util.HashMap; +import java.util.Objects; +import com.ruoyi.common.utils.StringUtils; + +/** + * 操作消息提醒 + * + * @author ruoyi + */ +public class AjaxResult extends HashMap +{ + private static final long serialVersionUID = 1L; + + /** 状态码 */ + public static final String CODE_TAG = "code"; + + /** 返回内容 */ + public static final String MSG_TAG = "msg"; + + /** 数据对象 */ + public static final String DATA_TAG = "data"; + + /** + * 状态类型 + */ + public enum Type + { + /** 成功 */ + SUCCESS(0), + /** 警告 */ + WARN(301), + /** 错误 */ + ERROR(500); + private final int value; + + Type(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + /** + * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 + */ + public AjaxResult() + { + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param type 状态类型 + * @param msg 返回内容 + */ + public AjaxResult(Type type, String msg) + { + super.put(CODE_TAG, type.value); + super.put(MSG_TAG, msg); + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param type 状态类型 + * @param msg 返回内容 + * @param data 数据对象 + */ + public AjaxResult(Type type, String msg, Object data) + { + super.put(CODE_TAG, type.value); + super.put(MSG_TAG, msg); + if (StringUtils.isNotNull(data)) + { + super.put(DATA_TAG, data); + } + } + + /** + * 返回成功消息 + * + * @return 成功消息 + */ + public static AjaxResult success() + { + return AjaxResult.success("操作成功"); + } + + /** + * 返回成功数据 + * + * @return 成功消息 + */ + public static AjaxResult success(Object data) + { + return AjaxResult.success("操作成功", data); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @return 成功消息 + */ + public static AjaxResult success(String msg) + { + return AjaxResult.success(msg, null); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 成功消息 + */ + public static AjaxResult success(String msg, Object data) + { + return new AjaxResult(Type.SUCCESS, msg, data); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult warn(String msg) + { + return AjaxResult.warn(msg, null); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static AjaxResult warn(String msg, Object data) + { + return new AjaxResult(Type.WARN, msg, data); + } + + /** + * 返回错误消息 + * + * @return + */ + public static AjaxResult error() + { + return AjaxResult.error("操作失败"); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult error(String msg) + { + return AjaxResult.error(msg, null); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static AjaxResult error(String msg, Object data) + { + return new AjaxResult(Type.ERROR, msg, data); + } + + /** + * 是否为成功消息 + * + * @return 结果 + */ + public boolean isSuccess() + { + return Objects.equals(Type.SUCCESS.value, this.get(CODE_TAG)); + } + + /** + * 是否为警告消息 + * + * @return 结果 + */ + public boolean isWarn() + { + return Objects.equals(Type.WARN.value, this.get(CODE_TAG)); + } + + /** + * 是否为错误消息 + * + * @return 结果 + */ + public boolean isError() + { + return Objects.equals(Type.ERROR.value, this.get(CODE_TAG)); + } + + /** + * 方便链式调用 + * + * @param key 键 + * @param value 值 + * @return 数据对象 + */ + @Override + public AjaxResult put(String key, Object value) + { + super.put(key, value); + return this; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java new file mode 100644 index 0000000..15bf66b --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java @@ -0,0 +1,118 @@ +package com.ruoyi.common.core.domain; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; + +/** + * Entity基类 + * + * @author ruoyi + */ +public class BaseEntity implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 搜索值 */ + @JsonIgnore + private String searchValue; + + /** 创建者 */ + private String createBy; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** 更新者 */ + private String updateBy; + + /** 更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** 备注 */ + private String remark; + + /** 请求参数 */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private Map params; + + public String getSearchValue() + { + return searchValue; + } + + public void setSearchValue(String searchValue) + { + this.searchValue = searchValue; + } + + public String getCreateBy() + { + return createBy; + } + + public void setCreateBy(String createBy) + { + this.createBy = createBy; + } + + public Date getCreateTime() + { + return createTime; + } + + public void setCreateTime(Date createTime) + { + this.createTime = createTime; + } + + public String getUpdateBy() + { + return updateBy; + } + + public void setUpdateBy(String updateBy) + { + this.updateBy = updateBy; + } + + public Date getUpdateTime() + { + return updateTime; + } + + public void setUpdateTime(Date updateTime) + { + this.updateTime = updateTime; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } + + public Map getParams() + { + if (params == null) + { + params = new HashMap<>(); + } + return params; + } + + public void setParams(Map params) + { + this.params = params; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/CxSelect.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/CxSelect.java new file mode 100644 index 0000000..3cac069 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/CxSelect.java @@ -0,0 +1,69 @@ +package com.ruoyi.common.core.domain; + +import java.io.Serializable; +import java.util.List; + +/** + * CxSelect树结构实体类 + * + * @author ruoyi + */ +public class CxSelect implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** + * 数据值字段名称 + */ + private String v; + + /** + * 数据标题字段名称 + */ + private String n; + + /** + * 子集数据字段名称 + */ + private List s; + + public CxSelect() + { + } + + public CxSelect(String v, String n) + { + this.v = v; + this.n = n; + } + + public List getS() + { + return s; + } + + public void setN(String n) + { + this.n = n; + } + + public String getN() + { + return n; + } + + public void setS(List s) + { + this.s = s; + } + + public String getV() + { + return v; + } + + public void setV(String v) + { + this.v = v; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java new file mode 100644 index 0000000..67337dd --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java @@ -0,0 +1,114 @@ +package com.ruoyi.common.core.domain; + +import java.io.Serializable; + +/** + * 响应信息主体 + * + * @author ruoyi + */ +public class R implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 成功 */ + public static final int SUCCESS = 0; + + /** 失败 */ + public static final int FAIL = 500; + + private int code; + + private String msg; + + private T data; + + public static R ok() + { + return restResult(null, SUCCESS, "操作成功"); + } + + public static R ok(T data) + { + return restResult(data, SUCCESS, "操作成功"); + } + + public static R ok(T data, String msg) + { + return restResult(data, SUCCESS, msg); + } + + public static R fail() + { + return restResult(null, FAIL, "操作失败"); + } + + public static R fail(String msg) + { + return restResult(null, FAIL, msg); + } + + public static R fail(T data) + { + return restResult(data, FAIL, "操作失败"); + } + + public static R fail(T data, String msg) + { + return restResult(data, FAIL, msg); + } + + public static R fail(int code, String msg) + { + return restResult(null, code, msg); + } + + private static R restResult(T data, int code, String msg) + { + R apiResult = new R<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } + + public T getData() + { + return data; + } + + public void setData(T data) + { + this.data = data; + } + + public static Boolean isError(R ret) + { + return !isSuccess(ret); + } + + public static Boolean isSuccess(R ret) + { + return R.SUCCESS == ret.getCode(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java new file mode 100644 index 0000000..d5df8a5 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -0,0 +1,177 @@ +package com.ruoyi.common.core.domain.entity; + +import java.util.Date; +import java.util.List; +import javax.validation.constraints.*; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.annotation.Excel.Type; +import com.ruoyi.common.annotation.Excels; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.xss.Xss; + +/** + * 用户对象 sys_user + * + * @author ruoyi + */ +public class SysUser extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 用户ID */ + @Excel(name = "用户序号", type = Type.EXPORT, cellType = ColumnType.NUMERIC, prompt = "用户编号") + private Long userId; + + /** 登录名称 */ + @Excel(name = "登录名称") + private String loginName; + + /** 用户邮箱 */ + @Excel(name = "用户邮箱") + private String email; + + /** 密码 */ + private String password; + + /** 盐加密 */ + private String salt; + + /** 最后登录IP */ + @Excel(name = "最后登录IP", type = Type.EXPORT) + private String loginIp; + + /** 最后登录时间 */ + @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) + private Date loginDate; + + /** 密码最后更新时间 */ + private Date pwdUpdateDate; + + public SysUser() + { + + } + + public SysUser(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public boolean isAdmin() + { + return isAdmin(this.userId); + } + + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } + + @Xss(message = "登录账号不能包含脚本字符") + @NotBlank(message = "登录账号不能为空") + @Size(min = 0, max = 30, message = "登录账号长度不能超过30个字符") + public String getLoginName() + { + return loginName; + } + + public void setLoginName(String loginName) + { + this.loginName = loginName; + } + + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + + @JsonIgnore + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + @JsonIgnore + public String getSalt() + { + return salt; + } + + public void setSalt(String salt) + { + this.salt = salt; + } + + public String getLoginIp() + { + return loginIp; + } + + public void setLoginIp(String loginIp) + { + this.loginIp = loginIp; + } + + public Date getLoginDate() + { + return loginDate; + } + + public void setLoginDate(Date loginDate) + { + this.loginDate = loginDate; + } + + public Date getPwdUpdateDate() + { + return pwdUpdateDate; + } + + public void setPwdUpdateDate(Date pwdUpdateDate) + { + this.pwdUpdateDate = pwdUpdateDate; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("loginName", getLoginName()) + .append("email", getEmail()) + .append("password", getPassword()) + .append("salt", getSalt()) + .append("loginIp", getLoginIp()) + .append("loginDate", getLoginDate()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java new file mode 100644 index 0000000..61f6d85 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java @@ -0,0 +1,89 @@ +package com.ruoyi.common.core.page; + +import com.ruoyi.common.utils.StringUtils; + +/** + * 分页数据 + * + * @author ruoyi + */ +public class PageDomain +{ + /** 当前记录起始索引 */ + private Integer pageNum; + + /** 每页显示记录数 */ + private Integer pageSize; + + /** 排序列 */ + private String orderByColumn; + + /** 排序的方向desc或者asc */ + private String isAsc = "asc"; + + /** 分页参数合理化 */ + private Boolean reasonable = true; + + public String getOrderBy() + { + if (StringUtils.isEmpty(orderByColumn)) + { + return ""; + } + return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc; + } + + public Integer getPageNum() + { + return pageNum; + } + + public void setPageNum(Integer pageNum) + { + this.pageNum = pageNum; + } + + public Integer getPageSize() + { + return pageSize; + } + + public void setPageSize(Integer pageSize) + { + this.pageSize = pageSize; + } + + public String getOrderByColumn() + { + return orderByColumn; + } + + public void setOrderByColumn(String orderByColumn) + { + this.orderByColumn = orderByColumn; + } + + public String getIsAsc() + { + return isAsc; + } + + public void setIsAsc(String isAsc) + { + this.isAsc = isAsc; + } + + public Boolean getReasonable() + { + if (StringUtils.isNull(reasonable)) + { + return Boolean.TRUE; + } + return reasonable; + } + + public void setReasonable(Boolean reasonable) + { + this.reasonable = reasonable; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java new file mode 100644 index 0000000..373e592 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java @@ -0,0 +1,85 @@ +package com.ruoyi.common.core.page; + +import java.io.Serializable; +import java.util.List; + +/** + * 表格分页数据对象 + * + * @author ruoyi + */ +public class TableDataInfo implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 总记录数 */ + private long total; + + /** 列表数据 */ + private List rows; + + /** 消息状态码 */ + private int code; + + /** 消息内容 */ + private String msg; + + /** + * 表格数据对象 + */ + public TableDataInfo() + { + } + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public TableDataInfo(List list, int total) + { + this.rows = list; + this.total = total; + } + + public long getTotal() + { + return total; + } + + public void setTotal(long total) + { + this.total = total; + } + + public List getRows() + { + return rows; + } + + public void setRows(List rows) + { + this.rows = rows; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java new file mode 100644 index 0000000..a120c30 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java @@ -0,0 +1,56 @@ +package com.ruoyi.common.core.page; + +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.ServletUtils; + +/** + * 表格数据处理 + * + * @author ruoyi + */ +public class TableSupport +{ + /** + * 当前记录起始索引 + */ + public static final String PAGE_NUM = "pageNum"; + + /** + * 每页显示记录数 + */ + public static final String PAGE_SIZE = "pageSize"; + + /** + * 排序列 + */ + public static final String ORDER_BY_COLUMN = "orderByColumn"; + + /** + * 排序的方向 "desc" 或者 "asc". + */ + public static final String IS_ASC = "isAsc"; + + /** + * 分页参数合理化 + */ + public static final String REASONABLE = "reasonable"; + + /** + * 封装分页对象 + */ + public static PageDomain getPageDomain() + { + PageDomain pageDomain = new PageDomain(); + pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1)); + pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10)); + pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); + pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); + pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE)); + return pageDomain; + } + + public static PageDomain buildPageRequest() + { + return getPageDomain(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java new file mode 100644 index 0000000..c3a95a2 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java @@ -0,0 +1,74 @@ +package com.ruoyi.common.core.text; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import com.ruoyi.common.utils.StringUtils; + +/** + * 字符集工具类 + * + * @author ruoyi + */ +public class CharsetKit +{ + /** UTF-8 */ + public static final String UTF_8 = "UTF-8"; + /** GBK */ + public static final String GBK = "GBK"; + + /** UTF-8 */ + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + /** GBK */ + public static final Charset CHARSET_GBK = Charset.forName(GBK); + + /** + * 转换为Charset对象 + * + * @param charset 字符集,为空则返回默认字符集 + * @return Charset + */ + public static Charset charset(String charset) + { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, String srcCharset, String destCharset) + { + return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, Charset srcCharset, Charset destCharset) + { + if (null == srcCharset) + { + srcCharset = StandardCharsets.ISO_8859_1; + } + + if (null == destCharset) + { + destCharset = StandardCharsets.UTF_8; + } + + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) + { + return source; + } + return new String(source.getBytes(srcCharset), destCharset); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java new file mode 100644 index 0000000..edf9afc --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java @@ -0,0 +1,1010 @@ +package com.ruoyi.common.core.text; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; +import com.ruoyi.common.utils.StringUtils; +import org.apache.commons.lang3.ArrayUtils; + +/** + * 类型转换器 + * + * @author ruoyi + */ +public class Convert +{ + /** + * 转换为字符串
    + * 如果给定的值为null,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static String toStr(Object value, String defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof String) + { + return (String) value; + } + return value.toString(); + } + + /** + * 转换为字符串
    + * 如果给定的值为null,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static String toStr(Object value) + { + return toStr(value, null); + } + + /** + * 转换为字符
    + * 如果给定的值为null,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Character toChar(Object value, Character defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof Character) + { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 转换为字符
    + * 如果给定的值为null,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Character toChar(Object value) + { + return toChar(value, null); + } + + /** + * 转换为byte
    + * 如果给定的值为null,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Byte toByte(Object value, Byte defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Byte) + { + return (Byte) value; + } + if (value instanceof Number) + { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Byte.parseByte(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为byte
    + * 如果给定的值为null,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) + { + return toByte(value, null); + } + + /** + * 转换为Short
    + * 如果给定的值为null,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Short toShort(Object value, Short defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Short) + { + return (Short) value; + } + if (value instanceof Number) + { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Short.parseShort(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Short
    + * 如果给定的值为null,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) + { + return toShort(value, null); + } + + /** + * 转换为Number
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Number toNumber(Object value, Number defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Number) + { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return NumberFormat.getInstance().parse(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Number
    + * 如果给定的值为空,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) + { + return toNumber(value, null); + } + + /** + * 转换为int
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Integer toInt(Object value, Integer defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Integer) + { + return (Integer) value; + } + if (value instanceof Number) + { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Integer.parseInt(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为int
    + * 如果给定的值为null,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) + { + return toInt(value, null); + } + + /** + * 转换为Integer数组
    + * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) + { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
    + * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) + { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
    + * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Integer[] {}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 转换为Long数组
    + * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Long[] {}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 转换为String数组
    + * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) + { + if (StringUtils.isEmpty(str)) + { + return new String[] {}; + } + return toStrArray(",", str); + } + + /** + * 转换为String数组
    + * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) + { + return str.split(split); + } + + /** + * 转换为long
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Long toLong(Object value, Long defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Long) + { + return (Long) value; + } + if (value instanceof Number) + { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).longValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为long
    + * 如果给定的值为null,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) + { + return toLong(value, null); + } + + /** + * 转换为double
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Double toDouble(Object value, Double defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Double) + { + return (Double) value; + } + if (value instanceof Number) + { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).doubleValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为double
    + * 如果给定的值为空,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) + { + return toDouble(value, null); + } + + /** + * 转换为Float
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Float toFloat(Object value, Float defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Float) + { + return (Float) value; + } + if (value instanceof Number) + { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Float.parseFloat(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Float
    + * 如果给定的值为空,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) + { + return toFloat(value, null); + } + + /** + * 转换为boolean
    + * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Boolean toBool(Object value, Boolean defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Boolean) + { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) + { + case "true": + case "yes": + case "ok": + case "1": + return true; + case "false": + case "no": + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 转换为boolean
    + * 如果给定的值为空,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) + { + return toBool(value, null); + } + + /** + * 转换为Enum对象
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * + * @param clazz Enum的Class + * @param value 值 + * @param defaultValue 默认值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (clazz.isAssignableFrom(value.getClass())) + { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Enum.valueOf(clazz, valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Enum对象
    + * 如果给定的值为空,或者转换失败,返回默认值null
    + * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) + { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigInteger) + { + return (BigInteger) value; + } + if (value instanceof Long) + { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigInteger(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigInteger
    + * 如果给定的值为空,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) + { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigDecimal) + { + return (BigDecimal) value; + } + if (value instanceof Long) + { + return new BigDecimal((Long) value); + } + if (value instanceof Double) + { + return BigDecimal.valueOf((Double) value); + } + if (value instanceof Integer) + { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigDecimal(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigDecimal
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) + { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
    + * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) + { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 将对象转为字符串
    + * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charsetName 字符集 + * @return 字符串 + */ + public static String str(Object obj, String charsetName) + { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 将对象转为字符串
    + * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) + { + if (null == obj) + { + return null; + } + + if (obj instanceof String) + { + return (String) obj; + } + else if (obj instanceof byte[]) + { + return str((byte[]) obj, charset); + } + else if (obj instanceof Byte[]) + { + byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); + return str(bytes, charset); + } + else if (obj instanceof ByteBuffer) + { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 将byte数组转为字符串 + * + * @param bytes byte数组 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(byte[] bytes, String charset) + { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 解码字节码 + * + * @param data 字符串 + * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 + * @return 解码后的字符串 + */ + public static String str(byte[] data, Charset charset) + { + if (data == null) + { + return null; + } + + if (null == charset) + { + return new String(data); + } + return new String(data, charset); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, String charset) + { + if (data == null) + { + return null; + } + + return str(data, Charset.forName(charset)); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, Charset charset) + { + if (null == charset) + { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 全角半角转换 + /** + * 半角转全角 + * + * @param input String. + * @return 全角字符串. + */ + public static String toSBC(String input) + { + return toSBC(input, null); + } + + /** + * 半角转全角 + * + * @param input String + * @param notConvertSet 不替换的字符集合 + * @return 全角字符串. + */ + public static String toSBC(String input, Set notConvertSet) + { + char[] c = input.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == ' ') + { + c[i] = '\u3000'; + } + else if (c[i] < '\177') + { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 全角转半角 + * + * @param input String. + * @return 半角字符串 + */ + public static String toDBC(String input) + { + return toDBC(input, null); + } + + /** + * 替换全角为半角 + * + * @param text 文本 + * @param notConvertSet 不替换的字符集合 + * @return 替换后的字符 + */ + public static String toDBC(String text, Set notConvertSet) + { + char[] c = text.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == '\u3000') + { + c[i] = ' '; + } + else if (c[i] > '\uFF00' && c[i] < '\uFF5F') + { + c[i] = (char) (c[i] - 65248); + } + } + String returnString = new String(c); + + return returnString; + } + + /** + * 数字金额大写转换 先写个完整的然后将如零拾替换成零 + * + * @param n 数字 + * @return 中文大写数字 + */ + public static String digitUppercase(double n) + { + String[] fraction = { "角", "分" }; + String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; + String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } }; + + String head = n < 0 ? "负" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) + { + // 优化double计算精度丢失问题 + BigDecimal nNum = new BigDecimal(n); + BigDecimal decimal = new BigDecimal(10); + BigDecimal scale = nNum.multiply(decimal).setScale(2, RoundingMode.HALF_EVEN); + double d = scale.doubleValue(); + s += (digit[(int) (Math.floor(d * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); + } + if (s.length() < 1) + { + s = "整"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) + { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) + { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; + } + return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java new file mode 100644 index 0000000..c78ac77 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java @@ -0,0 +1,92 @@ +package com.ruoyi.common.core.text; + +import com.ruoyi.common.utils.StringUtils; + +/** + * 字符串格式化 + * + * @author ruoyi + */ +public class StrFormatter +{ + public static final String EMPTY_JSON = "{}"; + public static final char C_BACKSLASH = '\\'; + public static final char C_DELIM_START = '{'; + public static final char C_DELIM_END = '}'; + + /** + * 格式化字符串
    + * 此方法只是简单将占位符 {} 按照顺序替换为参数
    + * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
    + * 例:
    + * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
    + * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
    + * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
    + * + * @param strPattern 字符串模板 + * @param argArray 参数列表 + * @return 结果 + */ + public static String format(final String strPattern, final Object... argArray) + { + if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) + { + return strPattern; + } + final int strPatternLength = strPattern.length(); + + // 初始化定义好的长度以获得更好的性能 + StringBuilder sbuf = new StringBuilder(strPatternLength + 50); + + int handledPosition = 0; + int delimIndex;// 占位符所在位置 + for (int argIndex = 0; argIndex < argArray.length; argIndex++) + { + delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); + if (delimIndex == -1) + { + if (handledPosition == 0) + { + return strPattern; + } + else + { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 + sbuf.append(strPattern, handledPosition, strPatternLength); + return sbuf.toString(); + } + } + else + { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) + { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) + { + // 转义符之前还有一个转义符,占位符依旧有效 + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + else + { + // 占位符被转义 + argIndex--; + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(C_DELIM_START); + handledPosition = delimIndex + 1; + } + } + else + { + // 正常占位符 + sbuf.append(strPattern, handledPosition, delimIndex); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + } + } + // 加入最后一个占位符后所有的字符 + sbuf.append(strPattern, handledPosition, strPattern.length()); + + return sbuf.toString(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java new file mode 100644 index 0000000..c6640bb --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.enums; + +/** + * 操作状态 + * + * @author ruoyi + */ +public enum BusinessStatus +{ + /** + * 成功 + */ + SUCCESS, + + /** + * 失败 + */ + FAIL, +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java new file mode 100644 index 0000000..24d076a --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java @@ -0,0 +1,59 @@ +package com.ruoyi.common.enums; + +/** + * 业务操作类型 + * + * @author ruoyi + */ +public enum BusinessType +{ + /** + * 其它 + */ + OTHER, + + /** + * 新增 + */ + INSERT, + + /** + * 修改 + */ + UPDATE, + + /** + * 删除 + */ + DELETE, + + /** + * 授权 + */ + GRANT, + + /** + * 导出 + */ + EXPORT, + + /** + * 导入 + */ + IMPORT, + + /** + * 强退 + */ + FORCE, + + /** + * 生成代码 + */ + GENCODE, + + /** + * 清空 + */ + CLEAN, +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java new file mode 100644 index 0000000..0d945be --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.enums; + +/** + * 数据源 + * + * @author ruoyi + */ +public enum DataSourceType +{ + /** + * 主库 + */ + MASTER, + + /** + * 从库 + */ + SLAVE +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/DesensitizedType.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/DesensitizedType.java new file mode 100644 index 0000000..07f02ee --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/DesensitizedType.java @@ -0,0 +1,59 @@ +package com.ruoyi.common.enums; + +import java.util.function.Function; +import com.ruoyi.common.utils.DesensitizedUtil; + +/** + * 脱敏类型 + * + * @author ruoyi + */ +public enum DesensitizedType +{ + /** + * 姓名,第2位星号替换 + */ + USERNAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2")), + + /** + * 密码,全部字符都用*代替 + */ + PASSWORD(DesensitizedUtil::password), + + /** + * 身份证,中间10位星号替换 + */ + ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\d{3}[Xx]|\\d{4})", "$1** **** ****$2")), + + /** + * 手机号,中间4位星号替换 + */ + PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")), + + /** + * 电子邮箱,仅显示第一个字母和@后面的地址显示,其他星号替换 + */ + EMAIL(s -> s.replaceAll("(^.)[^@]*(@.*$)", "$1****$2")), + + /** + * 银行卡号,保留最后4位,其他星号替换 + */ + BANK_CARD(s -> s.replaceAll("\\d{15}(\\d{3})", "**** **** **** **** $1")), + + /** + * 车牌号码,包含普通车辆、新能源车辆 + */ + CAR_LICENSE(DesensitizedUtil::carLicense); + + private final Function desensitizer; + + DesensitizedType(Function desensitizer) + { + this.desensitizer = desensitizer; + } + + public Function desensitizer() + { + return desensitizer; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/OnlineStatus.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/OnlineStatus.java new file mode 100644 index 0000000..a05d5ff --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/OnlineStatus.java @@ -0,0 +1,24 @@ +package com.ruoyi.common.enums; + +/** + * 用户会话 + * + * @author ruoyi + */ +public enum OnlineStatus +{ + /** 用户状态 */ + on_line("在线"), off_line("离线"); + + private final String info; + + private OnlineStatus(String info) + { + this.info = info; + } + + public String getInfo() + { + return info; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java new file mode 100644 index 0000000..bdd143c --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java @@ -0,0 +1,24 @@ +package com.ruoyi.common.enums; + +/** + * 操作人类别 + * + * @author ruoyi + */ +public enum OperatorType +{ + /** + * 其它 + */ + OTHER, + + /** + * 后台用户 + */ + MANAGE, + + /** + * 手机端用户 + */ + MOBILE +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java new file mode 100644 index 0000000..d7ff44a --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java @@ -0,0 +1,30 @@ +package com.ruoyi.common.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum UserStatus +{ + OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除"); + + private final String code; + private final String info; + + UserStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java new file mode 100644 index 0000000..f6ad2ab --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java @@ -0,0 +1,15 @@ +package com.ruoyi.common.exception; + +/** + * 演示模式异常 + * + * @author ruoyi + */ +public class DemoModeException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + public DemoModeException() + { + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java new file mode 100644 index 0000000..81a71b5 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java @@ -0,0 +1,58 @@ +package com.ruoyi.common.exception; + +/** + * 全局异常 + * + * @author ruoyi + */ +public class GlobalException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public GlobalException() + { + } + + public GlobalException(String message) + { + this.message = message; + } + + public String getDetailMessage() + { + return detailMessage; + } + + public GlobalException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } + + @Override + public String getMessage() + { + return message; + } + + public GlobalException setMessage(String message) + { + this.message = message; + return this; + } +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java new file mode 100644 index 0000000..7f053a3 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java @@ -0,0 +1,58 @@ +package com.ruoyi.common.exception; + +/** + * 业务异常 + * + * @author ruoyi + */ +public final class ServiceException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() + { + } + + public ServiceException(String message) + { + this.message = message; + } + + public String getDetailMessage() + { + return detailMessage; + } + + public ServiceException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } + + @Override + public String getMessage() + { + return message; + } + + public ServiceException setMessage(String message) + { + this.message = message; + return this; + } +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/UtilException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/UtilException.java new file mode 100644 index 0000000..980fa46 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/UtilException.java @@ -0,0 +1,26 @@ +package com.ruoyi.common.exception; + +/** + * 工具类异常 + * + * @author ruoyi + */ +public class UtilException extends RuntimeException +{ + private static final long serialVersionUID = 8247610319171014183L; + + public UtilException(Throwable e) + { + super(e.getMessage(), e); + } + + public UtilException(String message) + { + super(message); + } + + public UtilException(String message, Throwable throwable) + { + super(message, throwable); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java new file mode 100644 index 0000000..b55d72e --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java @@ -0,0 +1,97 @@ +package com.ruoyi.common.exception.base; + +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * 基础异常 + * + * @author ruoyi + */ +public class BaseException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 所属模块 + */ + private String module; + + /** + * 错误码 + */ + private String code; + + /** + * 错误码对应的参数 + */ + private Object[] args; + + /** + * 错误消息 + */ + private String defaultMessage; + + public BaseException(String module, String code, Object[] args, String defaultMessage) + { + this.module = module; + this.code = code; + this.args = args; + this.defaultMessage = defaultMessage; + } + + public BaseException(String module, String code, Object[] args) + { + this(module, code, args, null); + } + + public BaseException(String module, String defaultMessage) + { + this(module, null, null, defaultMessage); + } + + public BaseException(String code, Object[] args) + { + this(null, code, args, null); + } + + public BaseException(String defaultMessage) + { + this(null, null, null, defaultMessage); + } + + @Override + public String getMessage() + { + String message = null; + if (!StringUtils.isEmpty(code)) + { + message = MessageUtils.message(code, args); + } + if (message == null) + { + message = defaultMessage; + } + return message; + } + + public String getModule() + { + return module; + } + + public String getCode() + { + return code; + } + + public Object[] getArgs() + { + return args; + } + + public String getDefaultMessage() + { + return defaultMessage; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java new file mode 100644 index 0000000..871f09b --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.exception.file; + +import com.ruoyi.common.exception.base.BaseException; + +/** + * 文件信息异常类 + * + * @author ruoyi + */ +public class FileException extends BaseException +{ + private static final long serialVersionUID = 1L; + + public FileException(String code, Object[] args) + { + super("file", code, args, null); + } + +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java new file mode 100644 index 0000000..70e0ec9 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.file; + +/** + * 文件名称超长限制异常类 + * + * @author ruoyi + */ +public class FileNameLengthLimitExceededException extends FileException +{ + private static final long serialVersionUID = 1L; + + public FileNameLengthLimitExceededException(int defaultFileNameLength) + { + super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java new file mode 100644 index 0000000..ec6ab05 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.file; + +/** + * 文件名大小限制异常类 + * + * @author ruoyi + */ +public class FileSizeLimitExceededException extends FileException +{ + private static final long serialVersionUID = 1L; + + public FileSizeLimitExceededException(long defaultMaxSize) + { + super("upload.exceed.maxSize", new Object[] { defaultMaxSize }); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileUploadException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileUploadException.java new file mode 100644 index 0000000..f45e7ef --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileUploadException.java @@ -0,0 +1,61 @@ +package com.ruoyi.common.exception.file; + +import java.io.PrintStream; +import java.io.PrintWriter; + +/** + * 文件上传异常类 + * + * @author ruoyi + */ +public class FileUploadException extends Exception +{ + + private static final long serialVersionUID = 1L; + + private final Throwable cause; + + public FileUploadException() + { + this(null, null); + } + + public FileUploadException(final String msg) + { + this(msg, null); + } + + public FileUploadException(String msg, Throwable cause) + { + super(msg); + this.cause = cause; + } + + @Override + public void printStackTrace(PrintStream stream) + { + super.printStackTrace(stream); + if (cause != null) + { + stream.println("Caused by:"); + cause.printStackTrace(stream); + } + } + + @Override + public void printStackTrace(PrintWriter writer) + { + super.printStackTrace(writer); + if (cause != null) + { + writer.println("Caused by:"); + cause.printStackTrace(writer); + } + } + + @Override + public Throwable getCause() + { + return cause; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java new file mode 100644 index 0000000..b805fc1 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java @@ -0,0 +1,80 @@ +package com.ruoyi.common.exception.file; + +import java.util.Arrays; + +/** + * 文件上传 误异常类 + * + * @author ruoyi + */ +public class InvalidExtensionException extends FileUploadException +{ + private static final long serialVersionUID = 1L; + + private String[] allowedExtension; + private String extension; + private String filename; + + public InvalidExtensionException(String[] allowedExtension, String extension, String filename) + { + super("文件[" + filename + "]后缀[" + extension + "]不正确,请上传" + Arrays.toString(allowedExtension) + "格式"); + this.allowedExtension = allowedExtension; + this.extension = extension; + this.filename = filename; + } + + public String[] getAllowedExtension() + { + return allowedExtension; + } + + public String getExtension() + { + return extension; + } + + public String getFilename() + { + return filename; + } + + public static class InvalidImageExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidFlashExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidMediaExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidVideoExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java new file mode 100644 index 0000000..a567b40 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java @@ -0,0 +1,34 @@ +package com.ruoyi.common.exception.job; + +/** + * 计划策略异常 + * + * @author ruoyi + */ +public class TaskException extends Exception +{ + private static final long serialVersionUID = 1L; + + private Code code; + + public TaskException(String msg, Code code) + { + this(msg, code, null); + } + + public TaskException(String msg, Code code, Exception nestedEx) + { + super(msg, nestedEx); + this.code = code; + } + + public Code getCode() + { + return code; + } + + public enum Code + { + TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE + } +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/BlackListException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/BlackListException.java new file mode 100644 index 0000000..2bf5038 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/BlackListException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.user; + +/** + * 黑名单IP异常类 + * + * @author ruoyi + */ +public class BlackListException extends UserException +{ + private static final long serialVersionUID = 1L; + + public BlackListException() + { + super("login.blocked", null); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java new file mode 100644 index 0000000..389dbc7 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.user; + +/** + * 验证码错误异常类 + * + * @author ruoyi + */ +public class CaptchaException extends UserException +{ + private static final long serialVersionUID = 1L; + + public CaptchaException() + { + super("user.jcaptcha.error", null); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/RoleBlockedException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/RoleBlockedException.java new file mode 100644 index 0000000..1c4fd4a --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/RoleBlockedException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.user; + +/** + * 角色锁定异常类 + * + * @author ruoyi + */ +public class RoleBlockedException extends UserException +{ + private static final long serialVersionUID = 1L; + + public RoleBlockedException() + { + super("role.blocked", null); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserBlockedException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserBlockedException.java new file mode 100644 index 0000000..5150f52 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserBlockedException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.user; + +/** + * 用户锁定异常类 + * + * @author ruoyi + */ +public class UserBlockedException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserBlockedException() + { + super("user.blocked", null); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserDeleteException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserDeleteException.java new file mode 100644 index 0000000..3520030 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserDeleteException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.user; + +/** + * 用户账号已被删除 + * + * @author ruoyi + */ +public class UserDeleteException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserDeleteException() + { + super("user.password.delete", null); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java new file mode 100644 index 0000000..c292d70 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.exception.user; + +import com.ruoyi.common.exception.base.BaseException; + +/** + * 用户信息异常类 + * + * @author ruoyi + */ +public class UserException extends BaseException +{ + private static final long serialVersionUID = 1L; + + public UserException(String code, Object[] args) + { + super("user", code, args, null); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserNotExistsException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserNotExistsException.java new file mode 100644 index 0000000..eff8181 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserNotExistsException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.user; + +/** + * 用户不存在异常类 + * + * @author ruoyi + */ +public class UserNotExistsException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserNotExistsException() + { + super("user.not.exists", null); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java new file mode 100644 index 0000000..a7f3e5f --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.user; + +/** + * 用户密码不正确或不符合规范异常类 + * + * @author ruoyi + */ +public class UserPasswordNotMatchException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordNotMatchException() + { + super("user.password.not.match", null); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitCountException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitCountException.java new file mode 100644 index 0000000..7ead89b --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitCountException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.user; + +/** + * 用户错误记数异常类 + * + * @author ruoyi + */ +public class UserPasswordRetryLimitCountException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordRetryLimitCountException(int retryLimitCount) + { + super("user.password.retry.limit.count", new Object[] { retryLimitCount }); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java new file mode 100644 index 0000000..b5ccfb9 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.user; + +/** + * 用户错误最大次数异常类 + * + * @author ruoyi + */ +public class UserPasswordRetryLimitExceedException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordRetryLimitExceedException(int retryLimitCount) + { + super("user.password.retry.limit.exceed", new Object[] { retryLimitCount }); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/json/JSON.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/json/JSON.java new file mode 100644 index 0000000..1e5b928 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/json/JSON.java @@ -0,0 +1,187 @@ +package com.ruoyi.common.json; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; + +/** + * JSON解析处理 + * + * @author ruoyi + */ +public class JSON +{ + public static final String DEFAULT_FAIL = "\"Parse failed\""; + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final ObjectWriter objectWriter = objectMapper.writerWithDefaultPrettyPrinter(); + + public static void marshal(File file, Object value) throws Exception + { + try + { + objectWriter.writeValue(file, value); + } + catch (JsonGenerationException e) + { + throw new Exception(e); + } + catch (JsonMappingException e) + { + throw new Exception(e); + } + catch (IOException e) + { + throw new Exception(e); + } + } + + public static void marshal(OutputStream os, Object value) throws Exception + { + try + { + objectWriter.writeValue(os, value); + } + catch (JsonGenerationException e) + { + throw new Exception(e); + } + catch (JsonMappingException e) + { + throw new Exception(e); + } + catch (IOException e) + { + throw new Exception(e); + } + } + + public static String marshal(Object value) throws Exception + { + try + { + return objectWriter.writeValueAsString(value); + } + catch (JsonGenerationException e) + { + throw new Exception(e); + } + catch (JsonMappingException e) + { + throw new Exception(e); + } + catch (IOException e) + { + throw new Exception(e); + } + } + + public static byte[] marshalBytes(Object value) throws Exception + { + try + { + return objectWriter.writeValueAsBytes(value); + } + catch (JsonGenerationException e) + { + throw new Exception(e); + } + catch (JsonMappingException e) + { + throw new Exception(e); + } + catch (IOException e) + { + throw new Exception(e); + } + } + + public static T unmarshal(File file, Class valueType) throws Exception + { + try + { + return objectMapper.readValue(file, valueType); + } + catch (JsonParseException e) + { + throw new Exception(e); + } + catch (JsonMappingException e) + { + throw new Exception(e); + } + catch (IOException e) + { + throw new Exception(e); + } + } + + public static T unmarshal(InputStream is, Class valueType) throws Exception + { + try + { + return objectMapper.readValue(is, valueType); + } + catch (JsonParseException e) + { + throw new Exception(e); + } + catch (JsonMappingException e) + { + throw new Exception(e); + } + catch (IOException e) + { + throw new Exception(e); + } + } + + public static T unmarshal(String str, Class valueType) throws Exception + { + try + { + return objectMapper.readValue(str, valueType); + } + catch (JsonParseException e) + { + throw new Exception(e); + } + catch (JsonMappingException e) + { + throw new Exception(e); + } + catch (IOException e) + { + throw new Exception(e); + } + } + + public static T unmarshal(byte[] bytes, Class valueType) throws Exception + { + try + { + if (bytes == null) + { + bytes = new byte[0]; + } + return objectMapper.readValue(bytes, 0, bytes.length, valueType); + } + catch (JsonParseException e) + { + throw new Exception(e); + } + catch (JsonMappingException e) + { + throw new Exception(e); + } + catch (IOException e) + { + throw new Exception(e); + } + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/json/JSONObject.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/json/JSONObject.java new file mode 100644 index 0000000..2f4afe7 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/json/JSONObject.java @@ -0,0 +1,749 @@ +package com.ruoyi.common.json; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.ruoyi.common.utils.StringUtils; + +/** + * 通用消息对象,基于Map实现的可嵌套数据结构。 支持JSON数据结构。 + * + * @author ruoyi + */ +public class JSONObject extends LinkedHashMap +{ + private static final long serialVersionUID = 1L; + private static final Pattern arrayNamePattern = Pattern.compile("(\\w+)((\\[\\d+\\])+)"); + private static final ObjectMapper objectMapper = new ObjectMapper(); + + /** + * 数组结构。 + */ + public static class JSONArray extends ArrayList + { + private static final long serialVersionUID = 1L; + + public JSONArray() + { + super(); + } + + public JSONArray(int size) + { + super(size); + } + + @Override + public String toString() + { + try + { + return JSON.marshal(this); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + + @Override + public Object set(int index, Object element) + { + return super.set(index, transfer(element)); + } + + @Override + public boolean add(Object element) + { + return super.add(transfer(element)); + } + + @Override + public void add(int index, Object element) + { + super.add(index, transfer(element)); + } + } + + public JSONObject() + { + super(); + } + + public JSONObject(final JSONObject other) + { + super(other); + } + + @Override + public String toString() + { + try + { + return JSON.marshal(this); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + + /** + * 转换为紧凑格式的字符串。 + * + * @return 返回本对象紧凑格式字符串。 + */ + public String toCompactString() + { + try + { + return objectMapper.writeValueAsString(this); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + + /** + * 获取指定字段的整数值。如果字段不存在,或者无法转换为整数,返回null。 + * + * @param name 字段名,支持多级。 + * @return 返回指定的整数值,或者null。 + */ + public Integer intValue(final String name) + { + return valueAsInt(value(name)); + } + + /** + * 获取指定字段的整数值。如果字段不存在,或者无法转换为整数,返回defaultValue。 + * + * @param name 字段名,支持多级。 + * @param defaultValue 查询失败时,返回的值。 + * @return 返回指定的整数值,或者defaultValue。 + */ + public Integer intValue(final String name, final Integer defaultValue) + { + return StringUtils.nvl(intValue(name), defaultValue); + } + + /** + * 获取指定字段的长整数值。如果字段不存在,或者无法转换为长整数,返回null。 + * + * @param name 字段名,支持多级。 + * @return 返回指定的长整数值,或者null。 + */ + public Long longValue(final String name) + { + return valueAsLong(value(name)); + } + + /** + * 获取指定字段的长整数值。如果字段不存在,或者无法转换为长整数,返回defaultValue。 + * + * @param name 字段名,支持多级。 + * @param defaultValue 查询失败时,返回的值。 + * @return 返回指定的长整数值,或者defaultValue。 + */ + public Long longValue(final String name, final Long defaultValue) + { + return StringUtils.nvl(longValue(name), defaultValue); + } + + /** + * 获取指定字段的布尔值。如果字段不存在,或者无法转换为布尔型,返回null。 + * + * @param name 字段名,支持多级。 + * @return 返回指定的布尔值,或者null。 + */ + public Boolean boolValue(final String name) + { + return valueAsBool(value(name)); + } + + /** + * 获取指定字段的布尔值。如果字段不存在,或者无法转换为布尔型,返回defaultValue。 + * + * @param name 字段名,支持多级。 + * @param defaultValue 查询失败时,返回的值。 + * @return 返回指定的布尔值,或者defaultValue。 + */ + public Boolean boolValue(final String name, final Boolean defaultValue) + { + return StringUtils.nvl(boolValue(name), defaultValue); + } + + /** + * 获取指定字段的字符串值。如果字段不存在,返回null。 + * + * @param name 字段名,支持多级。 + * @return 返回指定的字符串值,或者null。 + */ + public String strValue(final String name) + { + return valueAsStr(value(name)); + } + + /** + * 获取指定字段的字符串值。如果字段不存在,返回defaultValue。 + * + * @param name 字段名,支持多级。 + * @param defaultValue 查询失败时,返回的值。 + * @return 返回指定的字符串值,或者defaultValue。 + */ + public String strValue(final String name, final String defaultValue) + { + return StringUtils.nvl(strValue(name), defaultValue); + } + + /** + * 获取指定字段的值。 + * + * @param name 字段名,支持多级,支持数组下标。 + * @return 返回指定字段的值。 + */ + public Object value(final String name) + { + final int indexDot = name.indexOf('.'); + if (indexDot >= 0) + { + return obj(name.substring(0, indexDot)).value(name.substring(indexDot + 1)); + } + else + { + final Matcher matcher = arrayNamePattern.matcher(name); + if (matcher.find()) + { + return endArray(matcher.group(1), matcher.group(2), new EndArrayCallback() + { + @Override + public Object callback(JSONArray arr, int index) + { + return elementAt(arr, index); + } + }); + } + else + { + return get(name); + } + } + } + + /** + * 设置指定字段的值。 + * + * @param name 字段名,支持多级,支持数组下标。 + * @param value 字段值。 + * @return 返回本对象。 + */ + public JSONObject value(final String name, final Object value) + { + final int indexDot = name.indexOf('.'); + if (indexDot >= 0) + { + obj(name.substring(0, indexDot)).value(name.substring(indexDot + 1), value); + } + else + { + final Matcher matcher = arrayNamePattern.matcher(name); + if (matcher.find()) + { + endArray(matcher.group(1), matcher.group(2), new EndArrayCallback() + { + @Override + public Void callback(JSONArray arr, int index) + { + elementAt(arr, index, value); + return null; + } + }); + } + else + { + set(name, value); + } + } + return this; + } + + /** + * 获取对象(非标量类型)字段。返回的数据是一个结构体。当不存在指定对象时,则为指定的名字创建一个空的MessageObject对象。 + * + * @param name 字段名。不支持多级名字,支持数组下标。 + * @return 返回指定的对象。如果对象不存在,则为指定的名字创建一个空的MessageObject对象。 + */ + public JSONObject obj(final String name) + { + final Matcher matcher = arrayNamePattern.matcher(name); + if (matcher.find()) + { + return endArray(matcher.group(1), matcher.group(2), new EndArrayCallback() + { + @Override + public JSONObject callback(JSONArray arr, int index) + { + return objAt(arr, index); + } + }); + } + else + { + JSONObject obj = getObj(name); + if (obj == null) + { + obj = new JSONObject(); + put(name, obj); + } + return obj; + } + } + + /** + * 获取数组字段。将名字对应的对象以数组对象返回,当指定的字段不存在时,创建一个空的数组。 + * + * @param name 字段名。不支持多级名字,不支持下标。 + * @return 返回一个数组(List)。 + */ + public JSONArray arr(final String name) + { + JSONArray arr = getArr(name); + if (arr == null) + { + arr = new JSONArray(); + put(name, arr); + } + return arr; + } + + /** + * 获取对象(非标量类型)字段。返回的数据是一个结构体。 + * + * @param name 字段名。 + * @return 返回指定的对象字段。 + */ + public JSONObject getObj(final String name) + { + return (JSONObject) get(name); + } + + /** + * 获取数组类型字段。 + * + * @param name 字段名。 + * @return 返回数组类型字段。 + */ + public JSONArray getArr(final String name) + { + return (JSONArray) get(name); + } + + /** + * 返回字段整数值。如果不存在,返回null。 + * + * @param name 字段名。 + * @return 返回指定字段整数值。 + */ + public Integer getInt(final String name) + { + return valueAsInt(get(name)); + } + + /** + * 返回字段整数值。如果不存在,返回defaultValue。 + * + * @param name 字段名。 + * @param defaultValue 字段不存在时,返回的值。 + * @return 返回指定字段整数值。 + */ + public Integer getInt(final String name, Integer defaultValue) + { + return StringUtils.nvl(getInt(name), defaultValue); + } + + /** + * 返回字段长整数值。如果不存在,返回null。 + * + * @param name 字段名。 + * @return 返回指定字段长整数值。 + */ + public Long getLong(final String name) + { + return valueAsLong(get(name)); + } + + /** + * 返回字段长整数值。如果不存在,返回defaultValue。 + * + * @param name 字段名。 + * @param defaultValue 字段不存在时,返回的值。 + * @return 返回指定字段长整数值。 + */ + public Long getLong(final String name, Long defaultValue) + { + return StringUtils.nvl(getLong(name), defaultValue); + } + + /** + * 返回字段字符串值。如果不存在,返回null。 + * + * @param name 字段名。 + * @return 返回指定字段字符串值。 + */ + public String getStr(final String name) + { + return valueAsStr(get(name)); + } + + /** + * 返回字段字符串值。如果不存在,返回defaultValue。 + * + * @param name 字段名。 + * @param defaultValue 字段不存在时,返回的值。 + * @return 返回指定字段字符串值。 + */ + public String getStr(final String name, final String defaultValue) + { + return StringUtils.nvl(getStr(name), defaultValue); + } + + /** + * 字段值按照布尔类型返回。如果不存在,返回null。 + * + * @param name 字段名。 + * @return 字段值。 + */ + public Boolean getBool(final String name) + { + return valueAsBool(get(name)); + } + + /** + * 字段值按照布尔类型返回。如果不存在,返回defaultValue。 + * + * @param name 字段名。 + * @param defaultValue 字段不存在时,返回的值。 + * @return 字段值。 + */ + public Boolean getBool(final String name, final Boolean defaultValue) + { + return StringUtils.nvl(getBool(name), defaultValue); + } + + /** + * 设置字段值 + * + * @param name 字段名 + * @param value 字段值(标量:数字、字符串、布尔型;结构体:MessageObject)。 如果是Map类型同时非MessageObject类型,则自动转换为MessageObject类型再存入 + * (此时,再修改Map中的数据,将不会体现到本对象中)。 + * @return 返回本对象 + */ + public JSONObject set(final String name, final Object value) + { + put(name, value); + return this; + } + + /** + * 将本对象转换为Java Bean。 + * + * @param beanClass Java Bean的类对象。 + * @return 返回转换后的Java Bean。 + */ + public T asBean(Class beanClass) + { + try + { + return JSON.unmarshal(JSON.marshal(this), beanClass); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + + /** + * 重载基类的方法。如果 value 是 Map 类型,但不是 MessageObject 类型,则创建一个包含内容等同于原 Map 的 MessageObject 作为 value(注意:此后再更改 Map 的内容,将不会反映到 + * MessageObject 中)。 重载此方法的目的是为了使JSON能够正确地解析为MessageObject对象。不建议直接调用此方法,请使用 set(name, value)方法设置字段值。 + */ + @Override + public Object put(String key, Object value) + { + return super.put(key, transfer(value)); + } + + public static Integer valueAsInt(Object value) + { + if (value instanceof Integer) + { + return (Integer) value; + } + else if (value instanceof Number) + { + return ((Number) value).intValue(); + } + else if (value instanceof String) + { + return Integer.valueOf((String) value); + } + else if (value instanceof Boolean) + { + return ((Boolean) value) ? 1 : 0; + } + else + { + return null; + } + } + + public static Long valueAsLong(Object value) + { + if (value instanceof Long) + { + return (Long) value; + } + else if (value instanceof Number) + { + return ((Number) value).longValue(); + } + else if (value instanceof String) + { + return Long.valueOf((String) value); + } + else if (value instanceof Boolean) + { + return ((Boolean) value) ? 1L : 0L; + } + else + { + return null; + } + } + + public static String valueAsStr(Object value) + { + if (value instanceof String) + { + return (String) value; + } + else if (value != null) + { + return value.toString(); + } + else + { + return null; + } + } + + public static Boolean valueAsBool(Object value) + { + if (value instanceof Boolean) + { + return (Boolean) value; + } + else if (value instanceof Number) + { + return ((Number) value).doubleValue() != 0.0; + } + else if (value instanceof String) + { + return Boolean.valueOf((String) value); + } + else + { + return null; + } + } + + /** + * 将所有层次中凡是Map类型同时又不是MessageObject的类型,转换为MessageObject类型。 + * + * @param value 值。 + * @return 返回转换后的值。 + */ + @SuppressWarnings("unchecked") + private static Object transfer(final Object value) + { + if (!(value instanceof JSONObject) && value instanceof Map) + { + return toObj((Map) value); + } + else if (!(value instanceof JSONArray) && value instanceof Collection) + { + return toArr((Collection) value); + } + else + { + return value; + } + } + + private static JSONArray toArr(final Collection list) + { + final JSONArray arr = new JSONArray(list.size()); + for (final Object element : list) + { + arr.add(element); + } + return arr; + } + + private static JSONObject toObj(final Map map) + { + final JSONObject obj = new JSONObject(); + for (final Map.Entry ent : map.entrySet()) + { + obj.put(ent.getKey(), transfer(ent.getValue())); + } + return obj; + } + + /** + * 将指定下标元素作为数组返回,如果不存在,则在该位置创建一个空的数组。 + * + * @param arr 当前数组。 + * @param index 下标。 + * @return 返回当前数组指定下标的元素,该元素应该是一个数组。 + */ + private static JSONArray arrayAt(JSONArray arr, int index) + { + expand(arr, index); + if (arr.get(index) == null) + { + arr.set(index, new JSONArray()); + } + return (JSONArray) arr.get(index); + } + + /** + * 将指定下标元素作为结构体返回,如果不存在,则在该位置创建一个空的结构体。 + * + * @param arr 当前数组。 + * @param index 下标。 + * @return 返回当前数组指定下标元素,该元素是一个结构体。 + */ + private static JSONObject objAt(final JSONArray arr, int index) + { + expand(arr, index); + if (arr.get(index) == null) + { + arr.set(index, new JSONObject()); + } + return (JSONObject) arr.get(index); + } + + /** + * 设置数组指定下标位置的值。 + * + * @param arr 数组。 + * @param index 下标。 + * @param value 值。 + */ + private static void elementAt(final JSONArray arr, final int index, final Object value) + { + expand(arr, index).set(index, value); + } + + /** + * 获取数组指定下标元素的值。 + * + * @param arr 数组。 + * @param index 下标。 + * @return 值。 + */ + private static Object elementAt(final JSONArray arr, final int index) + { + return expand(arr, index).get(index); + } + + /** + * 扩展数组到指定下标,以防止访问时下标越界。 + * + * @param arr 数组 + * @param index 下标 + * @return 返回传入的数组 + */ + private static JSONArray expand(final JSONArray arr, final int index) + { + while (arr.size() <= index) + { + arr.add(null); + } + return arr; + } + + /** + * 最后数组回调。 + * + * @author Mike + * + * @param 回调返回数据类型。 + */ + private interface EndArrayCallback + { + /** + * 当定位到最后一级数组,将调用本方法。 + * + * @param arr 最后一级数组对象。 + * @param index 最后一级索引。 + * @return 返回回调的返回值。 + */ + T callback(JSONArray arr, int index); + } + + /** + * 处理多维数组的工具函数(包括一维数组)。多维数组的名字如:arrary[1][2][3], 则name=array,indexStr=[1][2][3],在callback中,endArr将是 + * array[1][2]指定的对象,indexe=3。 + * + * @param name 不带下标的名字,不支持多级名字。 + * @param indexesStr 索引部分的字符串,如:[1][2][3] + * @param callback 回调函数。 + * @return 返回回调函数的返回值。 + */ + private T endArray(final String name, final String indexesStr, final EndArrayCallback callback) + { + JSONArray endArr = arr(name); + final int[] indexes = parseIndexes(indexesStr); + int i = 0; + while (i < indexes.length - 1) + { + endArr = arrayAt(endArr, indexes[i++]); + } + return callback.callback(endArr, indexes[i]); + } + + private static int[] parseIndexes(final String s) + { + int[] indexes = null; + List list = new ArrayList(); + + final StringTokenizer st = new StringTokenizer(s, "[]"); + while (st.hasMoreTokens()) + { + final int index = Integer.valueOf(st.nextToken()); + if (index < 0) + { + throw new RuntimeException(String.format("Illegal index %1$d in \"%2$s\"", index, s)); + } + + list.add(index); + } + + indexes = new int[list.size()]; + int i = 0; + for (Integer tmp : list.toArray(new Integer[list.size()])) + { + indexes[i++] = tmp; + } + + return indexes; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/AddressUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/AddressUtils.java new file mode 100644 index 0000000..9afafc1 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/AddressUtils.java @@ -0,0 +1,54 @@ +package com.ruoyi.common.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.http.HttpUtils; + +/** + * 获取地址类 + * + * @author ruoyi + */ +public class AddressUtils +{ + private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); + + // IP地址查询 + public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; + + // 未知地址 + public static final String UNKNOWN = "XX XX"; + + public static String getRealAddressByIP(String ip) + { + // 内网不查询 + if (IpUtils.internalIp(ip)) + { + return "内网IP"; + } + if (RuoYiConfig.isAddressEnabled()) + { + try + { + String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); + if (StringUtils.isEmpty(rspStr)) + { + log.error("获取地理位置异常 {}", ip); + return UNKNOWN; + } + JSONObject obj = JSONObject.parseObject(rspStr); + String region = obj.getString("pro"); + String city = obj.getString("city"); + return String.format("%s %s", region, city); + } + catch (Exception e) + { + log.error("获取地理位置异常 {}", e); + } + } + return UNKNOWN; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java new file mode 100644 index 0000000..b6326c2 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java @@ -0,0 +1,114 @@ +package com.ruoyi.common.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 精确的浮点数运算 + * + * @author ruoyi + */ +public class Arith +{ + + /** 默认除法运算精度 */ + private static final int DEF_DIV_SCALE = 10; + + /** 这个类不能实例化 */ + private Arith() + { + } + + /** + * 提供精确的加法运算。 + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static double add(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).doubleValue(); + } + + /** + * 提供精确的减法运算。 + * @param v1 被减数 + * @param v2 减数 + * @return 两个参数的差 + */ + public static double sub(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.subtract(b2).doubleValue(); + } + + /** + * 提供精确的乘法运算。 + * @param v1 被乘数 + * @param v2 乘数 + * @return 两个参数的积 + */ + public static double mul(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).doubleValue(); + } + + /** + * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 + * 小数点以后10位,以后的数字四舍五入。 + * @param v1 被除数 + * @param v2 除数 + * @return 两个参数的商 + */ + public static double div(double v1, double v2) + { + return div(v1, v2, DEF_DIV_SCALE); + } + + /** + * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 + * 定精度,以后的数字四舍五入。 + * @param v1 被除数 + * @param v2 除数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的商 + */ + public static double div(double v1, double v2, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + if (b1.compareTo(BigDecimal.ZERO) == 0) + { + return BigDecimal.ZERO.doubleValue(); + } + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); + } + + /** + * 提供精确的小数位四舍五入处理。 + * @param v 需要四舍五入的数字 + * @param scale 小数点后保留几位 + * @return 四舍五入后的结果 + */ + public static double round(double v, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b = new BigDecimal(Double.toString(v)); + BigDecimal one = BigDecimal.ONE; + return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/CacheUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/CacheUtils.java new file mode 100644 index 0000000..ae27682 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/CacheUtils.java @@ -0,0 +1,197 @@ +package com.ruoyi.common.utils; + +import java.util.Iterator; +import java.util.Set; +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheManager; +import org.apache.shiro.cache.ehcache.EhCacheManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.utils.spring.SpringUtils; + +/** + * Cache工具类 + * + * @author ruoyi + */ +public class CacheUtils +{ + private static Logger logger = LoggerFactory.getLogger(CacheUtils.class); + + private static CacheManager cacheManager = SpringUtils.getBean(CacheManager.class); + + private static final String SYS_CACHE = "sys-cache"; + + /** + * 获取SYS_CACHE缓存 + * + * @param key + * @return + */ + public static Object get(String key) + { + return get(SYS_CACHE, key); + } + + /** + * 获取SYS_CACHE缓存 + * + * @param key + * @param defaultValue + * @return + */ + public static Object get(String key, Object defaultValue) + { + Object value = get(key); + return value != null ? value : defaultValue; + } + + /** + * 写入SYS_CACHE缓存 + * + * @param key + * @return + */ + public static void put(String key, Object value) + { + put(SYS_CACHE, key, value); + } + + /** + * 从SYS_CACHE缓存中移除 + * + * @param key + * @return + */ + public static void remove(String key) + { + remove(SYS_CACHE, key); + } + + /** + * 获取缓存 + * + * @param cacheName + * @param key + * @return + */ + public static Object get(String cacheName, String key) + { + return getCache(cacheName).get(getKey(key)); + } + + /** + * 获取缓存 + * + * @param cacheName + * @param key + * @param defaultValue + * @return + */ + public static Object get(String cacheName, String key, Object defaultValue) + { + Object value = get(cacheName, getKey(key)); + return value != null ? value : defaultValue; + } + + /** + * 写入缓存 + * + * @param cacheName + * @param key + * @param value + */ + public static void put(String cacheName, String key, Object value) + { + getCache(cacheName).put(getKey(key), value); + } + + /** + * 从缓存中移除 + * + * @param cacheName + * @param key + */ + public static void remove(String cacheName, String key) + { + getCache(cacheName).remove(getKey(key)); + } + + /** + * 从缓存中移除所有 + * + * @param cacheName + */ + public static void removeAll(String cacheName) + { + Cache cache = getCache(cacheName); + Set keys = cache.keys(); + for (Iterator it = keys.iterator(); it.hasNext();) + { + cache.remove(it.next()); + } + logger.info("清理缓存: {} => {}", cacheName, keys); + } + + /** + * 从缓存中移除指定key + * + * @param keys + */ + public static void removeByKeys(Set keys) + { + removeByKeys(SYS_CACHE, keys); + } + + /** + * 从缓存中移除指定key + * + * @param cacheName + * @param keys + */ + public static void removeByKeys(String cacheName, Set keys) + { + for (Iterator it = keys.iterator(); it.hasNext();) + { + remove(it.next()); + } + logger.info("清理缓存: {} => {}", cacheName, keys); + } + + /** + * 获取缓存键名 + * + * @param key + * @return + */ + private static String getKey(String key) + { + return key; + } + + /** + * 获得一个Cache,没有则显示日志。 + * + * @param cacheName + * @return + */ + public static Cache getCache(String cacheName) + { + Cache cache = cacheManager.getCache(cacheName); + if (cache == null) + { + throw new RuntimeException("当前系统中没有定义“" + cacheName + "”这个缓存。"); + } + return cache; + } + + /** + * 获取所有缓存 + * + * @return 缓存组 + */ + public static String[] getCacheNames() + { + return ((EhCacheManager) cacheManager).getCacheManager().getCacheNames(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/CookieUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/CookieUtils.java new file mode 100644 index 0000000..4fa8339 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/CookieUtils.java @@ -0,0 +1,138 @@ +package com.ruoyi.common.utils; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Cookie工具类 + * + * @author ruoyi + */ +public class CookieUtils +{ + /** + * 设置 Cookie(生成时间为1天) + * + * @param name 名称 + * @param value 值 + */ + public static void setCookie(HttpServletResponse response, String name, String value) + { + setCookie(response, name, value, 60 * 60 * 24); + } + + /** + * 设置 Cookie + * + * @param name 名称 + * @param value 值 + * @param maxAge 生存时间(单位秒) + * @param uri 路径 + */ + public static void setCookie(HttpServletResponse response, String name, String value, String path) + { + setCookie(response, name, value, path, 60 * 60 * 24); + } + + /** + * 设置 Cookie + * + * @param name 名称 + * @param value 值 + * @param maxAge 生存时间(单位秒) + * @param uri 路径 + */ + public static void setCookie(HttpServletResponse response, String name, String value, int maxAge) + { + setCookie(response, name, value, "/", maxAge); + } + + /** + * 设置 Cookie + * + * @param name 名称 + * @param value 值 + * @param maxAge 生存时间(单位秒) + * @param uri 路径 + */ + public static void setCookie(HttpServletResponse response, String name, String value, String path, int maxAge) + { + Cookie cookie = new Cookie(name, null); + cookie.setPath(path); + cookie.setMaxAge(maxAge); + try + { + cookie.setValue(URLEncoder.encode(value, "utf-8")); + } + catch (UnsupportedEncodingException e) + { + e.printStackTrace(); + } + response.addCookie(cookie); + } + + /** + * 获得指定Cookie的值 + * + * @param name 名称 + * @return 值 + */ + public static String getCookie(HttpServletRequest request, String name) + { + return getCookie(request, null, name, false); + } + + /** + * 获得指定Cookie的值,并删除。 + * + * @param name 名称 + * @return 值 + */ + public static String getCookie(HttpServletRequest request, HttpServletResponse response, String name) + { + return getCookie(request, response, name, true); + } + + /** + * 获得指定Cookie的值 + * + * @param request 请求对象 + * @param response 响应对象 + * @param name 名字 + * @param isRemove 是否移除 + * @return 值 + */ + public static String getCookie(HttpServletRequest request, HttpServletResponse response, String name, + boolean isRemove) + { + String value = null; + Cookie[] cookies = request.getCookies(); + if (cookies != null) + { + for (Cookie cookie : cookies) + { + if (cookie.getName().equals(name)) + { + try + { + value = URLDecoder.decode(cookie.getValue(), "utf-8"); + } + catch (UnsupportedEncodingException e) + { + e.printStackTrace(); + } + if (isRemove) + { + cookie.setMaxAge(0); + response.addCookie(cookie); + } + } + } + } + return value; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java new file mode 100644 index 0000000..fb2ae21 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java @@ -0,0 +1,191 @@ +package com.ruoyi.common.utils; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; +import org.apache.commons.lang3.time.DateFormatUtils; + +/** + * 时间工具类 + * + * @author ruoyi + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils +{ + public static String YYYY = "yyyy"; + + public static String YYYY_MM = "yyyy-MM"; + + public static String YYYY_MM_DD = "yyyy-MM-dd"; + + public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + + public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + + private static String[] parsePatterns = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + /** + * 获取当前Date型日期 + * + * @return Date() 当前日期 + */ + public static Date getNowDate() + { + return new Date(); + } + + /** + * 获取当前日期, 默认格式为yyyy-MM-dd + * + * @return String + */ + public static String getDate() + { + return dateTimeNow(YYYY_MM_DD); + } + + public static final String getTime() + { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static final String dateTimeNow() + { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static final String dateTimeNow(final String format) + { + return parseDateToStr(format, new Date()); + } + + public static final String dateTime(final Date date) + { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static final String parseDateToStr(final String format, final Date date) + { + return new SimpleDateFormat(format).format(date); + } + + public static final Date dateTime(final String format, final String ts) + { + try + { + return new SimpleDateFormat(format).parse(ts); + } + catch (ParseException e) + { + throw new RuntimeException(e); + } + } + + /** + * 日期路径 即年/月/日 如2018/08/08 + */ + public static final String datePath() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy/MM/dd"); + } + + /** + * 日期路径 即年/月/日 如20180808 + */ + public static final String dateTime() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + /** + * 日期型字符串转化为日期 格式 + */ + public static Date parseDate(Object str) + { + if (str == null) + { + return null; + } + try + { + return parseDate(str.toString(), parsePatterns); + } + catch (ParseException e) + { + return null; + } + } + + /** + * 获取服务器启动时间 + */ + public static Date getServerStartDate() + { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 计算相差天数 + */ + public static int differentDaysByMillisecond(Date date1, Date date2) + { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + + /** + * 计算时间差 + * + * @param endDate 最后时间 + * @param startTime 开始时间 + * @return 时间差(天/小时/分钟) + */ + public static String timeDistance(Date endDate, Date startTime) + { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - startTime.getTime(); + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + // long sec = diff % nd % nh % nm / ns; + return day + "天" + hour + "小时" + min + "分钟"; + } + + /** + * 增加 LocalDateTime ==> Date + */ + public static Date toDate(LocalDateTime temporalAccessor) + { + ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 增加 LocalDate ==> Date + */ + public static Date toDate(LocalDate temporalAccessor) + { + LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); + ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/DesensitizedUtil.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/DesensitizedUtil.java new file mode 100644 index 0000000..f8a4c02 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/DesensitizedUtil.java @@ -0,0 +1,49 @@ +package com.ruoyi.common.utils; + +/** + * 脱敏工具类 + * + * @author ruoyi + */ +public class DesensitizedUtil +{ + /** + * 密码的全部字符都用*代替,比如:****** + * + * @param password 密码 + * @return 脱敏后的密码 + */ + public static String password(String password) + { + if (StringUtils.isBlank(password)) + { + return StringUtils.EMPTY; + } + return StringUtils.repeat('*', password.length()); + } + + /** + * 车牌中间用*代替,如果是错误的车牌,不处理 + * + * @param carLicense 完整的车牌号 + * @return 脱敏后的车牌 + */ + public static String carLicense(String carLicense) + { + if (StringUtils.isBlank(carLicense)) + { + return StringUtils.EMPTY; + } + // 普通车牌 + if (carLicense.length() == 7) + { + carLicense = StringUtils.hide(carLicense, 3, 6); + } + else if (carLicense.length() == 8) + { + // 新能源车牌 + carLicense = StringUtils.hide(carLicense, 3, 7); + } + return carLicense; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java new file mode 100644 index 0000000..a62600f --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java @@ -0,0 +1,67 @@ +package com.ruoyi.common.utils; + +import java.io.PrintWriter; +import java.io.StringWriter; +import org.apache.commons.lang3.exception.ExceptionUtils; + +/** + * 错误信息处理类。 + * + * @author ruoyi + */ +public class ExceptionUtil +{ + /** + * 获取exception的详细错误信息。 + */ + public static String getExceptionMessage(Throwable e) + { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw, true)); + return sw.toString(); + } + + public static String getRootErrorMessage(Exception e) + { + Throwable root = ExceptionUtils.getRootCause(e); + root = (root == null ? e : root); + if (root == null) + { + return ""; + } + String msg = root.getMessage(); + if (msg == null) + { + return "null"; + } + return StringUtils.defaultString(msg); + } + + /** + * 检测异常e被触发的原因是不是因为异常cause。 + * + * @param e 捕获的异常。 + * @param cause 异常触发原因。 + * @return 如果异常e是由cause类异常触发,则返回true;否则返回false。 + */ + public static boolean isCausedBy(final Throwable e, final Class cause) + { + if (cause.isAssignableFrom(e.getClass())) + { + return true; + } + else + { + Throwable t = e.getCause(); + while (t != null && t != e) + { + if (cause.isAssignableFrom(t.getClass())) + { + return true; + } + t = t.getCause(); + } + return false; + } + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/IpUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/IpUtils.java new file mode 100644 index 0000000..8fde230 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/IpUtils.java @@ -0,0 +1,370 @@ +package com.ruoyi.common.utils; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import javax.servlet.http.HttpServletRequest; + +/** + * 获取IP方法 + * + * @author ruoyi + */ +public class IpUtils +{ + public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)"; + // 匹配 ip + public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")"; + public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))"; + // 匹配网段 + public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")"; + + /** + * 获取客户端IP + * + * @param request 请求对象 + * @return IP地址 + */ + public static String getIpAddr(HttpServletRequest request) + { + if (request == null) + { + return "unknown"; + } + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("X-Forwarded-For"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("X-Real-IP"); + } + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getRemoteAddr(); + } + + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); + } + + /** + * 检查是否为内部IP地址 + * + * @param ip IP地址 + * @return 结果 + */ + public static boolean internalIp(String ip) + { + byte[] addr = textToNumericFormatV4(ip); + return internalIp(addr) || "127.0.0.1".equals(ip); + } + + /** + * 检查是否为内部IP地址 + * + * @param addr byte地址 + * @return 结果 + */ + private static boolean internalIp(byte[] addr) + { + if (StringUtils.isNull(addr) || addr.length < 2) + { + return true; + } + final byte b0 = addr[0]; + final byte b1 = addr[1]; + // 10.x.x.x/8 + final byte SECTION_1 = 0x0A; + // 172.16.x.x/12 + final byte SECTION_2 = (byte) 0xAC; + final byte SECTION_3 = (byte) 0x10; + final byte SECTION_4 = (byte) 0x1F; + // 192.168.x.x/16 + final byte SECTION_5 = (byte) 0xC0; + final byte SECTION_6 = (byte) 0xA8; + switch (b0) + { + case SECTION_1: + return true; + case SECTION_2: + if (b1 >= SECTION_3 && b1 <= SECTION_4) + { + return true; + } + case SECTION_5: + switch (b1) + { + case SECTION_6: + return true; + } + default: + return false; + } + } + + /** + * 将IPv4地址转换成字节 + * + * @param text IPv4地址 + * @return byte 字节 + */ + public static byte[] textToNumericFormatV4(String text) + { + if (text.length() == 0) + { + return null; + } + + byte[] bytes = new byte[4]; + String[] elements = text.split("\\.", -1); + try + { + long l; + int i; + switch (elements.length) + { + case 1: + l = Long.parseLong(elements[0]); + if ((l < 0L) || (l > 4294967295L)) + { + return null; + } + bytes[0] = (byte) (int) (l >> 24 & 0xFF); + bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 2: + l = Integer.parseInt(elements[0]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[0] = (byte) (int) (l & 0xFF); + l = Integer.parseInt(elements[1]); + if ((l < 0L) || (l > 16777215L)) + { + return null; + } + bytes[1] = (byte) (int) (l >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 3: + for (i = 0; i < 2; ++i) + { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + l = Integer.parseInt(elements[2]); + if ((l < 0L) || (l > 65535L)) + { + return null; + } + bytes[2] = (byte) (int) (l >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 4: + for (i = 0; i < 4; ++i) + { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + break; + default: + return null; + } + } + catch (NumberFormatException e) + { + return null; + } + return bytes; + } + + /** + * 获取IP地址 + * + * @return 本地IP地址 + */ + public static String getHostIp() + { + try + { + return InetAddress.getLocalHost().getHostAddress(); + } + catch (UnknownHostException e) + { + } + return "127.0.0.1"; + } + + /** + * 获取主机名 + * + * @return 本地主机名 + */ + public static String getHostName() + { + try + { + return InetAddress.getLocalHost().getHostName(); + } + catch (UnknownHostException e) + { + } + return "未知"; + } + + /** + * 从多级反向代理中获得第一个非unknown IP地址 + * + * @param ip 获得的IP地址 + * @return 第一个非unknown IP地址 + */ + public static String getMultistageReverseProxyIp(String ip) + { + // 多级反向代理检测 + if (ip != null && ip.indexOf(",") > 0) + { + final String[] ips = ip.trim().split(","); + for (String subIp : ips) + { + if (false == isUnknown(subIp)) + { + ip = subIp; + break; + } + } + } + return StringUtils.substring(ip, 0, 255); + } + + /** + * 检测给定字符串是否为未知,多用于检测HTTP请求相关 + * + * @param checkString 被检测的字符串 + * @return 是否未知 + */ + public static boolean isUnknown(String checkString) + { + return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); + } + + /** + * 是否为IP + */ + public static boolean isIP(String ip) + { + return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP); + } + + /** + * 是否为IP,或 *为间隔的通配符地址 + */ + public static boolean isIpWildCard(String ip) + { + return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD); + } + + /** + * 检测参数是否在ip通配符里 + */ + public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) + { + String[] s1 = ipWildCard.split("\\."); + String[] s2 = ip.split("\\."); + boolean isMatchedSeg = true; + for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) + { + if (!s1[i].equals(s2[i])) + { + isMatchedSeg = false; + break; + } + } + return isMatchedSeg; + } + + /** + * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串 + */ + public static boolean isIPSegment(String ipSeg) + { + return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG); + } + + /** + * 判断ip是否在指定网段中 + */ + public static boolean ipIsInNetNoCheck(String iparea, String ip) + { + int idx = iparea.indexOf('-'); + String[] sips = iparea.substring(0, idx).split("\\."); + String[] sipe = iparea.substring(idx + 1).split("\\."); + String[] sipt = ip.split("\\."); + long ips = 0L, ipe = 0L, ipt = 0L; + for (int i = 0; i < 4; ++i) + { + ips = ips << 8 | Integer.parseInt(sips[i]); + ipe = ipe << 8 | Integer.parseInt(sipe[i]); + ipt = ipt << 8 | Integer.parseInt(sipt[i]); + } + if (ips > ipe) + { + long t = ips; + ips = ipe; + ipe = t; + } + return ips <= ipt && ipt <= ipe; + } + + /** + * 校验ip是否符合过滤串规则 + * + * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99` + * @param ip 校验IP地址 + * @return boolean 结果 + */ + public static boolean isMatchedIp(String filter, String ip) + { + if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) + { + return false; + } + String[] ips = filter.split(";"); + for (String iStr : ips) + { + if (isIP(iStr) && iStr.equals(ip)) + { + return true; + } + else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) + { + return true; + } + else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) + { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java new file mode 100644 index 0000000..a0e7d6c --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java @@ -0,0 +1,135 @@ +package com.ruoyi.common.utils; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import org.apache.shiro.SecurityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.json.JSON; + +/** + * 处理并记录日志文件 + * + * @author ruoyi + */ +public class LogUtils +{ + public static final Logger ERROR_LOG = LoggerFactory.getLogger("sys-error"); + public static final Logger ACCESS_LOG = LoggerFactory.getLogger("sys-access"); + + /** + * 记录访问日志 [username][jsessionid][ip][accept][UserAgent][url][params][Referer] + * + * @param request + * @throws Exception + */ + public static void logAccess(HttpServletRequest request) throws Exception + { + String username = getUsername(); + String jsessionId = request.getRequestedSessionId(); + String ip = IpUtils.getIpAddr(request); + String accept = request.getHeader("accept"); + String userAgent = request.getHeader("User-Agent"); + String url = request.getRequestURI(); + String params = getParams(request); + + StringBuilder s = new StringBuilder(); + s.append(getBlock(username)); + s.append(getBlock(jsessionId)); + s.append(getBlock(ip)); + s.append(getBlock(accept)); + s.append(getBlock(userAgent)); + s.append(getBlock(url)); + s.append(getBlock(params)); + s.append(getBlock(request.getHeader("Referer"))); + getAccessLog().info(s.toString()); + } + + /** + * 记录异常错误 格式 [exception] + * + * @param message + * @param e + */ + public static void logError(String message, Throwable e) + { + String username = getUsername(); + StringBuilder s = new StringBuilder(); + s.append(getBlock("exception")); + s.append(getBlock(username)); + s.append(getBlock(message)); + ERROR_LOG.error(s.toString(), e); + } + + /** + * 记录页面错误 错误日志记录 [page/eception][username][statusCode][errorMessage][servletName][uri][exceptionName][ip][exception] + * + * @param request + */ + public static void logPageError(HttpServletRequest request) + { + String username = getUsername(); + + Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); + String message = (String) request.getAttribute("javax.servlet.error.message"); + String uri = (String) request.getAttribute("javax.servlet.error.request_uri"); + Throwable t = (Throwable) request.getAttribute("javax.servlet.error.exception"); + + if (statusCode == null) + { + statusCode = 0; + } + + StringBuilder s = new StringBuilder(); + s.append(getBlock(t == null ? "page" : "exception")); + s.append(getBlock(username)); + s.append(getBlock(statusCode)); + s.append(getBlock(message)); + s.append(getBlock(IpUtils.getIpAddr(request))); + + s.append(getBlock(uri)); + s.append(getBlock(request.getHeader("Referer"))); + StringWriter sw = new StringWriter(); + + while (t != null) + { + t.printStackTrace(new PrintWriter(sw)); + t = t.getCause(); + } + s.append(getBlock(sw.toString())); + getErrorLog().error(s.toString()); + + } + + public static String getBlock(Object msg) + { + if (msg == null) + { + msg = ""; + } + return "[" + msg.toString() + "]"; + } + + protected static String getParams(HttpServletRequest request) throws Exception + { + Map params = request.getParameterMap(); + return JSON.marshal(params); + } + + protected static String getUsername() + { + return (String) SecurityUtils.getSubject().getPrincipal(); + } + + public static Logger getAccessLog() + { + return ACCESS_LOG; + } + + public static Logger getErrorLog() + { + return ERROR_LOG; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/MapDataUtil.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/MapDataUtil.java new file mode 100644 index 0000000..d932bfe --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/MapDataUtil.java @@ -0,0 +1,54 @@ +package com.ruoyi.common.utils; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import javax.servlet.http.HttpServletRequest; + +/** + * Map通用处理方法 + * + * @author ruoyi + */ +public class MapDataUtil +{ + public static Map convertDataMap(HttpServletRequest request) + { + Map properties = request.getParameterMap(); + Map returnMap = new HashMap(); + Iterator entries = properties.entrySet().iterator(); + Map.Entry entry; + String name = ""; + String value = ""; + while (entries.hasNext()) + { + entry = (Entry) entries.next(); + name = (String) entry.getKey(); + Object valueObj = entry.getValue(); + if (null == valueObj) + { + value = ""; + } + else if (valueObj instanceof String[]) + { + String[] values = (String[]) valueObj; + value = ""; + for (int i = 0; i < values.length; i++) + { + value += values[i] + ","; + } + if (value.length() > 0) + { + value = value.substring(0, value.length() - 1); + } + } + else + { + value = valueObj.toString(); + } + returnMap.put(name, value); + } + return returnMap; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java new file mode 100644 index 0000000..7dac75a --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java @@ -0,0 +1,26 @@ +package com.ruoyi.common.utils; + +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import com.ruoyi.common.utils.spring.SpringUtils; + +/** + * 获取i18n资源文件 + * + * @author ruoyi + */ +public class MessageUtils +{ + /** + * 根据消息键和参数 获取消息 委托给spring messageSource + * + * @param code 消息键 + * @param args 参数 + * @return 获取国际化翻译值 + */ + public static String message(String code, Object... args) + { + MessageSource messageSource = SpringUtils.getBean(MessageSource.class); + return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java new file mode 100644 index 0000000..70e9b08 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java @@ -0,0 +1,35 @@ +package com.ruoyi.common.utils; + +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.common.utils.sql.SqlUtil; + +/** + * 分页工具类 + * + * @author ruoyi + */ +public class PageUtils extends PageHelper +{ + /** + * 设置请求分页数据 + */ + public static void startPage() + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + Boolean reasonable = pageDomain.getReasonable(); + PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); + } + + /** + * 清理分页的线程变量 + */ + public static void clearPage() + { + PageHelper.clearPage(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java new file mode 100644 index 0000000..1f136ec --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java @@ -0,0 +1,216 @@ +package com.ruoyi.common.utils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.text.Convert; + +/** + * 客户端工具类 + * + * @author ruoyi + */ +public class ServletUtils +{ + /** + * 定义移动端请求的所有可能类型 + */ + private final static String[] agent = { "Android", "iPhone", "iPod", "iPad", "Windows Phone", "MQQBrowser" }; + + /** + * 获取String参数 + */ + public static String getParameter(String name) + { + return getRequest().getParameter(name); + } + + /** + * 获取String参数 + */ + public static String getParameter(String name, String defaultValue) + { + return Convert.toStr(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name) + { + return Convert.toInt(getRequest().getParameter(name)); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name, Integer defaultValue) + { + return Convert.toInt(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name) + { + return Convert.toBool(getRequest().getParameter(name)); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name, Boolean defaultValue) + { + return Convert.toBool(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取request + */ + public static HttpServletRequest getRequest() + { + return getRequestAttributes().getRequest(); + } + + /** + * 获取response + */ + public static HttpServletResponse getResponse() + { + return getRequestAttributes().getResponse(); + } + + /** + * 获取session + */ + public static HttpSession getSession() + { + return getRequest().getSession(); + } + + public static ServletRequestAttributes getRequestAttributes() + { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } + + /** + * 将字符串渲染到客户端 + * + * @param response 渲染对象 + * @param string 待渲染的字符串 + * @return null + */ + public static String renderString(HttpServletResponse response, String string) + { + try + { + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(string); + } + catch (IOException e) + { + e.printStackTrace(); + } + return null; + } + + /** + * 是否是Ajax异步请求 + * + * @param request + */ + public static boolean isAjaxRequest(HttpServletRequest request) + { + String accept = request.getHeader("accept"); + if (accept != null && accept.contains("application/json")) + { + return true; + } + + String xRequestedWith = request.getHeader("X-Requested-With"); + if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) + { + return true; + } + + String uri = request.getRequestURI(); + if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) + { + return true; + } + + String ajax = request.getParameter("__ajax"); + return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); + } + + /** + * 判断User-Agent 是不是来自于手机 + */ + public static boolean checkAgentIsMobile(String ua) + { + boolean flag = false; + if (!ua.contains("Windows NT") || (ua.contains("Windows NT") && ua.contains("compatible; MSIE 9.0;"))) + { + // 排除 苹果桌面系统 + if (!ua.contains("Windows NT") && !ua.contains("Macintosh")) + { + for (String item : agent) + { + if (ua.contains(item)) + { + flag = true; + break; + } + } + } + } + return flag; + } + + /** + * 内容编码 + * + * @param str 内容 + * @return 编码后的内容 + */ + public static String urlEncode(String str) + { + try + { + return URLEncoder.encode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } + + /** + * 内容解码 + * + * @param str 内容 + * @return 解码后的内容 + */ + public static String urlDecode(String str) + { + try + { + return URLDecoder.decode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/ShiroUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/ShiroUtils.java new file mode 100644 index 0000000..23d266e --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/ShiroUtils.java @@ -0,0 +1,86 @@ +package com.ruoyi.common.utils; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.crypto.SecureRandomNumberGenerator; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.subject.SimplePrincipalCollection; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.bean.BeanUtils; + +/** + * shiro 工具类 + * + * @author ruoyi + */ +public class ShiroUtils +{ + public static Subject getSubject() + { + return SecurityUtils.getSubject(); + } + + public static Session getSession() + { + return SecurityUtils.getSubject().getSession(); + } + + public static void logout() + { + getSubject().logout(); + } + + public static SysUser getSysUser() + { + SysUser user = null; + Object obj = getSubject().getPrincipal(); + if (StringUtils.isNotNull(obj)) + { + user = new SysUser(); + BeanUtils.copyBeanProp(user, obj); + } + return user; + } + + public static void setSysUser(SysUser user) + { + Subject subject = getSubject(); + PrincipalCollection principalCollection = subject.getPrincipals(); + String realmName = principalCollection.getRealmNames().iterator().next(); + PrincipalCollection newPrincipalCollection = new SimplePrincipalCollection(user, realmName); + // 重新加载Principal + subject.runAs(newPrincipalCollection); + } + + public static Long getUserId() + { + return getSysUser().getUserId().longValue(); + } + + public static String getLoginName() + { + return getSysUser().getLoginName(); + } + + public static String getIp() + { + return StringUtils.substring(getSubject().getSession().getHost(), 0, 128); + } + + public static String getSessionId() + { + return String.valueOf(getSubject().getSession().getId()); + } + + /** + * 生成随机盐 + */ + public static String randomSalt() + { + // 一个Byte占两个字节,此处生成的3字节,字符串长度为6 + SecureRandomNumberGenerator secureRandom = new SecureRandomNumberGenerator(); + String hex = secureRandom.nextBytes(3).toHex(); + return hex; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java new file mode 100644 index 0000000..942d276 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -0,0 +1,676 @@ +package com.ruoyi.common.utils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.springframework.util.AntPathMatcher; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.text.StrFormatter; + +/** + * 字符串工具类 + * + * @author ruoyi + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils +{ + /** 空字符串 */ + private static final String NULLSTR = ""; + + /** 下划线 */ + private static final char SEPARATOR = '_'; + + /** 星号 */ + private static final char ASTERISK = '*'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) + { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) + { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) + { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + ** @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) + { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) + { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) + { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) + { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) + { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) + { + return !isEmpty(str); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) + { + return object == null; + } + + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) + { + return !isNull(object); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) + { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) + { + return (str == null ? "" : str.trim()); + } + + /** + * 替换指定字符串的指定区间内字符为"*" + * + * @param str 字符串 + * @param startInclude 开始位置(包含) + * @param endExclude 结束位置(不包含) + * @return 替换后的字符串 + */ + public static String hide(CharSequence str, int startInclude, int endExclude) + { + if (isEmpty(str)) + { + return NULLSTR; + } + final int strLength = str.length(); + if (startInclude > strLength) + { + return NULLSTR; + } + if (endExclude > strLength) + { + endExclude = strLength; + } + if (startInclude > endExclude) + { + // 如果起始位置大于结束位置,不替换 + return NULLSTR; + } + final char[] chars = new char[strLength]; + for (int i = 0; i < strLength; i++) + { + if (i >= startInclude && i < endExclude) + { + chars[i] = ASTERISK; + } + else + { + chars[i] = str.charAt(i); + } + } + return new String(chars); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) + { + if (str == null) + { + return NULLSTR; + } + + if (start < 0) + { + start = str.length() + start; + } + + if (start < 0) + { + start = 0; + } + if (start > str.length()) + { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) + { + if (str == null) + { + return NULLSTR; + } + + if (end < 0) + { + end = str.length() + end; + } + if (start < 0) + { + start = str.length() + start; + } + + if (end > str.length()) + { + end = str.length(); + } + + if (start > end) + { + return NULLSTR; + } + + if (start < 0) + { + start = 0; + } + if (end < 0) + { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 格式化文本, {} 表示占位符
    + * 此方法只是简单将占位符 {} 按照顺序替换为参数
    + * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
    + * 例:
    + * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
    + * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
    + * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
    + * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) + { + if (isEmpty(params) || isEmpty(template)) + { + return template; + } + return StrFormatter.format(template, params); + } + + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) + { + return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); + } + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static final Set str2Set(String str, String sep) + { + return new HashSet(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) + { + List list = new ArrayList(); + if (StringUtils.isEmpty(str)) + { + return list; + } + + // 过滤空白字符串 + if (filterBlank && StringUtils.isBlank(str)) + { + return list; + } + String[] split = str.split(sep); + for (String string : split) + { + if (filterBlank && StringUtils.isBlank(string)) + { + continue; + } + if (trim) + { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value + * + * @param collection 给定的集合 + * @param array 给定的数组 + * @return boolean 结果 + */ + public static boolean containsAny(Collection collection, String... array) + { + if (isEmpty(collection) || isEmpty(array)) + { + return false; + } + else + { + for (String str : array) + { + if (collection.contains(str)) + { + return true; + } + } + return false; + } + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) + { + if (isEmpty(cs) || isEmpty(searchCharSequences)) + { + return false; + } + for (CharSequence testStr : searchCharSequences) + { + if (containsIgnoreCase(cs, testStr)) + { + return true; + } + } + return false; + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) + { + if (str == null) + { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean curreCharIsUpperCase = true; + // 下一字符是否大写 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) + { + char c = str.charAt(i); + if (i > 0) + { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } + else + { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) + { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) + { + sb.append(SEPARATOR); + } + else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) + { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) + { + if (str != null && strs != null) + { + for (String s : strs) + { + if (str.equalsIgnoreCase(trim(s))) + { + return true; + } + } + } + return false; + } + + /** + * 删除最后一个字符串 + * + * @param str 输入字符串 + * @param spit 以什么类型结尾的 + * @return 截取后的字符串 + */ + public static String lastStringDel(String str, String spit) + { + if (!StringUtils.isEmpty(str) && str.endsWith(spit)) + { + return str.subSequence(0, str.length() - 1).toString(); + } + return str; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) + { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) + { + // 没必要转换 + return ""; + } + else if (!name.contains("_")) + { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) + { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) + { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 + * 例如:user_name->userName + */ + public static String toCamelCase(String s) + { + if (s == null) + { + return null; + } + if (s.indexOf(SEPARATOR) == -1) + { + return s; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) + { + char c = s.charAt(i); + + if (c == SEPARATOR) + { + upperCase = true; + } + else if (upperCase) + { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } + else + { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) + { + if (isEmpty(str) || isEmpty(strs)) + { + return false; + } + for (String pattern : strs) + { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) + { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) + { + return (T) obj; + } + + /** + * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static final String padl(final Number num, final int size) + { + return padl(num.toString(), size, '0'); + } + + /** + * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static final String padl(final String s, final int size, final char c) + { + final StringBuilder sb = new StringBuilder(size); + if (s != null) + { + final int len = s.length(); + if (s.length() <= size) + { + for (int i = size - len; i > 0; i--) + { + sb.append(c); + } + sb.append(s); + } + else + { + return s.substring(len - size, len); + } + } + else + { + for (int i = size; i > 0; i--) + { + sb.append(c); + } + } + return sb.toString(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java new file mode 100644 index 0000000..1934195 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java @@ -0,0 +1,99 @@ +package com.ruoyi.common.utils; + +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 线程相关工具类. + * + * @author ruoyi + */ +public class Threads +{ + private static final Logger logger = LoggerFactory.getLogger(Threads.class); + + /** + * sleep等待,单位为毫秒 + */ + public static void sleep(long milliseconds) + { + try + { + Thread.sleep(milliseconds); + } + catch (InterruptedException e) + { + return; + } + } + + /** + * 停止线程池 + * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. + * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. + * 如果仍人超時,則強制退出. + * 另对在shutdown时线程本身被调用中断做了处理. + */ + public static void shutdownAndAwaitTermination(ExecutorService pool) + { + if (pool != null && !pool.isShutdown()) + { + pool.shutdown(); + try + { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + pool.shutdownNow(); + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + logger.info("Pool did not terminate"); + } + } + } + catch (InterruptedException ie) + { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + + /** + * 打印线程异常信息 + */ + public static void printException(Runnable r, Throwable t) + { + if (t == null && r instanceof Future) + { + try + { + Future future = (Future) r; + if (future.isDone()) + { + future.get(); + } + } + catch (CancellationException ce) + { + t = ce; + } + catch (ExecutionException ee) + { + t = ee.getCause(); + } + catch (InterruptedException ie) + { + Thread.currentThread().interrupt(); + } + } + if (t != null) + { + logger.error(t.getMessage(), t); + } + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java new file mode 100644 index 0000000..4463662 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java @@ -0,0 +1,110 @@ +package com.ruoyi.common.utils.bean; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Bean 工具类 + * + * @author ruoyi + */ +public class BeanUtils extends org.springframework.beans.BeanUtils +{ + /** Bean方法名中属性名开始的下标 */ + private static final int BEAN_METHOD_PROP_INDEX = 3; + + /** * 匹配getter方法的正则表达式 */ + private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); + + /** * 匹配setter方法的正则表达式 */ + private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); + + /** + * Bean属性复制工具方法。 + * + * @param dest 目标对象 + * @param src 源对象 + */ + public static void copyBeanProp(Object dest, Object src) + { + try + { + copyProperties(src, dest); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + /** + * 获取对象的setter方法。 + * + * @param obj 对象 + * @return 对象的setter方法列表 + */ + public static List getSetterMethods(Object obj) + { + // setter方法列表 + List setterMethods = new ArrayList(); + + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + + // 查找setter方法 + + for (Method method : methods) + { + Matcher m = SET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 1)) + { + setterMethods.add(method); + } + } + // 返回setter方法列表 + return setterMethods; + } + + /** + * 获取对象的getter方法。 + * + * @param obj 对象 + * @return 对象的getter方法列表 + */ + + public static List getGetterMethods(Object obj) + { + // getter方法列表 + List getterMethods = new ArrayList(); + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + // 查找getter方法 + for (Method method : methods) + { + Matcher m = GET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 0)) + { + getterMethods.add(method); + } + } + // 返回getter方法列表 + return getterMethods; + } + + /** + * 检查Bean方法名中的属性名是否相等。
    + * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 + * + * @param m1 方法名1 + * @param m2 方法名2 + * @return 属性名一样返回true,否则返回false + */ + + public static boolean isMethodPropEquals(String m1, String m2) + { + return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java new file mode 100644 index 0000000..80bfed7 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java @@ -0,0 +1,24 @@ +package com.ruoyi.common.utils.bean; + +import java.util.Set; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validator; + +/** + * bean对象属性验证 + * + * @author ruoyi + */ +public class BeanValidators +{ + public static void validateWithException(Validator validator, Object object, Class... groups) + throws ConstraintViolationException + { + Set> constraintViolations = validator.validate(object, groups); + if (!constraintViolations.isEmpty()) + { + throw new ConstraintViolationException(constraintViolations); + } + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java new file mode 100644 index 0000000..68130b9 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java @@ -0,0 +1,76 @@ +package com.ruoyi.common.utils.file; + +import java.io.File; +import org.apache.commons.lang3.StringUtils; + +/** + * 文件类型工具类 + * + * @author ruoyi + */ +public class FileTypeUtils +{ + /** + * 获取文件类型 + *

    + * 例如: ruoyi.txt, 返回: txt + * + * @param file 文件名 + * @return 后缀(不含".") + */ + public static String getFileType(File file) + { + if (null == file) + { + return StringUtils.EMPTY; + } + return getFileType(file.getName()); + } + + /** + * 获取文件类型 + *

    + * 例如: ruoyi.txt, 返回: txt + * + * @param fileName 文件名 + * @return 后缀(不含".") + */ + public static String getFileType(String fileName) + { + int separatorIndex = fileName.lastIndexOf("."); + if (separatorIndex < 0) + { + return ""; + } + return fileName.substring(separatorIndex + 1).toLowerCase(); + } + + /** + * 获取文件类型 + * + * @param photoByte 文件字节码 + * @return 后缀(不含".") + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "JPG"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "GIF"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "JPG"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "BMP"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "PNG"; + } + return strFileExtendName; + } +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java new file mode 100644 index 0000000..b65418e --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java @@ -0,0 +1,232 @@ +package com.ruoyi.common.utils.file; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.Objects; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException; +import com.ruoyi.common.exception.file.FileSizeLimitExceededException; +import com.ruoyi.common.exception.file.InvalidExtensionException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.uuid.Seq; + +/** + * 文件上传工具类 + * + * @author ruoyi + */ +public class FileUploadUtils +{ + /** + * 默认大小 50M + */ + public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024L; + + /** + * 默认的文件名最大长度 100 + */ + public static final int DEFAULT_FILE_NAME_LENGTH = 100; + + /** + * 默认上传的地址 + */ + private static String defaultBaseDir = RuoYiConfig.getProfile(); + + public static void setDefaultBaseDir(String defaultBaseDir) + { + FileUploadUtils.defaultBaseDir = defaultBaseDir; + } + + public static String getDefaultBaseDir() + { + return defaultBaseDir; + } + + /** + * 以默认配置进行文件上传 + * + * @param file 上传的文件 + * @return 文件名称 + * @throws Exception + */ + public static final String upload(MultipartFile file) throws IOException + { + try + { + return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 根据文件路径上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @return 文件名称 + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file) throws IOException + { + try + { + return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 文件上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @param allowedExtension 上传文件类型 + * @return 返回上传成功的文件名 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileNameLengthLimitExceededException 文件名太长 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException + { + int fileNameLength = Objects.requireNonNull(file.getOriginalFilename()).length(); + if (fileNameLength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) + { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + + assertAllowed(file, allowedExtension); + + String fileName = extractFilename(file); + + String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); + file.transferTo(Paths.get(absPath)); + return getPathFileName(baseDir, fileName); + } + + /** + * 编码文件名 + */ + public static final String extractFilename(MultipartFile file) + { + return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), + FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); + } + + public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException + { + File desc = new File(uploadDir + File.separator + fileName); + + if (!desc.exists()) + { + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + } + return desc; + } + + public static final String getPathFileName(String uploadDir, String fileName) throws IOException + { + int dirLastIndex = RuoYiConfig.getProfile().length() + 1; + String currentDir = StringUtils.substring(uploadDir, dirLastIndex); + return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + } + + /** + * 文件大小校验 + * + * @param file 上传的文件 + * @return + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws InvalidExtensionException + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, InvalidExtensionException + { + long size = file.getSize(); + if (size > DEFAULT_MAX_SIZE) + { + throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) + { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) + { + throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) + { + throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) + { + throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) + { + throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, + fileName); + } + else + { + throw new InvalidExtensionException(allowedExtension, extension, fileName); + } + } + } + + /** + * 判断MIME类型是否是允许的MIME类型 + * + * @param extension + * @param allowedExtension + * @return + */ + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) + { + for (String str : allowedExtension) + { + if (str.equalsIgnoreCase(extension)) + { + return true; + } + } + return false; + } + + /** + * 获取文件名的后缀 + * + * @param file 表单文件 + * @return 后缀名 + */ + public static final String getExtension(MultipartFile file) + { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (StringUtils.isEmpty(extension)) + { + extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); + } + return extension; + } +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java new file mode 100644 index 0000000..62f0c62 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java @@ -0,0 +1,291 @@ +package com.ruoyi.common.utils.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.uuid.IdUtils; + +/** + * 文件处理工具类 + * + * @author ruoyi + */ +public class FileUtils +{ + public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; + + /** + * 输出指定文件的byte数组 + * + * @param filePath 文件路径 + * @param os 输出流 + * @return + */ + public static void writeBytes(String filePath, OutputStream os) throws IOException + { + FileInputStream fis = null; + try + { + File file = new File(filePath); + if (!file.exists()) + { + throw new FileNotFoundException(filePath); + } + fis = new FileInputStream(file); + byte[] b = new byte[1024]; + int length; + while ((length = fis.read(b)) > 0) + { + os.write(b, 0, length); + } + } + catch (IOException e) + { + throw e; + } + finally + { + IOUtils.close(os); + IOUtils.close(fis); + } + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeImportBytes(byte[] data) throws IOException + { + return writeBytes(data, RuoYiConfig.getImportPath()); + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @param uploadDir 目标文件 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeBytes(byte[] data, String uploadDir) throws IOException + { + FileOutputStream fos = null; + String pathName = ""; + try + { + String extension = getFileExtendName(data); + pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName); + fos = new FileOutputStream(file); + fos.write(data); + } + finally + { + IOUtils.close(fos); + } + return FileUploadUtils.getPathFileName(uploadDir, pathName); + } + + /** + * 删除文件 + * + * @param filePath 文件 + * @return + */ + public static boolean deleteFile(String filePath) + { + boolean flag = false; + File file = new File(filePath); + // 路径为文件且不为空则进行删除 + if (file.isFile() && file.exists()) + { + flag = file.delete(); + } + return flag; + } + + /** + * 文件名称验证 + * + * @param filename 文件名称 + * @return true 正常 false 非法 + */ + public static boolean isValidFilename(String filename) + { + return filename.matches(FILENAME_PATTERN); + } + + /** + * 检查文件是否可下载 + * + * @param resource 需要下载的文件 + * @return true 正常 false 非法 + */ + public static boolean checkAllowDownload(String resource) + { + // 禁止目录上跳级别 + if (StringUtils.contains(resource, "..")) + { + return false; + } + + // 检查允许下载的文件规则 + if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) + { + return true; + } + + // 不在允许下载的文件规则 + return false; + } + + /** + * 下载文件名重新编码 + * + * @param request 请求对象 + * @param fileName 文件名 + * @return 编码后的文件名 + */ + public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException + { + final String agent = request.getHeader("USER-AGENT"); + String filename = fileName; + if (agent.contains("MSIE")) + { + // IE浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + filename = filename.replace("+", " "); + } + else if (agent.contains("Firefox")) + { + // 火狐浏览器 + filename = new String(fileName.getBytes(), "ISO8859-1"); + } + else if (agent.contains("Chrome")) + { + // google浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + else + { + // 其它浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + return filename; + } + + /** + * 下载文件名重新编码 + * + * @param response 响应对象 + * @param realFileName 真实文件名 + * @return + */ + public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException + { + String percentEncodedFileName = percentEncode(realFileName); + + StringBuilder contentDispositionValue = new StringBuilder(); + contentDispositionValue.append("attachment; filename=") + .append(percentEncodedFileName) + .append(";") + .append("filename*=") + .append("utf-8''") + .append(percentEncodedFileName); + + response.setHeader("Content-disposition", contentDispositionValue.toString()); + } + + /** + * 百分号编码工具方法 + * + * @param s 需要百分号编码的字符串 + * @return 百分号编码后的字符串 + */ + public static String percentEncode(String s) throws UnsupportedEncodingException + { + String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); + return encode.replaceAll("\\+", "%20"); + } + + /** + * 获取图像后缀 + * + * @param photoByte 图像数据 + * @return 后缀名 + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "jpg"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "gif"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "jpg"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "bmp"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "png"; + } + return strFileExtendName; + } + + /** + * 获取文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png + * + * @param fileName 路径名称 + * @return 没有文件路径的名称 + */ + public static String getName(String fileName) + { + if (fileName == null) + { + return null; + } + int lastUnixPos = fileName.lastIndexOf('/'); + int lastWindowsPos = fileName.lastIndexOf('\\'); + int index = Math.max(lastUnixPos, lastWindowsPos); + return fileName.substring(index + 1); + } + + /** + * 获取不带后缀文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi + * + * @param fileName 路径名称 + * @return 没有文件路径和后缀的名称 + */ + public static String getNameNotSuffix(String fileName) + { + if (fileName == null) + { + return null; + } + String baseName = FilenameUtils.getBaseName(fileName); + return baseName; + } +} + diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java new file mode 100644 index 0000000..432dfda --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java @@ -0,0 +1,98 @@ +package com.ruoyi.common.utils.file; + +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; + +/** + * 图片处理工具类 + * + * @author ruoyi + */ +public class ImageUtils +{ + private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); + + public static byte[] getImage(String imagePath) + { + InputStream is = getFile(imagePath); + try + { + return IOUtils.toByteArray(is); + } + catch (Exception e) + { + log.error("图片加载异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(is); + } + } + + public static InputStream getFile(String imagePath) + { + try + { + byte[] result = readFile(imagePath); + result = Arrays.copyOf(result, result.length); + return new ByteArrayInputStream(result); + } + catch (Exception e) + { + log.error("获取图片异常 {}", e); + } + return null; + } + + /** + * 读取文件为字节数据 + * + * @param url 地址 + * @return 字节数据 + */ + public static byte[] readFile(String url) + { + InputStream in = null; + try + { + if (url.startsWith("http")) + { + // 网络地址 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + } + else + { + // 本机地址 + String localPath = RuoYiConfig.getProfile(); + String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX); + in = new FileInputStream(downloadPath); + } + return IOUtils.toByteArray(in); + } + catch (Exception e) + { + log.error("获取文件路径异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(in); + } + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java new file mode 100644 index 0000000..371e823 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java @@ -0,0 +1,59 @@ +package com.ruoyi.common.utils.file; + +/** + * 媒体类型工具类 + * + * @author ruoyi + */ +public class MimeTypeUtils +{ + public static final String IMAGE_PNG = "image/png"; + + public static final String IMAGE_JPG = "image/jpg"; + + public static final String IMAGE_JPEG = "image/jpeg"; + + public static final String IMAGE_BMP = "image/bmp"; + + public static final String IMAGE_GIF = "image/gif"; + + public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; + + public static final String[] FLASH_EXTENSION = { "swf", "flv" }; + + public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", + "asf", "rm", "rmvb" }; + + public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" }; + + public static final String[] DEFAULT_ALLOWED_EXTENSION = { + // 图片 + "bmp", "gif", "jpg", "jpeg", "png", + // word excel powerpoint + "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", + // 压缩文件 + "rar", "zip", "gz", "bz2", + // 视频格式 + "mp4", "avi", "rmvb", + // pdf + "pdf" }; + + public static String getExtension(String prefix) + { + switch (prefix) + { + case IMAGE_PNG: + return "png"; + case IMAGE_JPG: + return "jpg"; + case IMAGE_JPEG: + return "jpeg"; + case IMAGE_BMP: + return "bmp"; + case IMAGE_GIF: + return "gif"; + default: + return ""; + } + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java new file mode 100644 index 0000000..f52e83e --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java @@ -0,0 +1,167 @@ +package com.ruoyi.common.utils.html; + +import com.ruoyi.common.utils.StringUtils; + +/** + * 转义和反转义工具类 + * + * @author ruoyi + */ +public class EscapeUtil +{ + public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)"; + + private static final char[][] TEXT = new char[64][]; + + static + { + for (int i = 0; i < 64; i++) + { + TEXT[i] = new char[] { (char) i }; + } + + // special HTML characters + TEXT['\''] = "'".toCharArray(); // 单引号 + TEXT['"'] = """.toCharArray(); // 双引号 + TEXT['&'] = "&".toCharArray(); // &符 + TEXT['<'] = "<".toCharArray(); // 小于号 + TEXT['>'] = ">".toCharArray(); // 大于号 + } + + /** + * 转义文本中的HTML字符为安全的字符 + * + * @param text 被转义的文本 + * @return 转义后的文本 + */ + public static String escape(String text) + { + return encode(text); + } + + /** + * 还原被转义的HTML特殊字符 + * + * @param content 包含转义符的HTML内容 + * @return 转换后的字符串 + */ + public static String unescape(String content) + { + return decode(content); + } + + /** + * 清除所有HTML标签,但是不删除标签内的内容 + * + * @param content 文本 + * @return 清除标签后的文本 + */ + public static String clean(String content) + { + return new HTMLFilter().filter(content); + } + + /** + * Escape编码 + * + * @param text 被编码的文本 + * @return 编码后的字符 + */ + private static String encode(String text) + { + if (StringUtils.isEmpty(text)) + { + return StringUtils.EMPTY; + } + + final StringBuilder tmp = new StringBuilder(text.length() * 6); + char c; + for (int i = 0; i < text.length(); i++) + { + c = text.charAt(i); + if (c < 256) + { + tmp.append("%"); + if (c < 16) + { + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + else + { + tmp.append("%u"); + if (c <= 0xfff) + { + // issue#I49JU8@Gitee + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + } + return tmp.toString(); + } + + /** + * Escape解码 + * + * @param content 被转义的内容 + * @return 解码后的字符串 + */ + public static String decode(String content) + { + if (StringUtils.isEmpty(content)) + { + return content; + } + + StringBuilder tmp = new StringBuilder(content.length()); + int lastPos = 0, pos = 0; + char ch; + while (lastPos < content.length()) + { + pos = content.indexOf("%", lastPos); + if (pos == lastPos) + { + if (content.charAt(pos + 1) == 'u') + { + ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16); + tmp.append(ch); + lastPos = pos + 6; + } + else + { + ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16); + tmp.append(ch); + lastPos = pos + 3; + } + } + else + { + if (pos == -1) + { + tmp.append(content.substring(lastPos)); + lastPos = content.length(); + } + else + { + tmp.append(content.substring(lastPos, pos)); + lastPos = pos; + } + } + } + return tmp.toString(); + } + + public static void main(String[] args) + { + String html = ""; + String escape = EscapeUtil.escape(html); + // String html = "ipt>alert(\"XSS\")ipt>"; + // String html = "<123"; + // String html = "123>"; + System.out.println("clean: " + EscapeUtil.clean(html)); + System.out.println("escape: " + escape); + System.out.println("unescape: " + EscapeUtil.unescape(escape)); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java new file mode 100644 index 0000000..cd8cd4f --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java @@ -0,0 +1,570 @@ +package com.ruoyi.common.utils.html; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * HTML过滤器,用于去除XSS漏洞隐患。 + * + * @author ruoyi + */ +public final class HTMLFilter +{ + /** + * regex flag union representing /si modifiers in php + **/ + private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL; + private static final Pattern P_COMMENTS = Pattern.compile("", Pattern.DOTALL); + private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI); + private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL); + private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI); + private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI); + private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI); + private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI); + private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI); + private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?"); + private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?"); + private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?"); + private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))"); + private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL); + private static final Pattern P_END_ARROW = Pattern.compile("^>"); + private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_AMP = Pattern.compile("&"); + private static final Pattern P_QUOTE = Pattern.compile("\""); + private static final Pattern P_LEFT_ARROW = Pattern.compile("<"); + private static final Pattern P_RIGHT_ARROW = Pattern.compile(">"); + private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>"); + + // @xxx could grow large... maybe use sesat's ReferenceMap + private static final ConcurrentMap P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>(); + private static final ConcurrentMap P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>(); + + /** + * set of allowed html elements, along with allowed attributes for each element + **/ + private final Map> vAllowed; + /** + * counts of open tags for each (allowable) html element + **/ + private final Map vTagCounts = new HashMap<>(); + + /** + * html elements which must always be self-closing (e.g. "") + **/ + private final String[] vSelfClosingTags; + /** + * html elements which must always have separate opening and closing tags (e.g. "") + **/ + private final String[] vNeedClosingTags; + /** + * set of disallowed html elements + **/ + private final String[] vDisallowed; + /** + * attributes which should be checked for valid protocols + **/ + private final String[] vProtocolAtts; + /** + * allowed protocols + **/ + private final String[] vAllowedProtocols; + /** + * tags which should be removed if they contain no content (e.g. "" or "") + **/ + private final String[] vRemoveBlanks; + /** + * entities allowed within html markup + **/ + private final String[] vAllowedEntities; + /** + * flag determining whether comments are allowed in input String. + */ + private final boolean stripComment; + private final boolean encodeQuotes; + /** + * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "" + * becomes " text "). If set to false, unbalanced angle brackets will be html escaped. + */ + private final boolean alwaysMakeTags; + + /** + * Default constructor. + */ + public HTMLFilter() + { + vAllowed = new HashMap<>(); + + final ArrayList a_atts = new ArrayList<>(); + a_atts.add("href"); + a_atts.add("target"); + vAllowed.put("a", a_atts); + + final ArrayList img_atts = new ArrayList<>(); + img_atts.add("src"); + img_atts.add("width"); + img_atts.add("height"); + img_atts.add("alt"); + vAllowed.put("img", img_atts); + + final ArrayList no_atts = new ArrayList<>(); + vAllowed.put("b", no_atts); + vAllowed.put("strong", no_atts); + vAllowed.put("i", no_atts); + vAllowed.put("em", no_atts); + + vSelfClosingTags = new String[] { "img" }; + vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" }; + vDisallowed = new String[] {}; + vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp. + vProtocolAtts = new String[] { "src", "href" }; + vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" }; + vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" }; + stripComment = true; + encodeQuotes = true; + alwaysMakeTags = false; + } + + /** + * Map-parameter configurable constructor. + * + * @param conf map containing configuration. keys match field names. + */ + @SuppressWarnings("unchecked") + public HTMLFilter(final Map conf) + { + + assert conf.containsKey("vAllowed") : "configuration requires vAllowed"; + assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags"; + assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags"; + assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed"; + assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols"; + assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts"; + assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks"; + assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities"; + + vAllowed = Collections.unmodifiableMap((HashMap>) conf.get("vAllowed")); + vSelfClosingTags = (String[]) conf.get("vSelfClosingTags"); + vNeedClosingTags = (String[]) conf.get("vNeedClosingTags"); + vDisallowed = (String[]) conf.get("vDisallowed"); + vAllowedProtocols = (String[]) conf.get("vAllowedProtocols"); + vProtocolAtts = (String[]) conf.get("vProtocolAtts"); + vRemoveBlanks = (String[]) conf.get("vRemoveBlanks"); + vAllowedEntities = (String[]) conf.get("vAllowedEntities"); + stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true; + encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true; + alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true; + } + + private void reset() + { + vTagCounts.clear(); + } + + // --------------------------------------------------------------- + // my versions of some PHP library functions + public static String chr(final int decimal) + { + return String.valueOf((char) decimal); + } + + public static String htmlSpecialChars(final String s) + { + String result = s; + result = regexReplace(P_AMP, "&", result); + result = regexReplace(P_QUOTE, """, result); + result = regexReplace(P_LEFT_ARROW, "<", result); + result = regexReplace(P_RIGHT_ARROW, ">", result); + return result; + } + + // --------------------------------------------------------------- + + /** + * given a user submitted input String, filter out any invalid or restricted html. + * + * @param input text (i.e. submitted by a user) than may contain html + * @return "clean" version of input, with only valid, whitelisted html elements allowed + */ + public String filter(final String input) + { + reset(); + String s = input; + + s = escapeComments(s); + + s = balanceHTML(s); + + s = checkTags(s); + + s = processRemoveBlanks(s); + + // s = validateEntities(s); + + return s; + } + + public boolean isAlwaysMakeTags() + { + return alwaysMakeTags; + } + + public boolean isStripComments() + { + return stripComment; + } + + private String escapeComments(final String s) + { + final Matcher m = P_COMMENTS.matcher(s); + final StringBuffer buf = new StringBuffer(); + if (m.find()) + { + final String match = m.group(1); // (.*?) + m.appendReplacement(buf, Matcher.quoteReplacement("")); + } + m.appendTail(buf); + + return buf.toString(); + } + + private String balanceHTML(String s) + { + if (alwaysMakeTags) + { + // + // try and form html + // + s = regexReplace(P_END_ARROW, "", s); + // 不追加结束标签 + s = regexReplace(P_BODY_TO_END, "<$1>", s); + s = regexReplace(P_XML_CONTENT, "$1<$2", s); + + } + else + { + // + // escape stray brackets + // + s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s); + s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s); + + // + // the last regexp causes '<>' entities to appear + // (we need to do a lookahead assertion so that the last bracket can + // be used in the next pass of the regexp) + // + s = regexReplace(P_BOTH_ARROWS, "", s); + } + + return s; + } + + private String checkTags(String s) + { + Matcher m = P_TAGS.matcher(s); + + final StringBuffer buf = new StringBuffer(); + while (m.find()) + { + String replaceStr = m.group(1); + replaceStr = processTag(replaceStr); + m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr)); + } + m.appendTail(buf); + + // these get tallied in processTag + // (remember to reset before subsequent calls to filter method) + final StringBuilder sBuilder = new StringBuilder(buf.toString()); + for (String key : vTagCounts.keySet()) + { + for (int ii = 0; ii < vTagCounts.get(key); ii++) + { + sBuilder.append(""); + } + } + s = sBuilder.toString(); + + return s; + } + + private String processRemoveBlanks(final String s) + { + String result = s; + for (String tag : vRemoveBlanks) + { + if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) + { + P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?>")); + } + result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result); + if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) + { + P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>")); + } + result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result); + } + + return result; + } + + private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) + { + Matcher m = regex_pattern.matcher(s); + return m.replaceAll(replacement); + } + + private String processTag(final String s) + { + // ending tags + Matcher m = P_END_TAG.matcher(s); + if (m.find()) + { + final String name = m.group(1).toLowerCase(); + if (allowed(name)) + { + if (false == inArray(name, vSelfClosingTags)) + { + if (vTagCounts.containsKey(name)) + { + vTagCounts.put(name, vTagCounts.get(name) - 1); + return ""; + } + } + } + } + + // starting tags + m = P_START_TAG.matcher(s); + if (m.find()) + { + final String name = m.group(1).toLowerCase(); + final String body = m.group(2); + String ending = m.group(3); + + // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" ); + if (allowed(name)) + { + final StringBuilder params = new StringBuilder(); + + final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body); + final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body); + final List paramNames = new ArrayList<>(); + final List paramValues = new ArrayList<>(); + while (m2.find()) + { + paramNames.add(m2.group(1)); // ([a-z0-9]+) + paramValues.add(m2.group(3)); // (.*?) + } + while (m3.find()) + { + paramNames.add(m3.group(1)); // ([a-z0-9]+) + paramValues.add(m3.group(3)); // ([^\"\\s']+) + } + + String paramName, paramValue; + for (int ii = 0; ii < paramNames.size(); ii++) + { + paramName = paramNames.get(ii).toLowerCase(); + paramValue = paramValues.get(ii); + + // debug( "paramName='" + paramName + "'" ); + // debug( "paramValue='" + paramValue + "'" ); + // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) ); + + if (allowedAttribute(name, paramName)) + { + if (inArray(paramName, vProtocolAtts)) + { + paramValue = processParamProtocol(paramValue); + } + params.append(' ').append(paramName).append("=\"").append(paramValue).append("\""); + } + } + + if (inArray(name, vSelfClosingTags)) + { + ending = " /"; + } + + if (inArray(name, vNeedClosingTags)) + { + ending = ""; + } + + if (ending == null || ending.length() < 1) + { + if (vTagCounts.containsKey(name)) + { + vTagCounts.put(name, vTagCounts.get(name) + 1); + } + else + { + vTagCounts.put(name, 1); + } + } + else + { + ending = " /"; + } + return "<" + name + params + ending + ">"; + } + else + { + return ""; + } + } + + // comments + m = P_COMMENT.matcher(s); + if (!stripComment && m.find()) + { + return "<" + m.group() + ">"; + } + + return ""; + } + + private String processParamProtocol(String s) + { + s = decodeEntities(s); + final Matcher m = P_PROTOCOL.matcher(s); + if (m.find()) + { + final String protocol = m.group(1); + if (!inArray(protocol, vAllowedProtocols)) + { + // bad protocol, turn into local anchor link instead + s = "#" + s.substring(protocol.length() + 1); + if (s.startsWith("#//")) + { + s = "#" + s.substring(3); + } + } + } + + return s; + } + + private String decodeEntities(String s) + { + StringBuffer buf = new StringBuffer(); + + Matcher m = P_ENTITY.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.decode(match).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENTITY_UNICODE.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENCODE.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + s = validateEntities(s); + return s; + } + + private String validateEntities(final String s) + { + StringBuffer buf = new StringBuffer(); + + // validate entities throughout the string + Matcher m = P_VALID_ENTITIES.matcher(s); + while (m.find()) + { + final String one = m.group(1); // ([^&;]*) + final String two = m.group(2); // (?=(;|&|$)) + m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two))); + } + m.appendTail(buf); + + return encodeQuotes(buf.toString()); + } + + private String encodeQuotes(final String s) + { + if (encodeQuotes) + { + StringBuffer buf = new StringBuffer(); + Matcher m = P_VALID_QUOTES.matcher(s); + while (m.find()) + { + final String one = m.group(1); // (>|^) + final String two = m.group(2); // ([^<]+?) + final String three = m.group(3); // (<|$) + // 不替换双引号为",防止json格式无效 regexReplace(P_QUOTE, """, two) + m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three)); + } + m.appendTail(buf); + return buf.toString(); + } + else + { + return s; + } + } + + private String checkEntity(final String preamble, final String term) + { + + return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble; + } + + private boolean isValidEntity(final String entity) + { + return inArray(entity, vAllowedEntities); + } + + private static boolean inArray(final String s, final String[] array) + { + for (String item : array) + { + if (item != null && item.equals(s)) + { + return true; + } + } + return false; + } + + private boolean allowed(final String name) + { + return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed); + } + + private boolean allowedAttribute(final String name, final String paramName) + { + return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName)); + } +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java new file mode 100644 index 0000000..bd07f7a --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java @@ -0,0 +1,274 @@ +package com.ruoyi.common.utils.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.security.cert.X509Certificate; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; + +/** + * 通用http发送方法 + * + * @author ruoyi + */ +public class HttpUtils +{ + private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url) + { + return sendGet(url, StringUtils.EMPTY); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param) + { + return sendGet(url, param, Constants.UTF8); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @param contentType 编码类型 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param, String contentType) + { + StringBuilder result = new StringBuilder(); + BufferedReader in = null; + try + { + String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; + log.info("sendGet - {}", urlNameString); + URL realUrl = new URL(urlNameString); + URLConnection connection = realUrl.openConnection(); + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + connection.connect(); + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (in != null) + { + in.close(); + } + } + catch (Exception ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendPost(String url, String param) + { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try + { + log.info("sendPost - {}", url); + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (out != null) + { + out.close(); + } + if (in != null) + { + in.close(); + } + } + catch (IOException ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + public static String sendSSLPost(String url, String param) + { + StringBuilder result = new StringBuilder(); + String urlNameString = url + "?" + param; + try + { + log.info("sendSSLPost - {}", urlNameString); + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); + URL console = new URL(urlNameString); + HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + + conn.setSSLSocketFactory(sc.getSocketFactory()); + conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); + conn.connect(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String ret = ""; + while ((ret = br.readLine()) != null) + { + if (ret != null && !ret.trim().equals("")) + { + result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + } + } + log.info("recv - {}", result); + conn.disconnect(); + br.close(); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); + } + return result.toString(); + } + + private static class TrustAnyTrustManager implements X509TrustManager + { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public X509Certificate[] getAcceptedIssuers() + { + return new X509Certificate[] {}; + } + } + + private static class TrustAnyHostnameVerifier implements HostnameVerifier + { + @Override + public boolean verify(String hostname, SSLSession session) + { + return true; + } + } +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java new file mode 100644 index 0000000..ccab288 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java @@ -0,0 +1,24 @@ +package com.ruoyi.common.utils.poi; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Workbook; + +/** + * Excel数据格式处理适配器 + * + * @author ruoyi + */ +public interface ExcelHandlerAdapter +{ + /** + * 格式化 + * + * @param value 单元格数据值 + * @param args excel注解args参数组 + * @param cell 单元格对象 + * @param wb 工作簿对象 + * + * @return 处理后的值 + */ + Object format(Object value, String[] args, Cell cell, Workbook wb); +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java new file mode 100644 index 0000000..5068c8a --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -0,0 +1,1757 @@ +package com.ruoyi.common.utils.poi; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.RegExUtils; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.poi.hssf.usermodel.HSSFClientAnchor; +import org.apache.poi.hssf.usermodel.HSSFPicture; +import org.apache.poi.hssf.usermodel.HSSFPictureData; +import org.apache.poi.hssf.usermodel.HSSFShape; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.ClientAnchor; +import org.apache.poi.ss.usermodel.DataFormat; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Name; +import org.apache.poi.ss.usermodel.PictureData; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.apache.poi.xssf.usermodel.XSSFDrawing; +import org.apache.poi.xssf.usermodel.XSSFPicture; +import org.apache.poi.xssf.usermodel.XSSFShape; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.annotation.Excel.Type; +import com.ruoyi.common.annotation.Excels; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.exception.UtilException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileTypeUtils; +import com.ruoyi.common.utils.file.FileUtils; +import com.ruoyi.common.utils.file.ImageUtils; +import com.ruoyi.common.utils.reflect.ReflectUtils; + +/** + * Excel相关处理 + * + * @author ruoyi + */ +public class ExcelUtil +{ + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; + + public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; + + /** + * 用于dictType属性数据存储,避免重复查缓存 + */ + public Map sysDictMap = new HashMap(); + + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表名称 + */ + private String sheetName; + + /** + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) + */ + private Type type; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + /** + * 导入导出数据列表 + */ + private List list; + + /** + * 注解列表 + */ + private List fields; + + /** + * 当前行号 + */ + private int rownum; + + /** + * 标题 + */ + private String title; + + /** + * 最大高度 + */ + private short maxHeight; + + /** + * 合并后最后行数 + */ + private int subMergedLastRowNum = 0; + + /** + * 合并后开始行数 + */ + private int subMergedFirstRowNum = 1; + + /** + * 对象的子列表方法 + */ + private Method subMethod; + + /** + * 对象的子列表属性 + */ + private List subFields; + + /** + * 统计列表 + */ + private Map statistics = new HashMap(); + + /** + * 数字格式 + */ + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); + + /** + * 实体对象 + */ + public Class clazz; + + /** + * 需要排除列属性 + */ + public String[] excludeFields; + + public ExcelUtil(Class clazz) + { + this.clazz = clazz; + } + + /** + * 隐藏Excel中列属性 + * + * @param fields 列属性名 示例[单个"name"/多个"id","name"] + * @throws Exception + */ + public void hideColumn(String... fields) + { + this.excludeFields = fields; + } + + public void init(List list, String sheetName, String title, Type type) + { + if (list == null) + { + list = new ArrayList(); + } + this.list = list; + this.sheetName = sheetName; + this.type = type; + this.title = title; + createExcelField(); + createWorkbook(); + createTitle(); + createSubHead(); + } + + /** + * 创建excel第一行标题 + */ + public void createTitle() + { + if (StringUtils.isNotEmpty(title)) + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + int titleLastCol = this.fields.size() - 1; + if (isSubList()) + { + titleLastCol = titleLastCol + subFields.size() - 1; + } + Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); + titleRow.setHeightInPoints(30); + Cell titleCell = titleRow.createCell(0); + titleCell.setCellStyle(styles.get("title")); + titleCell.setCellValue(title); + sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); + } + } + + /** + * 创建对象的子列表名称 + */ + public void createSubHead() + { + if (isSubList()) + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + Row subRow = sheet.createRow(rownum); + int excelNum = 0; + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Cell headCell1 = subRow.createCell(excelNum); + headCell1.setCellValue(attr.name()); + headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + excelNum++; + } + int headFirstRow = excelNum - 1; + int headLastRow = headFirstRow + subFields.size() - 1; + if (headLastRow > headFirstRow) + { + sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); + } + rownum++; + } + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(InputStream is) + { + List list = null; + try + { + list = importExcel(is, 0); + } + catch (Exception e) + { + log.error("导入Excel异常{}", e.getMessage()); + throw new UtilException(e.getMessage()); + } + finally + { + IOUtils.closeQuietly(is); + } + return list; + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @param titleNum 标题占用行数 + * @return 转换后集合 + */ + public List importExcel(InputStream is, int titleNum) throws Exception + { + return importExcel(StringUtils.EMPTY, is, titleNum); + } + + /** + * 对excel表单指定表格索引名转换成list + * + * @param sheetName 表格索引名 + * @param titleNum 标题占用行数 + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(String sheetName, InputStream is, int titleNum) throws Exception + { + this.type = Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet + Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); + if (sheet == null) + { + throw new IOException("文件sheet不存在"); + } + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + Map pictures; + if (isXSSFWorkbook) + { + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); + } + else + { + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); + } + // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 + int rows = sheet.getLastRowNum(); + if (rows > 0) + { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + Row heard = sheet.getRow(titleNum); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) + { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell)) + { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } + else + { + cellMap.put(null, i); + } + } + // 有数据时才处理 得到类的所有field. + List fields = this.getFields(); + Map fieldsMap = new HashMap(); + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Integer column = cellMap.get(attr.name()); + if (column != null) + { + fieldsMap.put(column, objects); + } + } + for (int i = titleNum + 1; i <= rows; i++) + { + // 从第2行开始取数据,默认第一行是表头. + Row row = sheet.getRow(i); + // 判断当前行是否是空行 + if (isRowEmpty(row)) + { + continue; + } + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) + { + Object val = this.getCellValue(row, entry.getKey()); + + // 如果不存在实例则新建. + entity = (entity == null ? clazz.newInstance() : entity); + // 从map中得到对应列的field. + Field field = (Field) entry.getValue()[0]; + Excel attr = (Excel) entry.getValue()[1]; + // 取得类型,并根据对象类型设置值. + Class fieldType = field.getType(); + if (String.class == fieldType) + { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) + { + val = StringUtils.substringBefore(s, ".0"); + } + else + { + String dateFormat = field.getAnnotation(Excel.class).dateFormat(); + if (StringUtils.isNotEmpty(dateFormat)) + { + val = parseDateToStr(dateFormat, val); + } + else + { + val = Convert.toStr(val); + } + } + } + else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toInt(val); + } + else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toLong(val); + } + else if (Double.TYPE == fieldType || Double.class == fieldType) + { + val = Convert.toDouble(val); + } + else if (Float.TYPE == fieldType || Float.class == fieldType) + { + val = Convert.toFloat(val); + } + else if (BigDecimal.class == fieldType) + { + val = Convert.toBigDecimal(val); + } + else if (Date.class == fieldType) + { + if (val instanceof String) + { + val = DateUtils.parseDate(val); + } + else if (val instanceof Double) + { + val = DateUtil.getJavaDate((Double) val); + } + } + else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) + { + val = Convert.toBool(val, false); + } + if (StringUtils.isNotNull(fieldType)) + { + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) + { + propertyName = field.getName() + "." + attr.targetAttr(); + } + if (StringUtils.isNotEmpty(attr.readConverterExp())) + { + val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + val = dataFormatHandlerAdapter(val, attr, null); + } + else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) + { + PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); + if (image == null) + { + val = ""; + } + else + { + byte[] data = image.getData(); + val = FileUtils.writeImportBytes(data); + } + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName) + { + return exportExcel(list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName, String title) + { + this.init(list, sheetName, title, Type.EXPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName) + { + exportExcel(response, list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(list, sheetName, title, Type.EXPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName) + { + return importTemplateExcel(sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName, String title) + { + this.init(null, sheetName, title, Type.IMPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName) + { + importTemplateExcel(response, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(null, sheetName, title, Type.IMPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public void exportExcel(HttpServletResponse response) + { + try + { + writeSheet(); + wb.write(response.getOutputStream()); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + } + finally + { + IOUtils.closeQuietly(wb); + } + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public AjaxResult exportExcel() + { + OutputStream out = null; + try + { + writeSheet(); + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + throw new UtilException("导出Excel失败,请联系网站管理员!"); + } + finally + { + IOUtils.closeQuietly(wb); + IOUtils.closeQuietly(out); + } + } + + /** + * 创建写入数据到Sheet + */ + public void writeSheet() + { + // 取出一共有多少个sheet. + int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize)); + for (int index = 0; index < sheetNo; index++) + { + createSheet(sheetNo, index); + + // 产生一行 + Row row = sheet.createRow(rownum); + int column = 0; + // 写入各个字段的列头名称 + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType())) + { + for (Field subField : subFields) + { + Excel subExcel = subField.getAnnotation(Excel.class); + this.createHeadCell(subExcel, row, column++); + } + } + else + { + this.createHeadCell(excel, row, column++); + } + } + if (Type.EXPORT.equals(type)) + { + fillExcelData(index, row); + addStatisticsRow(); + } + } + } + + /** + * 填充excel数据 + * + * @param index 序号 + * @param row 单元格行 + */ + @SuppressWarnings("unchecked") + public void fillExcelData(int index, Row row) + { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + int rowNo = (1 + rownum) - startNo; + for (int i = startNo; i < endNo; i++) + { + rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; + row = sheet.createRow(rowNo); + // 得到导出对象. + T vo = (T) list.get(i); + Collection subList = null; + if (isSubList()) + { + if (isSubListValue(vo)) + { + subList = getListCellValue(vo); + subMergedLastRowNum = subMergedLastRowNum + subList.size(); + } + else + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + } + } + int column = 0; + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) + { + boolean subFirst = false; + for (Object obj : subList) + { + if (subFirst) + { + rowNo++; + row = sheet.createRow(rowNo); + } + List subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); + int subIndex = 0; + for (Field subField : subFields) + { + if (subField.isAnnotationPresent(Excel.class)) + { + subField.setAccessible(true); + Excel attr = subField.getAnnotation(Excel.class); + this.addCell(attr, row, (T) obj, subField, column + subIndex); + } + subIndex++; + } + subFirst = true; + } + this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); + } + else + { + this.addCell(excel, row, vo, field, column++); + } + } + } + } + + /** + * 创建表格样式 + * + * @param wb 工作薄对象 + * @return 样式列表 + */ + private Map createStyles(Workbook wb) + { + // 写入各条记录,每条记录对应excel表中的一行 + Map styles = new HashMap(); + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font titleFont = wb.createFont(); + titleFont.setFontName("Arial"); + titleFont.setFontHeightInPoints((short) 16); + titleFont.setBold(true); + style.setFont(titleFont); + DataFormat dataFormat = wb.createDataFormat(); + style.setDataFormat(dataFormat.getFormat("@")); + styles.put("title", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); + styles.put("data", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font totalFont = wb.createFont(); + totalFont.setFontName("Arial"); + totalFont.setFontHeightInPoints((short) 10); + style.setFont(totalFont); + styles.put("total", style); + + styles.putAll(annotationHeaderStyles(wb, styles)); + + styles.putAll(annotationDataStyles(wb)); + + return styles; + } + + /** + * 根据Excel注解创建表格头样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationHeaderStyles(Workbook wb, Map styles) + { + Map headerStyles = new HashMap(); + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); + if (!headerStyles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(excel.headerBackgroundColor().index); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBold(true); + headerFont.setColor(excel.headerColor().index); + style.setFont(headerFont); + // 设置表格头单元格文本形式 + DataFormat dataFormat = wb.createDataFormat(); + style.setDataFormat(dataFormat.getFormat("@")); + headerStyles.put(key, style); + } + } + return headerStyles; + } + + /** + * 根据Excel注解创建表格列样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationDataStyles(Workbook wb) + { + Map styles = new HashMap(); + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType())) + { + ParameterizedType pt = (ParameterizedType) field.getGenericType(); + Class subClass = (Class) pt.getActualTypeArguments()[0]; + List subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + for (Field subField : subFields) + { + Excel subExcel = subField.getAnnotation(Excel.class); + annotationDataStyles(styles, subField, subExcel); + } + } + else + { + annotationDataStyles(styles, field, excel); + } + } + return styles; + } + + /** + * 根据Excel注解创建表格列样式 + * + * @param styles 自定义样式列表 + * @param field 属性列信息 + * @param excel 注解信息 + */ + public void annotationDataStyles(Map styles, Field field, Excel excel) + { + String key = StringUtils.format("data_{}_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor(), excel.cellType()); + if (!styles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style.setAlignment(excel.align()); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + style.setFillForegroundColor(excel.backgroundColor().getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + dataFont.setColor(excel.color().index); + style.setFont(dataFont); + if (ColumnType.TEXT == excel.cellType()) + { + DataFormat dataFormat = wb.createDataFormat(); + style.setDataFormat(dataFormat.getFormat("@")); + } + styles.put(key, style); + } + } + + /** + * 创建单元格 + */ + public Cell createHeadCell(Excel attr, Row row, int column) + { + // 创建列 + Cell cell = row.createCell(column); + // 写入列信息 + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column); + cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + if (isSubList()) + { + // 填充默认样式,防止合并单元格样式失效 + sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType()))); + if (attr.needMerge()) + { + sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); + } + } + return cell; + } + + /** + * 设置单元格信息 + * + * @param value 单元格值 + * @param attr 注解相关 + * @param cell 单元格信息 + */ + public void setCellVo(Object value, Excel attr, Cell cell) + { + if (ColumnType.STRING == attr.cellType() || ColumnType.TEXT == attr.cellType()) + { + String cellValue = Convert.toStr(value); + // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。 + if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) + { + cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); + } + if (value instanceof Collection && StringUtils.equals("[]", cellValue)) + { + cellValue = StringUtils.EMPTY; + } + cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); + } + else if (ColumnType.NUMERIC == attr.cellType()) + { + if (StringUtils.isNotNull(value)) + { + cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); + } + } + else if (ColumnType.IMAGE == attr.cellType()) + { + ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); + String imagePath = Convert.toStr(value); + if (StringUtils.isNotEmpty(imagePath)) + { + byte[] data = ImageUtils.getImage(imagePath); + getDrawingPatriarch(cell.getSheet()).createPicture(anchor, + cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); + } + } + } + + /** + * 获取画布 + */ + public static Drawing getDrawingPatriarch(Sheet sheet) + { + if (sheet.getDrawingPatriarch() == null) + { + sheet.createDrawingPatriarch(); + } + return sheet.getDrawingPatriarch(); + } + + /** + * 获取图片类型,设置图片插入类型 + */ + public int getImageType(byte[] value) + { + String type = FileTypeUtils.getFileExtendName(value); + if ("JPG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_JPEG; + } + else if ("PNG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_PNG; + } + return Workbook.PICTURE_TYPE_JPEG; + } + + /** + * 创建表格样式 + */ + public void setDataValidation(Excel attr, Row row, int column) + { + if (attr.name().indexOf("注:") >= 0) + { + sheet.setColumnWidth(column, 6000); + } + else + { + // 设置列宽 + sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); + } + if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0 || attr.comboReadDict()) + { + String[] comboArray = attr.combo(); + if (comboArray.length > 15 || StringUtils.join(comboArray).length() > 255) + { + // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 + setXSSFValidationWithHidden(sheet, comboArray, attr.prompt(), 1, 100, column, column); + } + else + { + // 提示信息或只能选择不能输入的列内容. + setPromptOrValidation(sheet, comboArray, attr.prompt(), 1, 100, column, column); + } + } + } + + /** + * 添加单元格 + */ + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) + { + Cell cell = null; + try + { + // 设置行高 + row.setHeight(maxHeight); + // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. + if (attr.isExport()) + { + // 创建cell + cell = row.createCell(column); + if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) + { + CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); + sheet.addMergedRegion(cellAddress); + } + cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType()))); + + // 用于读取对象中的属性 + Object value = getTargetValue(vo, field, attr); + String dateFormat = attr.dateFormat(); + String readConverterExp = attr.readConverterExp(); + String separator = attr.separator(); + String dictType = attr.dictType(); + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) + { + cell.setCellValue(parseDateToStr(dateFormat, value)); + } + else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) + { + cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); + } + else if (value instanceof BigDecimal && -1 != attr.scale()) + { + cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + cell.setCellValue(dataFormatHandlerAdapter(value, attr, cell)); + } + else + { + // 设置列类型 + setCellVo(value, attr, cell); + } + addStatisticsData(column, Convert.toStr(value), attr); + } + } + catch (Exception e) + { + log.error("导出Excel失败{}", e); + } + return cell; + } + + /** + * 设置 POI XSSFSheet 单元格提示或选择框 + * + * @param sheet 表单 + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + sheet.addValidationData(dataValidation); + } + + /** + * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框). + * + * @param sheet 要设置的sheet. + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol) + { + String hideSheetName = "combo_" + firstCol + "_" + endCol; + Sheet hideSheet = wb.createSheet(hideSheetName); // 用于存储 下拉菜单数据 + for (int i = 0; i < textlist.length; i++) + { + hideSheet.createRow(i).createCell(0).setCellValue(textlist[i]); + } + // 创建名称,可被其他单元格引用 + Name name = wb.createName(); + name.setNameName(hideSheetName + "_data"); + name.setRefersToFormula(hideSheetName + "!$A$1:$A$" + textlist.length); + DataValidationHelper helper = sheet.getDataValidationHelper(); + // 加载下拉列表内容 + DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data"); + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + // 数据有效性对象 + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + + sheet.addValidationData(dataValidation); + // 设置hiddenSheet隐藏 + wb.setSheetHidden(wb.getSheetIndex(hideSheet), true); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[0].equals(value)) + { + propertyString.append(itemArray[1] + separator); + break; + } + } + } + else + { + if (itemArray[0].equals(propertyValue)) + { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[1].equals(value)) + { + propertyString.append(itemArray[0] + separator); + break; + } + } + } + else + { + if (itemArray[1].equals(propertyValue)) + { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 数据处理器 + * + * @param value 数据值 + * @param excel 数据注解 + * @return + */ + public String dataFormatHandlerAdapter(Object value, Excel excel, Cell cell) + { + try + { + Object instance = excel.handler().newInstance(); + Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class, Cell.class, Workbook.class }); + value = formatMethod.invoke(instance, value, excel.args(), cell, this.wb); + } + catch (Exception e) + { + log.error("不能格式化数据 " + excel.handler(), e.getMessage()); + } + return Convert.toStr(value); + } + + /** + * 合计统计信息 + */ + private void addStatisticsData(Integer index, String text, Excel entity) + { + if (entity != null && entity.isStatistics()) + { + Double temp = 0D; + if (!statistics.containsKey(index)) + { + statistics.put(index, temp); + } + try + { + temp = Double.valueOf(text); + } + catch (NumberFormatException e) + { + } + statistics.put(index, statistics.get(index) + temp); + } + } + + /** + * 创建统计行 + */ + public void addStatisticsRow() + { + if (statistics.size() > 0) + { + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + Set keys = statistics.keySet(); + Cell cell = row.createCell(0); + cell.setCellStyle(styles.get("total")); + cell.setCellValue("合计"); + + for (Integer key : keys) + { + cell = row.createCell(key); + cell.setCellStyle(styles.get("total")); + cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); + } + statistics.clear(); + } + } + + /** + * 编码文件名 + */ + public String encodingFilename(String filename) + { + filename = UUID.randomUUID() + "_" + filename + ".xlsx"; + return filename; + } + + /** + * 获取下载路径 + * + * @param filename 文件名称 + */ + public String getAbsoluteFile(String filename) + { + String downloadPath = RuoYiConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + /** + * 获取bean中的属性值 + * + * @param vo 实体对象 + * @param field 字段 + * @param excel 注解 + * @return 最终的属性值 + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception + { + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())) + { + String target = excel.targetAttr(); + if (target.contains(".")) + { + String[] targets = target.split("[.]"); + for (String name : targets) + { + o = getValue(o, name); + } + } + else + { + o = getValue(o, target); + } + } + return o; + } + + /** + * 以类的属性的get方法方法形式获取值 + * + * @param o + * @param name + * @return value + * @throws Exception + */ + private Object getValue(Object o, String name) throws Exception + { + if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) + { + Class clazz = o.getClass(); + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + o = field.get(o); + } + return o; + } + + /** + * 得到所有定义字段 + */ + private void createExcelField() + { + this.fields = getFields(); + this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + this.maxHeight = getRowHeight(); + } + + /** + * 获取字段注解信息 + */ + public List getFields() + { + List fields = new ArrayList(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + for (Field field : tempFields) + { + if (!ArrayUtils.contains(this.excludeFields, field.getName())) + { + // 单注解 + if (field.isAnnotationPresent(Excel.class)) + { + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + if (Collection.class.isAssignableFrom(field.getType())) + { + subMethod = getSubMethod(field.getName(), clazz); + ParameterizedType pt = (ParameterizedType) field.getGenericType(); + Class subClass = (Class) pt.getActualTypeArguments()[0]; + this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + } + } + + // 多注解 + if (field.isAnnotationPresent(Excels.class)) + { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel attr : excels) + { + if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) + && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + } + } + } + } + return fields; + } + + /** + * 根据注解获取最大行高 + */ + public short getRowHeight() + { + double maxHeight = 0; + for (Object[] os : this.fields) + { + Excel excel = (Excel) os[1]; + maxHeight = Math.max(maxHeight, excel.height()); + } + return (short) (maxHeight * 20); + } + + /** + * 创建一个工作簿 + */ + public void createWorkbook() + { + this.wb = new SXSSFWorkbook(500); + this.sheet = wb.createSheet(); + wb.setSheetName(0, sheetName); + this.styles = createStyles(wb); + } + + /** + * 创建工作表 + * + * @param sheetNo sheet数量 + * @param index 序号 + */ + public void createSheet(int sheetNo, int index) + { + // 设置工作表的名称. + if (sheetNo > 1 && index > 0) + { + this.sheet = wb.createSheet(); + this.createTitle(); + wb.setSheetName(index, sheetName + index); + } + } + + /** + * 获取单元格值 + * + * @param row 获取的行 + * @param column 获取单元格列号 + * @return 单元格值 + */ + public Object getCellValue(Row row, int column) + { + if (row == null) + { + return row; + } + Object val = ""; + try + { + Cell cell = row.getCell(column); + if (StringUtils.isNotNull(cell)) + { + if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) + { + val = cell.getNumericCellValue(); + if (DateUtil.isCellDateFormatted(cell)) + { + val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 + } + else + { + if ((Double) val % 1 != 0) + { + val = new BigDecimal(val.toString()); + } + else + { + val = new DecimalFormat("0").format(val); + } + } + } + else if (cell.getCellType() == CellType.STRING) + { + val = cell.getStringCellValue(); + } + else if (cell.getCellType() == CellType.BOOLEAN) + { + val = cell.getBooleanCellValue(); + } + else if (cell.getCellType() == CellType.ERROR) + { + val = cell.getErrorCellValue(); + } + + } + } + catch (Exception e) + { + return val; + } + return val; + } + + /** + * 判断是否是空行 + * + * @param row 判断的行 + * @return + */ + private boolean isRowEmpty(Row row) + { + if (row == null) + { + return true; + } + for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) + { + Cell cell = row.getCell(i); + if (cell != null && cell.getCellType() != CellType.BLANK) + { + return false; + } + } + return true; + } + + /** + * 获取Excel2003图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + List pictures = workbook.getAllPictures(); + if (!pictures.isEmpty()) + { + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) + { + HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); + if (shape instanceof HSSFPicture) + { + HSSFPicture pic = (HSSFPicture) shape; + int pictureIndex = pic.getPictureIndex() - 1; + HSSFPictureData picData = pictures.get(pictureIndex); + String picIndex = anchor.getRow1() + "_" + anchor.getCol1(); + sheetIndexPicMap.put(picIndex, picData); + } + } + return sheetIndexPicMap; + } + else + { + return sheetIndexPicMap; + } + } + + /** + * 获取Excel2007图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + for (POIXMLDocumentPart dr : sheet.getRelations()) + { + if (dr instanceof XSSFDrawing) + { + XSSFDrawing drawing = (XSSFDrawing) dr; + List shapes = drawing.getShapes(); + for (XSSFShape shape : shapes) + { + if (shape instanceof XSSFPicture) + { + XSSFPicture pic = (XSSFPicture) shape; + XSSFClientAnchor anchor = pic.getPreferredSize(); + CTMarker ctMarker = anchor.getFrom(); + String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); + sheetIndexPicMap.put(picIndex, pic.getPictureData()); + } + } + } + } + return sheetIndexPicMap; + } + + /** + * 格式化不同类型的日期对象 + * + * @param dateFormat 日期格式 + * @param val 被格式化的日期对象 + * @return 格式化后的日期字符 + */ + public String parseDateToStr(String dateFormat, Object val) + { + if (val == null) + { + return ""; + } + String str; + if (val instanceof Date) + { + str = DateUtils.parseDateToStr(dateFormat, (Date) val); + } + else if (val instanceof LocalDateTime) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val)); + } + else if (val instanceof LocalDate) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val)); + } + else + { + str = val.toString(); + } + return str; + } + + /** + * 是否有对象的子列表 + */ + public boolean isSubList() + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0; + } + + /** + * 是否有对象的子列表,集合不为空 + */ + public boolean isSubListValue(T vo) + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0; + } + + /** + * 获取集合的值 + */ + public Collection getListCellValue(Object obj) + { + Object value; + try + { + value = subMethod.invoke(obj, new Object[] {}); + } + catch (Exception e) + { + return new ArrayList(); + } + return (Collection) value; + } + + /** + * 获取对象的子列表方法 + * + * @param name 名称 + * @param pojoClass 类对象 + * @return 子列表方法 + */ + public Method getSubMethod(String name, Class pojoClass) + { + StringBuffer getMethodName = new StringBuffer("get"); + getMethodName.append(name.substring(0, 1).toUpperCase()); + getMethodName.append(name.substring(1)); + Method method = null; + try + { + method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); + } + catch (Exception e) + { + log.error("获取对象异常{}", e.getMessage()); + } + return method; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java new file mode 100644 index 0000000..b19953e --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java @@ -0,0 +1,410 @@ +package com.ruoyi.common.utils.reflect; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Date; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.DateUtils; + +/** + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. + * + * @author ruoyi + */ +@SuppressWarnings("rawtypes") +public class ReflectUtils +{ + private static final String SETTER_PREFIX = "set"; + + private static final String GETTER_PREFIX = "get"; + + private static final String CGLIB_CLASS_SEPARATOR = "$$"; + + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); + + /** + * 调用Getter方法. + * 支持多级,如:对象名.对象名.方法 + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) + { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + return (E) object; + } + + /** + * 调用Setter方法, 仅匹配方法名。 + * 支持多级,如:对象名.对象名.方法 + */ + public static void invokeSetter(Object obj, String propertyName, E value) + { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) + { + if (i < names.length - 1) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + else + { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + invokeMethodByName(object, setterMethodName, new Object[] { value }); + } + } + } + + /** + * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. + */ + @SuppressWarnings("unchecked") + public static E getFieldValue(final Object obj, final String fieldName) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return null; + } + E result = null; + try + { + result = (E) field.get(obj); + } + catch (IllegalAccessException e) + { + logger.error("不可能抛出的异常{}", e.getMessage()); + } + return result; + } + + /** + * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. + */ + public static void setFieldValue(final Object obj, final String fieldName, final E value) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return; + } + try + { + field.set(obj, value); + } + catch (IllegalAccessException e) + { + logger.error("不可能抛出的异常: {}", e.getMessage()); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符. + * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. + * 同时匹配方法名+参数类型, + */ + @SuppressWarnings("unchecked") + public static E invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes, + final Object[] args) + { + if (obj == null || methodName == null) + { + return null; + } + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) + { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try + { + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符, + * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用. + * 只匹配函数名,如果有多个同名函数调用第一个。 + */ + @SuppressWarnings("unchecked") + public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) + { + Method method = getAccessibleMethodByName(obj, methodName, args.length); + if (method == null) + { + // 如果为空不报错,直接返回空。 + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try + { + // 类型转换(将参数数据类型转换为目标方法参数类型) + Class[] cs = method.getParameterTypes(); + for (int i = 0; i < cs.length; i++) + { + if (args[i] != null && !args[i].getClass().equals(cs[i])) + { + if (cs[i] == String.class) + { + args[i] = Convert.toStr(args[i]); + if (StringUtils.endsWith((String) args[i], ".0")) + { + args[i] = StringUtils.substringBefore((String) args[i], ".0"); + } + } + else if (cs[i] == Integer.class) + { + args[i] = Convert.toInt(args[i]); + } + else if (cs[i] == Long.class) + { + args[i] = Convert.toLong(args[i]); + } + else if (cs[i] == Double.class) + { + args[i] = Convert.toDouble(args[i]); + } + else if (cs[i] == Float.class) + { + args[i] = Convert.toFloat(args[i]); + } + else if (cs[i] == Date.class) + { + if (args[i] instanceof String) + { + args[i] = DateUtils.parseDate(args[i]); + } + else + { + args[i] = DateUtil.getJavaDate((Double) args[i]); + } + } + else if (cs[i] == boolean.class || cs[i] == Boolean.class) + { + args[i] = Convert.toBool(args[i]); + } + } + } + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + */ + public static Field getAccessibleField(final Object obj, final String fieldName) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(fieldName, "fieldName can't be blank"); + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) + { + try + { + Field field = superClass.getDeclaredField(fieldName); + makeAccessible(field); + return field; + } + catch (NoSuchFieldException e) + { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 匹配函数名+参数类型。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethod(final Object obj, final String methodName, + final Class... parameterTypes) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + try + { + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); + makeAccessible(method); + return method; + } + catch (NoSuchMethodException e) + { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 只匹配函数名。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + Method[] methods = searchType.getDeclaredMethods(); + for (Method method : methods) + { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) + { + makeAccessible(method); + return method; + } + } + } + return null; + } + + /** + * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Method method) + { + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) + && !method.isAccessible()) + { + method.setAccessible(true); + } + } + + /** + * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Field field) + { + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) + { + field.setAccessible(true); + } + } + + /** + * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 + * 如无法找到, 返回Object.class. + */ + @SuppressWarnings("unchecked") + public static Class getClassGenricType(final Class clazz) + { + return getClassGenricType(clazz, 0); + } + + /** + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. + * 如无法找到, 返回Object.class. + */ + public static Class getClassGenricType(final Class clazz, final int index) + { + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) + { + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) + { + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) + { + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); + return Object.class; + } + + return (Class) params[index]; + } + + public static Class getUserClass(Object instance) + { + if (instance == null) + { + throw new RuntimeException("Instance must not be null"); + } + Class clazz = instance.getClass(); + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) + { + Class superClass = clazz.getSuperclass(); + if (superClass != null && !Object.class.equals(superClass)) + { + return superClass; + } + } + return clazz; + + } + + /** + * 将反射时的checked exception转换为unchecked exception. + */ + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) + { + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) + { + return new IllegalArgumentException(msg, e); + } + else if (e instanceof InvocationTargetException) + { + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); + } + return new RuntimeException(msg, e); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/security/CipherUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/security/CipherUtils.java new file mode 100644 index 0000000..43b9f24 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/security/CipherUtils.java @@ -0,0 +1,36 @@ +package com.ruoyi.common.utils.security; + +import java.security.Key; +import java.security.NoSuchAlgorithmException; +import javax.crypto.KeyGenerator; + +/** + * 对称密钥密码算法工具类 + * + * @author ruoyi + */ +public class CipherUtils +{ + /** + * 生成随机秘钥 + * + * @param keyBitSize 字节大小 + * @param algorithmName 算法名称 + * @return 创建密匙 + */ + public static Key generateNewKey(int keyBitSize, String algorithmName) + { + KeyGenerator kg; + try + { + kg = KeyGenerator.getInstance(algorithmName); + } + catch (NoSuchAlgorithmException e) + { + String msg = "Unable to acquire " + algorithmName + " algorithm. This is required to function."; + throw new IllegalStateException(msg, e); + } + kg.init(keyBitSize); + return kg.generateKey(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/security/Md5Utils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/security/Md5Utils.java new file mode 100644 index 0000000..ff9937f --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/security/Md5Utils.java @@ -0,0 +1,67 @@ +package com.ruoyi.common.utils.security; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Md5加密方法 + * + * @author ruoyi + */ +public class Md5Utils +{ + private static final Logger log = LoggerFactory.getLogger(Md5Utils.class); + + private static byte[] md5(String s) + { + MessageDigest algorithm; + try + { + algorithm = MessageDigest.getInstance("MD5"); + algorithm.reset(); + algorithm.update(s.getBytes("UTF-8")); + byte[] messageDigest = algorithm.digest(); + return messageDigest; + } + catch (Exception e) + { + log.error("MD5 Error...", e); + } + return null; + } + + private static final String toHex(byte hash[]) + { + if (hash == null) + { + return null; + } + StringBuffer buf = new StringBuffer(hash.length * 2); + int i; + + for (i = 0; i < hash.length; i++) + { + if ((hash[i] & 0xff) < 0x10) + { + buf.append("0"); + } + buf.append(Long.toString(hash[i] & 0xff, 16)); + } + return buf.toString(); + } + + public static String hash(String s) + { + try + { + return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); + } + catch (Exception e) + { + log.error("not supported charset...{}", e); + return s; + } + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/security/PermissionUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/security/PermissionUtils.java new file mode 100644 index 0000000..296f2ca --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/security/PermissionUtils.java @@ -0,0 +1,118 @@ +package com.ruoyi.common.utils.security; + +import java.beans.BeanInfo; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.constant.PermissionConstants; +import com.ruoyi.common.utils.MessageUtils; + +/** + * permission 工具类 + * + * @author ruoyi + */ +public class PermissionUtils +{ + private static final Logger log = LoggerFactory.getLogger(PermissionUtils.class); + + /** + * 查看数据的权限 + */ + public static final String VIEW_PERMISSION = "no.view.permission"; + + /** + * 创建数据的权限 + */ + public static final String CREATE_PERMISSION = "no.create.permission"; + + /** + * 修改数据的权限 + */ + public static final String UPDATE_PERMISSION = "no.update.permission"; + + /** + * 删除数据的权限 + */ + public static final String DELETE_PERMISSION = "no.delete.permission"; + + /** + * 导出数据的权限 + */ + public static final String EXPORT_PERMISSION = "no.export.permission"; + + /** + * 其他数据的权限 + */ + public static final String PERMISSION = "no.permission"; + + /** + * 权限错误消息提醒 + * + * @param permissionsStr 错误信息 + * @return 提示信息 + */ + public static String getMsg(String permissionsStr) + { + String permission = StringUtils.substringBetween(permissionsStr, "[", "]"); + String msg = MessageUtils.message(PERMISSION, permission); + if (StringUtils.endsWithIgnoreCase(permission, PermissionConstants.ADD_PERMISSION)) + { + msg = MessageUtils.message(CREATE_PERMISSION, permission); + } + else if (StringUtils.endsWithIgnoreCase(permission, PermissionConstants.EDIT_PERMISSION)) + { + msg = MessageUtils.message(UPDATE_PERMISSION, permission); + } + else if (StringUtils.endsWithIgnoreCase(permission, PermissionConstants.REMOVE_PERMISSION)) + { + msg = MessageUtils.message(DELETE_PERMISSION, permission); + } + else if (StringUtils.endsWithIgnoreCase(permission, PermissionConstants.EXPORT_PERMISSION)) + { + msg = MessageUtils.message(EXPORT_PERMISSION, permission); + } + else if (StringUtils.endsWithAny(permission, + new String[] { PermissionConstants.VIEW_PERMISSION, PermissionConstants.LIST_PERMISSION })) + { + msg = MessageUtils.message(VIEW_PERMISSION, permission); + } + return msg; + } + + /** + * 返回用户属性值 + * + * @param property 属性名称 + * @return 用户属性值 + */ + public static Object getPrincipalProperty(String property) + { + Subject subject = SecurityUtils.getSubject(); + if (subject != null) + { + Object principal = subject.getPrincipal(); + try + { + BeanInfo bi = Introspector.getBeanInfo(principal.getClass()); + for (PropertyDescriptor pd : bi.getPropertyDescriptors()) + { + if (pd.getName().equals(property) == true) + { + return pd.getReadMethod().invoke(principal, (Object[]) null); + } + } + } + catch (Exception e) + { + log.error("Error reading property [{}] from principal of type [{}]", property, + principal.getClass().getName()); + } + } + return null; + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java new file mode 100644 index 0000000..c5699ad --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java @@ -0,0 +1,159 @@ +package com.ruoyi.common.utils.spring; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; +import com.ruoyi.common.utils.StringUtils; + +/** + * spring工具类 方便在非spring管理环境中获取bean + * + * @author ruoyi + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware +{ + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + SpringUtils.applicationContext = applicationContext; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws org.springframework.beans.BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws org.springframework.beans.BeansException + * + */ + public static T getBean(Class clz) throws BeansException + { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) + { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) + { + return (T) AopContext.currentProxy(); + } + + /** + * 获取当前的环境配置,无配置返回null + * + * @return 当前的环境配置 + */ + public static String[] getActiveProfiles() + { + return applicationContext.getEnvironment().getActiveProfiles(); + } + + /** + * 获取当前的环境配置,当有多个环境配置时,只获取第一个 + * + * @return 当前的环境配置 + */ + public static String getActiveProfile() + { + final String[] activeProfiles = getActiveProfiles(); + return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; + } + + /** + * 获取配置文件中的值 + * + * @param key 配置文件的key + * @return 当前的配置文件的值 + * + */ + public static String getRequiredProperty(String key) + { + return applicationContext.getEnvironment().getRequiredProperty(key); + } + +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java new file mode 100644 index 0000000..451c7dc --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java @@ -0,0 +1,70 @@ +package com.ruoyi.common.utils.sql; + +import com.ruoyi.common.exception.UtilException; +import com.ruoyi.common.utils.StringUtils; + +/** + * sql操作工具类 + * + * @author ruoyi + */ +public class SqlUtil +{ + /** + * 定义常用的 sql关键字 + */ + public static String SQL_REGEX = "and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()"; + + /** + * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) + */ + public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + + /** + * 限制orderBy最大长度 + */ + private static final int ORDER_BY_MAX_LENGTH = 500; + + /** + * 检查字符,防止注入绕过 + */ + public static String escapeOrderBySql(String value) + { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) + { + throw new UtilException("参数不符合规范,不能进行查询"); + } + if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH) + { + throw new UtilException("参数已超过最大限制,不能进行查询"); + } + return value; + } + + /** + * 验证 order by 语法是否符合规范 + */ + public static boolean isValidOrderBySql(String value) + { + return value.matches(SQL_PATTERN); + } + + /** + * SQL关键字检查 + */ + public static void filterKeyword(String value) + { + if (StringUtils.isEmpty(value)) + { + return; + } + String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); + for (String sqlKeyword : sqlKeywords) + { + if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) + { + throw new UtilException("参数存在SQL注入风险"); + } + } + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java new file mode 100644 index 0000000..2c84427 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java @@ -0,0 +1,49 @@ +package com.ruoyi.common.utils.uuid; + +/** + * ID生成器工具类 + * + * @author ruoyi + */ +public class IdUtils +{ + /** + * 获取随机UUID + * + * @return 随机UUID + */ + public static String randomUUID() + { + return UUID.randomUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线 + * + * @return 简化的UUID,去掉了横线 + */ + public static String simpleUUID() + { + return UUID.randomUUID().toString(true); + } + + /** + * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 随机UUID + */ + public static String fastUUID() + { + return UUID.fastUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 简化的UUID,去掉了横线 + */ + public static String fastSimpleUUID() + { + return UUID.fastUUID().toString(true); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java new file mode 100644 index 0000000..bf99611 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java @@ -0,0 +1,86 @@ +package com.ruoyi.common.utils.uuid; + +import java.util.concurrent.atomic.AtomicInteger; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * @author ruoyi 序列生成类 + */ +public class Seq +{ + // 通用序列类型 + public static final String commSeqType = "COMMON"; + + // 上传序列类型 + public static final String uploadSeqType = "UPLOAD"; + + // 通用接口序列数 + private static AtomicInteger commSeq = new AtomicInteger(1); + + // 上传接口序列数 + private static AtomicInteger uploadSeq = new AtomicInteger(1); + + // 机器标识 + private static final String machineCode = "A"; + + /** + * 获取通用序列号 + * + * @return 序列值 + */ + public static String getId() + { + return getId(commSeqType); + } + + /** + * 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串 + * + * @return 序列值 + */ + public static String getId(String type) + { + AtomicInteger atomicInt = commSeq; + if (uploadSeqType.equals(type)) + { + atomicInt = uploadSeq; + } + return getId(atomicInt, 3); + } + + /** + * 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串 + * + * @param atomicInt 序列数 + * @param length 数值长度 + * @return 序列值 + */ + public static String getId(AtomicInteger atomicInt, int length) + { + String result = DateUtils.dateTimeNow(); + result += machineCode; + result += getSeq(atomicInt, length); + return result; + } + + /** + * 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数 + * + * @return 序列值 + */ + private synchronized static String getSeq(AtomicInteger atomicInt, int length) + { + // 先取值再+1 + int value = atomicInt.getAndIncrement(); + + // 如果更新后值>=10 的 (length)幂次方则重置为1 + int maxSeq = (int) Math.pow(10, length); + if (atomicInt.get() >= maxSeq) + { + atomicInt.set(1); + } + // 转字符串,用0左补齐 + return StringUtils.padl(value, length); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java new file mode 100644 index 0000000..acc3a6f --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java @@ -0,0 +1,484 @@ +package com.ruoyi.common.utils.uuid; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import com.ruoyi.common.exception.UtilException; + +/** + * 提供通用唯一识别码(universally unique identifier)(UUID)实现 + * + * @author ruoyi + */ +public final class UUID implements java.io.Serializable, Comparable +{ + private static final long serialVersionUID = -1185015143654744140L; + + /** + * SecureRandom 的单例 + * + */ + private static class Holder + { + static final SecureRandom numberGenerator = getSecureRandom(); + } + + /** 此UUID的最高64有效位 */ + private final long mostSigBits; + + /** 此UUID的最低64有效位 */ + private final long leastSigBits; + + /** + * 私有构造 + * + * @param data 数据 + */ + private UUID(byte[] data) + { + long msb = 0; + long lsb = 0; + assert data.length == 16 : "data must be 16 bytes in length"; + for (int i = 0; i < 8; i++) + { + msb = (msb << 8) | (data[i] & 0xff); + } + for (int i = 8; i < 16; i++) + { + lsb = (lsb << 8) | (data[i] & 0xff); + } + this.mostSigBits = msb; + this.leastSigBits = lsb; + } + + /** + * 使用指定的数据构造新的 UUID。 + * + * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位 + * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位 + */ + public UUID(long mostSigBits, long leastSigBits) + { + this.mostSigBits = mostSigBits; + this.leastSigBits = leastSigBits; + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID fastUUID() + { + return randomUUID(false); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID() + { + return randomUUID(true); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能 + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID(boolean isSecure) + { + final Random ng = isSecure ? Holder.numberGenerator : getRandom(); + + byte[] randomBytes = new byte[16]; + ng.nextBytes(randomBytes); + randomBytes[6] &= 0x0f; /* clear version */ + randomBytes[6] |= 0x40; /* set to version 4 */ + randomBytes[8] &= 0x3f; /* clear variant */ + randomBytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(randomBytes); + } + + /** + * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。 + * + * @param name 用于构造 UUID 的字节数组。 + * + * @return 根据指定数组生成的 {@code UUID} + */ + public static UUID nameUUIDFromBytes(byte[] name) + { + MessageDigest md; + try + { + md = MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException nsae) + { + throw new InternalError("MD5 not supported"); + } + byte[] md5Bytes = md.digest(name); + md5Bytes[6] &= 0x0f; /* clear version */ + md5Bytes[6] |= 0x30; /* set to version 3 */ + md5Bytes[8] &= 0x3f; /* clear variant */ + md5Bytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(md5Bytes); + } + + /** + * 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。 + * + * @param name 指定 {@code UUID} 字符串 + * @return 具有指定值的 {@code UUID} + * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常 + * + */ + public static UUID fromString(String name) + { + String[] components = name.split("-"); + if (components.length != 5) + { + throw new IllegalArgumentException("Invalid UUID string: " + name); + } + for (int i = 0; i < 5; i++) + { + components[i] = "0x" + components[i]; + } + + long mostSigBits = Long.decode(components[0]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[1]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[2]).longValue(); + + long leastSigBits = Long.decode(components[3]).longValue(); + leastSigBits <<= 48; + leastSigBits |= Long.decode(components[4]).longValue(); + + return new UUID(mostSigBits, leastSigBits); + } + + /** + * 返回此 UUID 的 128 位值中的最低有效 64 位。 + * + * @return 此 UUID 的 128 位值中的最低有效 64 位。 + */ + public long getLeastSignificantBits() + { + return leastSigBits; + } + + /** + * 返回此 UUID 的 128 位值中的最高有效 64 位。 + * + * @return 此 UUID 的 128 位值中最高有效 64 位。 + */ + public long getMostSignificantBits() + { + return mostSigBits; + } + + /** + * 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。 + *

    + * 版本号具有以下含意: + *

      + *
    • 1 基于时间的 UUID + *
    • 2 DCE 安全 UUID + *
    • 3 基于名称的 UUID + *
    • 4 随机生成的 UUID + *
    + * + * @return 此 {@code UUID} 的版本号 + */ + public int version() + { + // Version is bits masked by 0x000000000000F000 in MS long + return (int) ((mostSigBits >> 12) & 0x0f); + } + + /** + * 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。 + *

    + * 变体号具有以下含意: + *

      + *
    • 0 为 NCS 向后兼容保留 + *
    • 2 IETF RFC 4122(Leach-Salz), 用于此类 + *
    • 6 保留,微软向后兼容 + *
    • 7 保留供以后定义使用 + *
    + * + * @return 此 {@code UUID} 相关联的变体号 + */ + public int variant() + { + // This field is composed of a varying number of bits. + // 0 - - Reserved for NCS backward compatibility + // 1 0 - The IETF aka Leach-Salz variant (used by this class) + // 1 1 0 Reserved, Microsoft backward compatibility + // 1 1 1 Reserved for future definition. + return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63)); + } + + /** + * 与此 UUID 相关联的时间戳值。 + * + *

    + * 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。
    + * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。 + * + *

    + * 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。
    + * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。 + */ + public long timestamp() throws UnsupportedOperationException + { + checkTimeBase(); + return (mostSigBits & 0x0FFFL) << 48// + | ((mostSigBits >> 16) & 0x0FFFFL) << 32// + | mostSigBits >>> 32; + } + + /** + * 与此 UUID 相关联的时钟序列值。 + * + *

    + * 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。 + *

    + * {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出 + * UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的时钟序列 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public int clockSequence() throws UnsupportedOperationException + { + checkTimeBase(); + return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); + } + + /** + * 与此 UUID 相关的节点值。 + * + *

    + * 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。 + *

    + * 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。
    + * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的节点值 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public long node() throws UnsupportedOperationException + { + checkTimeBase(); + return leastSigBits & 0x0000FFFFFFFFFFFFL; + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

    + * UUID 的字符串表示形式由此 BNF 描述: + * + *

    +     * {@code
    +     * UUID                   = ----
    +     * time_low               = 4*
    +     * time_mid               = 2*
    +     * time_high_and_version  = 2*
    +     * variant_and_sequence   = 2*
    +     * node                   = 6*
    +     * hexOctet               = 
    +     * hexDigit               = [0-9a-fA-F]
    +     * }
    +     * 
    + * + * + * + * @return 此{@code UUID} 的字符串表现形式 + * @see #toString(boolean) + */ + @Override + public String toString() + { + return toString(false); + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

    + * UUID 的字符串表示形式由此 BNF 描述: + * + *

    +     * {@code
    +     * UUID                   = ----
    +     * time_low               = 4*
    +     * time_mid               = 2*
    +     * time_high_and_version  = 2*
    +     * variant_and_sequence   = 2*
    +     * node                   = 6*
    +     * hexOctet               = 
    +     * hexDigit               = [0-9a-fA-F]
    +     * }
    +     * 
    + * + * + * + * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串 + * @return 此{@code UUID} 的字符串表现形式 + */ + public String toString(boolean isSimple) + { + final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); + // time_low + builder.append(digits(mostSigBits >> 32, 8)); + if (false == isSimple) + { + builder.append('-'); + } + // time_mid + builder.append(digits(mostSigBits >> 16, 4)); + if (false == isSimple) + { + builder.append('-'); + } + // time_high_and_version + builder.append(digits(mostSigBits, 4)); + if (false == isSimple) + { + builder.append('-'); + } + // variant_and_sequence + builder.append(digits(leastSigBits >> 48, 4)); + if (false == isSimple) + { + builder.append('-'); + } + // node + builder.append(digits(leastSigBits, 12)); + + return builder.toString(); + } + + /** + * 返回此 UUID 的哈希码。 + * + * @return UUID 的哈希码值。 + */ + @Override + public int hashCode() + { + long hilo = mostSigBits ^ leastSigBits; + return ((int) (hilo >> 32)) ^ (int) hilo; + } + + /** + * 将此对象与指定对象比较。 + *

    + * 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。 + * + * @param obj 要与之比较的对象 + * + * @return 如果对象相同,则返回 {@code true};否则返回 {@code false} + */ + @Override + public boolean equals(Object obj) + { + if ((null == obj) || (obj.getClass() != UUID.class)) + { + return false; + } + UUID id = (UUID) obj; + return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); + } + + // Comparison Operations + + /** + * 将此 UUID 与指定的 UUID 比较。 + * + *

    + * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。 + * + * @param val 与此 UUID 比较的 UUID + * + * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。 + * + */ + @Override + public int compareTo(UUID val) + { + // The ordering is intentionally set up so that the UUIDs + // can simply be numerically compared as two numbers + return (this.mostSigBits < val.mostSigBits ? -1 : // + (this.mostSigBits > val.mostSigBits ? 1 : // + (this.leastSigBits < val.leastSigBits ? -1 : // + (this.leastSigBits > val.leastSigBits ? 1 : // + 0)))); + } + + // ------------------------------------------------------------------------------------------------------------------- + // Private method start + /** + * 返回指定数字对应的hex值 + * + * @param val 值 + * @param digits 位 + * @return 值 + */ + private static String digits(long val, int digits) + { + long hi = 1L << (digits * 4); + return Long.toHexString(hi | (val & (hi - 1))).substring(1); + } + + /** + * 检查是否为time-based版本UUID + */ + private void checkTimeBase() + { + if (version() != 1) + { + throw new UnsupportedOperationException("Not a time-based UUID"); + } + } + + /** + * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG) + * + * @return {@link SecureRandom} + */ + public static SecureRandom getSecureRandom() + { + try + { + return SecureRandom.getInstance("SHA1PRNG"); + } + catch (NoSuchAlgorithmException e) + { + throw new UtilException(e); + } + } + + /** + * 获取随机数生成器对象
    + * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() + { + return ThreadLocalRandom.current(); + } +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java new file mode 100644 index 0000000..7bfdf04 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java @@ -0,0 +1,27 @@ +package com.ruoyi.common.xss; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义xss校验注解 + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER }) +@Constraint(validatedBy = { XssValidator.class }) +public @interface Xss +{ + String message() + + default "不允许任何脚本运行"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssFilter.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssFilter.java new file mode 100644 index 0000000..5e1921c --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssFilter.java @@ -0,0 +1,74 @@ +package com.ruoyi.common.xss; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import com.ruoyi.common.utils.StringUtils; + +/** + * 防止XSS攻击的过滤器 + * + * @author ruoyi + */ +public class XssFilter implements Filter +{ + /** + * 排除链接 + */ + public List excludes = new ArrayList<>(); + + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + String tempExcludes = filterConfig.getInitParameter("excludes"); + if (StringUtils.isNotEmpty(tempExcludes)) + { + String[] urls = tempExcludes.split(","); + for (String url : urls) + { + excludes.add(url); + } + } + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + if (handleExcludeURL(req, resp)) + { + chain.doFilter(request, response); + return; + } + XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request); + chain.doFilter(xssRequest, response); + } + + private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) + { + String url = request.getServletPath(); + String method = request.getMethod(); + // GET DELETE 不过滤 + if (method == null || method.matches("GET") || method.matches("DELETE")) + { + return true; + } + return StringUtils.matches(url, excludes); + } + + @Override + public void destroy() + { + + } +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssHttpServletRequestWrapper.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssHttpServletRequestWrapper.java new file mode 100644 index 0000000..929de41 --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssHttpServletRequestWrapper.java @@ -0,0 +1,39 @@ +package com.ruoyi.common.xss; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import com.ruoyi.common.utils.html.EscapeUtil; + +/** + * XSS过滤处理 + * + * @author ruoyi + */ +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper +{ + /** + * @param request + */ + public XssHttpServletRequestWrapper(HttpServletRequest request) + { + super(request); + } + + @Override + public String[] getParameterValues(String name) + { + String[] values = super.getParameterValues(name); + if (values != null) + { + int length = values.length; + String[] escapseValues = new String[length]; + for (int i = 0; i < length; i++) + { + // 防xss攻击和过滤前后空格 + escapseValues[i] = EscapeUtil.clean(values[i]).trim(); + } + return escapseValues; + } + return super.getParameterValues(name); + } +} \ No newline at end of file diff --git a/src/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java b/src/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java new file mode 100644 index 0000000..42f425c --- /dev/null +++ b/src/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java @@ -0,0 +1,39 @@ +package com.ruoyi.common.xss; + +import com.ruoyi.common.utils.StringUtils; +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 自定义xss校验注解实现 + * + * @author ruoyi + */ +public class XssValidator implements ConstraintValidator +{ + private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />"; + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) + { + if (StringUtils.isBlank(value)) + { + return true; + } + return !containsHtml(value); + } + + public static boolean containsHtml(String value) + { + StringBuilder sHtml = new StringBuilder(); + Pattern pattern = Pattern.compile(HTML_PATTERN); + Matcher matcher = pattern.matcher(value); + while (matcher.find()) + { + sHtml.append(matcher.group()); + } + return pattern.matcher(sHtml).matches(); + } +} \ No newline at end of file diff --git a/src/ruoyi-framework/pom.xml b/src/ruoyi-framework/pom.xml new file mode 100644 index 0000000..b3b7bcc --- /dev/null +++ b/src/ruoyi-framework/pom.xml @@ -0,0 +1,82 @@ + + + + ruoyi + com.ruoyi + 4.7.9 + + 4.0.0 + + ruoyi-framework + + + framework框架核心 + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.alibaba + druid-spring-boot-starter + + + + + pro.fessional + kaptcha + + + servlet-api + javax.servlet + + + + + + + org.apache.shiro + shiro-spring + + + + + com.github.theborakompanioni + thymeleaf-extras-shiro + + + + + eu.bitwalker + UserAgentUtils + + + + + com.github.oshi + oshi-core + + + + + com.ruoyi + ruoyi-system + + + + + \ No newline at end of file diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java new file mode 100644 index 0000000..593b320 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java @@ -0,0 +1,122 @@ +package com.ruoyi.framework.aspectj; + +import java.util.ArrayList; +import java.util.List; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; +import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.context.PermissionContextHolder; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * 数据过滤处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class DataScopeAspect +{ + /** + * 全部数据权限 + */ + public static final String DATA_SCOPE_ALL = "1"; + + /** + * 自定数据权限 + */ + public static final String DATA_SCOPE_CUSTOM = "2"; + + /** + * 部门数据权限 + */ + public static final String DATA_SCOPE_DEPT = "3"; + + /** + * 部门及以下数据权限 + */ + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + + /** + * 仅本人数据权限 + */ + public static final String DATA_SCOPE_SELF = "5"; + + /** + * 数据权限过滤关键字 + */ + public static final String DATA_SCOPE = "dataScope"; + + @Before("@annotation(controllerDataScope)") + public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable + { + clearDataScope(point); + handleDataScope(point, controllerDataScope); + } + + protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) + { + // 获取当前的用户 + SysUser currentUser = ShiroUtils.getSysUser(); + if (currentUser != null) + { + // 如果是超级管理员,则不过滤数据 + if (!currentUser.isAdmin()) + { + String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext()); + dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), controllerDataScope.userAlias(), permission); + } + } + } + + /** + * 数据范围过滤 + * + * @param joinPoint 切点 + * @param user 用户 + * @param deptAlias 部门别名 + * @param userAlias 用户别名 + * @param permission 权限字符 + */ + public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission) + { + StringBuilder sqlString = new StringBuilder(); + List conditions = new ArrayList(); + + // 角色都不包含传递过来的权限字符,这个时候sqlString也会为空,所以要限制一下,不查询任何数据 + if (StringUtils.isEmpty(conditions)) + { + sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); + } + + if (StringUtils.isNotBlank(sqlString.toString())) + { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) + { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); + } + } + } + + /** + * 拼接权限sql前先清空params.dataScope参数防止注入 + */ + private void clearDataScope(final JoinPoint joinPoint) + { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) + { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, ""); + } + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java new file mode 100644 index 0000000..4951bc9 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java @@ -0,0 +1,72 @@ +package com.ruoyi.framework.aspectj; + +import java.util.Objects; +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.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.config.datasource.DynamicDataSourceContextHolder; +import com.ruoyi.common.utils.StringUtils; + +/** + * 多数据源处理 + * + * @author ruoyi + */ +@Aspect +@Order(1) +@Component +public class DataSourceAspect +{ + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)" + + "|| @within(com.ruoyi.common.annotation.DataSource)") + public void dsPointCut() + { + + } + + @Around("dsPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable + { + DataSource dataSource = getDataSource(point); + + if (StringUtils.isNotNull(dataSource)) + { + DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name()); + } + + try + { + return point.proceed(); + } + finally + { + // 销毁数据源 在执行方法之后 + DynamicDataSourceContextHolder.clearDataSourceType(); + } + } + + /** + * 获取需要切换的数据源 + */ + public DataSource getDataSource(ProceedingJoinPoint point) + { + MethodSignature signature = (MethodSignature) point.getSignature(); + DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); + if (Objects.nonNull(dataSource)) + { + return dataSource; + } + + return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java new file mode 100644 index 0000000..6b6dccb --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java @@ -0,0 +1,250 @@ +package com.ruoyi.framework.aspectj; + +import java.util.Collection; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.ArrayUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.NamedThreadLocal; +import org.springframework.stereotype.Component; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.support.spring.PropertyPreFilters; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.enums.BusinessStatus; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.system.domain.SysOperLog; + +/** + * 操作日志记录处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class LogAspect +{ + private static final Logger log = LoggerFactory.getLogger(LogAspect.class); + + /** 排除敏感属性字段 */ + public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" }; + + /** 计算操作消耗时间 */ + private static final ThreadLocal TIME_THREADLOCAL = new NamedThreadLocal("Cost Time"); + + /** + * 处理请求前执行 + */ + @Before(value = "@annotation(controllerLog)") + public void boBefore(JoinPoint joinPoint, Log controllerLog) + { + TIME_THREADLOCAL.set(System.currentTimeMillis()); + } + + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) + { + handleLog(joinPoint, controllerLog, null, jsonResult); + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) + { + handleLog(joinPoint, controllerLog, e, null); + } + + protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) + { + try + { + // 获取当前的用户 + SysUser currentUser = ShiroUtils.getSysUser(); + + // *========数据库日志=========*// + SysOperLog operLog = new SysOperLog(); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 请求的地址 + String ip = ShiroUtils.getIp(); + operLog.setOperIp(ip); + operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); + if (currentUser != null) + { + operLog.setOperName(currentUser.getLoginName()); + } + + if (e != null) + { + operLog.setStatus(BusinessStatus.FAIL.ordinal()); + operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); + } + // 设置方法名称 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + operLog.setMethod(className + "." + methodName + "()"); + // 设置请求方式 + operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); + // 处理设置注解上的参数 + getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); + // 设置消耗时间 + operLog.setCostTime(System.currentTimeMillis() - TIME_THREADLOCAL.get()); + // 保存数据库 + AsyncManager.me().execute(AsyncFactory.recordOper(operLog)); + } + catch (Exception exp) + { + // 记录本地异常日志 + log.error("异常信息:{}", exp.getMessage()); + exp.printStackTrace(); + } + finally + { + TIME_THREADLOCAL.remove(); + } + } + + /** + * 获取注解中对方法的描述信息 用于Controller层注解 + * + * @param log 日志 + * @param operLog 操作日志 + * @throws Exception + */ + public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception + { + // 设置action动作 + operLog.setBusinessType(log.businessType().ordinal()); + // 设置标题 + operLog.setTitle(log.title()); + // 设置操作人类别 + operLog.setOperatorType(log.operatorType().ordinal()); + // 是否需要保存request,参数和值 + if (log.isSaveRequestData()) + { + // 获取参数的信息,传入到数据库中。 + setRequestValue(joinPoint, operLog, log.excludeParamNames()); + } + // 是否需要保存response,参数和值 + if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) + { + operLog.setJsonResult(StringUtils.substring(JSONObject.toJSONString(jsonResult), 0, 2000)); + } + } + + /** + * 获取请求的参数,放到log中 + * + * @param operLog 操作日志 + * @throws Exception 异常 + */ + private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog, String[] excludeParamNames) throws Exception + { + Map map = ServletUtils.getRequest().getParameterMap(); + if (StringUtils.isNotEmpty(map)) + { + String params = JSONObject.toJSONString(map, excludePropertyPreFilter(excludeParamNames)); + operLog.setOperParam(StringUtils.substring(params, 0, 2000)); + } + else + { + Object args = joinPoint.getArgs(); + if (StringUtils.isNotNull(args)) + { + String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames); + operLog.setOperParam(StringUtils.substring(params, 0, 2000)); + } + } + } + + /** + * 忽略敏感属性 + */ + public PropertyPreFilters.MySimplePropertyPreFilter excludePropertyPreFilter(String[] excludeParamNames) + { + return new PropertyPreFilters().addFilter().addExcludes(ArrayUtils.addAll(EXCLUDE_PROPERTIES, excludeParamNames)); + } + + /** + * 参数拼装 + */ + private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames) + { + String params = ""; + if (paramsArray != null && paramsArray.length > 0) + { + for (Object o : paramsArray) + { + if (StringUtils.isNotNull(o) && !isFilterObject(o)) + { + try + { + Object jsonObj = JSONObject.toJSONString(o, excludePropertyPreFilter(excludeParamNames)); + params += jsonObj.toString() + " "; + } + catch (Exception e) + { + } + } + } + } + return params.trim(); + } + + /** + * 判断是否需要过滤的对象。 + * + * @param o 对象信息。 + * @return 如果是需要过滤的对象,则返回true;否则返回false。 + */ + @SuppressWarnings("rawtypes") + public boolean isFilterObject(final Object o) + { + Class clazz = o.getClass(); + if (clazz.isArray()) + { + return clazz.getComponentType().isAssignableFrom(MultipartFile.class); + } + else if (Collection.class.isAssignableFrom(clazz)) + { + Collection collection = (Collection) o; + for (Object value : collection) + { + return value instanceof MultipartFile; + } + } + else if (Map.class.isAssignableFrom(clazz)) + { + Map map = (Map) o; + for (Object value : map.entrySet()) + { + Map.Entry entry = (Map.Entry) value; + return entry.getValue() instanceof MultipartFile; + } + } + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse + || o instanceof BindingResult; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/PermissionsAspect.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/PermissionsAspect.java new file mode 100644 index 0000000..9d9831f --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/PermissionsAspect.java @@ -0,0 +1,30 @@ +package com.ruoyi.framework.aspectj; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; +import com.ruoyi.common.core.context.PermissionContextHolder; +import com.ruoyi.common.utils.StringUtils; + +/** + * 自定义权限拦截器,将权限字符串放到当前请求中以便用于多个角色匹配符合要求的权限 + * + * @author ruoyi + */ +@Aspect +@Component +public class PermissionsAspect +{ + @Before("@annotation(controllerRequiresPermissions)") + public void doBefore(JoinPoint point, RequiresPermissions controllerRequiresPermissions) throws Throwable + { + handleRequiresPermissions(point, controllerRequiresPermissions); + } + + protected void handleRequiresPermissions(final JoinPoint joinPoint, RequiresPermissions requiresPermissions) + { + PermissionContextHolder.setContext(StringUtils.join(requiresPermissions.value(), ",")); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java new file mode 100644 index 0000000..b6b0e88 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java @@ -0,0 +1,20 @@ +package com.ruoyi.framework.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +/** + * 程序注解配置 + * + * @author ruoyi + */ +@Configuration +// 表示通过aop框架暴露该代理对象,AopContext能够访问 +@EnableAspectJAutoProxy(exposeProxy = true) +// 指定要扫描的Mapper类的包的路径 +@MapperScan("com.ruoyi.**.mapper") +public class ApplicationConfig +{ + +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java new file mode 100644 index 0000000..43e78ae --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java @@ -0,0 +1,83 @@ +package com.ruoyi.framework.config; + +import java.util.Properties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import static com.google.code.kaptcha.Constants.*; + +/** + * 验证码配置 + * + * @author ruoyi + */ +@Configuration +public class CaptchaConfig +{ + @Bean(name = "captchaProducer") + public DefaultKaptcha getKaptchaBean() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } + + @Bean(name = "captchaProducerMath") + public DefaultKaptcha getKaptchaBeanMath() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 边框颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); + // 验证码文本生成器 + properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ruoyi.framework.config.KaptchaTextCreator"); + // 验证码文本字符间距 默认为2 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 验证码噪点颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); + // 干扰实现类 + properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java new file mode 100644 index 0000000..1e3ebef --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java @@ -0,0 +1,128 @@ +package com.ruoyi.framework.config; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.sql.DataSource; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; +import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; +import com.alibaba.druid.util.Utils; +import com.ruoyi.common.enums.DataSourceType; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.framework.config.properties.DruidProperties; +import com.ruoyi.framework.datasource.DynamicDataSource; + +/** + * druid 配置多数据源 + * + * @author ruoyi + */ +@Configuration +public class DruidConfig +{ + @Bean + @ConfigurationProperties("spring.datasource.druid.master") + public DataSource masterDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean + @ConfigurationProperties("spring.datasource.druid.slave") + @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") + public DataSource slaveDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean(name = "dynamicDataSource") + @Primary + public DynamicDataSource dataSource(DataSource masterDataSource) + { + Map targetDataSources = new HashMap<>(); + targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); + setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource"); + return new DynamicDataSource(masterDataSource, targetDataSources); + } + + /** + * 设置数据源 + * + * @param targetDataSources 备选数据源集合 + * @param sourceName 数据源名称 + * @param beanName bean名称 + */ + public void setDataSource(Map targetDataSources, String sourceName, String beanName) + { + try + { + DataSource dataSource = SpringUtils.getBean(beanName); + targetDataSources.put(sourceName, dataSource); + } + catch (Exception e) + { + } + } + + /** + * 去除监控页面底部的广告 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true") + public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) + { + // 获取web监控页面的参数 + DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); + // 提取common.js的配置路径 + String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; + String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); + final String filePath = "support/http/resources/js/common.js"; + // 创建filter进行过滤 + Filter filter = new Filter() + { + @Override + public void init(javax.servlet.FilterConfig filterConfig) throws ServletException + { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + chain.doFilter(request, response); + // 重置缓冲区,响应头不会被重置 + response.resetBuffer(); + // 获取common.js + String text = Utils.readFromResource(filePath); + // 正则替换banner, 除去底部的广告信息 + text = text.replaceAll("
    ", ""); + text = text.replaceAll("powered.*?shrek.wang", ""); + response.getWriter().write(text); + } + + @Override + public void destroy() + { + } + }; + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(filter); + registrationBean.addUrlPatterns(commonJsPattern); + return registrationBean; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java new file mode 100644 index 0000000..6abb9a2 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java @@ -0,0 +1,44 @@ +package com.ruoyi.framework.config; + +import java.util.HashMap; +import java.util.Map; +import javax.servlet.DispatcherType; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.xss.XssFilter; + +/** + * Filter配置 + * + * @author ruoyi + */ +@Configuration +@ConditionalOnProperty(value = "xss.enabled", havingValue = "true") +public class FilterConfig +{ + @Value("${xss.excludes}") + private String excludes; + + @Value("${xss.urlPatterns}") + private String urlPatterns; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + public FilterRegistrationBean xssFilterRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new XssFilter()); + registration.addUrlPatterns(StringUtils.split(urlPatterns, ",")); + registration.setName("xssFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); + Map initParameters = new HashMap(); + initParameters.put("excludes", excludes); + registration.setInitParameters(initParameters); + return registration; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java new file mode 100644 index 0000000..6d2382c --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java @@ -0,0 +1,43 @@ +package com.ruoyi.framework.config; + +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; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; +import com.ruoyi.common.constant.Constants; + +/** + * 资源文件配置加载 + * + * @author ruoyi + */ +@Configuration +public class I18nConfig implements WebMvcConfigurer +{ + @Bean + public LocaleResolver localeResolver() + { + SessionLocaleResolver slr = new SessionLocaleResolver(); + // 默认语言 + slr.setDefaultLocale(Constants.DEFAULT_LOCALE); + return slr; + } + + @Bean + public LocaleChangeInterceptor localeChangeInterceptor() + { + LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); + // 参数名 + lci.setParamName("lang"); + return lci; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) + { + registry.addInterceptor(localeChangeInterceptor()); + } +} \ No newline at end of file diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java new file mode 100644 index 0000000..ae89d3c --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java @@ -0,0 +1,76 @@ +package com.ruoyi.framework.config; + +import java.security.SecureRandom; +import java.util.Random; +import com.google.code.kaptcha.text.impl.DefaultTextCreator; + +/** + * 验证码文本生成器 + * + * @author ruoyi + */ +public class KaptchaTextCreator extends DefaultTextCreator +{ + private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); + + @Override + public String getText() + { + Integer result = 0; + Random random = new SecureRandom(); + int x = random.nextInt(10); + int y = random.nextInt(10); + StringBuilder suChinese = new StringBuilder(); + int randomoperands = (int) Math.round(Math.random() * 2); + if (randomoperands == 0) + { + result = x * y; + suChinese.append(CNUMBERS[x]); + suChinese.append("*"); + suChinese.append(CNUMBERS[y]); + } + else if (randomoperands == 1) + { + if (!(x == 0) && y % x == 0) + { + result = y / x; + suChinese.append(CNUMBERS[y]); + suChinese.append("/"); + suChinese.append(CNUMBERS[x]); + } + else + { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + } + else if (randomoperands == 2) + { + if (x >= y) + { + result = x - y; + suChinese.append(CNUMBERS[x]); + suChinese.append("-"); + suChinese.append(CNUMBERS[y]); + } + else + { + result = y - x; + suChinese.append(CNUMBERS[y]); + suChinese.append("-"); + suChinese.append(CNUMBERS[x]); + } + } + else + { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + suChinese.append("=?@" + result); + return suChinese.toString(); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java new file mode 100644 index 0000000..057c941 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java @@ -0,0 +1,132 @@ +package com.ruoyi.framework.config; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import javax.sql.DataSource; +import org.apache.ibatis.io.VFS; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.core.type.classreading.CachingMetadataReaderFactory; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.util.ClassUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * Mybatis支持*匹配扫描包 + * + * @author ruoyi + */ +@Configuration +public class MyBatisConfig +{ + @Autowired + private Environment env; + + static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; + + public static String setTypeAliasesPackage(String typeAliasesPackage) + { + ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver(); + MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver); + List allResult = new ArrayList(); + try + { + for (String aliasesPackage : typeAliasesPackage.split(",")) + { + List result = new ArrayList(); + aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN; + Resource[] resources = resolver.getResources(aliasesPackage); + if (resources != null && resources.length > 0) + { + MetadataReader metadataReader = null; + for (Resource resource : resources) + { + if (resource.isReadable()) + { + metadataReader = metadataReaderFactory.getMetadataReader(resource); + try + { + result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); + } + catch (ClassNotFoundException e) + { + e.printStackTrace(); + } + } + } + } + if (result.size() > 0) + { + HashSet hashResult = new HashSet(result); + allResult.addAll(hashResult); + } + } + if (allResult.size() > 0) + { + typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0])); + } + else + { + throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包"); + } + } + catch (IOException e) + { + e.printStackTrace(); + } + return typeAliasesPackage; + } + + public Resource[] resolveMapperLocations(String[] mapperLocations) + { + ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); + List resources = new ArrayList(); + if (mapperLocations != null) + { + for (String mapperLocation : mapperLocations) + { + try + { + Resource[] mappers = resourceResolver.getResources(mapperLocation); + resources.addAll(Arrays.asList(mappers)); + } + catch (IOException e) + { + // ignore + } + } + } + return resources.toArray(new Resource[resources.size()]); + } + + @Bean + public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception + { + String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage"); + String mapperLocations = env.getProperty("mybatis.mapperLocations"); + String configLocation = env.getProperty("mybatis.configLocation"); + typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); + VFS.addImplClass(SpringBootVFS.class); + + final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); + sessionFactory.setDataSource(dataSource); + sessionFactory.setTypeAliasesPackage(typeAliasesPackage); + sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ","))); + sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); + return sessionFactory.getObject(); + } +} \ No newline at end of file diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java new file mode 100644 index 0000000..5322ecd --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java @@ -0,0 +1,58 @@ +package com.ruoyi.framework.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 通用配置 + * + * @author ruoyi + */ +@Configuration +public class ResourcesConfig implements WebMvcConfigurer +{ + /** + * 首页地址 + */ + @Value("${shiro.user.indexUrl}") + private String indexUrl; + + @Autowired + private RepeatSubmitInterceptor repeatSubmitInterceptor; + + /** + * 默认首页的设置,当输入域名是可以自动跳转到默认指定的网页 + */ + @Override + public void addViewControllers(ViewControllerRegistry registry) + { + registry.addViewController("/").setViewName("forward:" + indexUrl); + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) + { + /** 本地文件上传路径 */ + registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**").addResourceLocations("file:" + RuoYiConfig.getProfile() + "/"); + + /** swagger配置 */ + registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); + } + + /** + * 自定义拦截规则 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) + { + registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**"); + } +} \ No newline at end of file diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java new file mode 100644 index 0000000..54b56bc --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java @@ -0,0 +1,393 @@ +package com.ruoyi.framework.config; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.Filter; +import org.apache.commons.io.IOUtils; +import org.apache.shiro.cache.ehcache.EhCacheManager; +import org.apache.shiro.config.ConfigurationException; +import org.apache.shiro.io.ResourceUtils; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apache.shiro.web.servlet.SimpleCookie; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.framework.config.properties.PermitAllUrlProperties; +import com.ruoyi.framework.shiro.realm.UserRealm; +import com.ruoyi.framework.shiro.session.OnlineSessionDAO; +import com.ruoyi.framework.shiro.session.OnlineSessionFactory; +import com.ruoyi.framework.shiro.web.CustomShiroFilterFactoryBean; +import com.ruoyi.framework.shiro.web.filter.LogoutFilter; +import com.ruoyi.framework.shiro.web.filter.captcha.CaptchaValidateFilter; +import com.ruoyi.framework.shiro.web.filter.kickout.KickoutSessionFilter; +import com.ruoyi.framework.shiro.web.filter.online.OnlineSessionFilter; +import com.ruoyi.framework.shiro.web.filter.sync.SyncOnlineSessionFilter; +import com.ruoyi.framework.shiro.web.session.OnlineWebSessionManager; +import com.ruoyi.framework.shiro.web.session.SpringSessionValidationScheduler; +import at.pollux.thymeleaf.shiro.dialect.ShiroDialect; + +/** + * 权限配置加载 + * + * @author ruoyi + */ +@Configuration +public class ShiroConfig +{ + /** + * Session超时时间,单位为毫秒(默认30分钟) + */ + @Value("${shiro.session.expireTime}") + private int expireTime; + + /** + * 相隔多久检查一次session的有效性,单位毫秒,默认就是10分钟 + */ + @Value("${shiro.session.validationInterval}") + private int validationInterval; + + /** + * 同一个用户最大会话数 + */ + @Value("${shiro.session.maxSession}") + private int maxSession; + + /** + * 踢出之前登录的/之后登录的用户,默认踢出之前登录的用户 + */ + @Value("${shiro.session.kickoutAfter}") + private boolean kickoutAfter; + + /** + * 验证码开关 + */ + @Value("${shiro.user.captchaEnabled}") + private boolean captchaEnabled; + + /** + * 验证码类型 + */ + @Value("${shiro.user.captchaType}") + private String captchaType; + + /** + * 设置Cookie的域名 + */ + @Value("${shiro.cookie.domain}") + private String domain; + + /** + * 设置cookie的有效访问路径 + */ + @Value("${shiro.cookie.path}") + private String path; + + /** + * 设置HttpOnly属性 + */ + @Value("${shiro.cookie.httpOnly}") + private boolean httpOnly; + + /** + * 设置Cookie的过期时间,秒为单位 + */ + @Value("${shiro.cookie.maxAge}") + private int maxAge; + + /** + * 登录地址 + */ + @Value("${shiro.user.loginUrl}") + private String loginUrl; + + /** + * 权限认证失败地址 + */ + @Value("${shiro.user.unauthorizedUrl}") + private String unauthorizedUrl; + + /** + * 是否开启记住我功能 + */ + @Value("${shiro.rememberMe.enabled: false}") + private boolean rememberMe; + + /** + * 缓存管理器 使用Ehcache实现 + */ + @Bean + public EhCacheManager getEhCacheManager() + { + net.sf.ehcache.CacheManager cacheManager = net.sf.ehcache.CacheManager.getCacheManager("ruoyi"); + EhCacheManager em = new EhCacheManager(); + if (StringUtils.isNull(cacheManager)) + { + em.setCacheManager(new net.sf.ehcache.CacheManager(getCacheManagerConfigFileInputStream())); + return em; + } + else + { + em.setCacheManager(cacheManager); + return em; + } + } + + /** + * 返回配置文件流 避免ehcache配置文件一直被占用,无法完全销毁项目重新部署 + */ + protected InputStream getCacheManagerConfigFileInputStream() + { + String configFile = "classpath:ehcache/ehcache-shiro.xml"; + InputStream inputStream = null; + try + { + inputStream = ResourceUtils.getInputStreamForPath(configFile); + byte[] b = IOUtils.toByteArray(inputStream); + InputStream in = new ByteArrayInputStream(b); + return in; + } + catch (IOException e) + { + throw new ConfigurationException( + "Unable to obtain input stream for cacheManagerConfigFile [" + configFile + "]", e); + } + finally + { + IOUtils.closeQuietly(inputStream); + } + } + + /** + * 自定义Realm + */ + @Bean + public UserRealm userRealm(EhCacheManager cacheManager) + { + UserRealm userRealm = new UserRealm(); + userRealm.setAuthorizationCacheName(Constants.SYS_AUTH_CACHE); + userRealm.setCacheManager(cacheManager); + return userRealm; + } + + /** + * 自定义sessionDAO会话 + */ + @Bean + public OnlineSessionDAO sessionDAO() + { + OnlineSessionDAO sessionDAO = new OnlineSessionDAO(); + return sessionDAO; + } + + /** + * 自定义sessionFactory会话 + */ + @Bean + public OnlineSessionFactory sessionFactory() + { + OnlineSessionFactory sessionFactory = new OnlineSessionFactory(); + return sessionFactory; + } + + /** + * 会话管理器 + */ + @Bean + public OnlineWebSessionManager sessionManager() + { + OnlineWebSessionManager manager = new OnlineWebSessionManager(); + // 加入缓存管理器 + manager.setCacheManager(getEhCacheManager()); + // 删除过期的session + manager.setDeleteInvalidSessions(true); + // 设置全局session超时时间 + manager.setGlobalSessionTimeout(expireTime * 60 * 1000); + // 去掉 JSESSIONID + manager.setSessionIdUrlRewritingEnabled(false); + // 定义要使用的无效的Session定时调度器 + manager.setSessionValidationScheduler(SpringUtils.getBean(SpringSessionValidationScheduler.class)); + // 是否定时检查session + manager.setSessionValidationSchedulerEnabled(true); + // 自定义SessionDao + manager.setSessionDAO(sessionDAO()); + // 自定义sessionFactory + manager.setSessionFactory(sessionFactory()); + return manager; + } + + /** + * 安全管理器 + */ + @Bean + public SecurityManager securityManager(UserRealm userRealm) + { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + // 设置realm. + securityManager.setRealm(userRealm); + // 注入缓存管理器; + securityManager.setCacheManager(getEhCacheManager()); + // session管理器 + securityManager.setSessionManager(sessionManager()); + return securityManager; + } + + /** + * 退出过滤器 + */ + public LogoutFilter logoutFilter() + { + LogoutFilter logoutFilter = new LogoutFilter(); + logoutFilter.setLoginUrl(loginUrl); + return logoutFilter; + } + + /** + * Shiro过滤器配置 + */ + @Bean + public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) + { + CustomShiroFilterFactoryBean shiroFilterFactoryBean = new CustomShiroFilterFactoryBean(); + // Shiro的核心安全接口,这个属性是必须的 + shiroFilterFactoryBean.setSecurityManager(securityManager); + // 身份认证失败,则跳转到登录页面的配置 + shiroFilterFactoryBean.setLoginUrl(loginUrl); + // 权限认证失败,则跳转到指定页面 + shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl); + // Shiro连接约束配置,即过滤链的定义 + LinkedHashMap filterChainDefinitionMap = new LinkedHashMap<>(); + // 对静态资源设置匿名访问 + filterChainDefinitionMap.put("/favicon.ico**", "anon"); + filterChainDefinitionMap.put("/ruoyi.png**", "anon"); + filterChainDefinitionMap.put("/html/**", "anon"); + filterChainDefinitionMap.put("/css/**", "anon"); + filterChainDefinitionMap.put("/docs/**", "anon"); + filterChainDefinitionMap.put("/fonts/**", "anon"); + filterChainDefinitionMap.put("/img/**", "anon"); + filterChainDefinitionMap.put("/ajax/**", "anon"); + filterChainDefinitionMap.put("/js/**", "anon"); + filterChainDefinitionMap.put("/yw/**", "anon"); + filterChainDefinitionMap.put("/captcha/captchaImage**", "anon"); + // 匿名访问不鉴权注解列表 + List permitAllUrl = SpringUtils.getBean(PermitAllUrlProperties.class).getUrls(); + if (StringUtils.isNotEmpty(permitAllUrl)) + { + permitAllUrl.forEach(url -> filterChainDefinitionMap.put(url, "anon")); + } + // 退出 logout地址,shiro去清除session + filterChainDefinitionMap.put("/logout", "logout"); + // 不需要拦截的访问 + filterChainDefinitionMap.put("/login", "anon,captchaValidate"); + // 注册相关 + filterChainDefinitionMap.put("/register", "anon,captchaValidate"); + + Map filters = new LinkedHashMap(); + filters.put("onlineSession", onlineSessionFilter()); + filters.put("syncOnlineSession", syncOnlineSessionFilter()); + filters.put("captchaValidate", captchaValidateFilter()); + filters.put("kickout", kickoutSessionFilter()); + // 注销成功,则跳转到指定页面 + filters.put("logout", logoutFilter()); + shiroFilterFactoryBean.setFilters(filters); + + // 所有请求需要认证 + filterChainDefinitionMap.put("/**", "user,kickout,onlineSession,syncOnlineSession"); + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); + + return shiroFilterFactoryBean; + } + + /** + * 自定义在线用户处理过滤器 + */ + public OnlineSessionFilter onlineSessionFilter() + { + OnlineSessionFilter onlineSessionFilter = new OnlineSessionFilter(); + onlineSessionFilter.setLoginUrl(loginUrl); + onlineSessionFilter.setOnlineSessionDAO(sessionDAO()); + return onlineSessionFilter; + } + + /** + * 自定义在线用户同步过滤器 + */ + public SyncOnlineSessionFilter syncOnlineSessionFilter() + { + SyncOnlineSessionFilter syncOnlineSessionFilter = new SyncOnlineSessionFilter(); + syncOnlineSessionFilter.setOnlineSessionDAO(sessionDAO()); + return syncOnlineSessionFilter; + } + + /** + * 自定义验证码过滤器 + */ + public CaptchaValidateFilter captchaValidateFilter() + { + CaptchaValidateFilter captchaValidateFilter = new CaptchaValidateFilter(); + captchaValidateFilter.setCaptchaEnabled(captchaEnabled); + captchaValidateFilter.setCaptchaType(captchaType); + return captchaValidateFilter; + } + + /** + * cookie 属性设置 + */ + public SimpleCookie rememberMeCookie() + { + SimpleCookie cookie = new SimpleCookie("rememberMe"); + cookie.setDomain(domain); + cookie.setPath(path); + cookie.setHttpOnly(httpOnly); + cookie.setMaxAge(maxAge * 24 * 60 * 60); + return cookie; + } + + /** + * 同一个用户多设备登录限制 + */ + public KickoutSessionFilter kickoutSessionFilter() + { + KickoutSessionFilter kickoutSessionFilter = new KickoutSessionFilter(); + kickoutSessionFilter.setCacheManager(getEhCacheManager()); + kickoutSessionFilter.setSessionManager(sessionManager()); + // 同一个用户最大的会话数,默认-1无限制;比如2的意思是同一个用户允许最多同时两个人登录 + kickoutSessionFilter.setMaxSession(maxSession); + // 是否踢出后来登录的,默认是false;即后者登录的用户踢出前者登录的用户;踢出顺序 + kickoutSessionFilter.setKickoutAfter(kickoutAfter); + // 被踢出后重定向到的地址; + kickoutSessionFilter.setKickoutUrl("/login?kickout=1"); + return kickoutSessionFilter; + } + + /** + * thymeleaf模板引擎和shiro框架的整合 + */ + @Bean + public ShiroDialect shiroDialect() + { + return new ShiroDialect(); + } + + /** + * 开启Shiro注解通知器 + */ + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor( + @Qualifier("securityManager") SecurityManager securityManager) + { + AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); + authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); + return authorizationAttributeSourceAdvisor; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java new file mode 100644 index 0000000..c8a5c8a --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java @@ -0,0 +1,89 @@ +package com.ruoyi.framework.config.properties; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import com.alibaba.druid.pool.DruidDataSource; + +/** + * druid 配置属性 + * + * @author ruoyi + */ +@Configuration +public class DruidProperties +{ + @Value("${spring.datasource.druid.initialSize}") + private int initialSize; + + @Value("${spring.datasource.druid.minIdle}") + private int minIdle; + + @Value("${spring.datasource.druid.maxActive}") + private int maxActive; + + @Value("${spring.datasource.druid.maxWait}") + private int maxWait; + + @Value("${spring.datasource.druid.connectTimeout}") + private int connectTimeout; + + @Value("${spring.datasource.druid.socketTimeout}") + private int socketTimeout; + + @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") + private int timeBetweenEvictionRunsMillis; + + @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}") + private int minEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}") + private int maxEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.validationQuery}") + private String validationQuery; + + @Value("${spring.datasource.druid.testWhileIdle}") + private boolean testWhileIdle; + + @Value("${spring.datasource.druid.testOnBorrow}") + private boolean testOnBorrow; + + @Value("${spring.datasource.druid.testOnReturn}") + private boolean testOnReturn; + + public DruidDataSource dataSource(DruidDataSource datasource) + { + /** 配置初始化大小、最小、最大 */ + datasource.setInitialSize(initialSize); + datasource.setMaxActive(maxActive); + datasource.setMinIdle(minIdle); + + /** 配置获取连接等待超时的时间 */ + datasource.setMaxWait(maxWait); + + /** 配置驱动连接超时时间,检测数据库建立连接的超时时间,单位是毫秒 */ + datasource.setConnectTimeout(connectTimeout); + + /** 配置网络超时时间,等待数据库操作完成的网络超时时间,单位是毫秒 */ + datasource.setSocketTimeout(socketTimeout); + + /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ + datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + + /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */ + datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); + + /** + * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 + */ + datasource.setValidationQuery(validationQuery); + /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */ + datasource.setTestWhileIdle(testWhileIdle); + /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnBorrow(testOnBorrow); + /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnReturn(testOnReturn); + return datasource; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java new file mode 100644 index 0000000..0683102 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java @@ -0,0 +1,122 @@ +package com.ruoyi.framework.config.properties; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.springframework.aop.framework.Advised; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import com.ruoyi.common.annotation.Anonymous; + +/** + * 设置Anonymous注解允许匿名访问的url + * + * @author ruoyi + */ +@Configuration +public class PermitAllUrlProperties implements InitializingBean, ApplicationContextAware +{ + private List urls = new ArrayList<>(); + + private ApplicationContext applicationContext; + + @Override + public void afterPropertiesSet() throws Exception + { + Map controllers = applicationContext.getBeansWithAnnotation(Controller.class); + for (Object bean : controllers.values()) + { + if (!(bean instanceof Advised)) + { + continue; + } + Class beanClass = ((Advised) bean).getTargetSource().getTarget().getClass(); + RequestMapping base = beanClass.getAnnotation(RequestMapping.class); + String[] baseUrl = {}; + if (Objects.nonNull(base)) + { + baseUrl = base.value(); + } + Method[] methods = beanClass.getDeclaredMethods(); + for (Method method : methods) + { + if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(RequestMapping.class)) + { + RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); + String[] uri = requestMapping.value(); + urls.addAll(rebuildUrl(baseUrl, uri)); + } + else if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(GetMapping.class)) + { + GetMapping requestMapping = method.getAnnotation(GetMapping.class); + String[] uri = requestMapping.value(); + urls.addAll(rebuildUrl(baseUrl, uri)); + } + else if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(PostMapping.class)) + { + PostMapping requestMapping = method.getAnnotation(PostMapping.class); + String[] uri = requestMapping.value(); + urls.addAll(rebuildUrl(baseUrl, uri)); + } + else if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(PutMapping.class)) + { + PutMapping requestMapping = method.getAnnotation(PutMapping.class); + String[] uri = requestMapping.value(); + urls.addAll(rebuildUrl(baseUrl, uri)); + } + else if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(DeleteMapping.class)) + { + DeleteMapping requestMapping = method.getAnnotation(DeleteMapping.class); + String[] uri = requestMapping.value(); + urls.addAll(rebuildUrl(baseUrl, uri)); + } + } + + } + } + + private List rebuildUrl(String[] bases, String[] uris) + { + List urls = new ArrayList<>(); + for (String base : bases) + { + for (String uri : uris) + { + urls.add(prefix(base) + prefix(uri)); + } + } + return urls; + } + + private String prefix(String seg) + { + return seg.startsWith("/") ? seg : "/" + seg; + } + + @Override + public void setApplicationContext(ApplicationContext context) throws BeansException + { + this.applicationContext = context; + } + + public List getUrls() + { + return urls; + } + + public void setUrls(List urls) + { + this.urls = urls; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java new file mode 100644 index 0000000..94b3d0d --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java @@ -0,0 +1,27 @@ +package com.ruoyi.framework.datasource; + +import java.util.Map; +import javax.sql.DataSource; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; +import com.ruoyi.common.config.datasource.DynamicDataSourceContextHolder; + +/** + * 动态数据源 + * + * @author ruoyi + */ +public class DynamicDataSource extends AbstractRoutingDataSource +{ + public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) + { + super.setDefaultTargetDataSource(defaultTargetDataSource); + super.setTargetDataSources(targetDataSources); + super.afterPropertiesSet(); + } + + @Override + protected Object determineCurrentLookupKey() + { + return DynamicDataSourceContextHolder.getDataSourceType(); + } +} \ No newline at end of file diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java new file mode 100644 index 0000000..6df2e5e --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java @@ -0,0 +1,55 @@ +package com.ruoyi.framework.interceptor; + +import java.lang.reflect.Method; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import com.ruoyi.common.json.JSON; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.ServletUtils; + +/** + * 防止重复提交拦截器 + * + * @author ruoyi + */ +@Component +public abstract class RepeatSubmitInterceptor implements HandlerInterceptor +{ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception + { + if (handler instanceof HandlerMethod) + { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); + if (annotation != null) + { + if (this.isRepeatSubmit(request, annotation)) + { + AjaxResult ajaxResult = AjaxResult.error(annotation.message()); + ServletUtils.renderString(response, JSON.marshal(ajaxResult)); + return false; + } + } + return true; + } + else + { + return true; + } + } + + /** + * 验证是否重复提交由子类实现具体的防重复提交的规则 + * + * @param request 请求对象 + * @param annotation 防复注解 + * @return 结果 + */ + public abstract boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) throws Exception; +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java new file mode 100644 index 0000000..fc0e1e9 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java @@ -0,0 +1,83 @@ +package com.ruoyi.framework.interceptor.impl; + +import java.util.HashMap; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import org.springframework.stereotype.Component; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.json.JSON; +import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 判断请求url和数据是否和上一次相同, + * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。 + * + * @author ruoyi + */ +@Component +public class SameUrlDataInterceptor extends RepeatSubmitInterceptor +{ + public final String REPEAT_PARAMS = "repeatParams"; + + public final String REPEAT_TIME = "repeatTime"; + + public final String SESSION_REPEAT_KEY = "repeatData"; + + @SuppressWarnings("unchecked") + @Override + public boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) throws Exception + { + // 本次参数及系统时间 + String nowParams = JSON.marshal(request.getParameterMap()); + Map nowDataMap = new HashMap(); + nowDataMap.put(REPEAT_PARAMS, nowParams); + nowDataMap.put(REPEAT_TIME, System.currentTimeMillis()); + + // 请求地址(作为存放session的key值) + String url = request.getRequestURI(); + + HttpSession session = request.getSession(); + Object sessionObj = session.getAttribute(SESSION_REPEAT_KEY); + if (sessionObj != null) + { + Map sessionMap = (Map) sessionObj; + if (sessionMap.containsKey(url)) + { + Map preDataMap = (Map) sessionMap.get(url); + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) + { + return true; + } + } + } + Map sessionMap = new HashMap(); + sessionMap.put(url, nowDataMap); + session.setAttribute(SESSION_REPEAT_KEY, sessionMap); + return false; + } + + /** + * 判断参数是否相同 + */ + private boolean compareParams(Map nowMap, Map preMap) + { + String nowParams = (String) nowMap.get(REPEAT_PARAMS); + String preParams = (String) preMap.get(REPEAT_PARAMS); + return nowParams.equals(preParams); + } + + /** + * 判断两次间隔时间 + */ + private boolean compareTime(Map nowMap, Map preMap, int interval) + { + long time1 = (Long) nowMap.get(REPEAT_TIME); + long time2 = (Long) preMap.get(REPEAT_TIME); + if ((time1 - time2) < interval) + { + return true; + } + return false; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java new file mode 100644 index 0000000..8f78300 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java @@ -0,0 +1,55 @@ +package com.ruoyi.framework.manager; + +import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import com.ruoyi.common.utils.Threads; +import com.ruoyi.common.utils.spring.SpringUtils; + +/** + * 异步任务管理器 + * + * @author liuhulu + */ +public class AsyncManager +{ + /** + * 操作延迟10毫秒 + */ + private final int OPERATE_DELAY_TIME = 10; + + /** + * 异步操作任务调度线程池 + */ + private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); + + /** + * 单例模式 + */ + private AsyncManager(){} + + private static AsyncManager me = new AsyncManager(); + + public static AsyncManager me() + { + return me; + } + + /** + * 执行任务 + * + * @param task 任务 + */ + public void execute(TimerTask task) + { + executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); + } + + /** + * 停止任务线程池 + */ + public void shutdown() + { + Threads.shutdownAndAwaitTermination(executor); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java new file mode 100644 index 0000000..78a4af3 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java @@ -0,0 +1,87 @@ +package com.ruoyi.framework.manager; + +import com.ruoyi.framework.shiro.web.session.SpringSessionValidationScheduler; +import net.sf.ehcache.CacheManager; +import org.apache.shiro.cache.ehcache.EhCacheManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.annotation.PreDestroy; + +/** + * 确保应用退出时能关闭后台线程 + * + * @author cj + */ +@Component +public class ShutdownManager +{ + private static final Logger logger = LoggerFactory.getLogger("sys-user"); + + @Autowired(required = false) + private SpringSessionValidationScheduler springSessionValidationScheduler; + + @Autowired(required = false) + private EhCacheManager ehCacheManager; + + @PreDestroy + public void destroy() + { + shutdownSpringSessionValidationScheduler(); + shutdownAsyncManager(); + shutdownEhCacheManager(); + } + + /** + * 停止Seesion会话检查 + */ + private void shutdownSpringSessionValidationScheduler() + { + if (springSessionValidationScheduler != null && springSessionValidationScheduler.isEnabled()) + { + try + { + logger.info("====关闭会话验证任务===="); + springSessionValidationScheduler.disableSessionValidation(); + } + catch (Exception e) + { + logger.error(e.getMessage(), e); + } + } + } + + /** + * 停止异步执行任务 + */ + private void shutdownAsyncManager() + { + try + { + logger.info("====关闭后台任务任务线程池===="); + AsyncManager.me().shutdown(); + } + catch (Exception e) + { + logger.error(e.getMessage(), e); + } + } + + private void shutdownEhCacheManager() + { + try + { + logger.info("====关闭缓存===="); + if (ehCacheManager != null) + { + CacheManager cacheManager = ehCacheManager.getCacheManager(); + cacheManager.shutdown(); + } + } + catch (Exception e) + { + logger.error(e.getMessage(), e); + } + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java new file mode 100644 index 0000000..078b146 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java @@ -0,0 +1,137 @@ +package com.ruoyi.framework.manager.factory; + +import java.util.TimerTask; + +import com.ruoyi.system.domain.SysUserOnline; +import com.ruoyi.system.service.ISysUserOnlineService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.AddressUtils; +import com.ruoyi.common.utils.LogUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.framework.shiro.session.OnlineSession; +import com.ruoyi.system.domain.SysLogininfor; +import com.ruoyi.system.domain.SysOperLog; +import com.ruoyi.system.service.ISysOperLogService; +import com.ruoyi.system.service.impl.SysLogininforServiceImpl; +import eu.bitwalker.useragentutils.UserAgent; + +/** + * 异步工厂(产生任务用) + * + * @author liuhulu + * + */ +public class AsyncFactory +{ + private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user"); + + /** + * 同步session到数据库 + * + * @param session 在线用户会话 + * @return 任务task + */ + public static TimerTask syncSessionToDb(final OnlineSession session) + { + return new TimerTask() + { + @Override + public void run() + { + SysUserOnline online = new SysUserOnline(); + online.setSessionId(String.valueOf(session.getId())); + online.setDeptName(session.getDeptName()); + online.setLoginName(session.getLoginName()); + online.setStartTimestamp(session.getStartTimestamp()); + online.setLastAccessTime(session.getLastAccessTime()); + online.setExpireTime(session.getTimeout()); + online.setIpaddr(session.getHost()); + online.setLoginLocation(AddressUtils.getRealAddressByIP(session.getHost())); + online.setBrowser(session.getBrowser()); + online.setOs(session.getOs()); + online.setStatus(session.getStatus()); + SpringUtils.getBean(ISysUserOnlineService.class).saveOnline(online); + + } + }; + } + + /** + * 操作日志记录 + * + * @param operLog 操作日志信息 + * @return 任务task + */ + public static TimerTask recordOper(final SysOperLog operLog) + { + return new TimerTask() + { + @Override + public void run() + { + // 远程查询操作地点 + operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); + SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog); + } + }; + } + + /** + * 记录登录信息 + * + * @param username 用户名 + * @param status 状态 + * @param message 消息 + * @param args 列表 + * @return 任务task + */ + public static TimerTask recordLogininfor(final String username, final String status, final String message, final Object... args) + { + final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + final String ip = ShiroUtils.getIp(); + return new TimerTask() + { + @Override + public void run() + { + String address = AddressUtils.getRealAddressByIP(ip); + StringBuilder s = new StringBuilder(); + s.append(LogUtils.getBlock(ip)); + s.append(address); + s.append(LogUtils.getBlock(username)); + s.append(LogUtils.getBlock(status)); + s.append(LogUtils.getBlock(message)); + // 打印信息到日志 + sys_user_logger.info(s.toString(), args); + // 获取客户端操作系统 + String os = userAgent.getOperatingSystem().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName(); + // 封装对象 + SysLogininfor logininfor = new SysLogininfor(); + logininfor.setLoginName(username); + logininfor.setIpaddr(ip); + logininfor.setLoginLocation(address); + logininfor.setBrowser(browser); + logininfor.setOs(os); + logininfor.setMsg(message); + // 日志状态 + if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) + { + logininfor.setStatus(Constants.SUCCESS); + } + else if (Constants.LOGIN_FAIL.equals(status)) + { + logininfor.setStatus(Constants.FAIL); + } + // 插入数据 + SpringUtils.getBean(SysLogininforServiceImpl.class).insertLogininfor(logininfor); + } + }; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java new file mode 100644 index 0000000..6a8f4cf --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java @@ -0,0 +1,86 @@ +package com.ruoyi.framework.shiro.realm; + +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.ExcessiveAttemptsException; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.exception.user.UserNotExistsException; +import com.ruoyi.common.exception.user.UserPasswordNotMatchException; +import com.ruoyi.common.exception.user.UserPasswordRetryLimitExceedException; +import com.ruoyi.framework.shiro.service.SysLoginService; + +/** + * 自定义Realm 处理登录 权限 + * + * @author ruoyi + */ +public class UserRealm extends AuthorizingRealm +{ + private static final Logger log = LoggerFactory.getLogger(UserRealm.class); + + @Autowired + private SysLoginService loginService; + + /** + * 授权 + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) + { + SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); + info.addRole("admin"); + info.addStringPermission("*:*:*"); + return info; + } + + /** + * 登录认证 + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException + { + UsernamePasswordToken upToken = (UsernamePasswordToken) token; + String username = upToken.getUsername(); + String password = ""; + if (upToken.getPassword() != null) + { + password = new String(upToken.getPassword()); + } + + SysUser user = null; + try + { + user = loginService.login(username, password); + } + catch (UserNotExistsException e) + { + throw new UnknownAccountException(e.getMessage(), e); + } + catch (UserPasswordNotMatchException e) + { + throw new IncorrectCredentialsException(e.getMessage(), e); + } + catch (UserPasswordRetryLimitExceedException e) + { + throw new ExcessiveAttemptsException(e.getMessage(), e); + } + catch (Exception e) + { + log.info("对用户[" + username + "]进行登录验证..验证未通过{}", e.getMessage()); + throw new AuthenticationException(e.getMessage(), e); + } + return new SimpleAuthenticationInfo(user, password, getName()); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysLoginService.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysLoginService.java new file mode 100644 index 0000000..4947112 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysLoginService.java @@ -0,0 +1,87 @@ +package com.ruoyi.framework.shiro.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.exception.user.UserNotExistsException; +import com.ruoyi.common.exception.user.UserPasswordNotMatchException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.system.service.ISysUserService; + +/** + * 登录校验方法 + * + * @author ruoyi + */ +@Component +public class SysLoginService +{ + @Autowired + private SysPasswordService passwordService; + + @Autowired + private ISysUserService userService; + + /** + * 登录 + */ + public SysUser login(String username, String password) + { + // 用户名或密码为空 错误 + if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null"))); + throw new UserNotExistsException(); + } + // 密码如果不在指定范围内 错误 + if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + + // 用户名不在指定范围内 错误 + if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + + // 查询用户信息 + SysUser user = userService.selectUserByLoginName(username); + if (user == null) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.not.exists"))); + throw new UserNotExistsException(); + } + + passwordService.validate(user, password); + + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + recordLoginInfo(user.getUserId()); + return user; + } + + /** + * 记录登录信息 + * + * @param userId 用户ID + */ + public void recordLoginInfo(Long userId) + { + SysUser user = new SysUser(); + user.setUserId(userId); + user.setLoginIp(ShiroUtils.getIp()); + user.setLoginDate(DateUtils.getNowDate()); + userService.updateUserInfo(user); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysPasswordService.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysPasswordService.java new file mode 100644 index 0000000..571d790 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysPasswordService.java @@ -0,0 +1,85 @@ +package com.ruoyi.framework.shiro.service; + +import java.util.concurrent.atomic.AtomicInteger; +import javax.annotation.PostConstruct; +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheManager; +import org.apache.shiro.crypto.hash.Md5Hash; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.ShiroConstants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.exception.user.UserPasswordNotMatchException; +import com.ruoyi.common.exception.user.UserPasswordRetryLimitExceedException; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; + +/** + * 登录密码方法 + * + * @author ruoyi + */ +@Component +public class SysPasswordService +{ + @Autowired + private CacheManager cacheManager; + + private Cache loginRecordCache; + + @Value(value = "${user.password.maxRetryCount}") + private String maxRetryCount; + + @PostConstruct + public void init() + { + loginRecordCache = cacheManager.getCache(ShiroConstants.LOGIN_RECORD_CACHE); + } + + public void validate(SysUser user, String password) + { + String loginName = user.getLoginName(); + + AtomicInteger retryCount = loginRecordCache.get(loginName); + + if (retryCount == null) + { + retryCount = new AtomicInteger(0); + loginRecordCache.put(loginName, retryCount); + } + if (retryCount.incrementAndGet() > Integer.valueOf(maxRetryCount).intValue()) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginName, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount))); + throw new UserPasswordRetryLimitExceedException(Integer.valueOf(maxRetryCount).intValue()); + } + + if (!matches(user, password)) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginName, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.count", retryCount))); + loginRecordCache.put(loginName, retryCount); + throw new UserPasswordNotMatchException(); + } + else + { + clearLoginRecordCache(loginName); + } + } + + public boolean matches(SysUser user, String newPassword) + { + return user.getPassword().equals(encryptPassword(user.getLoginName(), newPassword, user.getSalt())); + } + + public void clearLoginRecordCache(String loginName) + { + loginRecordCache.remove(loginName); + } + + public String encryptPassword(String loginName, String password, String salt) + { + return new Md5Hash(loginName + password + salt).toHex(); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysRegisterService.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysRegisterService.java new file mode 100644 index 0000000..14da276 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysRegisterService.java @@ -0,0 +1,78 @@ +package com.ruoyi.framework.shiro.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.ShiroConstants; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.system.service.ISysUserService; + +/** + * 注册校验方法 + * + * @author ruoyi + */ +@Component +public class SysRegisterService +{ + @Autowired + private ISysUserService userService; + + @Autowired + private SysPasswordService passwordService; + + /** + * 注册 + */ + public String register(SysUser user) + { + String msg = "", loginName = user.getLoginName(), password = user.getPassword(); + + if (StringUtils.isEmpty(loginName)) + { + msg = "用户名不能为空"; + } + else if (StringUtils.isEmpty(password)) + { + msg = "用户密码不能为空"; + } + else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + msg = "密码长度必须在5到20个字符之间"; + } + else if (loginName.length() < UserConstants.USERNAME_MIN_LENGTH + || loginName.length() > UserConstants.USERNAME_MAX_LENGTH) + { + msg = "账户长度必须在2到20个字符之间"; + } + else if (!userService.checkLoginNameUnique(user)) + { + msg = "保存用户'" + loginName + "'失败,注册账号已存在"; + } + else + { + user.setPwdUpdateDate(DateUtils.getNowDate()); + user.setSalt(ShiroUtils.randomSalt()); + user.setPassword(passwordService.encryptPassword(loginName, password, user.getSalt())); + boolean regFlag = userService.registerUser(user); + if (!regFlag) + { + msg = "注册失败,请联系系统管理人员"; + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginName, Constants.REGISTER, MessageUtils.message("user.register.success"))); + } + } + return msg; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/session/OnlineSession.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/session/OnlineSession.java new file mode 100644 index 0000000..f9c417c --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/session/OnlineSession.java @@ -0,0 +1,165 @@ +package com.ruoyi.framework.shiro.session; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.shiro.session.mgt.SimpleSession; +import com.ruoyi.common.enums.OnlineStatus; + +/** + * 在线用户会话属性 + * + * @author ruoyi + */ +public class OnlineSession extends SimpleSession +{ + private static final long serialVersionUID = 1L; + + /** 用户ID */ + private Long userId; + + /** 用户名称 */ + private String loginName; + + /** 部门名称 */ + private String deptName; + + /** 用户头像 */ + private String avatar; + + /** 登录IP地址 */ + private String host; + + /** 浏览器类型 */ + private String browser; + + /** 操作系统 */ + private String os; + + /** 在线状态 */ + private OnlineStatus status = OnlineStatus.on_line; + + /** 属性是否改变 优化session数据同步 */ + private transient boolean attributeChanged = false; + + @Override + public String getHost() + { + return host; + } + + @Override + public void setHost(String host) + { + this.host = host; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public String getLoginName() + { + return loginName; + } + + public void setLoginName(String loginName) + { + this.loginName = loginName; + } + + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + public OnlineStatus getStatus() + { + return status; + } + + public void setStatus(OnlineStatus status) + { + this.status = status; + } + + public void markAttributeChanged() + { + this.attributeChanged = true; + } + + public void resetAttributeChanged() + { + this.attributeChanged = false; + } + + public boolean isAttributeChanged() + { + return attributeChanged; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + @Override + public void setAttribute(Object key, Object value) + { + super.setAttribute(key, value); + } + + @Override + public Object removeAttribute(Object key) + { + return super.removeAttribute(key); + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("loginName", getLoginName()) + .append("deptName", getDeptName()) + .append("avatar", getAvatar()) + .append("host", getHost()) + .append("browser", getBrowser()) + .append("os", getOs()) + .append("status", getStatus()) + .append("attributeChanged", isAttributeChanged()) + .toString(); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/session/OnlineSessionDAO.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/session/OnlineSessionDAO.java new file mode 100644 index 0000000..4c3ad92 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/session/OnlineSessionDAO.java @@ -0,0 +1,84 @@ +package com.ruoyi.framework.shiro.session; + +import java.util.Date; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.UnknownSessionException; +import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO; +import org.springframework.beans.factory.annotation.Value; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; + +/** + * 针对自定义的ShiroSession的db操作 + * + * @author ruoyi + */ +public class OnlineSessionDAO extends EnterpriseCacheSessionDAO +{ + /** + * 同步session到数据库的周期 单位为毫秒(默认1分钟) + */ + @Value("${shiro.session.dbSyncPeriod}") + private int dbSyncPeriod; + + /** + * 上次同步数据库的时间戳 + */ + private static final String LAST_SYNC_DB_TIMESTAMP = OnlineSessionDAO.class.getName() + "LAST_SYNC_DB_TIMESTAMP"; + + public OnlineSessionDAO() + { + super(); + } + + public OnlineSessionDAO(long expireTime) + { + super(); + } + + + @Override + public void update(Session session) throws UnknownSessionException + { + super.update(session); + } + + /** + * 更新会话;如更新会话最后访问时间/停止会话/设置超时时间/设置移除属性等会调用 + */ + public void syncToDb(OnlineSession onlineSession) + { + Date lastSyncTimestamp = (Date) onlineSession.getAttribute(LAST_SYNC_DB_TIMESTAMP); + if (lastSyncTimestamp != null) + { + boolean needSync = true; + long deltaTime = onlineSession.getLastAccessTime().getTime() - lastSyncTimestamp.getTime(); + if (deltaTime < dbSyncPeriod * 60 * 1000) + { + // 时间差不足 无需同步 + needSync = false; + } + // isGuest = true 访客 + boolean isGuest = onlineSession.getUserId() == null || onlineSession.getUserId() == 0L; + + // session 数据变更了 同步 + if (!isGuest && onlineSession.isAttributeChanged()) + { + needSync = true; + } + + if (!needSync) + { + return; + } + } + // 更新上次同步数据库时间 + onlineSession.setAttribute(LAST_SYNC_DB_TIMESTAMP, onlineSession.getLastAccessTime()); + // 更新完后 重置标识 + if (onlineSession.isAttributeChanged()) + { + onlineSession.resetAttributeChanged(); + } + AsyncManager.me().execute(AsyncFactory.syncSessionToDb(onlineSession)); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/session/OnlineSessionFactory.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/session/OnlineSessionFactory.java new file mode 100644 index 0000000..24d9d75 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/session/OnlineSessionFactory.java @@ -0,0 +1,42 @@ +package com.ruoyi.framework.shiro.session; + +import javax.servlet.http.HttpServletRequest; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.mgt.SessionContext; +import org.apache.shiro.session.mgt.SessionFactory; +import org.apache.shiro.web.session.mgt.WebSessionContext; +import org.springframework.stereotype.Component; +import com.ruoyi.common.utils.IpUtils; +import eu.bitwalker.useragentutils.UserAgent; + +/** + * 自定义sessionFactory会话 + * + * @author ruoyi + */ +@Component +public class OnlineSessionFactory implements SessionFactory +{ + @Override + public Session createSession(SessionContext initData) + { + OnlineSession session = new OnlineSession(); + if (initData != null && initData instanceof WebSessionContext) + { + WebSessionContext sessionContext = (WebSessionContext) initData; + HttpServletRequest request = (HttpServletRequest) sessionContext.getServletRequest(); + if (request != null) + { + UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); + // 获取客户端操作系统 + String os = userAgent.getOperatingSystem().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName(); + session.setHost(IpUtils.getIpAddr(request)); + session.setBrowser(browser); + session.setOs(os); + } + } + return session; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/CustomShiroFilterFactoryBean.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/CustomShiroFilterFactoryBean.java new file mode 100644 index 0000000..a859fa1 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/CustomShiroFilterFactoryBean.java @@ -0,0 +1,85 @@ +package com.ruoyi.framework.shiro.web; + +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.filter.InvalidRequestFilter; +import org.apache.shiro.web.filter.mgt.DefaultFilter; +import org.apache.shiro.web.filter.mgt.FilterChainManager; +import org.apache.shiro.web.filter.mgt.FilterChainResolver; +import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver; +import org.apache.shiro.web.mgt.WebSecurityManager; +import org.apache.shiro.web.servlet.AbstractShiroFilter; +import org.apache.shiro.mgt.SecurityManager; +import org.springframework.beans.factory.BeanInitializationException; +import javax.servlet.Filter; +import java.util.Map; + +/** + * 自定义ShiroFilterFactoryBean解决资源中文路径问题 + * + * @author ruoyi + */ +public class CustomShiroFilterFactoryBean extends ShiroFilterFactoryBean +{ + @Override + public Class getObjectType() + { + return MySpringShiroFilter.class; + } + + @Override + protected AbstractShiroFilter createInstance() throws Exception + { + + SecurityManager securityManager = getSecurityManager(); + if (securityManager == null) + { + String msg = "SecurityManager property must be set."; + throw new BeanInitializationException(msg); + } + + if (!(securityManager instanceof WebSecurityManager)) + { + String msg = "The security manager does not implement the WebSecurityManager interface."; + throw new BeanInitializationException(msg); + } + + FilterChainManager manager = createFilterChainManager(); + // Expose the constructed FilterChainManager by first wrapping it in a + // FilterChainResolver implementation. The AbstractShiroFilter implementations + // do not know about FilterChainManagers - only resolvers: + PathMatchingFilterChainResolver chainResolver = new PathMatchingFilterChainResolver(); + chainResolver.setFilterChainManager(manager); + + Map filterMap = manager.getFilters(); + Filter invalidRequestFilter = filterMap.get(DefaultFilter.invalidRequest.name()); + if (invalidRequestFilter instanceof InvalidRequestFilter) + { + // 此处是关键,设置false跳过URL携带中文400,servletPath中文校验bug + ((InvalidRequestFilter) invalidRequestFilter).setBlockNonAscii(false); + } + // Now create a concrete ShiroFilter instance and apply the acquired SecurityManager and built + // FilterChainResolver. It doesn't matter that the instance is an anonymous inner class + // here - we're just using it because it is a concrete AbstractShiroFilter instance that accepts + // injection of the SecurityManager and FilterChainResolver: + return new MySpringShiroFilter((WebSecurityManager) securityManager, chainResolver); + } + + private static final class MySpringShiroFilter extends AbstractShiroFilter + { + protected MySpringShiroFilter(WebSecurityManager webSecurityManager, FilterChainResolver resolver) + { + if (webSecurityManager == null) + { + throw new IllegalArgumentException("WebSecurityManager property cannot be null."); + } + else + { + this.setSecurityManager(webSecurityManager); + if (resolver != null) + { + this.setFilterChainResolver(resolver); + } + } + } + } +} \ No newline at end of file diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/LogoutFilter.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/LogoutFilter.java new file mode 100644 index 0000000..67ab163 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/LogoutFilter.java @@ -0,0 +1,87 @@ +package com.ruoyi.framework.shiro.web.filter; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import org.apache.shiro.session.SessionException; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; + +/** + * 退出过滤器 + * + * @author ruoyi + */ +public class LogoutFilter extends org.apache.shiro.web.filter.authc.LogoutFilter +{ + private static final Logger log = LoggerFactory.getLogger(LogoutFilter.class); + + /** + * 退出后重定向的地址 + */ + private String loginUrl; + + public String getLoginUrl() + { + return loginUrl; + } + + public void setLoginUrl(String loginUrl) + { + this.loginUrl = loginUrl; + } + + @Override + protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception + { + try + { + Subject subject = getSubject(request, response); + String redirectUrl = getRedirectUrl(request, response, subject); + try + { + SysUser user = ShiroUtils.getSysUser(); + if (StringUtils.isNotNull(user)) + { + String loginName = user.getLoginName(); + // 记录用户退出日志 + AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginName, Constants.LOGOUT, MessageUtils.message("user.logout.success"))); + } + // 退出登录 + subject.logout(); + } + catch (SessionException ise) + { + log.error("logout fail.", ise); + } + issueRedirect(request, response, redirectUrl); + } + catch (Exception e) + { + log.error("Encountered session exception during logout. This can generally safely be ignored.", e); + } + return false; + } + + /** + * 退出跳转URL + */ + @Override + protected String getRedirectUrl(ServletRequest request, ServletResponse response, Subject subject) + { + String url = getLoginUrl(); + if (StringUtils.isNotEmpty(url)) + { + return url; + } + return super.getRedirectUrl(request, response, subject); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/captcha/CaptchaValidateFilter.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/captcha/CaptchaValidateFilter.java new file mode 100644 index 0000000..22dd339 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/captcha/CaptchaValidateFilter.java @@ -0,0 +1,79 @@ +package com.ruoyi.framework.shiro.web.filter.captcha; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import org.apache.shiro.web.filter.AccessControlFilter; +import com.google.code.kaptcha.Constants; +import com.ruoyi.common.constant.ShiroConstants; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * 验证码过滤器 + * + * @author ruoyi + */ +public class CaptchaValidateFilter extends AccessControlFilter +{ + /** + * 是否开启验证码 + */ + private boolean captchaEnabled = true; + + /** + * 验证码类型 + */ + private String captchaType = "math"; + + public void setCaptchaEnabled(boolean captchaEnabled) + { + this.captchaEnabled = captchaEnabled; + } + + public void setCaptchaType(String captchaType) + { + this.captchaType = captchaType; + } + + @Override + public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception + { + request.setAttribute(ShiroConstants.CURRENT_ENABLED, captchaEnabled); + request.setAttribute(ShiroConstants.CURRENT_TYPE, captchaType); + return super.onPreHandle(request, response, mappedValue); + } + + @Override + protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) + throws Exception + { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + // 验证码禁用 或不是表单提交 允许访问 + if (captchaEnabled == false || !"post".equals(httpServletRequest.getMethod().toLowerCase())) + { + return true; + } + return validateResponse(httpServletRequest, httpServletRequest.getParameter(ShiroConstants.CURRENT_VALIDATECODE)); + } + + public boolean validateResponse(HttpServletRequest request, String validateCode) + { + Object obj = ShiroUtils.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY); + String code = String.valueOf(obj != null ? obj : ""); + // 验证码清除,防止多次使用。 + request.getSession().removeAttribute(Constants.KAPTCHA_SESSION_KEY); + if (StringUtils.isEmpty(validateCode) || !validateCode.equalsIgnoreCase(code)) + { + return false; + } + return true; + } + + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception + { + request.setAttribute(ShiroConstants.CURRENT_CAPTCHA, ShiroConstants.CAPTCHA_ERROR); + return true; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/kickout/KickoutSessionFilter.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/kickout/KickoutSessionFilter.java new file mode 100644 index 0000000..d92db34 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/kickout/KickoutSessionFilter.java @@ -0,0 +1,176 @@ +package com.ruoyi.framework.shiro.web.filter.kickout; + +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayDeque; +import java.util.Deque; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheManager; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.mgt.DefaultSessionKey; +import org.apache.shiro.session.mgt.SessionManager; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.AccessControlFilter; +import org.apache.shiro.web.util.WebUtils; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.ruoyi.common.constant.ShiroConstants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.ShiroUtils; + +/** + * 登录帐号控制过滤器 + * + * @author ruoyi + */ +public class KickoutSessionFilter extends AccessControlFilter +{ + private final static ObjectMapper objectMapper = new ObjectMapper(); + + /** + * 同一个用户最大会话数 + **/ + private int maxSession = -1; + + /** + * 踢出之前登录的/之后登录的用户 默认false踢出之前登录的用户 + **/ + private Boolean kickoutAfter = false; + + /** + * 踢出后到的地址 + **/ + private String kickoutUrl; + + private SessionManager sessionManager; + private Cache> cache; + + @Override + protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) + throws Exception + { + return false; + } + + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception + { + Subject subject = getSubject(request, response); + if (!subject.isAuthenticated() && !subject.isRemembered() || maxSession == -1) + { + // 如果没有登录或用户最大会话数为-1,直接进行之后的流程 + return true; + } + try + { + Session session = subject.getSession(); + // 当前登录用户 + SysUser user = ShiroUtils.getSysUser(); + String loginName = user.getLoginName(); + Serializable sessionId = session.getId(); + + // 读取缓存用户 没有就存入 + Deque deque = cache.get(loginName); + if (deque == null) + { + // 初始化队列 + deque = new ArrayDeque(); + } + + // 如果队列里没有此sessionId,且用户没有被踢出;放入队列 + if (!deque.contains(sessionId) && session.getAttribute("kickout") == null) + { + // 将sessionId存入队列 + deque.push(sessionId); + // 将用户的sessionId队列缓存 + cache.put(loginName, deque); + } + + // 如果队列里的sessionId数超出最大会话数,开始踢人 + while (deque.size() > maxSession) + { + // 是否踢出后来登录的,默认是false;即后者登录的用户踢出前者登录的用户; + Serializable kickoutSessionId = kickoutAfter ? deque.removeFirst() : deque.removeLast(); + // 踢出后再更新下缓存队列 + cache.put(loginName, deque); + + try + { + // 获取被踢出的sessionId的session对象 + Session kickoutSession = sessionManager.getSession(new DefaultSessionKey(kickoutSessionId)); + if (null != kickoutSession) + { + // 设置会话的kickout属性表示踢出了 + kickoutSession.setAttribute("kickout", true); + } + } + catch (Exception e) + { + // 面对异常,我们选择忽略 + } + } + + // 如果被踢出了,(前者或后者)直接退出,重定向到踢出后的地址 + if (session.getAttribute("kickout") != null && (Boolean) session.getAttribute("kickout") == true) + { + // 退出登录 + subject.logout(); + saveRequest(request); + return isAjaxResponse(request, response); + } + return true; + } + catch (Exception e) + { + return isAjaxResponse(request, response); + } + } + + private boolean isAjaxResponse(ServletRequest request, ServletResponse response) throws IOException + { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse res = (HttpServletResponse) response; + if (ServletUtils.isAjaxRequest(req)) + { + AjaxResult ajaxResult = AjaxResult.error("您已在别处登录,请您修改密码或重新登录"); + ServletUtils.renderString(res, objectMapper.writeValueAsString(ajaxResult)); + } + else + { + WebUtils.issueRedirect(request, response, kickoutUrl); + } + return false; + } + + public void setMaxSession(int maxSession) + { + this.maxSession = maxSession; + } + + public void setKickoutAfter(boolean kickoutAfter) + { + this.kickoutAfter = kickoutAfter; + } + + public void setKickoutUrl(String kickoutUrl) + { + this.kickoutUrl = kickoutUrl; + } + + public void setSessionManager(SessionManager sessionManager) + { + this.sessionManager = sessionManager; + } + + // 设置Cache的key的前缀 + public void setCacheManager(CacheManager cacheManager) + { + // 必须和ehcache缓存配置中的缓存name一致 + this.cache = cacheManager.getCache(ShiroConstants.SYS_USERCACHE); + } +} \ No newline at end of file diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/online/OnlineSessionFilter.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/online/OnlineSessionFilter.java new file mode 100644 index 0000000..49012c7 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/online/OnlineSessionFilter.java @@ -0,0 +1,97 @@ +package com.ruoyi.framework.shiro.web.filter.online; + +import java.io.IOException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.AccessControlFilter; +import org.apache.shiro.web.util.WebUtils; +import org.springframework.beans.factory.annotation.Value; +import com.ruoyi.common.constant.ShiroConstants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.enums.OnlineStatus; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.framework.shiro.session.OnlineSession; +import com.ruoyi.framework.shiro.session.OnlineSessionDAO; + +/** + * 自定义访问控制 + * + * @author ruoyi + */ +public class OnlineSessionFilter extends AccessControlFilter +{ + /** + * 强制退出后重定向的地址 + */ + @Value("${shiro.user.loginUrl}") + private String loginUrl; + + private OnlineSessionDAO onlineSessionDAO; + + /** + * 表示是否允许访问;mappedValue就是[urls]配置中拦截器参数部分,如果允许访问返回true,否则false; + */ + @Override + protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) + throws Exception + { + Subject subject = getSubject(request, response); + if (subject == null || subject.getSession() == null) + { + return true; + } + Session session = onlineSessionDAO.readSession(subject.getSession().getId()); + if (session != null && session instanceof OnlineSession) + { + OnlineSession onlineSession = (OnlineSession) session; + request.setAttribute(ShiroConstants.ONLINE_SESSION, onlineSession); + // 把user对象设置进去 + boolean isGuest = onlineSession.getUserId() == null || onlineSession.getUserId() == 0L; + if (isGuest == true) + { + SysUser user = ShiroUtils.getSysUser(); + if (user != null) + { + onlineSession.setUserId(user.getUserId()); + onlineSession.setLoginName(user.getLoginName()); + onlineSession.markAttributeChanged(); + } + } + + if (onlineSession.getStatus() == OnlineStatus.off_line) + { + return false; + } + } + return true; + } + + /** + * 表示当访问拒绝时是否已经处理了;如果返回true表示需要继续处理;如果返回false表示该拦截器实例已经处理了,将直接返回即可。 + */ + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception + { + Subject subject = getSubject(request, response); + if (subject != null) + { + subject.logout(); + } + saveRequestAndRedirectToLogin(request, response); + return false; + } + + // 跳转到登录页 + @Override + protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException + { + WebUtils.issueRedirect(request, response, loginUrl); + } + + public void setOnlineSessionDAO(OnlineSessionDAO onlineSessionDAO) + { + this.onlineSessionDAO = onlineSessionDAO; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/sync/SyncOnlineSessionFilter.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/sync/SyncOnlineSessionFilter.java new file mode 100644 index 0000000..db83cbc --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/sync/SyncOnlineSessionFilter.java @@ -0,0 +1,39 @@ +package com.ruoyi.framework.shiro.web.filter.sync; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import org.apache.shiro.web.filter.PathMatchingFilter; +import com.ruoyi.common.constant.ShiroConstants; +import com.ruoyi.framework.shiro.session.OnlineSession; +import com.ruoyi.framework.shiro.session.OnlineSessionDAO; + +/** + * 同步Session数据到Db + * + * @author ruoyi + */ +public class SyncOnlineSessionFilter extends PathMatchingFilter +{ + private OnlineSessionDAO onlineSessionDAO; + + /** + * 同步会话数据到DB 一次请求最多同步一次 防止过多处理 需要放到Shiro过滤器之前 + */ + @Override + protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception + { + OnlineSession session = (OnlineSession) request.getAttribute(ShiroConstants.ONLINE_SESSION); + // 如果session stop了 也不同步 + // session停止时间,如果stopTimestamp不为null,则代表已停止 + if (session != null && session.getUserId() != null && session.getStopTimestamp() == null) + { + onlineSessionDAO.syncToDb(session); + } + return true; + } + + public void setOnlineSessionDAO(OnlineSessionDAO onlineSessionDAO) + { + this.onlineSessionDAO = onlineSessionDAO; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/session/OnlineWebSessionManager.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/session/OnlineWebSessionManager.java new file mode 100644 index 0000000..caf8877 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/session/OnlineWebSessionManager.java @@ -0,0 +1,176 @@ +package com.ruoyi.framework.shiro.web.session; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +import com.ruoyi.system.domain.SysUserOnline; +import com.ruoyi.system.service.ISysUserOnlineService; +import org.apache.commons.lang3.time.DateUtils; +import org.apache.shiro.session.ExpiredSessionException; +import org.apache.shiro.session.InvalidSessionException; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.mgt.DefaultSessionKey; +import org.apache.shiro.session.mgt.SessionKey; +import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.constant.ShiroConstants; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.bean.BeanUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.framework.shiro.session.OnlineSession; + +/** + * 主要是在此如果会话的属性修改了 就标识下其修改了 然后方便 OnlineSessionDao同步 + * + * @author ruoyi + */ +public class OnlineWebSessionManager extends DefaultWebSessionManager +{ + private static final Logger log = LoggerFactory.getLogger(OnlineWebSessionManager.class); + + @Override + public void setAttribute(SessionKey sessionKey, Object attributeKey, Object value) throws InvalidSessionException + { + super.setAttribute(sessionKey, attributeKey, value); + if (value != null && needMarkAttributeChanged(attributeKey)) + { + OnlineSession session = getOnlineSession(sessionKey); + session.markAttributeChanged(); + } + } + + private boolean needMarkAttributeChanged(Object attributeKey) + { + if (attributeKey == null) + { + return false; + } + String attributeKeyStr = attributeKey.toString(); + // 优化 flash属性没必要持久化 + if (attributeKeyStr.startsWith("org.springframework")) + { + return false; + } + if (attributeKeyStr.startsWith("javax.servlet")) + { + return false; + } + if (attributeKeyStr.equals(ShiroConstants.CURRENT_USERNAME)) + { + return false; + } + return true; + } + + @Override + public Object removeAttribute(SessionKey sessionKey, Object attributeKey) throws InvalidSessionException + { + Object removed = super.removeAttribute(sessionKey, attributeKey); + if (removed != null) + { + OnlineSession s = getOnlineSession(sessionKey); + s.markAttributeChanged(); + } + + return removed; + } + + public OnlineSession getOnlineSession(SessionKey sessionKey) + { + OnlineSession session = null; + Object obj = doGetSession(sessionKey); + if (StringUtils.isNotNull(obj)) + { + session = new OnlineSession(); + BeanUtils.copyBeanProp(session, obj); + } + return session; + } + + /** + * 验证session是否有效 用于删除过期session + */ + @Override + public void validateSessions() + { + if (log.isInfoEnabled()) + { + log.info("invalidation sessions..."); + } + + int invalidCount = 0; + + int timeout = (int) this.getGlobalSessionTimeout(); + if (timeout < 0) + { + // 永不过期不进行处理 + return; + } + Date expiredDate = DateUtils.addMilliseconds(new Date(), 0 - timeout); + ISysUserOnlineService userOnlineService = SpringUtils.getBean(ISysUserOnlineService.class); + List userOnlineList = userOnlineService.selectOnlineByExpired(expiredDate); + // 批量过期删除 + List needOfflineIdList = new ArrayList(); + for (SysUserOnline userOnline : userOnlineList) + { + try + { + SessionKey key = new DefaultSessionKey(userOnline.getSessionId()); + Session session = retrieveSession(key); + if (session != null) + { + throw new InvalidSessionException(); + } + } + catch (InvalidSessionException e) + { + if (log.isDebugEnabled()) + { + boolean expired = (e instanceof ExpiredSessionException); + String msg = "Invalidated session with id [" + userOnline.getSessionId() + "]" + + (expired ? " (expired)" : " (stopped)"); + log.debug(msg); + } + invalidCount++; + needOfflineIdList.add(userOnline.getSessionId()); + userOnlineService.removeUserCache(userOnline.getLoginName(), userOnline.getSessionId()); + } + + } + if (needOfflineIdList.size() > 0) + { + try + { + userOnlineService.batchDeleteOnline(needOfflineIdList); + } + catch (Exception e) + { + log.error("batch delete db session error.", e); + } + } + + if (log.isInfoEnabled()) + { + String msg = "Finished invalidation session."; + if (invalidCount > 0) + { + msg += " [" + invalidCount + "] sessions were stopped."; + } + else + { + msg += " No sessions were stopped."; + } + log.info(msg); + } + + } + + @Override + protected Collection getActiveSessions() + { + throw new UnsupportedOperationException("getActiveSessions method not supported"); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/session/SpringSessionValidationScheduler.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/session/SpringSessionValidationScheduler.java new file mode 100644 index 0000000..60174c0 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/session/SpringSessionValidationScheduler.java @@ -0,0 +1,131 @@ +package com.ruoyi.framework.shiro.web.session; + +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import org.apache.shiro.session.mgt.DefaultSessionManager; +import org.apache.shiro.session.mgt.SessionValidationScheduler; +import org.apache.shiro.session.mgt.ValidatingSessionManager; +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.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; +import com.ruoyi.common.utils.Threads; + +/** + * 自定义任务调度器完成 + * + * @author ruoyi + */ +@Component +public class SpringSessionValidationScheduler implements SessionValidationScheduler +{ + private static final Logger log = LoggerFactory.getLogger(SpringSessionValidationScheduler.class); + + public static final long DEFAULT_SESSION_VALIDATION_INTERVAL = DefaultSessionManager.DEFAULT_SESSION_VALIDATION_INTERVAL; + + /** + * 定时器,用于处理超时的挂起请求,也用于连接断开时的重连。 + */ + @Autowired + @Qualifier("scheduledExecutorService") + private ScheduledExecutorService executorService; + + private volatile boolean enabled = false; + + /** + * 会话验证管理器 + */ + @Autowired + @Qualifier("sessionManager") + @Lazy + private ValidatingSessionManager sessionManager; + + // 相隔多久检查一次session的有效性,单位毫秒,默认就是10分钟 + @Value("${shiro.session.validationInterval}") + private long sessionValidationInterval; + + @Override + public boolean isEnabled() + { + return this.enabled; + } + + /** + * Specifies how frequently (in milliseconds) this Scheduler will call the + * {@link org.apache.shiro.session.mgt.ValidatingSessionManager#validateSessions() + * ValidatingSessionManager#validateSessions()} method. + * + *

    + * Unless this method is called, the default value is {@link #DEFAULT_SESSION_VALIDATION_INTERVAL}. + * + * @param sessionValidationInterval + */ + public void setSessionValidationInterval(long sessionValidationInterval) + { + this.sessionValidationInterval = sessionValidationInterval; + } + + /** + * Starts session validation by creating a spring PeriodicTrigger. + */ + @Override + public void enableSessionValidation() + { + + enabled = true; + + if (log.isDebugEnabled()) + { + log.debug("Scheduling session validation job using Spring Scheduler with " + + "session validation interval of [" + sessionValidationInterval + "]ms..."); + } + + try + { + executorService.scheduleAtFixedRate(new Runnable() + { + @Override + public void run() + { + if (enabled) + { + sessionManager.validateSessions(); + } + } + }, 1000, sessionValidationInterval * 60 * 1000, TimeUnit.MILLISECONDS); + + this.enabled = true; + + if (log.isDebugEnabled()) + { + log.debug("Session validation job successfully scheduled with Spring Scheduler."); + } + + } + catch (Exception e) + { + if (log.isErrorEnabled()) + { + log.error("Error starting the Spring Scheduler session validation job. Session validation may not occur.", e); + } + } + } + + @Override + public void disableSessionValidation() + { + if (log.isDebugEnabled()) + { + log.debug("Stopping Spring Scheduler session validation job..."); + } + + if (this.enabled) + { + Threads.shutdownAndAwaitTermination(executorService); + } + this.enabled = false; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java new file mode 100644 index 0000000..6a549f8 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java @@ -0,0 +1,241 @@ +package com.ruoyi.framework.web.domain; + +import java.net.UnknownHostException; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; +import com.ruoyi.common.utils.Arith; +import com.ruoyi.common.utils.IpUtils; +import com.ruoyi.framework.web.domain.server.Cpu; +import com.ruoyi.framework.web.domain.server.Jvm; +import com.ruoyi.framework.web.domain.server.Mem; +import com.ruoyi.framework.web.domain.server.Sys; +import com.ruoyi.framework.web.domain.server.SysFile; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.CentralProcessor.TickType; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.software.os.FileSystem; +import oshi.software.os.OSFileStore; +import oshi.software.os.OperatingSystem; +import oshi.util.Util; + +/** + * 服务器相关信息 + * + * @author ruoyi + */ +public class Server +{ + + private static final int OSHI_WAIT_SECOND = 1000; + + /** + * CPU相关信息 + */ + private Cpu cpu = new Cpu(); + + /** + * 內存相关信息 + */ + private Mem mem = new Mem(); + + /** + * JVM相关信息 + */ + private Jvm jvm = new Jvm(); + + /** + * 服务器相关信息 + */ + private Sys sys = new Sys(); + + /** + * 磁盘相关信息 + */ + private List sysFiles = new LinkedList(); + + public Cpu getCpu() + { + return cpu; + } + + public void setCpu(Cpu cpu) + { + this.cpu = cpu; + } + + public Mem getMem() + { + return mem; + } + + public void setMem(Mem mem) + { + this.mem = mem; + } + + public Jvm getJvm() + { + return jvm; + } + + public void setJvm(Jvm jvm) + { + this.jvm = jvm; + } + + public Sys getSys() + { + return sys; + } + + public void setSys(Sys sys) + { + this.sys = sys; + } + + public List getSysFiles() + { + return sysFiles; + } + + public void setSysFiles(List sysFiles) + { + this.sysFiles = sysFiles; + } + + public void copyTo() throws Exception + { + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + + setCpuInfo(hal.getProcessor()); + + setMemInfo(hal.getMemory()); + + setSysInfo(); + + setJvmInfo(); + + setSysFiles(si.getOperatingSystem()); + } + + /** + * 设置CPU信息 + */ + private void setCpuInfo(CentralProcessor processor) + { + // CPU信息 + long[] prevTicks = processor.getSystemCpuLoadTicks(); + Util.sleep(OSHI_WAIT_SECOND); + long[] ticks = processor.getSystemCpuLoadTicks(); + long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()]; + long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()]; + long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()]; + long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()]; + long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()]; + long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()]; + long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()]; + long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()]; + long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal; + cpu.setCpuNum(processor.getLogicalProcessorCount()); + cpu.setTotal(totalCpu); + cpu.setSys(cSys); + cpu.setUsed(user); + cpu.setWait(iowait); + cpu.setFree(idle); + } + + /** + * 设置内存信息 + */ + private void setMemInfo(GlobalMemory memory) + { + mem.setTotal(memory.getTotal()); + mem.setUsed(memory.getTotal() - memory.getAvailable()); + mem.setFree(memory.getAvailable()); + } + + /** + * 设置服务器信息 + */ + private void setSysInfo() + { + Properties props = System.getProperties(); + sys.setComputerName(IpUtils.getHostName()); + sys.setComputerIp(IpUtils.getHostIp()); + sys.setOsName(props.getProperty("os.name")); + sys.setOsArch(props.getProperty("os.arch")); + sys.setUserDir(props.getProperty("user.dir")); + } + + /** + * 设置Java虚拟机 + */ + private void setJvmInfo() throws UnknownHostException + { + Properties props = System.getProperties(); + jvm.setTotal(Runtime.getRuntime().totalMemory()); + jvm.setMax(Runtime.getRuntime().maxMemory()); + jvm.setFree(Runtime.getRuntime().freeMemory()); + jvm.setVersion(props.getProperty("java.version")); + jvm.setHome(props.getProperty("java.home")); + } + + /** + * 设置磁盘信息 + */ + private void setSysFiles(OperatingSystem os) + { + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + for (OSFileStore fs : fsArray) + { + long free = fs.getUsableSpace(); + long total = fs.getTotalSpace(); + long used = total - free; + SysFile sysFile = new SysFile(); + sysFile.setDirName(fs.getMount()); + sysFile.setSysTypeName(fs.getType()); + sysFile.setTypeName(fs.getName()); + sysFile.setTotal(convertFileSize(total)); + sysFile.setFree(convertFileSize(free)); + sysFile.setUsed(convertFileSize(used)); + sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100)); + sysFiles.add(sysFile); + } + } + + /** + * 字节转换 + * + * @param size 字节大小 + * @return 转换后值 + */ + public String convertFileSize(long size) + { + long kb = 1024; + long mb = kb * 1024; + long gb = mb * 1024; + if (size >= gb) + { + return String.format("%.1f GB", (float) size / gb); + } + else if (size >= mb) + { + float f = (float) size / mb; + return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); + } + else if (size >= kb) + { + float f = (float) size / kb; + return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); + } + else + { + return String.format("%d B", size); + } + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java new file mode 100644 index 0000000..a13a66c --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java @@ -0,0 +1,101 @@ +package com.ruoyi.framework.web.domain.server; + +import com.ruoyi.common.utils.Arith; + +/** + * CPU相关信息 + * + * @author ruoyi + */ +public class Cpu +{ + /** + * 核心数 + */ + private int cpuNum; + + /** + * CPU总的使用率 + */ + private double total; + + /** + * CPU系统使用率 + */ + private double sys; + + /** + * CPU用户使用率 + */ + private double used; + + /** + * CPU当前等待率 + */ + private double wait; + + /** + * CPU当前空闲率 + */ + private double free; + + public int getCpuNum() + { + return cpuNum; + } + + public void setCpuNum(int cpuNum) + { + this.cpuNum = cpuNum; + } + + public double getTotal() + { + return Arith.round(Arith.mul(total, 100), 2); + } + + public void setTotal(double total) + { + this.total = total; + } + + public double getSys() + { + return Arith.round(Arith.mul(sys / total, 100), 2); + } + + public void setSys(double sys) + { + this.sys = sys; + } + + public double getUsed() + { + return Arith.round(Arith.mul(used / total, 100), 2); + } + + public void setUsed(double used) + { + this.used = used; + } + + public double getWait() + { + return Arith.round(Arith.mul(wait / total, 100), 2); + } + + public void setWait(double wait) + { + this.wait = wait; + } + + public double getFree() + { + return Arith.round(Arith.mul(free / total, 100), 2); + } + + public void setFree(double free) + { + this.free = free; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java new file mode 100644 index 0000000..1fdc6ac --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java @@ -0,0 +1,130 @@ +package com.ruoyi.framework.web.domain.server; + +import java.lang.management.ManagementFactory; +import com.ruoyi.common.utils.Arith; +import com.ruoyi.common.utils.DateUtils; + +/** + * JVM相关信息 + * + * @author ruoyi + */ +public class Jvm +{ + /** + * 当前JVM占用的内存总数(M) + */ + private double total; + + /** + * JVM最大可用内存总数(M) + */ + private double max; + + /** + * JVM空闲内存(M) + */ + private double free; + + /** + * JDK版本 + */ + private String version; + + /** + * JDK路径 + */ + private String home; + + public double getTotal() + { + return Arith.div(total, (1024 * 1024), 2); + } + + public void setTotal(double total) + { + this.total = total; + } + + public double getMax() + { + return Arith.div(max, (1024 * 1024), 2); + } + + public void setMax(double max) + { + this.max = max; + } + + public double getFree() + { + return Arith.div(free, (1024 * 1024), 2); + } + + public void setFree(double free) + { + this.free = free; + } + + public double getUsed() + { + return Arith.div(total - free, (1024 * 1024), 2); + } + + public double getUsage() + { + return Arith.mul(Arith.div(total - free, total, 4), 100); + } + + /** + * 获取JDK名称 + */ + public String getName() + { + return ManagementFactory.getRuntimeMXBean().getVmName(); + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getHome() + { + return home; + } + + public void setHome(String home) + { + this.home = home; + } + + /** + * JDK启动时间 + */ + public String getStartTime() + { + return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getServerStartDate()); + } + + /** + * JDK运行时间 + */ + public String getRunTime() + { + return DateUtils.timeDistance(DateUtils.getNowDate(), DateUtils.getServerStartDate()); + } + + /** + * 运行参数 + */ + public String getInputArgs() + { + return ManagementFactory.getRuntimeMXBean().getInputArguments().toString(); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java new file mode 100644 index 0000000..13eec52 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java @@ -0,0 +1,61 @@ +package com.ruoyi.framework.web.domain.server; + +import com.ruoyi.common.utils.Arith; + +/** + * 內存相关信息 + * + * @author ruoyi + */ +public class Mem +{ + /** + * 内存总量 + */ + private double total; + + /** + * 已用内存 + */ + private double used; + + /** + * 剩余内存 + */ + private double free; + + public double getTotal() + { + return Arith.div(total, (1024 * 1024 * 1024), 2); + } + + public void setTotal(long total) + { + this.total = total; + } + + public double getUsed() + { + return Arith.div(used, (1024 * 1024 * 1024), 2); + } + + public void setUsed(long used) + { + this.used = used; + } + + public double getFree() + { + return Arith.div(free, (1024 * 1024 * 1024), 2); + } + + public void setFree(long free) + { + this.free = free; + } + + public double getUsage() + { + return Arith.mul(Arith.div(used, total, 4), 100); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java new file mode 100644 index 0000000..45d64d9 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java @@ -0,0 +1,84 @@ +package com.ruoyi.framework.web.domain.server; + +/** + * 系统相关信息 + * + * @author ruoyi + */ +public class Sys +{ + /** + * 服务器名称 + */ + private String computerName; + + /** + * 服务器Ip + */ + private String computerIp; + + /** + * 项目路径 + */ + private String userDir; + + /** + * 操作系统 + */ + private String osName; + + /** + * 系统架构 + */ + private String osArch; + + public String getComputerName() + { + return computerName; + } + + public void setComputerName(String computerName) + { + this.computerName = computerName; + } + + public String getComputerIp() + { + return computerIp; + } + + public void setComputerIp(String computerIp) + { + this.computerIp = computerIp; + } + + public String getUserDir() + { + return userDir; + } + + public void setUserDir(String userDir) + { + this.userDir = userDir; + } + + public String getOsName() + { + return osName; + } + + public void setOsName(String osName) + { + this.osName = osName; + } + + public String getOsArch() + { + return osArch; + } + + public void setOsArch(String osArch) + { + this.osArch = osArch; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java new file mode 100644 index 0000000..1320cde --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java @@ -0,0 +1,114 @@ +package com.ruoyi.framework.web.domain.server; + +/** + * 系统文件相关信息 + * + * @author ruoyi + */ +public class SysFile +{ + /** + * 盘符路径 + */ + private String dirName; + + /** + * 盘符类型 + */ + private String sysTypeName; + + /** + * 文件类型 + */ + private String typeName; + + /** + * 总大小 + */ + private String total; + + /** + * 剩余大小 + */ + private String free; + + /** + * 已经使用量 + */ + private String used; + + /** + * 资源的使用率 + */ + private double usage; + + public String getDirName() + { + return dirName; + } + + public void setDirName(String dirName) + { + this.dirName = dirName; + } + + public String getSysTypeName() + { + return sysTypeName; + } + + public void setSysTypeName(String sysTypeName) + { + this.sysTypeName = sysTypeName; + } + + public String getTypeName() + { + return typeName; + } + + public void setTypeName(String typeName) + { + this.typeName = typeName; + } + + public String getTotal() + { + return total; + } + + public void setTotal(String total) + { + this.total = total; + } + + public String getFree() + { + return free; + } + + public void setFree(String free) + { + this.free = free; + } + + public String getUsed() + { + return used; + } + + public void setUsed(String used) + { + this.used = used; + } + + public double getUsage() + { + return usage; + } + + public void setUsage(double usage) + { + this.usage = usage; + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..50aa339 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -0,0 +1,149 @@ +package com.ruoyi.framework.web.exception; + +import javax.servlet.http.HttpServletRequest; +import org.apache.shiro.authz.AuthorizationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MissingPathVariableException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import org.springframework.web.servlet.ModelAndView; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.exception.DemoModeException; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.html.EscapeUtil; +import com.ruoyi.common.utils.security.PermissionUtils; + +/** + * 全局异常处理器 + * + * @author ruoyi + */ +@RestControllerAdvice +public class GlobalExceptionHandler +{ + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + /** + * 权限校验异常(ajax请求返回json,redirect请求跳转页面) + */ + @ExceptionHandler(AuthorizationException.class) + public Object handleAuthorizationException(AuthorizationException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage()); + if (ServletUtils.isAjaxRequest(request)) + { + return AjaxResult.error(PermissionUtils.getMsg(e.getMessage())); + } + else + { + return new ModelAndView("error/unauth"); + } + } + + /** + * 请求方式不支持 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, + HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); + return AjaxResult.error(e.getMessage()); + } + + /** + * 拦截未知的运行时异常 + */ + @ExceptionHandler(RuntimeException.class) + public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生未知异常.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 系统异常 + */ + @ExceptionHandler(Exception.class) + public AjaxResult handleException(Exception e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 业务异常 + */ + @ExceptionHandler(ServiceException.class) + public Object handleServiceException(ServiceException e, HttpServletRequest request) + { + log.error(e.getMessage(), e); + if (ServletUtils.isAjaxRequest(request)) + { + return AjaxResult.error(e.getMessage()); + } + else + { + return new ModelAndView("error/service", "errorMessage", e.getMessage()); + } + } + + /** + * 请求路径中缺少必需的路径变量 + */ + @ExceptionHandler(MissingPathVariableException.class) + public AjaxResult handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName())); + } + + /** + * 请求参数类型不匹配 + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public AjaxResult handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e, + HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + String value = Convert.toStr(e.getValue()); + if (StringUtils.isNotEmpty(value)) + { + value = EscapeUtil.clean(value); + } + log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", e.getName(), e.getRequiredType().getName(), value)); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(BindException.class) + public AjaxResult handleBindException(BindException e) + { + log.error(e.getMessage(), e); + String message = e.getAllErrors().get(0).getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 演示模式异常 + */ + @ExceptionHandler(DemoModeException.class) + public AjaxResult handleDemoModeException(DemoModeException e) + { + return AjaxResult.error("演示模式,不允许操作"); + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/CacheService.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/CacheService.java new file mode 100644 index 0000000..a33b3e6 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/CacheService.java @@ -0,0 +1,84 @@ +package com.ruoyi.framework.web.service; + +import java.util.Set; +import java.util.TreeSet; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.stereotype.Service; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.CacheUtils; + +/** + * 缓存操作处理 + * + * @author ruoyi + */ +@Service +public class CacheService +{ + /** + * 获取所有缓存名称 + * + * @return 缓存列表 + */ + public String[] getCacheNames() + { + String[] cacheNames = CacheUtils.getCacheNames(); + return ArrayUtils.removeElement(cacheNames, Constants.SYS_AUTH_CACHE); + } + + /** + * 根据缓存名称获取所有键名 + * + * @param cacheName 缓存名称 + * @return 键名列表 + */ + public Set getCacheKeys(String cacheName) + { + return new TreeSet<>(CacheUtils.getCache(cacheName).keys()); + } + + /** + * 根据缓存名称和键名获取内容值 + * + * @param cacheName 缓存名称 + * @param cacheKey 键名 + * @return 键值 + */ + public Object getCacheValue(String cacheName, String cacheKey) + { + return CacheUtils.get(cacheName, cacheKey); + } + + /** + * 根据名称删除缓存信息 + * + * @param cacheName 缓存名称 + */ + public void clearCacheName(String cacheName) + { + CacheUtils.removeAll(cacheName); + } + + /** + * 根据名称和键名删除缓存信息 + * + * @param cacheName 缓存名称 + * @param cacheKey 键名 + */ + public void clearCacheKey(String cacheName, String cacheKey) + { + CacheUtils.remove(cacheName, cacheKey); + } + + /** + * 清理所有缓存 + */ + public void clearAll() + { + String[] cacheNames = getCacheNames(); + for (String cacheName : cacheNames) + { + CacheUtils.removeAll(cacheName); + } + } +} diff --git a/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java new file mode 100644 index 0000000..0443591 --- /dev/null +++ b/src/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java @@ -0,0 +1,262 @@ +package com.ruoyi.framework.web.service; + +import java.beans.BeanInfo; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import com.ruoyi.common.utils.StringUtils; + +/** + * RuoYi首创 js调用 thymeleaf 实现按钮权限可见性 + * + * @author ruoyi + */ +@Service("permission") +public class PermissionService +{ + private static final Logger log = LoggerFactory.getLogger(PermissionService.class); + + /** 没有权限,hidden用于前端隐藏按钮 */ + public static final String NOACCESS = "hidden"; + + private static final String ROLE_DELIMETER = ","; + + private static final String PERMISSION_DELIMETER = ","; + + /** + * 验证用户是否具备某权限,无权限返回hidden用于前端隐藏(如需返回Boolean使用isPermitted) + * + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + public String hasPermi(String permission) + { + return isPermitted(permission) ? StringUtils.EMPTY : NOACCESS; + } + + /** + * 验证用户是否不具备某权限,与 hasPermi逻辑相反。无权限返回hidden用于前端隐藏(如需返回Boolean使用isLacksPermitted) + * + * @param permission 权限字符串 + * @return 用户是否不具备某权限 + */ + public String lacksPermi(String permission) + { + return isLacksPermitted(permission) ? StringUtils.EMPTY : NOACCESS; + } + + /** + * 验证用户是否具有以下任意一个权限,无权限返回hidden用于隐藏(如需返回Boolean使用hasAnyPermissions) + * + * @param permissions 以 PERMISSION_DELIMETER 为分隔符的权限列表 + * @return 用户是否具有以下任意一个权限 + */ + public String hasAnyPermi(String permissions) + { + return hasAnyPermissions(permissions, PERMISSION_DELIMETER) ? StringUtils.EMPTY : NOACCESS; + } + + /** + * 验证用户是否具备某角色,无权限返回hidden用于隐藏(如需返回Boolean使用isRole) + * + * @param role 角色字符串 + * @return 用户是否具备某角色 + */ + public String hasRole(String role) + { + return isRole(role) ? StringUtils.EMPTY : NOACCESS; + } + + /** + * 验证用户是否不具备某角色,与hasRole逻辑相反。无权限返回hidden用于隐藏(如需返回Boolean使用isLacksRole) + * + * @param role 角色字符串 + * @return 用户是否不具备某角色 + */ + public String lacksRole(String role) + { + return isLacksRole(role) ? StringUtils.EMPTY : NOACCESS; + } + + /** + * 验证用户是否具有以下任意一个角色,无权限返回hidden用于隐藏(如需返回Boolean使用isAnyRoles) + * + * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表 + * @return 用户是否具有以下任意一个角色 + */ + public String hasAnyRoles(String roles) + { + return isAnyRoles(roles, ROLE_DELIMETER) ? StringUtils.EMPTY : NOACCESS; + } + + /** + * 验证用户是否认证通过或已记住的用户。 + * + * @return 用户是否认证通过或已记住的用户 + */ + public boolean isUser() + { + Subject subject = SecurityUtils.getSubject(); + return subject != null && subject.getPrincipal() != null; + } + + /** + * 判断用户是否拥有某个权限 + * + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + public boolean isPermitted(String permission) + { + return SecurityUtils.getSubject().isPermitted(permission); + } + + /** + * 判断用户是否不具备某权限,与 isPermitted逻辑相反。 + * + * @param permission 权限名称 + * @return 用户是否不具备某权限 + */ + public boolean isLacksPermitted(String permission) + { + return isPermitted(permission) != true; + } + + /** + * 验证用户是否具有以下任意一个权限。 + * + * @param permissions 以 PERMISSION_DELIMETER 为分隔符的权限列表 + * @return 用户是否具有以下任意一个权限 + */ + public boolean hasAnyPermissions(String permissions) + { + return hasAnyPermissions(permissions, PERMISSION_DELIMETER); + } + + /** + * 验证用户是否具有以下任意一个权限。 + * + * @param permissions 以 delimeter 为分隔符的权限列表 + * @param delimeter 权限列表分隔符 + * @return 用户是否具有以下任意一个权限 + */ + public boolean hasAnyPermissions(String permissions, String delimeter) + { + Subject subject = SecurityUtils.getSubject(); + + if (subject != null) + { + if (delimeter == null || delimeter.length() == 0) + { + delimeter = PERMISSION_DELIMETER; + } + + for (String permission : permissions.split(delimeter)) + { + if (permission != null && subject.isPermitted(permission.trim()) == true) + { + return true; + } + } + } + + return false; + } + + /** + * 判断用户是否拥有某个角色 + * + * @param role 角色字符串 + * @return 用户是否具备某角色 + */ + public boolean isRole(String role) + { + return SecurityUtils.getSubject().hasRole(role); + } + + /** + * 验证用户是否不具备某角色,与 isRole逻辑相反。 + * + * @param role 角色名称 + * @return 用户是否不具备某角色 + */ + public boolean isLacksRole(String role) + { + return isRole(role) != true; + } + + /** + * 验证用户是否具有以下任意一个角色。 + * + * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表 + * @return 用户是否具有以下任意一个角色 + */ + public boolean isAnyRoles(String roles) + { + return isAnyRoles(roles, ROLE_DELIMETER); + } + + /** + * 验证用户是否具有以下任意一个角色。 + * + * @param roles 以 delimeter 为分隔符的角色列表 + * @param delimeter 角色列表分隔符 + * @return 用户是否具有以下任意一个角色 + */ + public boolean isAnyRoles(String roles, String delimeter) + { + Subject subject = SecurityUtils.getSubject(); + if (subject != null) + { + if (delimeter == null || delimeter.length() == 0) + { + delimeter = ROLE_DELIMETER; + } + + for (String role : roles.split(delimeter)) + { + if (subject.hasRole(role.trim()) == true) + { + return true; + } + } + } + + return false; + } + + /** + * 返回用户属性值 + * + * @param property 属性名称 + * @return 用户属性值 + */ + public Object getPrincipalProperty(String property) + { + Subject subject = SecurityUtils.getSubject(); + if (subject != null) + { + Object principal = subject.getPrincipal(); + try + { + BeanInfo bi = Introspector.getBeanInfo(principal.getClass()); + for (PropertyDescriptor pd : bi.getPropertyDescriptors()) + { + if (pd.getName().equals(property) == true) + { + return pd.getReadMethod().invoke(principal, (Object[]) null); + } + } + } + catch (Exception e) + { + log.error("Error reading property [{}] from principal of type [{}]", property, principal.getClass().getName()); + } + } + return null; + } +} diff --git a/src/ruoyi-system/pom.xml b/src/ruoyi-system/pom.xml new file mode 100644 index 0000000..59d82d0 --- /dev/null +++ b/src/ruoyi-system/pom.xml @@ -0,0 +1,28 @@ + + + + ruoyi + com.ruoyi + 4.7.9 + + 4.0.0 + + ruoyi-system + + + system系统模块 + + + + + + + com.ruoyi + ruoyi-common + + + + + \ No newline at end of file diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysAccount.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysAccount.java new file mode 100644 index 0000000..e04602e --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysAccount.java @@ -0,0 +1,107 @@ +package com.ruoyi.system.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 系统访问记录表 sys_logininfor + * + * @author ruoyi + */ +public class SysAccount extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + private Long id; + + /** 账户名称 */ + private String name; + + /** 账户类型0储蓄账户1支付账户2信用账户 */ + private String type; + + /** 账户余额 */ + private BigDecimal price; + + /** 更新日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date updateTime; + + private Long userId; + + public SysAccount() { + } + + public SysAccount(Long userId) { + this.userId = userId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + @Override + public Date getUpdateTime() { + return updateTime; + } + + @Override + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "SysAccount{" + + "id=" + id + + ", name='" + name + '\'' + + ", type='" + type + '\'' + + ", price=" + price + + ", updateTime=" + updateTime + + '}'; + } +} \ No newline at end of file diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysBalanceLog.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysBalanceLog.java new file mode 100644 index 0000000..d98ad4a --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysBalanceLog.java @@ -0,0 +1,205 @@ +package com.ruoyi.system.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户交易信息 + * + * @author ruoyi + */ +public class SysBalanceLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + private Long id; + + /** 描述 */ + @Excel(name="收入来源") + private String desc; + + /** 类型0收入1支出 */ + private String type; + + private BigDecimal bgPrice; + + /** 产生日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date createDate; + + //支出类型0购物1学习2娱乐3通讯4日常支出 + private String zcType; + + @Excel(name="收入类型") + //收入类型0生活费1奖学金2助学金3兼职 + private String srType; + + private Long userId; + @Excel(name="收入账户") + private String accountStr; + private Long accountId; + + /** 交易金额 */ + @Excel(name="金额") + private BigDecimal price; + private Boolean isMonth; + + private Integer page; + private Integer pageSize; + + private Integer mon; + + public SysBalanceLog() { + } + + public SysBalanceLog(String type, BigDecimal price, Long userId) { + this.type = type; + this.price = price; + this.userId = userId; + } + + public SysBalanceLog(BigDecimal bgPrice, Long accountId) { + this.bgPrice = bgPrice; + this.accountId = accountId; + } + + public Integer getMon() { + return mon; + } + + public void setMon(Integer mon) { + this.mon = mon; + } + + public BigDecimal getBgPrice() { + return bgPrice; + } + + public void setBgPrice(BigDecimal bgPrice) { + this.bgPrice = bgPrice; + } + + public String getAccountStr() { + return accountStr; + } + + public void setAccountStr(String accountStr) { + this.accountStr = accountStr; + } + + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Boolean getMonth() { + return isMonth; + } + + public void setMonth(Boolean month) { + isMonth = month; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getZcType() { + return zcType; + } + + public void setZcType(String zcType) { + this.zcType = zcType; + } + + public String getSrType() { + return srType; + } + + public void setSrType(String srType) { + this.srType = srType; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getAccountId() { + return accountId; + } + + public void setAccountId(Long accountId) { + this.accountId = accountId; + } + + @Override + public String toString() { + return "SysBalanceLog{" + + "id=" + id + + ", desc='" + desc + '\'' + + ", type='" + type + '\'' + + ", price=" + price + + ", createDate=" + createDate + + ", zcType='" + zcType + '\'' + + ", srType='" + srType + '\'' + + ", userId=" + userId + + ", accountId=" + accountId + + '}'; + } +} \ No newline at end of file diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysIndex.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysIndex.java new file mode 100644 index 0000000..3980339 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysIndex.java @@ -0,0 +1,54 @@ +package com.ruoyi.system.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 系统访问记录表 sys_logininfor + * + * @author ruoyi + */ +public class SysIndex extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + //账户余额 + private BigDecimal accountPrice; + //收入金额 + private BigDecimal srPrice; + //支出金额 + private BigDecimal payPrice; + + public SysIndex(BigDecimal accountPrice, BigDecimal srPrice, BigDecimal payPrice) { + this.accountPrice = accountPrice; + this.srPrice = srPrice; + this.payPrice = payPrice; + } + + public BigDecimal getAccountPrice() { + return accountPrice; + } + + public void setAccountPrice(BigDecimal accountPrice) { + this.accountPrice = accountPrice; + } + + public BigDecimal getSrPrice() { + return srPrice; + } + + public void setSrPrice(BigDecimal srPrice) { + this.srPrice = srPrice; + } + + public BigDecimal getPayPrice() { + return payPrice; + } + + public void setPayPrice(BigDecimal payPrice) { + this.payPrice = payPrice; + } +} \ No newline at end of file diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysJk.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysJk.java new file mode 100644 index 0000000..0331413 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysJk.java @@ -0,0 +1,136 @@ +package com.ruoyi.system.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 系统访问记录表 sys_logininfor + * + * @author ruoyi + */ +public class SysJk extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + private Long id; + + /** 监控描述 */ + private String name; + + /** 类型0消费金额1消费次数2阈值监控 */ + private String type; + + /** 阈值金额/数量 */ + private BigDecimal number; + + /** 截至日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + private Long userId; + + private String msg; + + private Boolean pdFlag; + + private Long jkId; + + private Integer jcDay; + + public SysJk() { + } + + public SysJk(Long userId, String msg, Long jkId) { + this.userId = userId; + this.msg = msg; + this.jkId = jkId; + } + + public SysJk(Long userId) { + this.userId = userId; + } + + public Integer getJcDay() { + return jcDay; + } + + public void setJcDay(Integer jcDay) { + this.jcDay = jcDay; + } + + public Long getJkId() { + return jkId; + } + + public void setJkId(Long jkId) { + this.jkId = jkId; + } + + public Boolean getPdFlag() { + return pdFlag; + } + + public void setPdFlag(Boolean pdFlag) { + this.pdFlag = pdFlag; + } + + public BigDecimal getNumber() { + return number; + } + + public void setNumber(BigDecimal number) { + this.number = number; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} \ No newline at end of file diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java new file mode 100644 index 0000000..29b3af1 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java @@ -0,0 +1,159 @@ +package com.ruoyi.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import java.util.Date; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 系统访问记录表 sys_logininfor + * + * @author ruoyi + */ +public class SysLogininfor extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + @Excel(name = "序号", cellType = ColumnType.NUMERIC) + private Long infoId; + + /** 用户账号 */ + @Excel(name = "用户账号") + private String loginName; + + /** 登录状态 0成功 1失败 */ + @Excel(name = "登录状态", readConverterExp = "0=成功,1=失败") + private String status; + + /** 登录IP地址 */ + @Excel(name = "登录地址") + private String ipaddr; + + /** 登录地点 */ + @Excel(name = "登录地点") + private String loginLocation; + + /** 浏览器类型 */ + @Excel(name = "浏览器") + private String browser; + + /** 操作系统 */ + @Excel(name = "操作系统") + private String os; + + /** 提示消息 */ + @Excel(name = "提示消息") + private String msg; + + /** 访问时间 */ + @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date loginTime; + + public Long getInfoId() + { + return infoId; + } + + public void setInfoId(Long infoId) + { + this.infoId = infoId; + } + + public String getLoginName() + { + return loginName; + } + + public void setLoginName(String loginName) + { + this.loginName = loginName; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } + + public Date getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Date loginTime) + { + this.loginTime = loginTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("infoId", getInfoId()) + .append("loginName", getLoginName()) + .append("ipaddr", getIpaddr()) + .append("loginLocation", getLoginLocation()) + .append("browser", getBrowser()) + .append("os", getOs()) + .append("status", getStatus()) + .append("msg", getMsg()) + .append("loginTime", getLoginTime()) + .toString(); + } +} \ No newline at end of file diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java new file mode 100644 index 0000000..e758412 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java @@ -0,0 +1,292 @@ +package com.ruoyi.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import java.util.Date; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 操作日志记录表 oper_log + * + * @author ruoyi + */ +public class SysOperLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 日志主键 */ + @Excel(name = "操作序号", cellType = ColumnType.NUMERIC) + private Long operId; + + /** 操作模块 */ + @Excel(name = "操作模块") + private String title; + + /** 业务类型(0其它 1新增 2修改 3删除) */ + @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") + private Integer businessType; + + /** 业务类型数组 */ + private Integer[] businessTypes; + + /** 请求方法 */ + @Excel(name = "请求方法") + private String method; + + /** 请求方式 */ + @Excel(name = "请求方式") + private String requestMethod; + + /** 操作类别(0其它 1后台用户 2手机端用户) */ + @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户") + private Integer operatorType; + + /** 操作人员 */ + @Excel(name = "操作人员") + private String operName; + + /** 部门名称 */ + @Excel(name = "部门名称") + private String deptName; + + /** 请求url */ + @Excel(name = "请求地址") + private String operUrl; + + /** 操作地址 */ + @Excel(name = "操作地址") + private String operIp; + + /** 操作地点 */ + @Excel(name = "操作地点") + private String operLocation; + + /** 请求参数 */ + @Excel(name = "请求参数") + private String operParam; + + /** 返回参数 */ + @Excel(name = "返回参数") + private String jsonResult; + + /** 操作状态(0正常 1异常) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=异常") + private Integer status; + + /** 错误消息 */ + @Excel(name = "错误消息") + private String errorMsg; + + /** 操作时间 */ + @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date operTime; + + /** 消耗时间 */ + @Excel(name = "消耗时间", suffix = "毫秒") + private Long costTime; + + public Long getOperId() + { + return operId; + } + + public void setOperId(Long operId) + { + this.operId = operId; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public Integer getBusinessType() + { + return businessType; + } + + public void setBusinessType(Integer businessType) + { + this.businessType = businessType; + } + + public Integer[] getBusinessTypes() + { + return businessTypes; + } + + public void setBusinessTypes(Integer[] businessTypes) + { + this.businessTypes = businessTypes; + } + + public String getMethod() + { + return method; + } + + public void setMethod(String method) + { + this.method = method; + } + + public String getRequestMethod() + { + return requestMethod; + } + + public void setRequestMethod(String requestMethod) + { + this.requestMethod = requestMethod; + } + + public Integer getOperatorType() + { + return operatorType; + } + + public void setOperatorType(Integer operatorType) + { + this.operatorType = operatorType; + } + + public String getOperName() + { + return operName; + } + + public void setOperName(String operName) + { + this.operName = operName; + } + + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + public String getOperUrl() + { + return operUrl; + } + + public void setOperUrl(String operUrl) + { + this.operUrl = operUrl; + } + + public String getOperIp() + { + return operIp; + } + + public void setOperIp(String operIp) + { + this.operIp = operIp; + } + + public String getOperLocation() + { + return operLocation; + } + + public void setOperLocation(String operLocation) + { + this.operLocation = operLocation; + } + + public String getOperParam() + { + return operParam; + } + + public void setOperParam(String operParam) + { + this.operParam = operParam; + } + + public String getJsonResult() + { + return jsonResult; + } + + public void setJsonResult(String jsonResult) + { + this.jsonResult = jsonResult; + } + + public Integer getStatus() + { + return status; + } + + public void setStatus(Integer status) + { + this.status = status; + } + + public String getErrorMsg() + { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) + { + this.errorMsg = errorMsg; + } + + public Date getOperTime() + { + return operTime; + } + + public void setOperTime(Date operTime) + { + this.operTime = operTime; + } + + public Long getCostTime() + { + return costTime; + } + + public void setCostTime(Long costTime) + { + this.costTime = costTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("operId", getOperId()) + .append("title", getTitle()) + .append("businessType", getBusinessType()) + .append("businessTypes", getBusinessTypes()) + .append("method", getMethod()) + .append("requestMethod", getRequestMethod()) + .append("operatorType", getOperatorType()) + .append("operName", getOperName()) + .append("deptName", getDeptName()) + .append("operUrl", getOperUrl()) + .append("operIp", getOperIp()) + .append("operLocation", getOperLocation()) + .append("operParam", getOperParam()) + .append("status", getStatus()) + .append("errorMsg", getErrorMsg()) + .append("operTime", getOperTime()) + .append("costTime", getCostTime()) + .toString(); + } +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPayYz.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPayYz.java new file mode 100644 index 0000000..1a62510 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPayYz.java @@ -0,0 +1,178 @@ +package com.ruoyi.system.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 系统访问记录表 sys_logininfor + * + * @author ruoyi + */ +public class SysPayYz extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 购物金额 */ + private BigDecimal type0 = new BigDecimal(0); + /** 购物阈值 */ + private BigDecimal typeYz0 = new BigDecimal(0); + //购物百分比 + private BigDecimal typeBfb0 = new BigDecimal(100); + /** 学习金额 */ + private BigDecimal type1 = new BigDecimal(0); + /** 学习阈值 */ + private BigDecimal typeYz1 = new BigDecimal(0); + //学习百分比 + private BigDecimal typeBfb1 = new BigDecimal(100); + /** 娱乐金额 */ + private BigDecimal type2 = new BigDecimal(0); + /** 娱乐阈值 */ + private BigDecimal typeYz2 = new BigDecimal(0); + //娱乐百分比 + private BigDecimal typeBfb2 = new BigDecimal(100); + /** 通讯金额 */ + private BigDecimal type3 = new BigDecimal(0); + /** 通讯阈值 */ + private BigDecimal typeYz3 = new BigDecimal(0); + //通讯百分比 + private BigDecimal typeBfb3 = new BigDecimal(100); + /** 日常支出金额 */ + private BigDecimal type4 = new BigDecimal(0); + /** 日常支出阈值 */ + private BigDecimal typeYz4 = new BigDecimal(0); + //日常支出百分比 + private BigDecimal typeBfb4 = new BigDecimal(100); + + private Long userId; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public BigDecimal getType0() { + return type0; + } + + public void setType0(BigDecimal type0) { + this.type0 = type0; + } + + public BigDecimal getTypeYz0() { + return typeYz0; + } + + public void setTypeYz0(BigDecimal typeYz0) { + this.typeYz0 = typeYz0; + } + + public BigDecimal getTypeBfb0() { + return typeBfb0; + } + + public void setTypeBfb0(BigDecimal typeBfb0) { + this.typeBfb0 = typeBfb0; + } + + public BigDecimal getType1() { + return type1; + } + + public void setType1(BigDecimal type1) { + this.type1 = type1; + } + + public BigDecimal getTypeYz1() { + return typeYz1; + } + + public void setTypeYz1(BigDecimal typeYz1) { + this.typeYz1 = typeYz1; + } + + public BigDecimal getTypeBfb1() { + return typeBfb1; + } + + public void setTypeBfb1(BigDecimal typeBfb1) { + this.typeBfb1 = typeBfb1; + } + + public BigDecimal getType2() { + return type2; + } + + public void setType2(BigDecimal type2) { + this.type2 = type2; + } + + public BigDecimal getTypeYz2() { + return typeYz2; + } + + public void setTypeYz2(BigDecimal typeYz2) { + this.typeYz2 = typeYz2; + } + + public BigDecimal getTypeBfb2() { + return typeBfb2; + } + + public void setTypeBfb2(BigDecimal typeBfb2) { + this.typeBfb2 = typeBfb2; + } + + public BigDecimal getType3() { + return type3; + } + + public void setType3(BigDecimal type3) { + this.type3 = type3; + } + + public BigDecimal getTypeYz3() { + return typeYz3; + } + + public void setTypeYz3(BigDecimal typeYz3) { + this.typeYz3 = typeYz3; + } + + public BigDecimal getTypeBfb3() { + return typeBfb3; + } + + public void setTypeBfb3(BigDecimal typeBfb3) { + this.typeBfb3 = typeBfb3; + } + + public BigDecimal getType4() { + return type4; + } + + public void setType4(BigDecimal type4) { + this.type4 = type4; + } + + public BigDecimal getTypeYz4() { + return typeYz4; + } + + public void setTypeYz4(BigDecimal typeYz4) { + this.typeYz4 = typeYz4; + } + + public BigDecimal getTypeBfb4() { + return typeBfb4; + } + + public void setTypeBfb4(BigDecimal typeBfb4) { + this.typeBfb4 = typeBfb4; + } +} \ No newline at end of file diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java new file mode 100644 index 0000000..4ecf07a --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java @@ -0,0 +1,177 @@ +package com.ruoyi.system.domain; + +import java.util.Date; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.enums.OnlineStatus; + +/** + * 当前在线会话 sys_user_online + * + * @author ruoyi + */ +public class SysUserOnline extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 用户会话id */ + private String sessionId; + + /** 部门名称 */ + private String deptName; + + /** 登录名称 */ + private String loginName; + + /** 登录IP地址 */ + private String ipaddr; + + /** 登录地址 */ + private String loginLocation; + + /** 浏览器类型 */ + private String browser; + + /** 操作系统 */ + private String os; + + /** session创建时间 */ + private Date startTimestamp; + + /** session最后访问时间 */ + private Date lastAccessTime; + + /** 超时时间,单位为毫秒 */ + private Long expireTime; + + /** 在线状态 */ + private OnlineStatus status = OnlineStatus.on_line; + + public String getSessionId() + { + return sessionId; + } + + public void setSessionId(String sessionId) + { + this.sessionId = sessionId; + } + + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + public String getLoginName() + { + return loginName; + } + + public void setLoginName(String loginName) + { + this.loginName = loginName; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public Date getStartTimestamp() + { + return startTimestamp; + } + + public void setStartTimestamp(Date startTimestamp) + { + this.startTimestamp = startTimestamp; + } + + public Date getLastAccessTime() + { + return lastAccessTime; + } + + public void setLastAccessTime(Date lastAccessTime) + { + this.lastAccessTime = lastAccessTime; + } + + public Long getExpireTime() + { + return expireTime; + } + + public void setExpireTime(Long expireTime) + { + this.expireTime = expireTime; + } + + public OnlineStatus getStatus() + { + return status; + } + + public void setStatus(OnlineStatus status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("sessionId", getSessionId()) + .append("loginName", getLoginName()) + .append("deptName", getDeptName()) + .append("ipaddr", getIpaddr()) + .append("loginLocation", getLoginLocation()) + .append("browser", getBrowser()) + .append("os", getOs()) + .append("status", getStatus()) + .append("startTimestamp", getStartTimestamp()) + .append("lastAccessTime", getLastAccessTime()) + .append("expireTime", getExpireTime()) + .toString(); + } +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysAccountMapper.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysAccountMapper.java new file mode 100644 index 0000000..24491ef --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysAccountMapper.java @@ -0,0 +1,31 @@ +package com.ruoyi.system.mapper; + +import com.ruoyi.system.domain.SysAccount; +import com.ruoyi.system.domain.SysBalanceLog; +import com.ruoyi.system.domain.SysLogininfor; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户账户信息 数据层 + * + * @author ruoyi + */ +public interface SysAccountMapper +{ + /** + * 查询用户账户 + * + * @param account 访问日志对象 + */ + List selectSysAccounts(SysAccount account); + + public int insertSysAccount(SysAccount account); + + public int updateSysAccount(SysAccount account); + + public int deleteSysAccount(@Param("ids") List ids); + + void updateSysAccountMoney(SysBalanceLog balanceLog); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysBalanceLogMapper.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysBalanceLogMapper.java new file mode 100644 index 0000000..762f128 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysBalanceLogMapper.java @@ -0,0 +1,52 @@ +package com.ruoyi.system.mapper; + +import com.ruoyi.system.domain.SysAccount; +import com.ruoyi.system.domain.SysBalanceLog; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 用户交易信息 数据层 + * + * @author ruoyi + */ +public interface SysBalanceLogMapper +{ + List selectSysBalanceLog(SysBalanceLog balanceLog); + + public int insertSysBalanceLog(SysBalanceLog balanceLog); + + public int updateSysBalanceLog(SysBalanceLog balanceLog); + + public int deleteSysBalanceLog(@Param("ids") List ids); + + BigDecimal selectBalancePrice(Long userId); + + List selectSzPrice(Long userId); + + List selectYz(Long userId); + + List selectBalanceLogZj(Long userId); + + void deleteYzByUserId(Long userId); + + int insertYz(@Param("data") List data); + + Integer selectPayCs(@Param("format") String format); + + List selectBalanceLog(@Param("ids") List ids); + + List selectSZ(Long userId); + List selectSr(Long userId); + List selectZc(Long userId); + + BigDecimal getYs(Long userId); + void insertYs(@Param("userId") Long userId,@Param("price") BigDecimal price); + void delYs(Long userId); + + BigDecimal selectMonZc(Long userId); + + List selectSrAndZc(Long userId); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysJkMapper.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysJkMapper.java new file mode 100644 index 0000000..ae6d03c --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysJkMapper.java @@ -0,0 +1,32 @@ +package com.ruoyi.system.mapper; + +import com.ruoyi.system.domain.SysAccount; +import com.ruoyi.system.domain.SysBalanceLog; +import com.ruoyi.system.domain.SysJk; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 检测信息 数据层 + * + * @author ruoyi + */ +public interface SysJkMapper +{ + /** + * 查询检测通知 + * + * @param userId 访问日志对象 + */ + List selectSysJkNotices(Long userId); + + List selectSysJks(SysJk jk); + + public int insertSysJk(SysJk jk); + public int insertSysJkNotice(@Param("jk") List jk); + + public int updateSysJk(SysJk jk); + + public int deleteSysJk(Long id); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java new file mode 100644 index 0000000..7ee47dc --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java @@ -0,0 +1,42 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.SysLogininfor; + +/** + * 系统访问日志情况信息 数据层 + * + * @author ruoyi + */ +public interface SysLogininforMapper +{ + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + public void insertLogininfor(SysLogininfor logininfor); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + public List selectLogininforList(SysLogininfor logininfor); + + /** + * 批量删除系统登录日志 + * + * @param ids 需要删除的数据 + * @return 结果 + */ + public int deleteLogininforByIds(String[] ids); + + /** + * 清空系统登录日志 + * + * @return 结果 + */ + public int cleanLogininfor(); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java new file mode 100644 index 0000000..b40bd29 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java @@ -0,0 +1,48 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.SysOperLog; + +/** + * 操作日志 数据层 + * + * @author ruoyi + */ +public interface SysOperLogMapper +{ + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + public void insertOperlog(SysOperLog operLog); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + public List selectOperLogList(SysOperLog operLog); + + /** + * 批量删除系统操作日志 + * + * @param ids 需要删除的数据 + * @return 结果 + */ + public int deleteOperLogByIds(String[] ids); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + public SysOperLog selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + public void cleanOperLog(); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java new file mode 100644 index 0000000..c5c7060 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.common.core.domain.entity.SysUser; + +/** + * 用户表 数据层 + * + * @author ruoyi + */ +public interface SysUserMapper +{ + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + public SysUser selectUserByLoginName(String userName); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + public SysUser selectUserById(Long userId); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUser(SysUser user); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int insertUser(SysUser user); + + /** + * 校验用户名称是否唯一 + * + * @param loginName 登录名称 + * @return 结果 + */ + public SysUser checkLoginNameUnique(String loginName); + + /** + * 校验email是否唯一 + * + * @param email 用户邮箱 + * @return 结果 + */ + public SysUser checkEmailUnique(String email); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserOnlineMapper.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserOnlineMapper.java new file mode 100644 index 0000000..5bd68ed --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserOnlineMapper.java @@ -0,0 +1,52 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.SysUserOnline; + +/** + * 在线用户 数据层 + * + * @author ruoyi + */ +public interface SysUserOnlineMapper +{ + /** + * 通过会话序号查询信息 + * + * @param sessionId 会话ID + * @return 在线用户信息 + */ + public SysUserOnline selectOnlineById(String sessionId); + + /** + * 通过会话序号删除信息 + * + * @param sessionId 会话ID + * @return 在线用户信息 + */ + public int deleteOnlineById(String sessionId); + + /** + * 保存会话信息 + * + * @param online 会话信息 + * @return 结果 + */ + public int saveOnline(SysUserOnline online); + + /** + * 查询会话集合 + * + * @param userOnline 会话参数 + * @return 会话集合 + */ + public List selectUserOnlineList(SysUserOnline userOnline); + + /** + * 查询过期会话集合 + * + * @param lastAccessTime 过期时间 + * @return 会话集合 + */ + public List selectOnlineByExpired(String lastAccessTime); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysAccountService.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysAccountService.java new file mode 100644 index 0000000..e69edc9 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysAccountService.java @@ -0,0 +1,34 @@ +package com.ruoyi.system.service; + +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.system.domain.SysAccount; + +import java.util.List; + +/** + * 用户 业务层 + * + * @author ruoyi + */ +public interface ISysAccountService +{ + /** + * 通过用户账户 + * + * @param userId 用户id + * @return 用户对象信息 + */ + public List selectSysAccounts(SysAccount account); + + /** + * 保存用户账户 + * + * @param account 用户账户 + * @return 结果 + */ + public int insertSysAccount(SysAccount account); + + public int updateSysAccount(SysAccount account); + + public int deleteSysAccount(List ids); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysBalanceLogService.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysBalanceLogService.java new file mode 100644 index 0000000..62b5af1 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysBalanceLogService.java @@ -0,0 +1,48 @@ +package com.ruoyi.system.service; + +import com.ruoyi.system.domain.SysAccount; +import com.ruoyi.system.domain.SysBalanceLog; +import com.ruoyi.system.domain.SysIndex; +import com.ruoyi.system.domain.SysPayYz; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 用户 业务层 + * + * @author ruoyi + */ +public interface ISysBalanceLogService +{ + List selectSysBalanceLog(SysBalanceLog balanceLog); + + public int insertSysBalanceLog(SysBalanceLog balanceLog); + + public int updateSysBalanceLog(SysBalanceLog balanceLog); + + public int deleteSysBalanceLog(List ids); + + SysIndex selectIndexInfo(Long userId); + + SysPayYz selectPayYz(Long userId); + + int updateYsInfo(SysPayYz payYz); + + String importBalanceLog(List balanceLogs, Long userId); + + List selectSZ(Long userId); + + List selectSr(Long userId); + + List selectZc(Long userId); + + BigDecimal getYs(Long userId); + + void insertYs(Long userId, BigDecimal price); + + String getCurYs(Long userId); + + List selectSrAndZc(Long userId); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysJkService.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysJkService.java new file mode 100644 index 0000000..86da38e --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysJkService.java @@ -0,0 +1,29 @@ +package com.ruoyi.system.service; + +import com.ruoyi.system.domain.SysAccount; +import com.ruoyi.system.domain.SysJk; + +import java.util.List; + +/** + * 检测 业务层 + * + * @author ruoyi + */ +public interface ISysJkService +{ + /** + * 查询检测通知 + * @param userId + * @return + */ + public List selectSysJkNotice(Long userId); + + public List selectSysJks(Long userId); + + public int insertSysJk(SysJk jk); + + public int updateSysJk(SysJk jk); + + public int deleteSysJk(Long id); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java new file mode 100644 index 0000000..ea99dff --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java @@ -0,0 +1,40 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.system.domain.SysLogininfor; + +/** + * 系统访问日志情况信息 服务层 + * + * @author ruoyi + */ +public interface ISysLogininforService +{ + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + public void insertLogininfor(SysLogininfor logininfor); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + public List selectLogininforList(SysLogininfor logininfor); + + /** + * 批量删除系统登录日志 + * + * @param ids 需要删除的数据 + * @return 结果 + */ + public int deleteLogininforByIds(String ids); + + /** + * 清空系统登录日志 + */ + public void cleanLogininfor(); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java new file mode 100644 index 0000000..3cdc5d2 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java @@ -0,0 +1,48 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.system.domain.SysOperLog; + +/** + * 操作日志 服务层 + * + * @author ruoyi + */ +public interface ISysOperLogService +{ + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + public void insertOperlog(SysOperLog operLog); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + public List selectOperLogList(SysOperLog operLog); + + /** + * 批量删除系统操作日志 + * + * @param ids 需要删除的数据 + * @return 结果 + */ + public int deleteOperLogByIds(String ids); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + public SysOperLog selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + public void cleanOperLog(); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java new file mode 100644 index 0000000..50c99a1 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java @@ -0,0 +1,75 @@ +package com.ruoyi.system.service; + +import java.util.Date; +import java.util.List; +import com.ruoyi.system.domain.SysUserOnline; + +/** + * 在线用户 服务层 + * + * @author ruoyi + */ +public interface ISysUserOnlineService +{ + /** + * 通过会话序号查询信息 + * + * @param sessionId 会话ID + * @return 在线用户信息 + */ + public SysUserOnline selectOnlineById(String sessionId); + + /** + * 通过会话序号删除信息 + * + * @param sessionId 会话ID + * @return 在线用户信息 + */ + public void deleteOnlineById(String sessionId); + + /** + * 通过会话序号删除信息 + * + * @param sessions 会话ID集合 + * @return 在线用户信息 + */ + public void batchDeleteOnline(List sessions); + + /** + * 保存会话信息 + * + * @param online 会话信息 + */ + public void saveOnline(SysUserOnline online); + + /** + * 查询会话集合 + * + * @param userOnline 分页参数 + * @return 会话集合 + */ + public List selectUserOnlineList(SysUserOnline userOnline); + + /** + * 强退用户 + * + * @param sessionId 会话ID + */ + public void forceLogout(String sessionId); + + /** + * 清理用户缓存 + * + * @param loginName 登录名称 + * @param sessionId 会话ID + */ + public void removeUserCache(String loginName, String sessionId); + + /** + * 查询会话集合 + * + * @param expiredDate 有效期 + * @return 会话集合 + */ + public List selectOnlineByExpired(Date expiredDate); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java new file mode 100644 index 0000000..b806838 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -0,0 +1,76 @@ +package com.ruoyi.system.service; + +import com.ruoyi.common.core.domain.entity.SysUser; + +/** + * 用户 业务层 + * + * @author ruoyi + */ +public interface ISysUserService +{ + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + public SysUser selectUserByLoginName(String userName); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + public SysUser selectUserById(Long userId); + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean registerUser(SysUser user); + + /** + * 保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUser(SysUser user); + public int insertUser(SysUser user); + + /** + * 修改用户详细信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUserInfo(SysUser user); + + /** + * 修改用户密码信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int resetUserPwd(SysUser user); + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean checkLoginNameUnique(SysUser user); + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean checkEmailUnique(SysUser user); +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysAccountServiceImpl.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysAccountServiceImpl.java new file mode 100644 index 0000000..a6c4cc4 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysAccountServiceImpl.java @@ -0,0 +1,50 @@ +package com.ruoyi.system.service.impl; + +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.domain.SysAccount; +import com.ruoyi.system.mapper.SysAccountMapper; +import com.ruoyi.system.mapper.SysUserMapper; +import com.ruoyi.system.service.ISysAccountService; +import com.ruoyi.system.service.ISysUserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.validation.Validator; +import java.util.List; + +/** + * 用户 业务层处理 + * + * @author ruoyi + */ +@Service +public class SysAccountServiceImpl implements ISysAccountService +{ + @Autowired + private SysAccountMapper accountMapper; + + @Override + public List selectSysAccounts(SysAccount account) { + return accountMapper.selectSysAccounts(account); + } + + @Override + public int insertSysAccount(SysAccount account) { + return accountMapper.insertSysAccount(account); + } + + @Override + public int updateSysAccount(SysAccount account) { + return accountMapper.updateSysAccount(account); + } + + @Override + public int deleteSysAccount(List ids) { + return accountMapper.deleteSysAccount(ids); + } +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysBalanceLogServiceImpl.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysBalanceLogServiceImpl.java new file mode 100644 index 0000000..eb0a4ef --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysBalanceLogServiceImpl.java @@ -0,0 +1,428 @@ +package com.ruoyi.system.service.impl; + +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.domain.*; +import com.ruoyi.system.mapper.SysAccountMapper; +import com.ruoyi.system.mapper.SysBalanceLogMapper; +import com.ruoyi.system.mapper.SysJkMapper; +import com.ruoyi.system.service.ISysAccountService; +import com.ruoyi.system.service.ISysBalanceLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用户 业务层处理 + * + * @author ruoyi + */ +@Service +public class SysBalanceLogServiceImpl implements ISysBalanceLogService +{ + @Autowired + private SysBalanceLogMapper balanceLogMapper; + @Autowired + private SysAccountMapper accountMapper; + @Autowired + private SysJkMapper jkMapper; + + private SimpleDateFormat sim = new SimpleDateFormat("yyyy月MM日dd"); + private SimpleDateFormat sim2 = new SimpleDateFormat("yyyy-MM-dd"); + + @Override + public List selectSysBalanceLog(SysBalanceLog balanceLog) { + return balanceLogMapper.selectSysBalanceLog(balanceLog); + } + + @Transactional + @Override + public int insertSysBalanceLog(SysBalanceLog balanceLog) { + accountMapper.updateSysAccountMoney(balanceLog); + + if ("1".equals(balanceLog.getType())) { + List notices = new ArrayList<>(); + + SysJk sysJk = new SysJk(); + sysJk.setUserId(balanceLog.getUserId()); + sysJk.setPdFlag(true); + List jks = jkMapper.selectSysJks(sysJk); + jks.forEach(jk -> { + switch (jk.getType()) { + case "0": + if (balanceLog.getPrice().compareTo(jk.getNumber()) > 0){ + notices.add(new SysJk(balanceLog.getUserId(), + jk.getName() + ":" + balanceLog.getPrice().setScale(2,RoundingMode.HALF_EVEN) + + "元于" + sim.format(new Date()), jk.getId())); + } + break; + case "1": + Date currentDate = new Date(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(currentDate); + calendar.add(Calendar.DAY_OF_MONTH, -jk.getJcDay()); + int payCs = balanceLogMapper.selectPayCs(sim2.format(calendar.getTime())) + 1; + if (payCs > Integer.parseInt(jk.getNumber().setScale(0, RoundingMode.HALF_EVEN).toEngineeringString())) { + notices.add(new SysJk(balanceLog.getUserId(), + jk.getName() + ":您在过去" + jk.getJcDay() + + "天内进行了" + payCs + "笔交易", jk.getId())); + } + break; + case "2": + BigDecimal userYe = balanceLogMapper.selectBalancePrice(balanceLog.getUserId()); + if (userYe.compareTo(jk.getNumber()) < 0) { + notices.add(new SysJk(balanceLog.getUserId(), + jk.getName() + ":当前余额为" + userYe.toEngineeringString() + + "元", jk.getId())); + } + break; + } + }); + if (!notices.isEmpty()) { + jkMapper.insertSysJkNotice(notices); + } + } + return balanceLogMapper.insertSysBalanceLog(balanceLog); + } + + @Transactional + @Override + public int updateSysBalanceLog(SysBalanceLog balanceLog) { + accountMapper.updateSysAccountMoney(balanceLog); + if ("1".equals(balanceLog.getType())) { + List notices = new ArrayList<>(); + + SysJk sysJk = new SysJk(); + sysJk.setUserId(balanceLog.getUserId()); + sysJk.setPdFlag(true); + List jks = jkMapper.selectSysJks(sysJk); + jks.forEach(jk -> { + switch (jk.getType()) { + case "0": + if (balanceLog.getPrice().compareTo(jk.getNumber()) > 0){ + notices.add(new SysJk(balanceLog.getUserId(), + jk.getName() + ":" + balanceLog.getPrice().setScale(2,RoundingMode.HALF_EVEN) + + "元于" + sim.format(new Date()), jk.getId())); + } + break; + case "1": + Date currentDate = new Date(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(currentDate); + calendar.add(Calendar.DAY_OF_MONTH, -jk.getJcDay()); + int payCs = balanceLogMapper.selectPayCs(sim2.format(calendar.getTime())) + 1; + if (payCs > Integer.parseInt(jk.getNumber().setScale(0, RoundingMode.HALF_EVEN).toEngineeringString())) { + notices.add(new SysJk(balanceLog.getUserId(), + jk.getName() + ":您在过去" + jk.getJcDay() + + "天内进行了" + payCs + "笔交易", jk.getId())); + } + break; + case "2": + BigDecimal userYe = balanceLogMapper.selectBalancePrice(balanceLog.getUserId()); + if (userYe.compareTo(jk.getNumber()) < 0) { + notices.add(new SysJk(balanceLog.getUserId(), + jk.getName() + ":当前余额为" + userYe.toEngineeringString() + + "元", jk.getId())); + } + break; + } + }); + if (!notices.isEmpty()) { + jkMapper.insertSysJkNotice(notices); + } + } + return balanceLogMapper.updateSysBalanceLog(balanceLog); + } + + @Transactional + @Override + public int deleteSysBalanceLog(List ids) { + List logs = balanceLogMapper.selectBalanceLog(ids); + logs.forEach(log -> { + accountMapper.updateSysAccountMoney(new SysBalanceLog(log.getPrice(), log.getAccountId())); + }); + return balanceLogMapper.deleteSysBalanceLog(ids); + } + + @Override + public SysIndex selectIndexInfo(Long userId) { + BigDecimal accountPrice = new BigDecimal(0); + BigDecimal cx = balanceLogMapper.selectBalancePrice(userId); + if (cx != null) { + accountPrice = cx; + } + List balanceLog = balanceLogMapper.selectSzPrice(userId); + BigDecimal sr = new BigDecimal(0); + BigDecimal zc = new BigDecimal(0); + for (SysBalanceLog b : balanceLog) { + if ("0".equals(b.getType())) { + sr = b.getPrice(); + } else { + zc = b.getPrice(); + } + } + return new SysIndex(accountPrice, sr, zc); + } + + @Override + public SysPayYz selectPayYz(Long userId) { + SysPayYz fhz = new SysPayYz(); + List yzs = balanceLogMapper.selectYz(userId); + Map yzMap = new HashMap<>(); + if (!yzs.isEmpty()) { + yzMap = yzs.stream().collect(Collectors.toMap(SysBalanceLog::getType, SysBalanceLog::getPrice)); + } + List zjs = balanceLogMapper.selectBalanceLogZj(userId); + Map zjMap = new HashMap<>(); + if (!zjs.isEmpty()) { + zjMap = zjs.stream().collect(Collectors.toMap(SysBalanceLog::getType, SysBalanceLog::getPrice)); + } + if (zjMap.containsKey("0") || yzMap.containsKey("0")) { + int i = 0; + if (yzMap.containsKey("0")) { + fhz.setTypeYz0(yzMap.get("0").setScale(2, RoundingMode.HALF_UP)); + fhz.setTypeBfb0(new BigDecimal(0)); + if (fhz.getTypeYz0().compareTo(new BigDecimal(0)) > 0) { + i = 1; + } + } + if (zjMap.containsKey("0")) { + BigDecimal zj = zjMap.get("0"); + fhz.setType0(zj.setScale(2, RoundingMode.HALF_UP)); + if (i == 1) { + fhz.setTypeBfb0(zj.divide(fhz.getTypeYz0(),2, RoundingMode.HALF_UP).multiply(new BigDecimal(100))); + } else { + fhz.setTypeBfb0(new BigDecimal(100)); + } + } + } + if (zjMap.containsKey("1") || yzMap.containsKey("1")) { + int i = 0; + if (yzMap.containsKey("1")) { + fhz.setTypeYz1(yzMap.get("1").setScale(2, RoundingMode.HALF_UP)); + fhz.setTypeBfb1(new BigDecimal(0)); + if (fhz.getTypeYz1().compareTo(new BigDecimal(0)) > 0) { + i = 1; + } + } + if (zjMap.containsKey("1")) { + BigDecimal zj = zjMap.get("1"); + fhz.setType1(zj.setScale(2, RoundingMode.HALF_UP)); + if (i == 1) { + fhz.setTypeBfb1(zj.divide(fhz.getTypeYz1(),2, RoundingMode.HALF_UP).multiply(new BigDecimal(100))); + } else { + fhz.setTypeBfb1(new BigDecimal(100)); + } + } + } + if (zjMap.containsKey("2") || yzMap.containsKey("2")) { + int i = 0; + if (yzMap.containsKey("2")) { + fhz.setTypeYz2(yzMap.get("2").setScale(2, RoundingMode.HALF_UP)); + fhz.setTypeBfb2(new BigDecimal(0)); + if (fhz.getTypeYz2().compareTo(new BigDecimal(0)) > 0) { + i = 1; + } + } + if (zjMap.containsKey("2")) { + BigDecimal zj = zjMap.get("2"); + fhz.setType2(zj.setScale(2, RoundingMode.HALF_UP)); + if (i == 1) { + fhz.setTypeBfb2(zj.divide(fhz.getTypeYz2(), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100))); + } else { + fhz.setTypeBfb2(new BigDecimal(100)); + } + } + } + if (zjMap.containsKey("3") || yzMap.containsKey("3")) { + int i = 0; + if (yzMap.containsKey("3")) { + fhz.setTypeYz3(yzMap.get("3").setScale(2, RoundingMode.HALF_UP)); + fhz.setTypeBfb3(new BigDecimal(0)); + if (fhz.getTypeYz3().compareTo(new BigDecimal(0)) > 0) { + i = 1; + } + } + if (zjMap.containsKey("3")) { + BigDecimal zj = zjMap.get("3"); + fhz.setType3(zj.setScale(2, RoundingMode.HALF_UP)); + if (i == 1) { + fhz.setTypeBfb3(zj.divide(fhz.getTypeYz3(),2, RoundingMode.HALF_UP).multiply(new BigDecimal(100))); + } else { + fhz.setTypeBfb3(new BigDecimal(100)); + } + } + } + if (zjMap.containsKey("4") || yzMap.containsKey("4")) { + int i = 0; + if (yzMap.containsKey("4")) { + fhz.setTypeYz4(yzMap.get("4").setScale(2, RoundingMode.HALF_UP)); + fhz.setTypeBfb4(new BigDecimal(0)); + if (fhz.getTypeYz4().compareTo(new BigDecimal(0)) > 0) { + i = 1; + } + } + if (zjMap.containsKey("4")) { + BigDecimal zj = zjMap.get("4"); + fhz.setType4(zj.setScale(2, RoundingMode.HALF_UP)); + if (i == 1) { + fhz.setTypeBfb4(zj.divide(fhz.getTypeYz4(), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100))); + } else { + fhz.setTypeBfb4(new BigDecimal(100)); + } + } + } + return fhz; + } + + @Transactional + @Override + public int updateYsInfo(SysPayYz payYz) { + balanceLogMapper.deleteYzByUserId(payYz.getUserId()); + List data = new ArrayList<>(); + if (payYz.getTypeYz0() != null) { + data.add(new SysBalanceLog("0", payYz.getTypeYz0(), payYz.getUserId())); + } + if (payYz.getTypeYz1() != null) { + data.add(new SysBalanceLog("1", payYz.getTypeYz1(), payYz.getUserId())); + } + if (payYz.getTypeYz2() != null) { + data.add(new SysBalanceLog("2", payYz.getTypeYz2(), payYz.getUserId())); + } + if (payYz.getTypeYz3() != null) { + data.add(new SysBalanceLog("3", payYz.getTypeYz3(), payYz.getUserId())); + } + if (payYz.getTypeYz4() != null) { + data.add(new SysBalanceLog("4", payYz.getTypeYz4(), payYz.getUserId())); + } + return balanceLogMapper.insertYz(data); + } + + @Override + public String importBalanceLog(List balanceLogs, Long userId) { + if (balanceLogs.isEmpty()) { + return "导入失败,导入数据为空"; + } + if (balanceLogs.get(0) == null) { + return "导入失败,请确定是否使用正确模板"; + } + + Map srTypeMap = new HashMap<>(); + srTypeMap.put("生活费","0"); + srTypeMap.put("奖学金","1"); + srTypeMap.put("助学金","2"); + srTypeMap.put("兼职","3"); + List sysAccounts = accountMapper.selectSysAccounts(new SysAccount(userId)); + Map acountMap = sysAccounts.stream().collect(Collectors.toMap(SysAccount::getName, SysAccount::getId)); + + int i = 0; + int row = 1; + String message = ""; + for (SysBalanceLog balanceLog: balanceLogs) { + balanceLog.setUserId(userId); + balanceLog.setType("0"); + balanceLog.setBgPrice(balanceLog.getPrice()); + if (StringUtils.isEmpty(balanceLog.getDesc())) { + message = "导入失败,第" + row + "行收入来源为空"; + i = 1; + break; + } + if (StringUtils.isEmpty(balanceLog.getSrType())) { + message = "导入失败,第" + row + "行收入类型为空"; + i = 1; + break; + } + if (StringUtils.isEmpty(balanceLog.getAccountStr())) { + message = "导入失败,第" + row + "行收入账户为空"; + i = 1; + break; + } else { + if (sysAccounts.isEmpty()) { + message = "导入失败,系统未录入账户,请先去录入账户"; + i = 1; + break; + } + Long accountId = acountMap.get(balanceLog.getAccountStr()); + if (accountId == null) { + message = "导入失败,第" + row + "行收入账户未有匹配账户请修改再提"; + i = 1; + break; + } + balanceLog.setAccountId(accountId); + } + if (balanceLog.getPrice() == null) { + message = "导入失败,第" + row + "行金额为空"; + i = 1; + break; + } + String srType = srTypeMap.get(balanceLog.getSrType()); + if (StringUtils.isNotEmpty(srType)) { + balanceLog.setSrType(srType); + } else { + message = "导入失败,第" + row + "行收入类型错误"; + i = 1; + break; + } + + row++; + } + if (i == 1) { + return message; + } + balanceLogs.forEach(balanceLog -> { + accountMapper.updateSysAccountMoney(balanceLog); + balanceLogMapper.insertSysBalanceLog(balanceLog); + }); + + return null; + } + + @Override + public List selectSZ(Long userId) { + return balanceLogMapper.selectSZ(userId); + } + + @Override + public List selectSr(Long userId) { + return balanceLogMapper.selectSr(userId); + } + + @Override + public List selectZc(Long userId) { + return balanceLogMapper.selectZc(userId); + } + + @Override + public BigDecimal getYs(Long userId) { + return balanceLogMapper.getYs(userId); + } + + @Transactional + @Override + public void insertYs(Long userId, BigDecimal price) { + balanceLogMapper.delYs(userId); + balanceLogMapper.insertYs(userId, price); + } + + @Override + public String getCurYs(Long userId) { + BigDecimal ys = balanceLogMapper.getYs(userId); + BigDecimal zc = balanceLogMapper.selectMonZc(userId); + if ((ys == null && zc == null) || (ys != null && zc == null)) { + return "0"; + } else if (ys == null && zc != null) { + return "100"; + } + return zc.divide(ys, 2, RoundingMode.HALF_EVEN).multiply(new BigDecimal(100)).toEngineeringString(); + } + + @Override + public List selectSrAndZc(Long userId) { + return balanceLogMapper.selectSrAndZc(userId); + } +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysJkServiceImpl.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysJkServiceImpl.java new file mode 100644 index 0000000..2423871 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysJkServiceImpl.java @@ -0,0 +1,49 @@ +package com.ruoyi.system.service.impl; + +import com.ruoyi.system.domain.SysAccount; +import com.ruoyi.system.domain.SysJk; +import com.ruoyi.system.mapper.SysAccountMapper; +import com.ruoyi.system.mapper.SysJkMapper; +import com.ruoyi.system.service.ISysAccountService; +import com.ruoyi.system.service.ISysJkService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 用户 业务层处理 + * + * @author ruoyi + */ +@Service +public class SysJkServiceImpl implements ISysJkService +{ + @Autowired + private SysJkMapper jkMapper; + + @Override + public List selectSysJkNotice(Long userId) { + return jkMapper.selectSysJkNotices(userId); + } + + @Override + public List selectSysJks(Long userId) { + return jkMapper.selectSysJks(new SysJk(userId)); + } + + @Override + public int insertSysJk(SysJk jk) { + return jkMapper.insertSysJk(jk); + } + + @Override + public int updateSysJk(SysJk jk) { + return jkMapper.updateSysJk(jk); + } + + @Override + public int deleteSysJk(Long id) { + return jkMapper.deleteSysJk(id); + } +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java new file mode 100644 index 0000000..13f5c1a --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java @@ -0,0 +1,66 @@ +package com.ruoyi.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.system.domain.SysLogininfor; +import com.ruoyi.system.mapper.SysLogininforMapper; +import com.ruoyi.system.service.ISysLogininforService; + +/** + * 系统访问日志情况信息 服务层处理 + * + * @author ruoyi + */ +@Service +public class SysLogininforServiceImpl implements ISysLogininforService +{ + + @Autowired + private SysLogininforMapper logininforMapper; + + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + @Override + public void insertLogininfor(SysLogininfor logininfor) + { + logininforMapper.insertLogininfor(logininfor); + } + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + @Override + public List selectLogininforList(SysLogininfor logininfor) + { + return logininforMapper.selectLogininforList(logininfor); + } + + /** + * 批量删除系统登录日志 + * + * @param ids 需要删除的数据 + * @return 结果 + */ + @Override + public int deleteLogininforByIds(String ids) + { + return logininforMapper.deleteLogininforByIds(Convert.toStrArray(ids)); + } + + /** + * 清空系统登录日志 + */ + @Override + public void cleanLogininfor() + { + logininforMapper.cleanLogininfor(); + } +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java new file mode 100644 index 0000000..78ae353 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java @@ -0,0 +1,77 @@ +package com.ruoyi.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.system.domain.SysOperLog; +import com.ruoyi.system.mapper.SysOperLogMapper; +import com.ruoyi.system.service.ISysOperLogService; + +/** + * 操作日志 服务层处理 + * + * @author ruoyi + */ +@Service +public class SysOperLogServiceImpl implements ISysOperLogService +{ + @Autowired + private SysOperLogMapper operLogMapper; + + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + @Override + public void insertOperlog(SysOperLog operLog) + { + operLogMapper.insertOperlog(operLog); + } + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + @Override + public List selectOperLogList(SysOperLog operLog) + { + return operLogMapper.selectOperLogList(operLog); + } + + /** + * 批量删除系统操作日志 + * + * @param ids 需要删除的数据 + * @return + */ + @Override + public int deleteOperLogByIds(String ids) + { + return operLogMapper.deleteOperLogByIds(Convert.toStrArray(ids)); + } + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + @Override + public SysOperLog selectOperLogById(Long operId) + { + return operLogMapper.selectOperLogById(operId); + } + + /** + * 清空操作日志 + */ + @Override + public void cleanOperLog() + { + operLogMapper.cleanOperLog(); + } +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java new file mode 100644 index 0000000..ae6087a --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java @@ -0,0 +1,140 @@ +package com.ruoyi.system.service.impl; + +import java.io.Serializable; +import java.util.Date; +import java.util.Deque; +import java.util.List; +import com.ruoyi.common.utils.spring.SpringUtils; +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.ehcache.EhCacheManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.constant.ShiroConstants; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.domain.SysUserOnline; +import com.ruoyi.system.mapper.SysUserOnlineMapper; +import com.ruoyi.system.service.ISysUserOnlineService; + +/** + * 在线用户 服务层处理 + * + * @author ruoyi + */ +@Service +public class SysUserOnlineServiceImpl implements ISysUserOnlineService +{ + @Autowired + private SysUserOnlineMapper userOnlineDao; + + /** + * 通过会话序号查询信息 + * + * @param sessionId 会话ID + * @return 在线用户信息 + */ + @Override + public SysUserOnline selectOnlineById(String sessionId) + { + return userOnlineDao.selectOnlineById(sessionId); + } + + /** + * 通过会话序号删除信息 + * + * @param sessionId 会话ID + * @return 在线用户信息 + */ + @Override + public void deleteOnlineById(String sessionId) + { + SysUserOnline userOnline = selectOnlineById(sessionId); + if (StringUtils.isNotNull(userOnline)) + { + userOnlineDao.deleteOnlineById(sessionId); + } + } + + /** + * 通过会话序号删除信息 + * + * @param sessions 会话ID集合 + * @return 在线用户信息 + */ + @Override + public void batchDeleteOnline(List sessions) + { + for (String sessionId : sessions) + { + SysUserOnline userOnline = selectOnlineById(sessionId); + if (StringUtils.isNotNull(userOnline)) + { + userOnlineDao.deleteOnlineById(sessionId); + } + } + } + + /** + * 保存会话信息 + * + * @param online 会话信息 + */ + @Override + public void saveOnline(SysUserOnline online) + { + userOnlineDao.saveOnline(online); + } + + /** + * 查询会话集合 + * + * @param userOnline 在线用户 + */ + @Override + public List selectUserOnlineList(SysUserOnline userOnline) + { + return userOnlineDao.selectUserOnlineList(userOnline); + } + + /** + * 强退用户 + * + * @param sessionId 会话ID + */ + @Override + public void forceLogout(String sessionId) + { + userOnlineDao.deleteOnlineById(sessionId); + } + + /** + * 清理用户缓存 + * + * @param loginName 登录名称 + * @param sessionId 会话ID + */ + @Override + public void removeUserCache(String loginName, String sessionId) + { + EhCacheManager ehCacheManager = SpringUtils.getBean(EhCacheManager.class); + Cache> cache = ehCacheManager.getCache(ShiroConstants.SYS_USERCACHE); + Deque deque = cache.get(loginName); + if (StringUtils.isEmpty(deque) || deque.size() == 0) + { + return; + } + deque.remove(sessionId); + } + + /** + * 查询会话集合 + * + * @param expiredDate 失效日期 + */ + @Override + public List selectOnlineByExpired(Date expiredDate) + { + String lastAccessTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, expiredDate); + return userOnlineDao.selectOnlineByExpired(lastAccessTime); + } +} diff --git a/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..5de07e4 --- /dev/null +++ b/src/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -0,0 +1,159 @@ +package com.ruoyi.system.service.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import javax.validation.Validator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.mapper.SysUserMapper; +import com.ruoyi.system.service.ISysUserService; + +/** + * 用户 业务层处理 + * + * @author ruoyi + */ +@Service +public class SysUserServiceImpl implements ISysUserService +{ + private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); + + @Autowired + private SysUserMapper userMapper; + + @Autowired + protected Validator validator; + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + @Override + public SysUser selectUserByLoginName(String userName) + { + return userMapper.selectUserByLoginName(userName); + } + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @Override + public SysUser selectUserById(Long userId) + { + return userMapper.selectUserById(userId); + } + + + /** + * 新增保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional + public int insertUser(SysUser user) + { + // 新增用户信息 + return userMapper.insertUser(user); + } + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean registerUser(SysUser user) + { + return userMapper.insertUser(user) > 0; + } + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional + public int updateUser(SysUser user) + { + return userMapper.updateUser(user); + } + + /** + * 修改用户个人详细信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserInfo(SysUser user) + { + return userMapper.updateUser(user); + } + + /** + * 修改用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int resetUserPwd(SysUser user) + { + return updateUserInfo(user); + } + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean checkLoginNameUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkLoginNameUnique(user.getLoginName()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public boolean checkEmailUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkEmailUnique(user.getEmail()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } +} diff --git a/src/ruoyi-system/src/main/resources/mapper/system/SysAccountMapper.xml b/src/ruoyi-system/src/main/resources/mapper/system/SysAccountMapper.xml new file mode 100644 index 0000000..33a0f04 --- /dev/null +++ b/src/ruoyi-system/src/main/resources/mapper/system/SysAccountMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + select id, name, type, price, update_time, user_id + from sys_account + + + + + + insert into sys_account(name, type, price, update_time, user_id) + values (#{name}, #{type}, #{price}, NOW(), #{userId}) + + + + delete from sys_account where id in + + #{item} + + + + + update sys_account + + name = #{name}, + type = #{type}, + price = #{price}, + update_time = NOW() + + where id = #{id} + + + update sys_account + set + price = price + #{bgPrice}, + update_time = NOW() + where id = #{accountId} + + \ No newline at end of file diff --git a/src/ruoyi-system/src/main/resources/mapper/system/SysBalanceLogMapper.xml b/src/ruoyi-system/src/main/resources/mapper/system/SysBalanceLogMapper.xml new file mode 100644 index 0000000..336f20e --- /dev/null +++ b/src/ruoyi-system/src/main/resources/mapper/system/SysBalanceLogMapper.xml @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + select id, `desc`, type, price, create_date, user_id, account_id, sr_type, zc_type + from sys_balancle_log + + + + + + + + insert into sys_balancle_log(`desc`, type, price, create_date, user_id, account_id, sr_type, zc_type) + values (#{desc}, #{type}, #{price}, NOW(), #{userId}, #{accountId}, #{srType}, #{zcType}) + + + + delete from sys_balancle_log where id in + + #{item} + + + + + update sys_balancle_log + + `desc` = #{desc}, + type = #{type}, + price = #{price}, + user_id = #{userId}, + account_id = #{accountId}, + sr_type = #{srType}, + zc_type = #{zcType}, + create_date = NOW() + + where id = #{id} + + + + + + + + + + + + delete from sys_yz + where user_id = #{userId} + + + + insert into sys_yz (user_id, type, price) + values + + (#{item.userId}, #{item.type}, #{item.price}) + + + + + + + + + + + + + + + + + insert into sys_ys_mon (user_id,date_mon,price) values + (#{userId}, DATE_FORMAT(NOW(), '%Y-%m'), #{price}) + + + + delete from sys_ys_mon + where user_id = #{userId} and date_mon = DATE_FORMAT(NOW(), '%Y-%m') + + + + \ No newline at end of file diff --git a/src/ruoyi-system/src/main/resources/mapper/system/SysJkMapper.xml b/src/ruoyi-system/src/main/resources/mapper/system/SysJkMapper.xml new file mode 100644 index 0000000..7190e6a --- /dev/null +++ b/src/ruoyi-system/src/main/resources/mapper/system/SysJkMapper.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + select id, name, type, number, end_date, user_id, jc_day + from sys_jk + + + + + + + + insert into sys_jk(name, type, number, end_date, user_id, jc_day) + values (#{name}, #{type}, #{number}, #{endDate}, #{userId}, #{jcDay}) + + + + insert into sys_jk_notice(msg, user_id, jk_id) + values + + (#{item.msg}, #{item.userId}, #{item.jkId}) + + + + + delete from sys_jk where id = #{id} + + + + update sys_jk + + name = #{name}, + type = #{type}, + `number` = #{number}, + `end_date` = #{endDate}, + `jc_day` = #{jcDay}, + + where id = #{id} + + \ No newline at end of file diff --git a/src/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml b/src/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml new file mode 100644 index 0000000..ac0afb7 --- /dev/null +++ b/src/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + insert into sys_logininfor (login_name, status, ipaddr, login_location, browser, os, msg, login_time) + values (#{loginName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, sysdate()) + + + + + + delete from sys_logininfor where info_id in + + #{infoId} + + + + + truncate table sys_logininfor + + + \ No newline at end of file diff --git a/src/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml b/src/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml new file mode 100644 index 0000000..388625e --- /dev/null +++ b/src/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time, cost_time + from sys_oper_log + + + + insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, cost_time, oper_time) + values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, #{costTime}, sysdate()) + + + + + + delete from sys_oper_log where oper_id in + + #{operId} + + + + + + + truncate table sys_oper_log + + + \ No newline at end of file diff --git a/src/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/src/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml new file mode 100644 index 0000000..7c1ac64 --- /dev/null +++ b/src/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + select u.user_id, u.login_name, u.email,u.password, u.salt, u.login_ip, u.login_date, u.create_by, u.create_time, u.update_by, u.update_time + from sys_user u + + + + + + + + + + + + update sys_user + + login_name = #{loginName}, + email = #{email}, + password = #{password}, + salt = #{salt}, + login_ip = #{loginIp}, + login_date = #{loginDate}, + update_by = #{updateBy}, + update_time = sysdate() + + where user_id = #{userId} + + + + insert into sys_user( + user_id, + login_name, + email, + password, + salt, + pwd_update_date, + create_by, + create_time + )values( + #{userId}, + #{loginName}, + #{email}, + #{password}, + #{salt}, + #{pwdUpdateDate}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/src/ruoyi-system/src/main/resources/mapper/system/SysUserOnlineMapper.xml b/src/ruoyi-system/src/main/resources/mapper/system/SysUserOnlineMapper.xml new file mode 100644 index 0000000..ff85fd8 --- /dev/null +++ b/src/ruoyi-system/src/main/resources/mapper/system/SysUserOnlineMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + select sessionId, login_name, dept_name, ipaddr, login_location, browser, os, status, start_timestamp, last_access_time, expire_time + from sys_user_online + + + + + + replace into sys_user_online(sessionId, login_name, dept_name, ipaddr, login_location, browser, os, status, start_timestamp, last_access_time, expire_time) + values (#{sessionId}, #{loginName}, #{deptName}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{status}, #{startTimestamp}, #{lastAccessTime}, #{expireTime}) + + + + delete from sys_user_online where sessionId = #{sessionId} + + + + + + + \ No newline at end of file diff --git a/src/ry.bat b/src/ry.bat new file mode 100644 index 0000000..ac1e437 --- /dev/null +++ b/src/ry.bat @@ -0,0 +1,67 @@ +@echo off + +rem jarƽĿ¼ +set AppName=ruoyi-admin.jar + +rem JVM +set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" + + +ECHO. + ECHO. [1] %AppName% + ECHO. [2] ر%AppName% + ECHO. [3] %AppName% + ECHO. [4] ״̬ %AppName% + ECHO. [5] +ECHO. + +ECHO.ѡĿ: +set /p ID= + IF "%id%"=="1" GOTO start + IF "%id%"=="2" GOTO stop + IF "%id%"=="3" GOTO restart + IF "%id%"=="4" GOTO status + IF "%id%"=="5" EXIT +PAUSE +:start + for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b + ) + if defined pid ( + echo %%is running + PAUSE + ) + +start javaw %JVM_OPTS% -jar %AppName% + +echo starting +echo Start %AppName% success... +goto:eof + +rem stopͨjpspid +:stop + for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b + ) + if not defined pid (echo process %AppName% does not exists) else ( + echo prepare to kill %image_name% + echo start kill %pid% ... + rem ݽIDkill + taskkill /f /pid %pid% + ) +goto:eof +:restart + call :stop + call :start +goto:eof +:status + for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b + ) + if not defined pid (echo process %AppName% is dead ) else ( + echo %image_name% is running + ) +goto:eof diff --git a/src/ry.sh b/src/ry.sh new file mode 100644 index 0000000..d6a9cf3 --- /dev/null +++ b/src/ry.sh @@ -0,0 +1,86 @@ +#!/bin/sh +# ./ry.sh start 启动 stop 停止 restart 重启 status 状态 +AppName=ruoyi-admin.jar + +# JVM参数 +JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" +APP_HOME=`pwd` +LOG_PATH=$APP_HOME/logs/$AppName.log + +if [ "$1" = "" ]; +then + echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m" + exit 1 +fi + +if [ "$AppName" = "" ]; +then + echo -e "\033[0;31m 未输入应用名 \033[0m" + exit 1 +fi + +function start() +{ + PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'` + + if [ x"$PID" != x"" ]; then + echo "$AppName is running..." + else + nohup java $JVM_OPTS -jar $AppName > /dev/null 2>&1 & + echo "Start $AppName success..." + fi +} + +function stop() +{ + echo "Stop $AppName" + + PID="" + query(){ + PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'` + } + + query + if [ x"$PID" != x"" ]; then + kill -TERM $PID + echo "$AppName (pid:$PID) exiting..." + while [ x"$PID" != x"" ] + do + sleep 1 + query + done + echo "$AppName exited." + else + echo "$AppName already stopped." + fi +} + +function restart() +{ + stop + sleep 2 + start +} + +function status() +{ + PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l` + if [ $PID != 0 ];then + echo "$AppName is running..." + else + echo "$AppName is not running..." + fi +} + +case $1 in + start) + start;; + stop) + stop;; + restart) + restart;; + status) + status;; + *) + +esac diff --git a/src/sql/cwbs.sql b/src/sql/cwbs.sql new file mode 100644 index 0000000..d1f0883 --- /dev/null +++ b/src/sql/cwbs.sql @@ -0,0 +1,349 @@ +/* + Navicat Premium Data Transfer + + Source Server : 阿里云 + Source Server Type : MySQL + Source Server Version : 50743 + Source Host : rm-m5e3u8r97i93wh3r5lo.mysql.rds.aliyuncs.com:3306 + Source Schema : cwbs + + Target Server Type : MySQL + Target Server Version : 50743 + File Encoding : 65001 + + Date: 01/11/2024 23:12:05 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for sys_account +-- ---------------------------- +DROP TABLE IF EXISTS `sys_account`; +CREATE TABLE `sys_account` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '账户名称', + `type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '账户类型0储蓄账户1支付账户2信用账户', + `price` decimal(10, 2) NULL DEFAULT NULL COMMENT '账户余额', + `update_time` date NULL DEFAULT NULL COMMENT '更新日期', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户账户表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_account +-- ---------------------------- +INSERT INTO `sys_account` VALUES (1, '招商银行储蓄卡', '0', 12620.50, '2024-11-01', 1); + +-- ---------------------------- +-- Table structure for sys_balancle_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_balancle_log`; +CREATE TABLE `sys_balancle_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `desc` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', + `type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型0收入1支出', + `price` decimal(10, 2) NULL DEFAULT NULL COMMENT '交易金额', + `create_date` date NULL DEFAULT NULL COMMENT '产生日期', + `zc_type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '支出类型0购物1学习2娱乐3通讯4日常支出', + `sr_type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收入类型0生活费1奖学金', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id', + `account_id` int(11) NULL DEFAULT NULL COMMENT '账户id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '支出收入记录表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_balancle_log +-- ---------------------------- +INSERT INTO `sys_balancle_log` VALUES (1, '购物支出', '1', 6000.00, '2024-11-01', '0', NULL, 1, 1); +INSERT INTO `sys_balancle_log` VALUES (3, '日常支出', '1', 155.05, '2024-09-27', '4', NULL, 1, NULL); +INSERT INTO `sys_balancle_log` VALUES (4, '超市购物', '1', 900.00, '2024-10-31', '0', NULL, 1, 1); +INSERT INTO `sys_balancle_log` VALUES (5, '学习', '1', 600.00, '2024-10-31', '1', NULL, 1, 1); +INSERT INTO `sys_balancle_log` VALUES (6, '兼职收入', '0', 2000.00, '2024-11-01', NULL, '3', 1, 1); +INSERT INTO `sys_balancle_log` VALUES (7, '话费支出', '0', 500.00, '2024-11-01', NULL, '1', 1, 1); +INSERT INTO `sys_balancle_log` VALUES (8, '生活费收入', '0', 9120.00, '2024-11-01', NULL, '0', 1, 1); + +-- ---------------------------- +-- Table structure for sys_jk +-- ---------------------------- +DROP TABLE IF EXISTS `sys_jk`; +CREATE TABLE `sys_jk` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '目标描述', + `type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型0消费金额1消费次数2阈值监控', + `number` decimal(10, 2) NULL DEFAULT NULL COMMENT '阈值金额/数量', + `end_date` date NULL DEFAULT NULL COMMENT '截至日期', + `user_id` bigint(20) NULL DEFAULT NULL, + `jc_day` int(5) NULL DEFAULT NULL COMMENT '监测天数', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户监控表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_jk +-- ---------------------------- +INSERT INTO `sys_jk` VALUES (2, '消费费用监测', '0', 500.00, '2024-12-31', 1, NULL); + +-- ---------------------------- +-- Table structure for sys_jk_notice +-- ---------------------------- +DROP TABLE IF EXISTS `sys_jk_notice`; +CREATE TABLE `sys_jk_notice` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` bigint(20) NULL DEFAULT NULL, + `msg` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '通知信息', + `jk_id` int(11) NULL DEFAULT NULL COMMENT '监控id', + `balance_id` int(11) NULL DEFAULT NULL COMMENT '交易记录id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户监控通知表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_jk_notice +-- ---------------------------- +INSERT INTO `sys_jk_notice` VALUES (1, 1, '消费费用监测:600.00元于2024月10日31', 2, NULL); +INSERT INTO `sys_jk_notice` VALUES (2, 1, '消费费用监测:900.00元于2024月10日31', 2, NULL); + +-- ---------------------------- +-- Table structure for sys_logininfor +-- ---------------------------- +DROP TABLE IF EXISTS `sys_logininfor`; +CREATE TABLE `sys_logininfor` ( + `info_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '访问ID', + `login_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '登录账号', + `ipaddr` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '登录IP地址', + `login_location` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '登录地点', + `browser` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '浏览器类型', + `os` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '操作系统', + `status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '登录状态(0成功 1失败)', + `msg` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '提示消息', + `login_time` datetime NULL DEFAULT NULL COMMENT '访问时间', + PRIMARY KEY (`info_id`) USING BTREE, + INDEX `idx_sys_logininfor_s`(`status`) USING BTREE, + INDEX `idx_sys_logininfor_lt`(`login_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 169 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统访问记录' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_logininfor +-- ---------------------------- +INSERT INTO `sys_logininfor` VALUES (100, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-28 15:28:24'); +INSERT INTO `sys_logininfor` VALUES (101, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '1', '密码输入错误1次', '2024-10-28 20:34:49'); +INSERT INTO `sys_logininfor` VALUES (102, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-28 20:35:22'); +INSERT INTO `sys_logininfor` VALUES (103, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-28 20:38:47'); +INSERT INTO `sys_logininfor` VALUES (104, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-28 20:39:45'); +INSERT INTO `sys_logininfor` VALUES (105, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-28 21:42:53'); +INSERT INTO `sys_logininfor` VALUES (106, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-28 21:51:41'); +INSERT INTO `sys_logininfor` VALUES (107, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-28 22:01:49'); +INSERT INTO `sys_logininfor` VALUES (108, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-28 22:50:48'); +INSERT INTO `sys_logininfor` VALUES (109, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-28 22:55:08'); +INSERT INTO `sys_logininfor` VALUES (110, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-29 15:02:14'); +INSERT INTO `sys_logininfor` VALUES (111, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-29 15:03:19'); +INSERT INTO `sys_logininfor` VALUES (112, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-29 15:09:04'); +INSERT INTO `sys_logininfor` VALUES (113, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-29 15:22:05'); +INSERT INTO `sys_logininfor` VALUES (114, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-29 15:32:42'); +INSERT INTO `sys_logininfor` VALUES (115, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-29 15:40:42'); +INSERT INTO `sys_logininfor` VALUES (116, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-29 18:56:48'); +INSERT INTO `sys_logininfor` VALUES (117, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-29 19:11:47'); +INSERT INTO `sys_logininfor` VALUES (118, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-30 08:58:00'); +INSERT INTO `sys_logininfor` VALUES (119, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 10:29:22'); +INSERT INTO `sys_logininfor` VALUES (120, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 14:08:41'); +INSERT INTO `sys_logininfor` VALUES (121, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 14:08:44'); +INSERT INTO `sys_logininfor` VALUES (122, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 14:28:00'); +INSERT INTO `sys_logininfor` VALUES (123, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 15:59:04'); +INSERT INTO `sys_logininfor` VALUES (124, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 16:06:44'); +INSERT INTO `sys_logininfor` VALUES (125, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 16:07:40'); +INSERT INTO `sys_logininfor` VALUES (126, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 16:24:02'); +INSERT INTO `sys_logininfor` VALUES (127, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 16:26:45'); +INSERT INTO `sys_logininfor` VALUES (128, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 16:30:37'); +INSERT INTO `sys_logininfor` VALUES (129, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 16:34:04'); +INSERT INTO `sys_logininfor` VALUES (130, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 16:36:03'); +INSERT INTO `sys_logininfor` VALUES (131, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 16:41:45'); +INSERT INTO `sys_logininfor` VALUES (132, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 17:08:53'); +INSERT INTO `sys_logininfor` VALUES (133, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 17:16:12'); +INSERT INTO `sys_logininfor` VALUES (134, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 17:18:17'); +INSERT INTO `sys_logininfor` VALUES (135, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 17:31:59'); +INSERT INTO `sys_logininfor` VALUES (136, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 17:42:02'); +INSERT INTO `sys_logininfor` VALUES (137, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-10-31 17:56:12'); +INSERT INTO `sys_logininfor` VALUES (138, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 08:58:27'); +INSERT INTO `sys_logininfor` VALUES (139, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 10:18:43'); +INSERT INTO `sys_logininfor` VALUES (140, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 11:03:26'); +INSERT INTO `sys_logininfor` VALUES (141, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 11:04:32'); +INSERT INTO `sys_logininfor` VALUES (142, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 11:26:02'); +INSERT INTO `sys_logininfor` VALUES (143, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 14:15:41'); +INSERT INTO `sys_logininfor` VALUES (144, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 14:20:54'); +INSERT INTO `sys_logininfor` VALUES (145, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 17:18:06'); +INSERT INTO `sys_logininfor` VALUES (146, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 17:19:22'); +INSERT INTO `sys_logininfor` VALUES (147, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 17:21:25'); +INSERT INTO `sys_logininfor` VALUES (148, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 17:22:39'); +INSERT INTO `sys_logininfor` VALUES (149, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 18:27:21'); +INSERT INTO `sys_logininfor` VALUES (150, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 18:45:02'); +INSERT INTO `sys_logininfor` VALUES (151, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 18:49:25'); +INSERT INTO `sys_logininfor` VALUES (152, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 18:52:38'); +INSERT INTO `sys_logininfor` VALUES (153, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 20:28:10'); +INSERT INTO `sys_logininfor` VALUES (154, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 20:40:26'); +INSERT INTO `sys_logininfor` VALUES (155, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 20:49:42'); +INSERT INTO `sys_logininfor` VALUES (156, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 20:52:52'); +INSERT INTO `sys_logininfor` VALUES (157, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 20:58:28'); +INSERT INTO `sys_logininfor` VALUES (158, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 20:59:57'); +INSERT INTO `sys_logininfor` VALUES (159, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 22:35:19'); +INSERT INTO `sys_logininfor` VALUES (160, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 22:35:58'); +INSERT INTO `sys_logininfor` VALUES (161, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 22:37:33'); +INSERT INTO `sys_logininfor` VALUES (162, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 22:38:59'); +INSERT INTO `sys_logininfor` VALUES (163, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 22:41:22'); +INSERT INTO `sys_logininfor` VALUES (164, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 22:42:35'); +INSERT INTO `sys_logininfor` VALUES (165, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 22:44:08'); +INSERT INTO `sys_logininfor` VALUES (166, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 23:01:37'); +INSERT INTO `sys_logininfor` VALUES (167, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 23:05:46'); +INSERT INTO `sys_logininfor` VALUES (168, 'admin', '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', '0', '登录成功', '2024-11-01 23:08:34'); + +-- ---------------------------- +-- Table structure for sys_mouth +-- ---------------------------- +DROP TABLE IF EXISTS `sys_mouth`; +CREATE TABLE `sys_mouth` ( + `id` int(11) NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_mouth +-- ---------------------------- +INSERT INTO `sys_mouth` VALUES (1); +INSERT INTO `sys_mouth` VALUES (2); +INSERT INTO `sys_mouth` VALUES (3); +INSERT INTO `sys_mouth` VALUES (4); +INSERT INTO `sys_mouth` VALUES (5); +INSERT INTO `sys_mouth` VALUES (6); +INSERT INTO `sys_mouth` VALUES (7); +INSERT INTO `sys_mouth` VALUES (8); +INSERT INTO `sys_mouth` VALUES (9); +INSERT INTO `sys_mouth` VALUES (10); +INSERT INTO `sys_mouth` VALUES (11); +INSERT INTO `sys_mouth` VALUES (12); + +-- ---------------------------- +-- Table structure for sys_oper_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_oper_log`; +CREATE TABLE `sys_oper_log` ( + `oper_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志主键', + `title` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '模块标题', + `business_type` int(2) NULL DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)', + `method` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '方法名称', + `request_method` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '请求方式', + `operator_type` int(1) NULL DEFAULT 0 COMMENT '操作类别(0其它 1后台用户 2手机端用户)', + `oper_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '操作人员', + `dept_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '部门名称', + `oper_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '请求URL', + `oper_ip` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '主机地址', + `oper_location` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '操作地点', + `oper_param` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '请求参数', + `json_result` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '返回参数', + `status` int(1) NULL DEFAULT 0 COMMENT '操作状态(0正常 1异常)', + `error_msg` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '错误消息', + `oper_time` datetime NULL DEFAULT NULL COMMENT '操作时间', + `cost_time` bigint(20) NULL DEFAULT 0 COMMENT '消耗时间', + PRIMARY KEY (`oper_id`) USING BTREE, + INDEX `idx_sys_oper_log_bt`(`business_type`) USING BTREE, + INDEX `idx_sys_oper_log_s`(`status`) USING BTREE, + INDEX `idx_sys_oper_log_ot`(`oper_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志记录' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_oper_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `login_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录账号', + `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '用户邮箱', + `password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '密码', + `salt` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '盐加密', + `login_ip` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '最后登录IP', + `login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间', + `pwd_update_date` datetime NULL DEFAULT NULL COMMENT '密码最后更新时间', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`user_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO `sys_user` VALUES (1, 'admin', 'ry@163.com', '29c67a30398638269fe600f73a054934', '111111', '127.0.0.1', '2024-11-01 23:08:34', NULL, 'admin', '2024-10-28 09:19:16', '', '2024-11-01 23:08:33'); +INSERT INTO `sys_user` VALUES (2, 'ry', 'ry@qq.com', '8e6d98b90472783cc73c17047ddccf36', '222222', '127.0.0.1', NULL, NULL, 'admin', '2024-10-28 09:19:16', '', NULL); + +-- ---------------------------- +-- Table structure for sys_user_online +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_online`; +CREATE TABLE `sys_user_online` ( + `sessionId` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户会话id', + `login_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '登录账号', + `dept_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '部门名称', + `ipaddr` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '登录IP地址', + `login_location` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '登录地点', + `browser` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '浏览器类型', + `os` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '操作系统', + `status` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '在线状态on_line在线off_line离线', + `start_timestamp` datetime NULL DEFAULT NULL COMMENT 'session创建时间', + `last_access_time` datetime NULL DEFAULT NULL COMMENT 'session最后访问时间', + `expire_time` int(5) NULL DEFAULT 0 COMMENT '超时时间,单位为分钟', + PRIMARY KEY (`sessionId`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '在线用户记录' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user_online +-- ---------------------------- +INSERT INTO `sys_user_online` VALUES ('2f40a7ec-e2fd-4ed1-b6a5-895455f2ce7e', 'admin', NULL, '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', 'on_line', '2024-11-01 22:44:07', '2024-11-01 22:44:09', 1800000); +INSERT INTO `sys_user_online` VALUES ('7b9c9621-03bc-4016-b930-f80e1fc29190', 'admin', NULL, '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', 'on_line', '2024-11-01 22:38:58', '2024-11-01 22:39:00', 1800000); +INSERT INTO `sys_user_online` VALUES ('a43d92fe-813b-4324-b255-5b08597050c6', 'admin', NULL, '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', 'on_line', '2024-11-01 23:08:32', '2024-11-01 23:08:34', 1800000); +INSERT INTO `sys_user_online` VALUES ('aa68e566-3d80-4ccd-8e61-d0f210343c59', 'admin', NULL, '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', 'on_line', '2024-11-01 23:05:45', '2024-11-01 23:05:47', 1800000); +INSERT INTO `sys_user_online` VALUES ('acc1f5c1-ce53-4eec-8c14-0a1e938a064f', 'admin', NULL, '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', 'on_line', '2024-11-01 22:42:34', '2024-11-01 22:42:36', 1800000); +INSERT INTO `sys_user_online` VALUES ('b9baaab9-e718-431b-a90c-dba00665f22f', 'admin', NULL, '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', 'on_line', '2024-11-01 22:41:20', '2024-11-01 22:41:22', 1800000); +INSERT INTO `sys_user_online` VALUES ('bcf648dd-e366-40a0-9dd6-8156a9a3bd96', 'admin', NULL, '127.0.0.1', '内网IP', 'Firefox 13', 'Windows 10', 'on_line', '2024-11-01 23:01:38', '2024-11-01 23:03:58', 1800000); + +-- ---------------------------- +-- Table structure for sys_ys_mon +-- ---------------------------- +DROP TABLE IF EXISTS `sys_ys_mon`; +CREATE TABLE `sys_ys_mon` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` bigint(20) NULL DEFAULT NULL, + `date_mon` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '时间yyyy-MM', + `price` decimal(10, 2) NULL DEFAULT NULL COMMENT '预算', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户月度预算表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_ys_mon +-- ---------------------------- +INSERT INTO `sys_ys_mon` VALUES (1, 1, '2024-11', 3000.00); + +-- ---------------------------- +-- Table structure for sys_yz +-- ---------------------------- +DROP TABLE IF EXISTS `sys_yz`; +CREATE TABLE `sys_yz` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` bigint(20) NULL DEFAULT NULL, + `type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '支出类型0购物1学习2娱乐3通讯4日常支出', + `price` decimal(10, 2) NULL DEFAULT NULL COMMENT '阈值金额', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户阈值表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_yz +-- ---------------------------- +INSERT INTO `sys_yz` VALUES (12, 1, '0', 500.00); +INSERT INTO `sys_yz` VALUES (13, 1, '1', 2000.00); +INSERT INTO `sys_yz` VALUES (14, 1, '2', 0.00); +INSERT INTO `sys_yz` VALUES (15, 1, '3', 0.00); +INSERT INTO `sys_yz` VALUES (16, 1, '4', 0.00); + +SET FOREIGN_KEY_CHECKS = 1;