From 375cbd6c2641b31919fc5bf9cd2bd38bfb84a3ea Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Tue, 13 Sep 2022 16:23:42 +0800 Subject: [PATCH] Merge appactive module into main branch of 2.2.x. (#2758) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feature: initial appactive module * feature:appactive core logic * feature:add appactive relevant examples * fix: add appactive module in pom.xml * fix: Reformat code * feature: add AppactivePredicate * refactor: delete duplicate codes and reformat them * feature: using PredicateBasedRule default filter logic * feature: deleted useless filed in AppactiveRule * refactor: polish the code * feat(appactive):doc init * refactor: add rules and polish codes * refactor: modified package name * refactor: delete useless files * feature: add readme-zh.md * refactor: polish readme docs * fix: fix appactive docs error * refactor: polish code and docs * refactor: adjust service type name * refactor: delete useless files Co-authored-by: 就砺 --- pom.xml | 2 +- spring-cloud-alibaba-dependencies/pom.xml | 6 + .../src/main/asciidoc-zh/appactive.adoc | 332 ++++++++++++++++++ .../src/main/asciidoc/appactive.adoc | 330 +++++++++++++++++ .../appactive-example/baseline.sh | 88 +++++ .../appactive-example/common/pom.xml | 62 ++++ .../cloud/example/common/Constants.java | 34 ++ .../alibaba/cloud/example/common/RPCType.java | 30 ++ .../cloud/example/common/entity/Product.java | 108 ++++++ .../example/common/entity/ResultHolder.java | 103 ++++++ .../example/common/filter/ChainAspect.java | 55 +++ .../example/common/service/OrderDAO.java | 47 +++ .../example/common/service/ProductDAO.java | 98 ++++++ .../common/service/ProductServiceNormal.java | 28 ++ .../common/service/ProductServiceUnit.java | 26 ++ .../service/ProductServiceUnitHidden.java | 26 ++ .../component-quickstart.yml | 27 ++ .../appactive-example/cut.sh | 86 +++++ .../appactive-example/frontend/Dockerfile | 19 + .../appactive-example/frontend/pom.xml | 60 ++++ .../example/frontend/FrontendApplication.java | 36 ++ .../frontend/controller/FrontController.java | 172 +++++++++ .../example/frontend/filter/ChainFilter.java | 49 +++ .../src/main/resources/application.properties | 18 + .../resources/static/css/bootstrap.min.css | 7 + .../main/resources/static/img/backpack.png | Bin 0 -> 6446 bytes .../main/resources/static/img/badminton.png | Bin 0 -> 17456 bytes .../src/main/resources/static/img/cup.png | Bin 0 -> 12210 bytes .../main/resources/static/img/frontend.png | Bin 0 -> 20709 bytes .../src/main/resources/static/img/gateway.png | Bin 0 -> 25965 bytes .../main/resources/static/img/keyboard.png | Bin 0 -> 3620 bytes .../src/main/resources/static/img/product.png | Bin 0 -> 19353 bytes .../src/main/resources/static/img/storage.png | Bin 0 -> 21007 bytes .../main/resources/static/js/bootstrap.min.js | 7 + .../static/js/jquery-3.2.1.slim.min.js | 4 + .../main/resources/static/js/popper.min.js | 5 + .../src/main/resources/templates/buy.html | 69 ++++ .../src/main/resources/templates/detail.html | 41 +++ .../src/main/resources/templates/header.html | 258 ++++++++++++++ .../src/main/resources/templates/index.html | 39 ++ .../appactive-example/product/Dockerfile | 18 + .../appactive-example/product/pom.xml | 59 ++++ .../example/product/ProductApplication.java | 128 +++++++ .../cloud/example/product/init/InitData.java | 96 +++++ .../product/repository/ProductRepository.java | 25 ++ .../service/ProductServiceNormalImpl.java | 44 +++ .../service/ProductServiceUnitHiddenImpl.java | 49 +++ .../service/ProductServiceUnitImpl.java | 47 +++ .../src/main/resources/application.properties | 20 ++ .../resources/static/css/bootstrap.min.css | 7 + .../main/resources/static/img/frontend.png | Bin 0 -> 20709 bytes .../src/main/resources/static/img/gateway.png | Bin 0 -> 25965 bytes .../src/main/resources/static/img/product.png | Bin 0 -> 19353 bytes .../src/main/resources/static/img/storage.png | Bin 0 -> 21007 bytes .../main/resources/static/js/bootstrap.min.js | 7 + .../static/js/jquery-3.2.1.slim.min.js | 4 + .../main/resources/static/js/popper.min.js | 5 + .../src/main/resources/templates/buy.html | 27 ++ .../src/main/resources/templates/detail.html | 27 ++ .../src/main/resources/templates/header.html | 195 ++++++++++ .../src/main/resources/templates/index.html | 27 ++ .../appactive-example/readme-zh.md | 217 ++++++++++++ .../appactive-example/readme.md | 216 ++++++++++++ .../appactive-example/rule/dbProperty.json | 1 + .../appactive-example/rule/forbiddenRule.json | 15 + .../rule/forbiddenRuleEmpty.json | 4 + .../appactive-example/rule/idSource.json | 4 + .../appactive-example/rule/idTransformer.json | 7 + .../appactive-example/rule/idUnitMapping.json | 25 ++ .../rule/idUnitMappingNext.json | 25 ++ .../rule/transformerBetween.json | 4 + .../appactive-example/storage/Dockerfile | 18 + .../appactive-example/storage/pom.xml | 45 +++ .../example/storage/StorageApplication.java | 86 +++++ .../storage/repository/ProductRepository.java | 25 ++ .../storage/service/OrderServiceImpl.java | 77 ++++ .../src/main/resources/application.properties | 16 + .../nacos-discovery-consumer-example/pom.xml | 110 +++--- .../src/main/resources/application.properties | 8 +- spring-cloud-alibaba-examples/pom.xml | 4 + spring-cloud-alibaba-starters/pom.xml | 1 + .../.gitignore | 33 ++ .../pom.xml | 98 ++++++ .../cloud/appactive/AppactiveProperties.java | 94 +++++ .../cloud/appactive/common/ServiceMeta.java | 64 ++++ .../appactive/common/ServiceMetaObject.java | 74 ++++ .../cloud/appactive/common/UriContext.java | 42 +++ .../config/FilterAutoConfiguration.java | 76 ++++ .../FilterPropertiesAutoConfiguration.java | 37 ++ .../cloud/appactive/constant/Constants.java | 33 ++ .../consumer/AppactivePredicate.java | 124 +++++++ .../appactive/consumer/AppactiveRule.java | 49 +++ .../consumer/ConsumerAutoConfig.java | 95 +++++ .../consumer/FeignDecoderPostProcessor.java | 78 ++++ .../appactive/consumer/ReqResInterceptor.java | 56 +++ .../consumer/ResponseInterceptor.java | 55 +++ ...outerIdTransmissionRequestInterceptor.java | 53 +++ .../cloud/appactive/consumer/ServerMeta.java | 31 ++ .../appactive/provider/CoreServiceFilter.java | 100 ++++++ .../provider/GeneralServiceFilter.java | 51 +++ .../provider/GlobalServiceFilter.java | 75 ++++ .../appactive/provider/NacosAutoConfig.java | 47 +++ .../cloud/appactive/provider/Register.java | 50 +++ .../cloud/appactive/provider/URIRegister.java | 117 ++++++ .../main/resources/META-INF/spring.factories | 5 + 105 files changed, 5443 insertions(+), 59 deletions(-) create mode 100644 spring-cloud-alibaba-docs/src/main/asciidoc-zh/appactive.adoc create mode 100644 spring-cloud-alibaba-docs/src/main/asciidoc/appactive.adoc create mode 100755 spring-cloud-alibaba-examples/appactive-example/baseline.sh create mode 100644 spring-cloud-alibaba-examples/appactive-example/common/pom.xml create mode 100644 spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/Constants.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/RPCType.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/entity/Product.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/entity/ResultHolder.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/filter/ChainAspect.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/OrderDAO.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductDAO.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductServiceNormal.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductServiceUnit.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductServiceUnitHidden.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/component-quickstart.yml create mode 100755 spring-cloud-alibaba-examples/appactive-example/cut.sh create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/Dockerfile create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/pom.xml create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/java/com/alibaba/cloud/example/frontend/FrontendApplication.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/java/com/alibaba/cloud/example/frontend/controller/FrontController.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/java/com/alibaba/cloud/example/frontend/filter/ChainFilter.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/application.properties create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/css/bootstrap.min.css create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/backpack.png create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/badminton.png create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/cup.png create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/frontend.png create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/gateway.png create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/keyboard.png create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/product.png create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/storage.png create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/js/bootstrap.min.js create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/js/jquery-3.2.1.slim.min.js create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/js/popper.min.js create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/buy.html create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/detail.html create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/header.html create mode 100644 spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/index.html create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/Dockerfile create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/pom.xml create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/ProductApplication.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/init/InitData.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/repository/ProductRepository.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/service/ProductServiceNormalImpl.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/service/ProductServiceUnitHiddenImpl.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/service/ProductServiceUnitImpl.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/application.properties create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/css/bootstrap.min.css create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/img/frontend.png create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/img/gateway.png create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/img/product.png create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/img/storage.png create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/js/bootstrap.min.js create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/js/jquery-3.2.1.slim.min.js create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/js/popper.min.js create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/buy.html create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/detail.html create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/header.html create mode 100644 spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/index.html create mode 100644 spring-cloud-alibaba-examples/appactive-example/readme-zh.md create mode 100644 spring-cloud-alibaba-examples/appactive-example/readme.md create mode 100644 spring-cloud-alibaba-examples/appactive-example/rule/dbProperty.json create mode 100644 spring-cloud-alibaba-examples/appactive-example/rule/forbiddenRule.json create mode 100644 spring-cloud-alibaba-examples/appactive-example/rule/forbiddenRuleEmpty.json create mode 100644 spring-cloud-alibaba-examples/appactive-example/rule/idSource.json create mode 100644 spring-cloud-alibaba-examples/appactive-example/rule/idTransformer.json create mode 100644 spring-cloud-alibaba-examples/appactive-example/rule/idUnitMapping.json create mode 100644 spring-cloud-alibaba-examples/appactive-example/rule/idUnitMappingNext.json create mode 100644 spring-cloud-alibaba-examples/appactive-example/rule/transformerBetween.json create mode 100644 spring-cloud-alibaba-examples/appactive-example/storage/Dockerfile create mode 100644 spring-cloud-alibaba-examples/appactive-example/storage/pom.xml create mode 100644 spring-cloud-alibaba-examples/appactive-example/storage/src/main/java/com/alibaba/cloud/example/storage/StorageApplication.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/storage/src/main/java/com/alibaba/cloud/example/storage/repository/ProductRepository.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/storage/src/main/java/com/alibaba/cloud/example/storage/service/OrderServiceImpl.java create mode 100644 spring-cloud-alibaba-examples/appactive-example/storage/src/main/resources/application.properties create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/.gitignore create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/pom.xml create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/AppactiveProperties.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/common/ServiceMeta.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/common/ServiceMetaObject.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/common/UriContext.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/config/FilterAutoConfiguration.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/config/FilterPropertiesAutoConfiguration.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/constant/Constants.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/AppactivePredicate.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/AppactiveRule.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ConsumerAutoConfig.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/FeignDecoderPostProcessor.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ReqResInterceptor.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ResponseInterceptor.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/RouterIdTransmissionRequestInterceptor.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ServerMeta.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/CoreServiceFilter.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/GeneralServiceFilter.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/GlobalServiceFilter.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/NacosAutoConfig.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/Register.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/URIRegister.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/resources/META-INF/spring.factories diff --git a/pom.xml b/pom.xml index ed93b5e6b..ddea01c3c 100644 --- a/pom.xml +++ b/pom.xml @@ -200,7 +200,7 @@ - ${maven.multiModuleProjectDirectory}/eclipse/checkstyle-suppressions.xml + ${session.executionRootDirectory}/eclipse/checkstyle-suppressions.xml true true diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 657559560..d0e305854 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -226,6 +226,12 @@ ${revision} + + com.alibaba.cloud + spring-cloud-starter-alibaba-appactive + ${revision} + + com.alibaba.cloud spring-cloud-alibaba-commons diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/appactive.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/appactive.adoc new file mode 100644 index 000000000..ffa98ce67 --- /dev/null +++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/appactive.adoc @@ -0,0 +1,332 @@ +== Spring Cloud Alibaba AppActive + +=== AppActive介绍 +AppActive,是一个面向业务应用构建云原生高可用多活容灾架构的开源中间件。它提供了应用多活容灾架构的标准、实现和 Demo,适用于丰富的业务场景(单 AZ、单 Region、单云、多 AZ、多 Region、多云、自建 IDC等)。 + +AppActive 建立在 阿里巴巴 使用 AHAS-MSHA 系统大规模运行生产应用系统的8年经验之上,且结合了来自阿里云商业化服务的外部多家客户和社区的最佳实践,具备高可靠、可拓展等特性。 + +AppActive 具备以下特性 + +==== 一、单元分流 +===== 流量统一接入 +对流量的把控能力,来源于流量的统一接入,我们将这一层称为接入层。接入层是单元所有流量的入口,它能解析请求协议,并按照设置的分流模式与分流粒度,将请求流量正确引导到正确单元的相应应用服务SLB上。下文若无特殊说明,请求协议默认HTTP。下图为接入层示意图。 + +===== 分流模式 +多活场景下,流量会按照某个纬度切片,分流到不同的单元。多活支持多种分流模式,比如按比例分流,按业务属性分流,具体选择哪种分流模式还是取决于业务场景需要。分流模式最终体现在路由规则里,路由规则是一项配置,它定义了某个流量应该隶属于哪个单元。 + +1. 按比例分流。在某些业务场景下,需要按用户分流,或者按设备号分流。用户、设备等都可以抽象成一个ID,那就可以将ID划为多个区间,每个区间归属于某个单元。这种分流模式,每个单元的流量比例,就可以通过ID区间进行估算,通过设置ID区间与单元容量的比例一致,就可以做到全局的负载均衡。 +2. 按业务属性分流。在某些业务场景下,需要按流量属性分流,比如将爬虫流量引入特定单元,或者按省份分流。爬虫、省份等都可以抽象成一个标签,那就可以将不同的标签值流量引入不同单元。这种分流模式,可以支持对不同业务属性的流量进行物理隔离。 + +===== 分流粒度 +随着应用服务化,当今应用早已不是单体架构,提供用户访问入口的应用也可能成百上千。接入层将用户流量引入正确的应用,支持域名与URI前缀两种粒度。 + +1. 按域名分流。按照不同域名区分不同应用。比如应用app1的域名是app1.example.com,app2的域名是app2.example.com。 +2. 按URI前缀分流。按照不同URI前缀区分不同应用。比如应用app1与app2的域名都是app.example.com,但是将URI中/app1前缀的流量引入app1,将/app2前缀的流量引入app2。 + +===== 流量协议 +接入层支持四层、七层丰富的流量请求协议,以满足用户互联网、物联网等多样化场景需求。 + +1. HTTP协议支持。接入层默认支持HTTP协议,从HTTP协议中解析出域名与URI,进行转发路由。 +2. HTTPS协议支持。接入层支持HTTPS协议,提供集中化的域名证书管理,满足用户可靠传输、安全传输的要求。用户在接入层配置好域名证书,则应用SLB无需再配置证书。 +3. 其他协议支持。接入层除了支持HTTP与HTTPS协议,还支持其他基于HTTP的协议,比如SOAP等。接入层在协议上有很大的扩展性,能以插件的形式迅速支持特殊协议,比如物联网场景下的MQTT,COAP等。 + +===== 路由透传 +为了确保流量能在单元内闭环,接入层、应用层、数据层每一层都会进行路由纠错或单元保护。为了识别流量,需要明确流量所属的单元化类型与分流id,我们称之为路由参数,以便通过路由规则计算出流量所属正确单元,因此,路由参数需要跟随请求路径一路传递,我们称之为路由透传。 + +1. 接入层路由透传。当浏览器发起业务请求时,需要在请求中携带路由参数。路由参数可以在cookie、head或body中,建议cookie。接入层能解析HTTP请求,拿到路由参数并路由到正确的应用SLB,同时应用服务器仍然能从请求中拿到原生的路由参数。 +2. 应用层路由透传。流量到达应用服务器,多活提供插件从HTTP请求中提取路由参数,并保存到上下文,下一步应用可能会发起RPC调用或异步消息,因此路由参数还需要在RPC与消息层面透传。 +3. RPC路由透传。当应用发起RPC调用时,RPC客户端能从上下文中取出路由参数,并跟随RPC请求到远程服务提供者Provider,Provider客户端识别出Request中的路由参数,亦保存到调用上下文。路由参数在RPC中的传递过程对用户透明。 +4. 消息路由透传。MQ客户端在发送消息时,会从当前上下文获取路由参数添加到消息属性中。MQ客户端消费消息时,能从消息属性中取出路由参数,亦保存到调用上下文。路由参数在MQ中的传递过程对用户透明。 +5. 数据层路由透传。数据脏写会造成很严重的后果,因此要保证数据落库到正确单元的DB。多活提供了 DRIVER 插件,对非本单元的请求拒绝。 + +==== 二、单元协同 +在容灾场景中,理想场景中各个单元独立,但实际上会存在部分跨单元场景的业务场景,为了满足这些场景,产品需要提供单元协同的能力。 + +===== 中心调用 +有些特定业务场景,为保证数据强一致性,特定服务只能在特定中心单元提供,所有对中心服务的调用都会直接路由到中心单元来完成。异地多活产品通过CSB组件和RPC多活插件来完成服务单元间协同调用,满足业务的完整性。 + +==== 三、单元保护 +产品保证业务逻辑的全局正确性,不会因切流操作导致单元业务逻辑不一致问题。系统自上而下各层都有对错误流量的纠错保护能力,保证业务按单元化规则进行正确的流转。 + +===== 接入层纠错 +流量打入接入层,接入层通过请求附加的路由参数判断流量归属单元,非本单元流量将被代理到正确的目标单元,保证了接入层入口流量的正确性。 + +===== RPC纠错 +RPC服务调用时,RPC多活Plugin在Consumer端会根据请求的单元信息,对服务调用进行正确的路由选址,对错误的流量服务调用,RPC多活Plugin会计算出正确的目标单元,跨单元调用目标单元服务,保证服务流转逻辑的一致性。同时RPC多活Plugin 在Provider端会对过来的请求进行二次校验,保证服务调用的正确。通过双重校验机制,RPC多活Plugin实现对RPC调用的纠错,保证服务调用的正确性。 + +==== 四、单元扩展 +===== 水平扩展 +当现有单元的业务承载量已达上限且无法扩容时,产品 提供简单快捷单元水平扩展能力: + +1. 全国范围内扩展新单元不受地域限制 +2. 扩展的新单元数量不受限制,单元的稳定性和性能不受单元数量影响 +3. 提供两种单元扩展形式:独立 DB 的异地单元 、 共享 DB 的同城单元 + +=== 如何使用AppActive + +==== 一、数据面 + +**前置条件** + +- 需要你的应用服务基于 Java 实现,并且以 SpringCloud 实现服务调用 +- 负载均衡支持 Ribbon,暂不支持 SpringCloudBalancer +- 支持声明式http客户端:Feign 和 RestTemplate,暂不支持 原始Http客户端如 OkHttp 和 HttpClient + +===== 入口应用 +入口应用负责从流量中提取路由标,并设置到上下文中 + +**改造步骤** + +1. 引入 maven 依赖 + + ``` + + com.alibaba.msha + client-bridge-servlet + 0.2.1 + + ``` + +2. 引入 filter,以 Spring 为例 + + ```java + @Configuration + public class WebConfig { + @Bean + public FilterRegistrationBean appActiveFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + RequestFilter reqResFilter = new RequestFilter(); + filterRegistrationBean.setFilter(reqResFilter); + filterRegistrationBean.addUrlPatterns("/*"); + return filterRegistrationBean; + } + } + ``` + +3. 当请求到来时,可以在应用中调用 `AppContextClient.getRouteId();` 来获取路由ID + +===== 所有应用 + +**改造步骤** + +1. 在 provider 和 consumer 都引入 maven 依赖 + + ``` + + com.alibaba.msha + client-bridge-rpc-springcloud-common + 0.2.1 + + ``` + + 对于 使用 Nacos 作为注册中心的应用,还应引入 + ``` + + com.alibaba.msha + client-bridge-rpc-springcloud-nacos + 0.2.1 + + ``` + + 注意,不同的注册中心不能同时使用。 + + 然后引入自动配置 + + `@Import({ConsumerAutoConfig.class, NacosAutoConfig.class})` + +2. 在 consumer 的 maven 中引入切面,植入多活寻址逻辑 + + ``` + + + + + org.codehaus.mojo + aspectj-maven-plugin + 1.11 + + + + com.alibaba.msha + client-bridge-rpc-springcloud-common + + + ${maven.compiler.source} + ${maven.compiler.target} + 1.8 + true + + + + compileId + compile + + compile + + + + + + + ``` + +3. 在 provider 中定义不同uri的属性,支持 ant 模式的 uri,举例 + + ``` + @Bean + public FilterRegistrationBean appActiveUnitServiceFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + UnitServiceFilter reqResFilter = new UnitServiceFilter(); + filterRegistrationBean.setFilter(reqResFilter); + filterRegistrationBean.addUrlPatterns("/detailHidden/*","/detail/*"); + return filterRegistrationBean; + } + + @Bean + public FilterRegistrationBean appActiveCenterServiceFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + CenterServiceFilter reqResFilter = new CenterServiceFilter(); + filterRegistrationBean.setFilter(reqResFilter); + filterRegistrationBean.addUrlPatterns("/buy/*"); + return filterRegistrationBean; + } + ``` + 不同服务类型如下 + +- center: 中心服务,强一致的业务(例如库存、金额等)的服务,强制路由到中心机房,使用 `GlobalServiceFilter` 过滤 +- unit: 单元服务,基于规则,仅在本单元路由的服务,使用 `CoreServiceFilter` 过滤 +- normal: 普通服务,不做多活改造,使用 `GeneralServiceFilter` 过滤,本类服务亦可不单独配置,除上述两种服务以外都认为是普通服务 + +===== 基本配置 + +凡是依赖 `appactive-java-api` 模块的应用,启动时候都要配置参数: + +``` +-Dappactive.channelTypeEnum=NACOS +-Dappactive.namespaceId=appactiveDemoNamespaceId +``` + +表征当前应用使用 Nacos 作为命令通道,并且使用 appactiveDemoNamespaceId空间。 +该空间需要有一些几个 dataId(下面管控面进行说明),这些 dataId 的 groudId 必须一致,比如默认为 `appactive.groupId` +当然这些都可以在启动参数进行配置,如 + +``` +-Dappactive.dataId.idSourceRulePath=someDataId +-Dappactive.dataId.transformerRulePath=otherDataId +...... +-Dappactive.groupId=myGroupId +``` + +==== 二、管控面 + +在应用部署完成后要进行基线推送,在希望调整流量时进行切流。核心是规则的构造和推送,这里重点将几个规则进行说明。 + +- appactive.dataId.idSourceRulePath,举例: + +``` +{ + "source": "arg,header,cookie", + "tokenKey": "r_id" +} +``` + +说明,从http parameter、header、cookie 中按顺序寻找以r_id为key的value,找到一个即终止寻找过程。 + +- appactive.dataId.transformerRulePath,举例: + +``` +{ + "id": "userIdBetween", + "mod": "10000" +} +``` + +说明,提取到路由标后按照10000取模,作为最终路由标。 + + +- appactive.dataId.trafficRouteRulePath,举例: + +``` +{ + "itemType": "UnitRuleItem", + "items": [ + { + "name": "unit", + "conditions": [ + { + "@userIdBetween": [ + "0~1999" + ] + } + ] + }, + { + "name": "center", + "conditions": [ + { + "@userIdBetween": [ + "2000~9999" + ] + } + ] + } + ] +} + +``` +说明 按 10000 取模后在 0~1999 范围内的路由标应该被路由到 unit; + +按 10000 取模后在 2000~9999 范围内的路由标应该被路由到 center; + +- appactive.dataId.forbiddenRulePath,举例: + +假设我们希望将 2000~2999 从 unit 划分到 center,则新的appactive.trafficRulePath如下 + +``` +{ + "itemType": "UnitRuleItem", + "items": [ + { + "name": "unit", + "conditions": [ + { + "@userIdBetween": [ + "0~2999" + ] + } + ] + }, + { + "name": "center", + "conditions": [ + { + "@userIdBetween": [ + "3000~9999" + ] + } + ] + } + ] +} + +``` + +对应的appactive.forbiddenRulePath 为 + +``` + { + "itemType": "ForbiddenRuleItem", + "items": [ + { + "name": "between", + "conditions": [ + { + "@userIdBetween": [ + "2000~2999" + ] + } + ] + } + ] + } +``` \ No newline at end of file diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/appactive.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/appactive.adoc new file mode 100644 index 000000000..a577c1a40 --- /dev/null +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/appactive.adoc @@ -0,0 +1,330 @@ +== Spring Cloud Alibaba AppActive + +=== Introduction + +AppActive is an open source middleware that builds a cloud-native, high-availability and multi-active disaster tolerance +architecture for business applications. It provides standards, implementations, and demos for applying the multi-active +disaster recovery architecture, which is suitable for rich business scenarios (single AZ, single region, single cloud, +multi AZ, multi region, multi-cloud, self-built IDC...). + +AppActive is an internal open source project of AHAS-MSHA. It is based on Alibaba's nearly 9-year production disaster +recovery practice, and combines the best practices of many external customers and communities from Alibaba Cloud's +commercial services, and has the characteristics of high reliability and scalability. + +AppActive has the following features: + +==== One, unit diversion + +===== Unified traffic access +The ability to control traffic comes from the unified access of traffic. We call this layer the access layer. The access layer is the entrance of all traffic of the unit. It can parse the request protocol and correctly guide the request traffic to the corresponding application service SLB of the correct unit according to the set split mode and split granularity. If there are no special instructions below, the request protocol defaults to HTTP. The figure below is a schematic diagram of the access layer. + +===== Shunt mode +In the multi-active scenario, the traffic will be sliced ​​according to a certain latitude and distributed to different units. Multi-active supports multiple diversion modes, such as proportional diversion and diversion according to business attributes. The specific diversion mode to choose depends on the needs of the business scenario. The shunt mode is finally reflected in the routing rules. The routing rule is a configuration that defines which unit a certain flow should belong to. + +1. Diversion proportionally.In some business scenarios, you need to split traffic according to users or device numbers. Users, devices, etc. can all be abstracted into one ID, and then the ID can be divided into multiple sections, and each section belongs to a certain unit. In this shunt mode, the traffic ratio of each unit can be estimated through the ID interval. By setting the ratio of the ID interval to the unit capacity to be consistent, global load balancing can be achieved. +2. Diversion according to business attributes.In some business scenarios, it is necessary to split traffic according to traffic attributes, such as introducing crawler traffic to a specific unit, or splitting traffic by province. Crawlers, provinces, etc. can all be abstracted into one label, and then different label value traffic can be introduced into different units. This offloading mode can support physical isolation of traffic with different business attributes. + +===== Shunt granularity +With the servicing of applications, today's applications are no longer a monolithic architecture, and there may be hundreds of applications that provide user access. The access layer introduces user traffic to the correct application, and supports two granularities of domain name and URI prefix. + +1. Diversion by domain name.Different applications are distinguished according to different domain names. For example, the domain name of application app1 is app1.example.com, and the domain name of app2 is app2.example.com. +2. Diversion by URI prefix.Different applications are distinguished according to different URI prefixes. For example, the domain names of apps app1 and app2 are both app.example.com, but the traffic with the prefix /app1 in the URI is introduced into app1, and the traffic with the prefix /app2 is introduced into app2. + +===== Traffic Protocol +The access layer supports four-layer and seven-layer rich traffic request protocols to meet the needs of users in diverse scenarios such as the Internet and the Internet of Things. + +1. HTTP protocol support.The access layer supports the HTTP protocol by default, and the domain name and URI are parsed from the HTTP protocol for forwarding and routing. +2. HTTPS protocol support.The access layer supports the HTTPS protocol, provides centralized domain name certificate management, and meets the user's requirements for reliable and secure transmission. If the user configures the domain name certificate at the access layer, the application of SLB does not need to configure the certificate. +3. Other protocol support.In addition to supporting HTTP and HTTPS protocols, the access layer also supports other HTTP-based protocols, such as SOAP. The access layer has great scalability in terms of protocols, and can quickly support special protocols in the form of plug-ins, such as MQTT and COAP in the Internet of Things scenario. + +===== Route transparent transmission +In order to ensure that the flow can be closed in the cell, each layer of the access layer, application layer, and data layer will perform routing error correction or cell protection. In order to identify the traffic, it is necessary to clarify the unitized type and branch id of the traffic, which we call routing parameters, so that the correct unit of the traffic can be calculated through routing rules. Therefore, the routing parameters need to be transmitted along the request path, which we call routing Penetrate. + +1. Access layer routing transparent transmission.When a browser initiates a service request, it needs to carry routing parameters in the request. Routing parameters can be in cookie, head or body, cookie is recommended. The access layer can parse the HTTP request, get the routing parameters and route to the correct application SLB, while the application server can still get the native routing parameters from the request. +2. Application layer routing transparent transmission.When the traffic arrives at the application server, MultiLive provides a plug-in to extract routing parameters from the HTTP request and save them in the context. The next application may initiate RPC calls or asynchronous messages. Therefore, routing parameters need to be transparently transmitted at the RPC and message levels. +3. RPC routing transparent transmission.When an application initiates an RPC call, the RPC client can retrieve routing parameters from the context and follow the RPC request to the remote service provider Provider. The Provider client recognizes the routing parameters in the Request and saves them in the calling context. The process of routing parameters in RPC is transparent to users. +4. Message routing transparent transmission.When the MQ client sends a message, it will obtain routing parameters from the current context and add it to the message properties. When the MQ client consumes a message, it can retrieve routing parameters from the message attributes and save them in the calling context. The process of routing parameters in MQ is transparent to users. +5. Data layer routing transparent transmission.Dirty writing of data can cause serious consequences, so it is necessary to ensure that the data is stored in the correct unit of DB. Duohuo provides the DRIVER plug-in, and rejects requests from non-this unit. + +==== Two, unit collaboration +In the disaster recovery scenario, each unit in the ideal scenario is independent, but in fact there will be some business scenarios that cross-unit scenarios. In order to meet these scenarios, the product needs to provide unit collaboration capabilities. + +===== Center call +In some specific business scenarios, in order to ensure strong data consistency, specific services can only be provided in specific central units, and all calls to central services will be directly routed to the central unit for completion. Remote multi-active products use CSB components and RPC multi-active plug-ins to complete coordinated calls between service units to meet business integrity. + +==== Three, unit protection +The product guarantees the global correctness of the business logic, and will not cause inconsistencies in the unit business logic due to cut-flow operations. Each layer of the system from top to bottom has error correction protection capabilities for error traffic to ensure that services are flowed correctly according to the unitized rules. + +===== Access layer error correction +The traffic enters the access layer, and the access layer determines the unit of the traffic by requesting additional routing parameters, and the non-unit traffic will be proxied to the correct target unit, ensuring the correctness of the access layer ingress traffic. + +===== RPC error correction +When the RPC service is called, the RPC Multi-Live Plugin will perform the correct routing of the service call based on the requested unit information on the Consumer side, and call the wrong traffic service. The RPC Multi-Live Plugin will calculate the correct target unit and call across units. Target unit services to ensure the consistency of service circulation logic. At the same time, the RPC Multi-Live Plugin will perform a second check on the incoming request on the Provider side to ensure the correct service call. Through the double check mechanism, RPC Multi-Live Plugin realizes the error correction of RPC calls to ensure the correctness of service calls. + +==== Four, unit extension +===== Horizontal extension +When the business carrying capacity of the existing unit has reached the upper limit and cannot be expanded, the product provides simple and fast unit horizontal expansion capabilities: + +1. Expansion of new units nationwide without geographic restrictions +2. The number of new units to be expanded is not limited, and the stability and performance of the unit are not affected by the number of units +3. Two types of unit expansion are provided: remote unit with independent DB and same-city unit with shared DB + +=== AppActive: How to + +==== A. Data Plane + +===== Frontend application + +The frontend application is responsible for extracting the routing beacon from the traffic and setting it in the context + +1. Introduce maven dependency + + ``` + + com.alibaba.msha + client-bridge-servlet + 0.2.1 + + ``` + +2. import filter,for example + + ```java + @Configuration + public class WebConfig { + @Bean + public FilterRegistrationBean appActiveFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + RequestFilter reqResFilter = new RequestFilter(); + filterRegistrationBean.setFilter(reqResFilter); + filterRegistrationBean.addUrlPatterns("/*"); + return filterRegistrationBean; + } + } + ``` + +3. When the request comes, you can call `AppContextClient.getRouteId();` in the application to get the route ID + +===== All applications + +1. Introduce maven dependency for both consumer and producer + + ``` + + com.alibaba.msha + client-bridge-rpc-springcloud-common + 0.2.1 + + ``` + + if you use Nacos as service registry,you should import + ``` + + com.alibaba.msha + client-bridge-rpc-springcloud-nacos + 0.2.1 + + ``` + + It should be noted that you can not use 2 registry at the same time. + Then import auto config + + `@Import({ConsumerAutoConfig.class, NacosAutoConfig.class})` + +2. import aspect config for consumer + + ``` + + + + + org.codehaus.mojo + aspectj-maven-plugin + 1.11 + + + + com.alibaba.msha + client-bridge-rpc-springcloud-common + + + ${maven.compiler.source} + ${maven.compiler.target} + 1.8 + true + + + + compileId + compile + + compile + + + + + + + ``` +In which we defined a multi-active routing policy + +3. Define service type for uris in providers, such as + + ``` + @Bean + public FilterRegistrationBean appActiveUnitServiceFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + UnitServiceFilter reqResFilter = new UnitServiceFilter(); + filterRegistrationBean.setFilter(reqResFilter); + filterRegistrationBean.addUrlPatterns("/detailHidden/*","/detail/*"); + return filterRegistrationBean; + } + + @Bean + public FilterRegistrationBean appActiveCenterServiceFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + CenterServiceFilter reqResFilter = new CenterServiceFilter(); + filterRegistrationBean.setFilter(reqResFilter); + filterRegistrationBean.addUrlPatterns("/buy/*"); + return filterRegistrationBean; + } + ``` + + +- center: center service, which will only route within center idc, and is filtered by `GlobalServiceFilter` +- unit: unit service, which will only route within right unit according to multi-active rules, and is filtered by `CoreServiceFilter` +- normal: normal service, which requires no multi-active modification, and will route as it was, and is filtered by `GeneralServiceFilter`. Fyi, you can skip this service cause any service other than the above 2 types is considered as normal services. + +===== 4.1 Basic configuration + +All applications that rely on the `appactive-java-api` module must configure the parameters bellow + +``` +-Dappactive.channelTypeEnum=NACOS +-Dappactive.namespaceId=appactiveDemoNamespaceId +``` + +which indicate we use naocs as command channel and use namespace with the id "appactiveDemoNamespaceId". +The namespace must contains several dataIds(which will be described in controll plane section), which share one groupId( "appactive.groupId" by default). +Of course, all these parameters can be redefined,such as: + + +``` +-Dappactive.dataId.idSourceRulePath=someDataId +-Dappactive.dataId.transformerRulePath=otherDataId +...... +-Dappactive.groupId=myGroupId +``` + +==== B. Control Plane + +After the application is deployed, the baseline is pushed, and the flow is switched when you want to adjust the traffic. The core is the construction and push of rules, here are a few rules to explain. + +- appactive.dataId.idSourceRulePath, example: + +``` +{ + "source": "arg,header,cookie", + "tokenKey": "r_id" +} +``` + +AppActive would extract value corresponding to the key r_id in the order of parameter, header, cookie. + +- appactive.dataId.transformerRulePath, example: + +``` +{ + "id": "userIdBetween", + "mod": "10000" +} +``` + +The final routing target would be decided by rawValue % 10000 + +- appactive.dataId.trafficRouteRulePath, example: + +``` +{ + "itemType": "UnitRuleItem", + "items": [ + { + "name": "unit", + "conditions": [ + { + "@userIdBetween": [ + "0~1999" + ] + } + ] + }, + { + "name": "center", + "conditions": [ + { + "@userIdBetween": [ + "2000~9999" + ] + } + ] + } + ] +} + +``` +Modulo by 10000, the routing targets within the range of 0-1999 should be routed to unit, +the routing targets within the range of 2000-9999 should be routed to the center + + +- appactive.dataId.forbiddenRulePath, example: + +Suppose we would like to switch routing targets 2000~2999 from unit to center, the new value of appactive.trafficRulePath would be + +``` +{ + "itemType": "UnitRuleItem", + "items": [ + { + "name": "unit", + "conditions": [ + { + "@userIdBetween": [ + "0~2999" + ] + } + ] + }, + { + "name": "center", + "conditions": [ + { + "@userIdBetween": [ + "3000~9999" + ] + } + ] + } + ] +} + +``` + +the corresponding value of appactive.forbiddenRulePath is + +``` + { + "itemType": "ForbiddenRuleItem", + "items": [ + { + "name": "between", + "conditions": [ + { + "@userIdBetween": [ + "2000~2999" + ] + } + ] + } + ] + } +``` \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/appactive-example/baseline.sh b/spring-cloud-alibaba-examples/appactive-example/baseline.sh new file mode 100755 index 000000000..3d24f3d06 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/baseline.sh @@ -0,0 +1,88 @@ +# sh baseline.sh 2 or sh baseline.sh 2 NACOS appactiveDemoNamespaceId +# sh baseline.sh 3 + +type=$1 +channel=$2 +tenant=$3 +if [ ! -n "$channel" ] ;then + channel="FILE" +fi +echo "channel: ${channel}" + + +if [ `expr $type % 2` == 0 ] +then + if [ $channel = "FILE" ] + then + for file in $(ls ../data/); do + if [[ "$file" == *"path-address"* ]]; then + echo "continue" + continue + fi + echo "$(date "+%Y-%m-%d %H:%M:%S") 应用 ${file} 基线推送中"; + cp -f ./rule/idSource.json "../data/$file/" + cp -f ./rule/transformerBetween.json "../data/$file/idTransformer.json" + cp -f ./rule/idUnitMapping.json "../data/$file/" + cp -f ./rule/dbProperty.json "../data/$file/mysql-product" + arr=(${file//-/ }) + unitFlag=${arr[1]} + echo "{\"unitFlag\":\"${unitFlag}\"}" > "../data/$file/machine.json" + echo "$(date "+%Y-%m-%d %H:%M:%S") 应用 ${file} 基线推送完成" + done + elif [ $channel = "NACOS" ] + then + dataIdPrefix="appactive.dataId." + groupId="appactive.groupId" + + idSourceRule=$(cat ./rule/idSource.json) + echo "$(date "+%Y-%m-%d %H:%M:%S") idSourceRule 推送结果: " \ + && curl -X POST "127.0.0.1:8848/nacos/v1/cs/configs" \ + -d "tenant=${tenant}&dataId=${dataIdPrefix}idSourceRulePath&group=${groupId}&content=${idSourceRule}" \ + && echo "" + + idTransformerRule=$(cat ./rule/transformerBetween.json) + echo "$(date "+%Y-%m-%d %H:%M:%S") idTransformerRule 推送结果: " \ + && curl -X POST "127.0.0.1:8848/nacos/v1/cs/configs" \ + -d "tenant=${tenant}&dataId=${dataIdPrefix}transformerRulePath&group=${groupId}&content=${idTransformerRule}" \ + && echo "" + + idUnitMappingRule=$(cat ./rule/idUnitMapping.json) + echo "$(date "+%Y-%m-%d %H:%M:%S") idUnitMappingRule 推送结果: " \ + && curl -X POST "127.0.0.1:8848/nacos/v1/cs/configs" \ + -d "tenant=${tenant}&dataId=${dataIdPrefix}trafficRouteRulePath&group=${groupId}&content=${idUnitMappingRule}" \ + && echo "" + + forbiddenRule=$(cat ./rule/forbiddenRuleEmpty.json) + echo "$(date "+%Y-%m-%d %H:%M:%S") forbiddenRule 推送结果: " \ + && curl -X POST "127.0.0.1:8848/nacos/v1/cs/configs" \ + -d "tenant=${tenant}&dataId=${dataIdPrefix}forbiddenRulePath&group=${groupId}&content=${forbiddenRule}" \ + && echo "" + + dataScopeRule=$(cat ./rule/dbProperty.json) + echo "$(date "+%Y-%m-%d %H:%M:%S") dataScopeRule 推送结果: " \ + && curl -X POST "127.0.0.1:8848/nacos/v1/cs/configs" \ + -d "tenant=${tenant}&dataId=${dataIdPrefix}dataScopeRuleDirectoryPath_mysql-product&group=${groupId}&content=${dataScopeRule}" \ + && echo "" + else + echo "unsupported channel: ${channel}" + exit 1 + fi +fi + +if [ `expr $type % 3` == 0 ] +then + idSource=$(cat ./rule/idSource.json) + idTransformer=$(cat ./rule/idTransformer.json) + idUnitMapping=$(cat ./rule/idUnitMapping.json) + + gatewayRule="{\"idSource\" : $idSource, \"idTransformer\" : $idTransformer, \"idUnitMapping\" : $idUnitMapping}" + data="{\"key\" : \"459236fc-ed71-4bc4-b46c-69fc60d31f18_test1122\", \"value\" : $gatewayRule}" + echo $data + echo "$(date "+%Y-%m-%d %H:%M:%S") gateway 基线推送结果: " && curl --header "Content-Type: application/json" \ + --request POST \ + --data "$data" \ + 127.0.0.1:8090/set +fi + + + diff --git a/spring-cloud-alibaba-examples/appactive-example/common/pom.xml b/spring-cloud-alibaba-examples/appactive-example/common/pom.xml new file mode 100644 index 000000000..1d467b11d --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/common/pom.xml @@ -0,0 +1,62 @@ + + + + + 4.0.0 + + com.alibaba.cloud + spring-cloud-alibaba-examples + ${revision} + ../../pom.xml + + + appactive-example-common + Spring Cloud Starter Alibaba Appactive Example - Common Service + jar + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework + spring-beans + 5.3.18 + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.hibernate + hibernate-validator + 5.1.0.Final + + + + com.alibaba.msha + client-spi-metainfo + 0.2.1 + + + com.alibaba.cloud + spring-cloud-starter-alibaba-appactive + + + diff --git a/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/Constants.java b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/Constants.java new file mode 100644 index 000000000..31a6f7bbd --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/Constants.java @@ -0,0 +1,34 @@ +/* + * Copyright 2013-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.common; + +/** + * @author ChengPu raozihao + * @description + * @date 2022/8/15 + */ +public final class Constants { + + /** + * center flag. + */ + public static final String CENTER_FLAG = "center"; + + private Constants() { + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/RPCType.java b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/RPCType.java new file mode 100644 index 000000000..d493b6d5b --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/RPCType.java @@ -0,0 +1,30 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.common; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public enum RPCType { + + /** + * Spring Cloud. + */ + SpringCloud + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/entity/Product.java b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/entity/Product.java new file mode 100644 index 000000000..e449874cd --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/entity/Product.java @@ -0,0 +1,108 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.common.entity; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; + +/** + * @author ChengPu raozihao + * @description + * @date 2022/8/15 + */ +@Entity +public class Product implements Serializable { + + @Id + @Column(nullable = false, columnDefinition = "char(100)") + private String id; + + @Column(nullable = false, columnDefinition = "char(100)") + private String name; + + @Column(nullable = false, columnDefinition = "char(100)") + private String img; + + @Column(nullable = false, columnDefinition = "varchar(2000)") + private String description; + + private int price; + + private int number; + + public Product() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public int getNumber() { + return number; + } + + public void setNumber(int number) { + this.number = number; + } + + @Override + public String toString() { + return "Product{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", img='" + + img + '\'' + ", description='" + description + '\'' + ", price=" + price + + ", number=" + number + '}'; + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/entity/ResultHolder.java b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/entity/ResultHolder.java new file mode 100644 index 000000000..bac909612 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/entity/ResultHolder.java @@ -0,0 +1,103 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.common.entity; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class ResultHolder implements Serializable { + + List chain = new ArrayList<>(); + + private T result; + + /** + * Default constructor. + */ + public ResultHolder() { + + } + + public ResultHolder(T result) { + this.result = result; + } + + public T getResult() { + return result; + } + + public void setResult(T result) { + this.result = result; + } + + public List getChain() { + return chain; + } + + public void setChain(List chain) { + this.chain = chain; + } + + public void addChain(String app, String unitFlag) { + chain.add(new Node(app, unitFlag)); + } + + @Override + public String toString() { + return "ResultHolder{" + "result=" + result + ", chain=" + chain + '}'; + } + + static class Node implements Serializable { + + private String app; + + private String unitFlag; + + Node() { + } + + Node(String app, String unitFlag) { + this.app = app; + this.unitFlag = unitFlag; + } + + public String getApp() { + return app; + } + + public void setApp(String app) { + this.app = app; + } + + public String getUnitFlag() { + return unitFlag; + } + + public void setUnitFlag(String unitFlag) { + this.unitFlag = unitFlag; + } + + @Override + public String toString() { + return "Node{" + "app='" + app + '\'' + ", unitFlag='" + unitFlag + '\'' + + '}'; + } + + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/filter/ChainAspect.java b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/filter/ChainAspect.java new file mode 100644 index 000000000..f72b4dd0c --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/filter/ChainAspect.java @@ -0,0 +1,55 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.common.filter; + +import com.alibaba.cloud.example.common.entity.ResultHolder; +import io.appactive.support.log.LogUtil; +import io.appactive.support.sys.JvmPropertyUtil; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.Logger; + +import org.springframework.stereotype.Component; + +@Aspect +@Component +public class ChainAspect { + + private static final Logger logger = LogUtil.getLogger(); + + /** + * Add tag information in result. + * @param joinPoint joinPoint + * @param result result + */ + @AfterReturning( + pointcut = "execution(* com.alibaba.cloud.example.frontend.service.*.*(..)) || " + + "execution(* com.alibaba.cloud.example.product.service.*.*(..)) || " + + "execution(* com.alibaba.cloud.example.storage.service.*.*(..)) || " + + "execution(* com.alibaba.cloud.example.common.service.*.*(..))", + returning = "result") + public void afterRunning(JoinPoint joinPoint, Object result) { + if (result instanceof ResultHolder) { + ResultHolder resultHolder = (ResultHolder) result; + resultHolder.addChain(JvmPropertyUtil.getJvmAndEnvValue("appactive.app"), + JvmPropertyUtil.getJvmAndEnvValue("appactive.unit")); + logger.info("ChainAspect: " + resultHolder); + } + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/OrderDAO.java b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/OrderDAO.java new file mode 100644 index 000000000..640d4e2a6 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/OrderDAO.java @@ -0,0 +1,47 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.common.service; + +import com.alibaba.cloud.example.common.entity.ResultHolder; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Service +public class OrderDAO { + + @Autowired + private OrderService orderService; + + public ResultHolder buy(String rId, String pId, Integer number) { + return orderService.buy(rId, pId, number); + } + + @FeignClient(name = "storage") + public interface OrderService { + + @GetMapping("/buy/") + ResultHolder buy(@RequestParam(name = "rId") String rId, + @RequestParam(name = "id") String id, + @RequestParam(name = "number") Integer number); + + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductDAO.java b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductDAO.java new file mode 100644 index 000000000..bebd4f492 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductDAO.java @@ -0,0 +1,98 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.common.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.alibaba.cloud.example.common.RPCType; +import com.alibaba.cloud.example.common.entity.Product; +import com.alibaba.cloud.example.common.entity.ResultHolder; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.client.RestTemplate; + +@Service +public class ProductDAO { + + @Autowired(required = false) + RestTemplate restTemplate; + + @Autowired + private ProductService productService; + + public ResultHolder> list() { + return productService.list(); + } + + public ResultHolder detail(String rId, String pId) { + return productService.detail(rId, pId); + } + + public ResultHolder detailHidden(String pId) { + return productService.detailHidden(pId); + } + + public ResultHolder buy(String rId, String pId, Integer number) { + return productService.buy(RPCType.SpringCloud.name(), rId, pId, number); + } + + public ResultHolder> listTemplate() { + if (restTemplate != null) { + return restTemplate.getForObject("http://product/list", ResultHolder.class); + } + return productService.list(); + } + + public ResultHolder detailTemplate(String rId, String pId) { + if (restTemplate != null) { + Map params = new HashMap<>(2); + params.put("rId", rId); + params.put("pId", pId); + return restTemplate.getForObject("http://product/detail", ResultHolder.class, + params); + } + return productService.detail(rId, pId); + } + + @FeignClient(name = "product") + public interface ProductService { + + @RequestMapping("/list/") + ResultHolder> list(); + + @RequestMapping("/detail/") + ResultHolder detail(@RequestParam(name = "rId") String rId, + @RequestParam(name = "pId") String pId); + + @RequestMapping("/detailHidden/") + ResultHolder detailHidden(@RequestParam(name = "pId") String pId); + + @RequestMapping("/buy/") + ResultHolder buy(@RequestParam(name = "rpcType") String rpcType, + @RequestParam(name = "rId") String rId, + @RequestParam(name = "pId") String pId, + @RequestParam(name = "number") Integer number); + + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductServiceNormal.java b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductServiceNormal.java new file mode 100644 index 000000000..c2e1bd0ef --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductServiceNormal.java @@ -0,0 +1,28 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.common.service; + +import java.util.List; + +import com.alibaba.cloud.example.common.entity.Product; +import com.alibaba.cloud.example.common.entity.ResultHolder; + +public interface ProductServiceNormal { + + ResultHolder> list(); + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductServiceUnit.java b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductServiceUnit.java new file mode 100644 index 000000000..0a7eaf56b --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductServiceUnit.java @@ -0,0 +1,26 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.common.service; + +import com.alibaba.cloud.example.common.entity.Product; +import com.alibaba.cloud.example.common.entity.ResultHolder; + +public interface ProductServiceUnit { + + ResultHolder detail(String rId, String pId); + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductServiceUnitHidden.java b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductServiceUnitHidden.java new file mode 100644 index 000000000..cae8eddf5 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/common/src/main/java/com/alibaba/cloud/example/common/service/ProductServiceUnitHidden.java @@ -0,0 +1,26 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.common.service; + +import com.alibaba.cloud.example.common.entity.Product; +import com.alibaba.cloud.example.common.entity.ResultHolder; + +public interface ProductServiceUnitHidden { + + ResultHolder detail(String pId); + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/component-quickstart.yml b/spring-cloud-alibaba-examples/appactive-example/component-quickstart.yml new file mode 100644 index 000000000..6bb8cb3a1 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/component-quickstart.yml @@ -0,0 +1,27 @@ +version: "3" +services: + nacos: + container_name: nacos + hostname: nacos + image: nacos/nacos-server:2.0.3 + environment: + - PREFER_HOST_MODE=hostname + - MODE=standalone + ports: + - "8848:8848" + - "9848:9848" + - "9849:9849" + + mysql: + container_name: mysql + hostname: mysql + image: mysql:5.7 + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: product + ports: + - "3306:3306" + command: [ + --character-set-server=utf8mb4, + --collation-server=utf8mb4_unicode_ci + ] \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/appactive-example/cut.sh b/spring-cloud-alibaba-examples/appactive-example/cut.sh new file mode 100755 index 000000000..870a435c8 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/cut.sh @@ -0,0 +1,86 @@ +channel=$1 +tenant=$2 +waitTime=$3 +if [ ! -n "$channel" ] ;then + channel="FILE" +fi +if [ ! -n "$waitTime" ] ;then + waitTime=3 +fi +echo "channel: ${channel}" +dataIdPrefix="appactive.dataId." +groupId="appactive.groupId" + +forbiddenFile="forbiddenRule.json" +forbiddenFileEmpty="forbiddenRuleEmpty.json" +idUnitMappingNextFile="idUnitMappingNext.json" + +if [ $channel = "FILE" ] +then + for file in $(ls ../data/); do + if [[ "$file" == *"path-address"* ]]; then + echo "continue" + continue + fi + echo "$(date "+%Y-%m-%d %H:%M:%S") 应用 ${file} 禁写规则推送中)" + cp -f ./rule/$forbiddenFile "../data/$file/forbiddenRule.json" + echo "$(date "+%Y-%m-%d %H:%M:%S") 应用 ${file} 禁写规则推送完成" + done +elif [ $channel = "NACOS" ] +then + forbiddenRule=$(cat ./rule/forbiddenRule.json) + echo "$(date "+%Y-%m-%d %H:%M:%S") forbiddenRule 推送结果: " \ + && curl -X POST "127.0.0.1:8848/nacos/v1/cs/configs" \ + -d "tenant=${tenant}&dataId=${dataIdPrefix}forbiddenRulePath&group=${groupId}&content=${forbiddenRule}" \ + && echo "" +else + echo "unsupported channel: ${channel}" + exit 1 +fi + +idSource=$(cat ./rule/idSource.json) +idTransformer=$(cat ./rule/idTransformer.json) +idUnitMapping=$(cat ./rule/$idUnitMappingNextFile) + +gatewayRule="{\"idSource\" : $idSource, \"idTransformer\" : $idTransformer, \"idUnitMapping\" : $idUnitMapping}" +data="{\"key\" : \"459236fc-ed71-4bc4-b46c-69fc60d31f18_test1122\", \"value\" : $gatewayRule}" +echo $data +echo "$(date "+%Y-%m-%d %H:%M:%S") gateway 新规则推送结果: " && curl --header "Content-Type: application/json" \ +--request POST \ +--data "$data" \ +127.0.0.1:8090/set + +echo "等待数据追平......" +sleep "${waitTime}s" +echo "数据已经追平,下发新规则......" + +if [ $channel = "FILE" ] +then + for file in $(ls ../data/); do + if [[ "$file" == *"path-address"* ]]; then + echo "continue" + continue + fi + echo "$(date "+%Y-%m-%d %H:%M:%S") 应用 ${file} 新规则推送中" + cp -f ./rule/$idUnitMappingNextFile "../data/$file/idUnitMapping.json" + echo "$(date "+%Y-%m-%d %H:%M:%S") 应用 ${file} 新规则推送完成" + echo "$(date "+%Y-%m-%d %H:%M:%S") 应用 ${file} 清除禁写规则推送中)" + cp -f ./rule/$forbiddenFileEmpty "../data/$file/forbiddenRule.json" + echo "$(date "+%Y-%m-%d %H:%M:%S") 应用 ${file} 清除禁写规则推送完成" + done +elif [ $channel = "NACOS" ] +then + idUnitMappingRule=$(cat ./rule/idUnitMappingNext.json) + echo "$(date "+%Y-%m-%d %H:%M:%S") idUnitMappingRule 推送结果: " \ + && curl -X POST "127.0.0.1:8848/nacos/v1/cs/configs" \ + -d "tenant=${tenant}&dataId=${dataIdPrefix}trafficRouteRulePath&group=${groupId}&content=${idUnitMappingRule}" \ + && echo "" + forbiddenRule=$(cat ./rule/forbiddenRuleEmpty.json) + echo "$(date "+%Y-%m-%d %H:%M:%S") forbiddenRule 推送结果: " \ + && curl -X POST "127.0.0.1:8848/nacos/v1/cs/configs" \ + -d "tenant=${tenant}&dataId=${dataIdPrefix}forbiddenRulePath&group=${groupId}&content=${forbiddenRule}" \ + && echo "" +else + echo "unsupported channel: ${channel}" + exit 1 +fi diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/Dockerfile b/spring-cloud-alibaba-examples/appactive-example/frontend/Dockerfile new file mode 100644 index 000000000..992e90044 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/frontend/Dockerfile @@ -0,0 +1,19 @@ +FROM openjdk:8-jdk-alpine + +WORKDIR /app +COPY target/frontend-0.2.1.jar /app +# 设置文件夹操作权限 +RUN chown -R root:root /app/* && \ + chmod a+rw -R /app/* +#EXPOSE 8088 +USER root:root + +ARG UNITFLAG=default + +ENV TZ=Asia/Shanghai \ + UNITFLAG=$UNITFLAG \ + LANG="en_US.UTF-8" + +ENTRYPOINT ["sh", "-c"] +CMD ["java -jar /app/frontend-0.2.1.jar"] +#CMD ["sleep 10m"] diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/pom.xml b/spring-cloud-alibaba-examples/appactive-example/frontend/pom.xml new file mode 100644 index 000000000..8c6d351c8 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/frontend/pom.xml @@ -0,0 +1,60 @@ + + + + + + com.alibaba.cloud + spring-cloud-alibaba-examples + ${revision} + ../../pom.xml + + 4.0.0 + + frontend + Spring Cloud Starter Alibaba Appactive Example - Frontend Service + jar + + + 8 + 8 + true + + + + + com.alibaba.cloud + appactive-example-common + ${revision} + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + + + diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/java/com/alibaba/cloud/example/frontend/FrontendApplication.java b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/java/com/alibaba/cloud/example/frontend/FrontendApplication.java new file mode 100644 index 000000000..5231093b0 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/java/com/alibaba/cloud/example/frontend/FrontendApplication.java @@ -0,0 +1,36 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.frontend; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) +@ComponentScan(basePackages = { "com.alibaba.cloud.example" }) +@EnableDiscoveryClient +@EnableFeignClients(basePackages = { "com.alibaba.cloud.example" }) +public class FrontendApplication { + + public static void main(String[] args) { + SpringApplication.run(FrontendApplication.class, args); + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/java/com/alibaba/cloud/example/frontend/controller/FrontController.java b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/java/com/alibaba/cloud/example/frontend/controller/FrontController.java new file mode 100644 index 000000000..d7eee3296 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/java/com/alibaba/cloud/example/frontend/controller/FrontController.java @@ -0,0 +1,172 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.frontend.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +import com.alibaba.cloud.example.common.RPCType; +import com.alibaba.cloud.example.common.entity.Product; +import com.alibaba.cloud.example.common.entity.ResultHolder; +import com.alibaba.cloud.example.common.service.ProductDAO; +import com.alibaba.fastjson.JSON; +import io.appactive.java.api.base.AppContextClient; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller("/") +public class FrontController { + + @Resource + private ProductDAO productDAO; + + @Value("${spring.application.name}") + private String appName; + + @Autowired + private Environment env; + + private Map metaData; + + @RequestMapping("/") + public String index() { + return "redirect:/listProduct"; + } + + @RequestMapping("/echo") + @ResponseBody + public ResultHolder echo(@RequestParam(required = false, + defaultValue = "echo content") String content) { + return new ResultHolder<>(appName + " : " + content); + } + + @RequestMapping("/check") + @ResponseBody + public String check() { + return "OK From " + appName; + } + + @RequestMapping("/show") + @ResponseBody + public String show() { + return "routerId: " + AppContextClient.getRouteId(); + } + + @ModelAttribute("metaData") + public Map getMetaData() { + return metaData; + } + + @PostConstruct + public void parseMetaData() { + String unitList = env.getProperty("io.appactive.demo.unitlist"); + String appList = env.getProperty("io.appactive.demo.applist"); + metaData = new HashMap<>(2); + metaData.put("unitList", unitList.split(",")); + metaData.put("appList", appList.split(",")); + } + + @RequestMapping("/meta") + @ResponseBody + public ResultHolder meta() { + return new ResultHolder<>(metaData); + } + + @GetMapping("/listProduct") + public String listProduct( + @CookieValue(value = "rpc_type", required = false, + defaultValue = "Dubbo") RPCType rpcType, + @RequestParam(required = false, defaultValue = "feign") String call, + Model model) { + // normal + ResultHolder> resultHolder = (call.equals("feign") + ? productDAO.list() : productDAO.listTemplate()); + + model.addAttribute("result", JSON.toJSONString(resultHolder.getResult())); + model.addAttribute("products", resultHolder.getResult()); + model.addAttribute("chain", JSON.toJSONString(resultHolder.getChain())); + model.addAttribute("current", "listProduct"); + return "index.html"; + } + + @GetMapping("/detailProduct") + public String detailProduct( + @CookieValue(value = "rpc_type", required = false, + defaultValue = "Dubbo") RPCType rpcType, + @RequestParam(required = false, defaultValue = "12") String id, + @RequestParam(required = false, defaultValue = "false") Boolean hidden, + @RequestParam(required = false, defaultValue = "feign") String call, + Model model) { + // unit + ResultHolder resultHolder = getProductResultHolder(rpcType, id, hidden, + call); + + model.addAttribute("result", JSON.toJSONString(resultHolder.getResult())); + model.addAttribute("product", resultHolder.getResult()); + model.addAttribute("chain", JSON.toJSONString(resultHolder.getChain())); + model.addAttribute("current", "detailProduct"); + return "detail.html"; + } + + private ResultHolder getProductResultHolder(RPCType rpcType, String id, + Boolean hidden, String call) { + ResultHolder resultHolder; + resultHolder = hidden ? productDAO.detailHidden(id) + : (call.equals("feign") + ? productDAO.detail(AppContextClient.getRouteId(), id) + : productDAO.detailTemplate(AppContextClient.getRouteId(), id)); + return resultHolder; + } + + @RequestMapping("/buyProduct") + public String buyProduct( + @CookieValue(value = "rpc_type", required = false, + defaultValue = "Dubbo") RPCType rpcType, + @RequestParam(required = false, defaultValue = "12") String pId, + @RequestParam(required = false, defaultValue = "1") Integer number, + @RequestParam(required = false, defaultValue = "feign") String call, + Model model) { + // unit + ResultHolder resultHolder = productDAO.buy(AppContextClient.getRouteId(), + pId, number); + + ResultHolder productHolder = getProductResultHolder(rpcType, pId, false, + call); + + model.addAttribute("result", JSON.toJSONString(resultHolder.getResult())); + model.addAttribute("msg", resultHolder.getResult()); + model.addAttribute("product", productHolder.getResult()); + model.addAttribute("chain", JSON.toJSONString(resultHolder.getChain())); + model.addAttribute("current", "buyProduct"); + return "buy.html"; + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/java/com/alibaba/cloud/example/frontend/filter/ChainFilter.java b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/java/com/alibaba/cloud/example/frontend/filter/ChainFilter.java new file mode 100644 index 000000000..7a894fc05 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/java/com/alibaba/cloud/example/frontend/filter/ChainFilter.java @@ -0,0 +1,49 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.frontend.filter; + +import java.io.IOException; + +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.HttpServletResponse; + +// @Component +public class ChainFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + HttpServletResponse res = (HttpServletResponse) response; + chain.doFilter(request, response); + } + + @Override + public void destroy() { + + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/application.properties b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/application.properties new file mode 100644 index 000000000..761a0f55c --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/application.properties @@ -0,0 +1,18 @@ +server.port=8089 +spring.application.name=frontend + +appactive.unit=center +appactive.app=frontend +io.appactive.demo.unitlist=center,unit +io.appactive.demo.applist=frontend,product,storage +spring.thymeleaf.mode=LEGACYHTML5 +spring.thymeleaf.encoding=UTF-8 +spring.thymeleaf.servlet.content-type=text/html +spring.thymeleaf.suffix=.html +spring.thymeleaf.cache=false +spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 +feign.client.config.default.connectTimeout=8000 +feign.client.config.default.readTimeout=8000 +spring.cloud.appactive.filter.general-path=/* +product.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.appactive.consumer.AppactiveRule + diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/css/bootstrap.min.css b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/css/bootstrap.min.css new file mode 100644 index 000000000..c814524fe --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0 (https://getbootstrap.com) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-control{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-control::before{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#6c757d!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/backpack.png b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/backpack.png new file mode 100644 index 0000000000000000000000000000000000000000..d6029b3655b0c214fd48398009369a967b376a77 GIT binary patch literal 6446 zcmXw8by!qiw4FQj5DqXP&EO9ZknRu}q`SMjkw$u?B$ZIQq>*l zeeaKR&i-THwa&fY{`Ohx+(=br8GHx@1Ox)%%gIWrqt=0c0~-@Hm+Mw!p%%bhUFJ2Y zVw7qh1R~p$lN8r{YkZuE>kpf`><{v`7T_Q<_Ccy@Ld$jIz$|j`^%W2fI*FQrV|{~e z`JRbC{I!|`lQ0u6KjDlDKI4t$JLmbo-!KRl3L)UIz`gSj%$?;t}dk6tZS8FUqP^r zjdA@P@-6Ij7#KYQ57T|z;HrO(Yycxrto3Rgh|IMCQ-jx$=Twsf4W zP8!HghKKm)Jld#E2#%Ga>2^k5hP(FY+qRxmrYNZJV9j(SZdo44W9w%(kW|=KUhV^> z_w}GhEUJ!>2{xgRu3~P1-}biZoKpTSm}OjfXbdoF^UT7D86qYNEung8=n!*yghN!m zNC+=yvIbEV0j*&6@Ag|xbl?9@$%uWjv=c_VBk%BYaPrC%70;Ct0Oym`I|sOqVS+5` zuorAg4Y}eNxUU9lTCjo&R!lPcIg+U(;_bf{@tg^P4hu#PUzWyJu8Qh@qYfvaMU@L1 zdh=zkXf5bvfyGYQrs1Hk)6UG2=kDbs_Wy468HJ5UMBM#Mg2%PH(p}42AQbzJR{J~ctDR+t7z}L4% zC}r+`I9lj7p53qrKmOFaWFr~g@|erepp&3o(JE$_MoL?>Km@lDdF48hp>#wwztk_qxv^Go9 zOTCr{IR9j1yjLeJsrOEx2EcH(7eP-?mSNEKMwU7L+C9ThW^i^qDIh9tO>7*Lp)w?=5lcxG;dcSDP(V$|+ zC(TiH6+}S7=kKW!G$qzVKQh+p*S#%_)h!&b(&eHXSJiia{r#S1xSV@f%jd4np5FjG%%Y@YcMvAbc5 zU}RfuE*{-XEic3&n*SYpA>CHdH>=D~TnnlA({r{=%0()|GXeY91bon zze2*??zw!z%^l_L#~ZmS<)~^EM_(1wv(%uJAy3vn>(g1C`bFeEA{24I^lsJ$<67>B zW?x*02#nBP*qC^E-TN&Pr=RW){~4MG6Qg#N+IrspMarwZ_n?&ucOYMCiE-NJ@M0SK zL2W@`qE{ivxS((L1Al;Z+1~V@t|o52Z&FR&G;rlA2tY-tOGX8w2 z@0|SJtQNyiERTNrvxOm4XE!XL4Lr8XQWJ%HPcC&oo2Y`_953^kKx)DL40|L8A5>0_ zjW?}c&23ko9QceGHXl{`_E$%*iM|iKFx6|j159q3(EV@z44IG}3{{kWA9Ai_4V{_s zP%)sb(^=lBU!aJyD1F`=87zqE|LYkhI3LRw z?}+D9ANX3o(Dy{ZtU)_A;lcpGl+9QlJ3F@_=GLJ;7s-(W906H5=fd;4*E8PPY55po z_;KKvUt%zwu*ZtWy3dz@{Ff0kG>Ghvv>%(DscsJ4+g`-s=heDE_?XqGjpvwd{oqFY z5;eOiGGkyQW9(i3F+JwCIW7h%z2(;YPAxwGZK73{NhV=CT%*ChDYUbNyq}>CXD&Jt>&Imh2TjS4iXDm9?tTQ z=XLs66k{h47tJWMrf2+YyACfj_(Yf)fZyj|vw4&$h?f%c)OK_wucUO>aAU>!>v zhOiJ+e>a5!Gb%4$c0tIy@qEUjg6YP;j9oXyAj^)6Yq!r_fRGXV`v{wODQ~V!Q2An8U~EtEbu0y`;Ey}p`1CB*z7N;=Tb8uqYcI6 zDUPzhcaop7Dk-1x4t`bp_H&cQwGLC#ZL+ofh@)lBQ39??Lt~Dt7X9n=C?T?TC!a*D z&cy5#-j&G#0T9kU+9(y1ddciYVGap^d33}d2^2DxRj}5$1%oqc`&*O-1BZw8@iDe+ zy>_~tpYBcESbN2oXKVc2BHzCW6xdyLD5MVu*I4NFxd${y{z*yY>}AAAg9%>8?v8v~ z+q$1tl)}T>zj$4^b)*!~gQmnnl`Dg=}HZ@%;4C#<=Gw35&-$TGu}2Cp7u z#4l?`#cH{Cj3{xEhMSKNL7jrUqO$K)!Ir&=c8Ai&amqrb`ctPIDuHW7BWo z{2otgHh#FC#y>;#{&nwcy3E6ro|sx1IU?(Q zRfHG^&b4Rf|HwQxb?Y9`F`I^gG4AXkMXy=|Q&KI+eKF_|!;U1q&Lt=@=N=5Rl>xw^ zg;>l84EE?G;+4cV_kHC)ibBPK7mdtkE+J>UuC_S9cUmy6GfChLXrTuhc32|`w|7dHx=7Tl?wtk;-ocFZ(-QN z2;;~5dCyHu@0_vx!$ScdJ56}do8tyM_uxIA{V_34-)*J;EDG(*5{KmgBghs^tNrm1 zgHkB~Gx$q3)8Cott=;TazQDo?`yY|8@#2n)(!te1U!S27iWS~eR25CmNYDiNN_YKL zVCTGVA>kvD>-$oKq<3F#D!wiW?#e6-B&l0RDz*yyK2Q_yD>zHMkzXv$b-Ht?y3VX& z5b-|t9T*RD$EVY)lrDa*R$@BZb16kY~m3IFMw?PWxfA`SfQs zCe~W-|m5PHIpXA zAl`-E(jNIgi!n8-Z%GCo-|%HU%y|!e-H8uAfh72kXnp*_9aJYOv>_bT6yR@z*Ajfi za9b41^Kxz8@LgjAuk(O`ND7>t8B!}kG zpVv-Z>u5zkZ#yrWe&x2A3I+v~@P~7VRF93p4S%kA-=3YLot+qLITYvIwitQpwdE02 zwwpY(-Ag-cMCCfHUuBBWa%sHH15yt!<@IV?UpQMV4scjd{ z4)C3ERqaL3q%}G`Pkx}B>=dIQdND43R6K-L(i7KAKB*nc;oBgRE0ju)MBhhH_+>@6mt$U@7q+ zyfmJojfI=fPNUb8l(0Il>W_1kd=zo=;Z?LWsO_IpMYYZXWLC2 zng+*pLr}ouEoIdYDV>8rcIhGC{DNy8uU8-TnV)Xz{E?j}ifCW*=B1^R1lb`&FT%HzYTmsO9tKNB1}O~oHZc@5irwF4aR8Ie z8AFXUedpySx8;LIpxdas^f%KqzQzqGlP|9L&p6zD~j} z7d#&%-z~ClP33_hWHQsOWu&?uiI{t3w>R}B|4TwT5OHq*8T|gd<@i5Iz>X!wBtCMH zJ(+y5tkBdNG|5YtYjhdmI!D*1^`4;OHaweYB1ASBD?Ye!{XWg56E`{MB#Dv@ENf`{ zR!jD#B+;-qQEFP=d0L)bQ^9%q?MiV%m+CgYM1err`lEo@@U)Zyb@>86TlJ!`y3iJ6 zQqwvaASQHOAj@Fl=uS<$I$fS-Y0rEfJgXm5*I3KGUPJ)Ct4(iDqN?YB$K;iT-M;9&vvyn@ecmqZ-%l1H19A1OOfvAHLYJM&FRm!>Ea4$x zs;v0skTvi6>{=^MeAH`F%10&7!Gm|B#Urd{O0dlvADC<%8>xh|-JSk=>+-b*ysb5J zCY!LcZ&nnUBjiI&eUzh+G8D!>K@D9hQ9vV8!U869e;osp%XO_^i3Z0~7lpG05c<_} z0CXB&_+4Af7NHGUnW;z_!#H+#`udd#{~jJ~-5?r@OLs_R zkg04L0!z=UU-fqs-;P{zHce%p0%fd_9qOtDnDkFs`_KjoXt}}qG55UG_0Gf#)7O|% z_#q)1zpEqq?_F+Q0^|v4#nmJGYGD_490-()CzS8ayOFz6{L&Cz#p+OH-$Cf^t)z@B z&iyYfJ3h!OW-br6MTYskhn4YK1^S+Zd(-;uuaj;v-clZ?^swZ)&F=rSzWPs75W)d) zzTNyAfmhLK8)KT6FId|-%oA)n{_|Pa3T)+WtwG=J1*~w2TAASPm7)id(QiBqJe5U=$#+u{J zr~xkAo-z1*fppuQeelT}Pf4P=vW&qmkqTKe?WY&VNd@nH9Hc0sP+^Vi>+h4!mL*k#;y zx(z(lLyqVOB620Ovmew#;Fc7F5dU9&Z}^gSL5Sv$t+;BUG53s2u`G$-@L{T1&6P)C zb<_l){Hg6cLXm4=7drZA_NTxw1Bva1# zIx7Z@6NdOrO#lwPdUjhVTjj^B@WLvx;1ru1A&sZtAL`zKFsViq1zHe_?CH0iY(2Gv ze0sQJ)AVnc`B)Z$7dM@s@7I}g*?V+>E-!nFk?Uu&`QCPm0uQ1|wHQ8W^yW5|C8#XN zrGGOJ({65Myv0X`o?&H}eDzFV9k*{eWWZVMw*cPFk}hz3nilk(4Abj0sjF*ugmp?6 zk&u`u`1T7SPQMW!J~aoWnIuz`*?$-ZLmxKMTc6|qh;TJ*EGXVHk_fIR>`_I86HqU5 z8Nvo*<>%$Rrzr|jGdDG9R>Kl<=kOHNe(oikXnJ&1Ae^^`}5~tx@!^fGQtt5{b>w25`(~Dw~v4ZCTl*CQ6RT$=^OFE7a42 z#gYU=T*}y)SkfFltqRfHNE2RiDpoZMQgCR(Ow&a?4tULu7wbK>bu4k#`Gi__ET__eD$f|D&Ji#wJ!@q5I&Mf zBjh-*m2nYh>c%lTK>}U&je17w$I<~XavC#-WJ4{l3h3qU8l9FdOGIm(h6lBg^Lk8! zBdI9gI(j6cRj!V*fd#6TJBp}AX>*nNRU73ebJdx+-3w7RkmpWWt5g#SQe%dt3TdEh zU}`|oS1lFPyA07*naRCr$PT?JHC$s7OOhuxiP_pX7p=9+7FcdqTKxF)Qw^*7el6$@-ZbnPxe z1r-oXP{F_egET;-d3XM29-zd#_s)GhUZD3J&z`gIo0)IEnIALXe8u7WCr<*MR+<7_ zVZlZTao%uQ7A~(-9a48%)mC&gCyT2((QI00M~;7=(P+*R0{`!hBaC!_r5&fAuN^aY{( zQ$S?RrveSQQ@jZ|tu_9$hE=Wf`t1TF4Jb%otw>XLC!7}uY&6JN%Qo{-t4iHOT0oyN|E%~${;Ff0P^+_vo;b6maSe9LYlKlaq z0!E%$CJMzoCC}&A$|lfNCmd`*C}8MmC;O2=S6r$eCz}8zTLYxtv;(uB1_Z87NJz}B z-`(;}kG_<5G+$<{63BJ{vAz*hIpSmN`~&A)$M`&ZlTRB9)2sE5=-i|lN*2zGTscfo zFkf!fzZ@nUa+)Yq|4m3pz?*kbc=J9Ak6yilhtF$x`UGfW_)PavvtmiKtXmlkYnH(e z#q+EF<%?D>G1*1izmu)I(z2U z0>>#`WE+5NaQ;{%Pp*Uw-j4&u+MT|JnAmuY#8j+MJ`CyD0Ke3)g!+|BpjxT?$dyAg zF)4Y1kce3LheqOA;74pc?h)tZ7nG%^S-BF0Fl#^yG^kbzHOd!7nZkLHC#OOqSI2*!zDYQI$t(J0&<9~7sq`pDcbaIn^3sCP8ATE>66vds*%eQpBFF4KWRIOU zcP`8t)DlD6)j_SYg){~P%fJEeV{pa$O|i0JvVw5LbpS)hO*Ez?h=(rzbcSd!SxY*go@+@rB0NLgqItv6#2~dQd8XjJL zvev6ak%Cw?r3<<@u7t9Ma>{C}4Pu`+5m>bA63*O^$9Kxu^M<#@;I?&8uR>wuG|}x+ zeu`D{cbY(7#o6R4$%ZR@7hqdF z?Nh}h@R+~*Dy&X=GIw5~RADR|*CDZQ%W83j^W-piI}T4s;D+P39?#!-r32d}xo|!{ zri!6nw~PWHN#ICuCcqbuR5?1w+0`SXx;Oekubay+Bnm^9ABESmV77e&;C~Z3M$hWg z$RuAb6TO{w%*>`E415=Pt;gacjqbk)WB7w)xH^f!17xdPsHq7+!STi2oE03obLZsm z@0y~hUP`anz}=T0&~(ZU=Dk*)MsJ$!J?LHa4TeCcAivvn*=7R)8RHd#pV;8i$GCvIaNVd2R3;eYgRRHS%* z-M^|aGbxWy*>B15hi5$e8b~!$IXpTp>?cL1%ij$aAnL$Dm2s++OBn$vIG*j9n5Fg% zmPL9T_z6Favtl6yJ?)MyAExMTT8@cch{)FYDRy7DhnV<8OzGJWV>;APS^D+;4PSl6 z;joKu7b!kCf^kYGa~ml-UHz_q$*GyCI&iSQSk`R!ajQ{wv69`5pA(*v`kxG79pkovg0pKyZcp@0ErjxxUgXsu^_8kg9FGm zx6pg3U#sYBs1cA}t;D{D)yv@Q%AqJ*B#$fsXq#9LIR2U51G9S8g^5D*Wr&JbV&VpS z9KP~Ea4N0pSH-n|25Wn&8uvHupY#6vEIuy6Rq9KL+jVmX+j7 zmjr%qKi;i9etRQ{F>QHAbG?Q}8w5a-4S_FH+d8P=sA9f&<6+TPtC5{eVLPX*F4tD= zSl$0R0SC{gqI^(4Drd`aXj(OM=8d->W6^ujAts~ajQ-7GIhiIpF}!cnsXM;2t(|@p ztXGnAkOIpz;b$Qp49`>y4TZ}>{R1gUG%{W%d@h0Xj!)+PAwlS+mrZN zXcRinvqM0zbmGQ^Bidr6fxKLa3CH)=rcP0VT+Itk&@#r z8~-a74QV1tXD9??)}Hm>f7wUu#X@hoh+Y9=7}>U_&KEIdz&kHL;AaW%+%^p=V`9(77`5`aB%eYcarOzuuYa()C9Rp< z1@rnFgz;H&zUm0xzWa2q;s`5|32@=O`CFw3#qQKKcz6qE`S9K~6?H4<$ED={t8g@wi0v5E!4&)Ebjjdq z&k7Ry1nmCs6%#nNnDxTcZa*>6sv}BJ5=`52341Qw$?$WZUw*_lV_&HXnsXy;%UPW%dnW5J?K!ofbDU+DH#*W0q#jEA3N|~bYvzZJ|=UgXoH)Pcr z9J}f(C~s;hzq@k^YL-@?(2*4+EDM@hUoLu8oV3va|2cUJ4tICwR5Yll+doD#w>sV4 zdghMc8?~-2>pI_RLJo;^mAoGZV8`K0f(y3%w_ow+VEw%ByFLm*TQjw{!Y}-$zgnrA zh&DiSaOp4%ZlU=TcVw&*zx{g=$FDvV#p3BTqtUZr<^s4_z@D1MR%Ui$cW9ly zX6XYUY7K)_NK&pPZd)dxd5scsWv&(ajtdUL#Y^~Qjppw?V&01>it$go8=u$gzsiuz zAS3ICmkr0j<`p%bQ)H|%cG&7OIWBrUkqnv%I5-PG6w^G2OA{s&mHgY>-Pa0wa&o{` zrK7pdoXd0y5E?0{00f<@{@Hc}AFQd5y-s$I)j`<{3{4ivPB@Q&s> z+qXI!h)PWCdPRSqy=q@Vd_scSYz1AK)xw44x{v3lZtN}1>~QC4px~mfp3)Wb`^kT1 zov^_kd+pikdLCLj6oXo59zXK>LkxOa9K^$y(w6^@O{(Ld1-lzerqH0K@rDyOugu*p zoL5VidWcQ|BKCSk-Abr?iO{!dau+PngCXpM$4d-aBFq<6%mWV2fZQx3iw}5W)jnza zNQyk9Ebd~P^hH=Sx-Qs{=Wjnq?&Yq{YT|%-ZxqQZc>|N|OH%^x7opc1P2D5-+^fsP z4mtyfDxWTILiG=|-|dGlg7zMF7L4j~TsIaS>j~PBG+hhPcG2-X8c*Aer>})mo9S)0g2Ds zNVK1AgZB|pl6!YR+n-=Fw>$C~K=u>LY@y!kKSjkQ6jH~yE){j10YuFAiV9(q-NlF} zF9HQ0-IWdtB^O!S1bvsC#98+zg5BoLlM7xuCxbO}V`jl22PEFFKjD`dyAc%=Cn=Vh zgIZ(F*jC7`VWA+&0W=`!xAeI8nHz%1=5%H-)FD7ZX~0WcAz5wMd!9Ud6|9z@y4A|T z+iJ81V%EG#z`JNv9kEHW0}7Ix))OTQ*G$`b8Qag?lI%~R;K0+`XcC{8PIB8n9PMW9 zkxZ~hhxlV?8&ygmUDp?pn%~ro_E&aX@Dfabt*e(TodINc;W$jVl*PlMI*@9OX+C zhV#FpW2%+Tud>XsTHI5gBp2_!MbCx8p3tc`+n=M`WBG_?+Stok(#I})uOpK;*b64} z(p4C)ZU7<>cb-bJ9@CfY7IZIII-xTb57J#AkeB}lG@i_!jXh-^d2{C?u3LWNOp{L% zR&daakPd4{qDslMK3sA@GPQS83|?}OX|paJ*Aa_{$|(lL)U8&DTzy_!xBcV5RH06@ z7eGYZ+o=GeqT?RV|7U+~Az`ea(GzAp>uPlY#5!Ac&=bpT*liT4`=Td_>!$J8aqbS2 z&e5uVW&CH+2R{^5@6y2v5?0}?oY)Bq2O54z?p?oNo2I|p2qeKDmQU}@s$=_4DU~WI- zh&uH3e|Mzb}6&oje;x2OfX1-+Op)|mwfi>Gm>C#A&>{N8>%S9|>S zo+4f9#H&|V01(Q>fzpLaQAtON$XB) z%uoL|KVjee9`Si|Dr8mn(G(>AEggm-nQ)KSc%qqT7#FWRmao@81HS_Vxcc;EV5^P$ zE($vT+}kx3^>q|Q*z2!jxZwFra9!f<7b;CSnCy0Xq@1+wwCwbV!+x!g-LtzQcMi#v zx@vil3z8$thhsn{Jb*K?$1~ORQ%u6;qJ7tkrG@-PP7p$_`vnC5B39nOYv&}?tC;mC zNL&Jsd_C6+F6@wB8{)rtUyCH|c6uc1BpKJOA-2!#oT)HYIo9}A^(x}zGWi)CGqtm| z)cD<}7_ZWUHj24Oe%^~e{EU=2QB)bn4XIY$;Hj9(1ZGa<%p)Sp8;*dojjY}^`PE3mgYYyEw`RCrN zf+3{e&Iv+r2OJu&+IA9eL)1sSb!=J#j{g(%Thq$2y!jB5P-)mkL5tlcvtH=lxDx73 z+`;4sD8&>DNLay9IDcMD=+y-44_%iU7E~uWwy3Y(gQBDuow3DnpVisBf-cIofSzDqo@HKi8=$%4IZSjVv8OBOA_U$-0=Tcb?=e5_Bv?Hg6csipn&S~@~%v09ng zUGaGI_S;9+$od4FCr>W^mi46AAIlZ^;;G2$isH1CU>j^;N{y zrQFcXZXq9|S_#m2^N!~7vt+Prgmg5zdc{&(y*7mx4)8kXa@SO>+}iU4Gf}yO`izAd z%sWGq36_qLdoSLV|Gbo{C!2-+Fe+6sQC5(oK1o=?K??|7{Cfl{70>wS#tM>F^{c>s z%h1^Po+j8JeJ@pUlD`pGH>ZEavrtjmup9N}sMA=#N z$8a?z8RURubms<49>Av6%HZs(p`x`JSwYggZe?6rGZ=YuYCLsKFd*6{GBz=?NS}3L zf2?$3B&1C0=mZh><^{L|@53WUh^75GuxKEL{vw#uAybQ#$P+$yx4$*sA!k;NM32V8 z&Xl{Id@*U=nN0DR(zvZ@6&zmFk16vyD@dCDSP?F3hw3FMpE{wu{SX~gao8ro3^%$m z66y>fQW;Hn@OuWNopCkP$L+AUN#RR@6!IJA>W zUhQc;2~DbM-)T`3fLz`%4()y{Eo0e}NHsZ0Ms+sDPO~nV$~?jf5}HBg_U2KU8cViN zQZt`+o>)}?~3Yk<%sv}#Ksaliut)RQXSxng2xSY$zwO1S`Wwj7T(bxLWx z54K%=fa#X!nc7e2*%;e?@1&KQD6Al84ttVYX9h{rS;1|s(-VIO~)xm&Cjq0SU^ z9Rnof6u|Wnlo1C%5Y!OUL+Vs6g@@b6Gl*Fpi5!4j-8detYikaUpomy>U3d@=UxY9* z$zpM5>L{6r6(lt)mBzzuV>9KNFNd!b+IhRKz4`a3yWoq5u3St~_|g7_UO*~RPrcx9 z5(NFE^pIxkA~+DwM+Go#SHaw%==FyqK(NYjK=!9EkW?;T63_PhrW1Pr%_Ura{8mBP5a2X% zH18{0c$sLRvlE2!D5j`WYdQgbcpv_`gqS^~TZ>vaw^X}zLZkq4YujWrs-k&`?q{J< zXlG`Fp!boPSSoSfEloORy>3+~TO9s26Ezt^R-4V|AH`+0#dGN=KItM*kL7HJozBW*?*CQKJ99g8iNR-!SxUD!*u^_p1mMIHIDZ zGpz5J+eh_MHSr(mY$^Hz$;Z?4vMiS5c}OH`jyA08l}>dK)d?c0hY)*?COMv`A3zj zi_PW7_-(E5+*8`=10-2l)N|$GTlj0wWx+Mo$Ms6*07<@P(IZl<__hOpE@A;xv>%s^ z+{QxII*ZV(GKO-%3K0-GiamNrS#{gsEo=rqTMWk{$4M@qx}&QCCA z%}L3Abaj$kTss<_8)QvpnGL7CG1uy%*j#OSM{~hEy^=!81c6R<5SD8e09w+iR!nR> zsIndt7cV%yo7*R&ab?Y4mr{2;cD+699MxBx?b5s!E-aINIdk+5Lbv(0Ov@n#j+71# zTz!hst4>Jvr)`iN_jn1*Bkpkbd5x|=*TAxI?X$$ihfeH6R3d7PwZex_!jBlbbWTh! zY@Gun>6#Vh4-gTpm%9Rx4tA%mK`hE}c;|+&oAWi1o8(RsA^6MA9V_<>pI8a@3q=iP z=kL8mZ^qgjdl&Y@=v0AKVtgOG=7*6hk4sKX+aQq~P)h{6FF(PgwIU}aK>+V$u6h0I zO!BEGfP_j#7&;T6y;NyvI`=y}rogn4W>2uGW%u9pXBhRrV}jy*b;u0m1&WBCzWo~g z|2)976es>SJfcrifl^cgJsiI7hvEOrejo{tNyLxiw;|+%@RPp2l=GCO&>W~T9v|8E5P zHWjS$Alk=K*Jl{ILKwg)jg9Ffv2}im@oPk`ka|8ns7&<&kfdu?sGxUm(qfZi05?#| z!#C*^nGDlPnbSo+$0nk1pLK$p)Ov1TOzM;|hUec?UYKWXFA0#$fFq^zbgwgXS! zsL#zcq(g(x|1Id2A=qisCMWDZe@Ap^ZGa?t+^y`uzM1c7W{;zL@r} z@Iq@794U;Q@_2y(ON|wCH*Uh`8%Xk}g7?a2(fc`=Lv? z|0F)vEfdhPMp_WQk4iwJ$-D3-EMuPD ztN=%L0LiRv&e(F&Q}`4#0No>nIlTg8gY(BCd2%KAi(A&oX&Pw7@}jkDd`B!AqIvaJ zDX-o|qdQ>Ph@Ueo?6Z(4<&YJ}lwN*8Di2DUC1l;yE@)k|xa3tRGXy8xpJR}b=_D8K zyhbkz@fSaRzg!v26)WkQCHdqVPQX0}NMk7{M%tg-)`@6dU9*iz6IlO13wR26-c~MK z6wmffRvZ3G{kc9yC#YmwG+$1gMdHbM-MY1H66%!IC}%`waQvlh$ftNTnYIgoVV}hM z(^=L;mPzUL1fdKvo+6h4t|NjC$^EAyV~ESs@z(PYL68on`zW{RyO+Y>Tz}5#sB~y07*naR8x#% za7zh0F$cx+iJb63M?gY~&rx&9Y*AP5U$mfUun+cnolb08&os*_R6A z)XL%L)uf_Ea%nu>242t9XPT!S1|It(rgXtv+6|1?h|{!-4p?KEi zI94}}7okz8Gj^+(w=O^x^MqJaeR%AOiQXUpl5~oMO4&u|F>(grdQ*jc^|q6uj*K~T znBc+gsi;v#{+-+Q@?(q_iOH~>(E~Gj*3-h4)_xaaywmIFgB=ren)50;o<~>ngK&HJ zT6D6yOeZQw>IMUlB#?;PMUqM-a4rO-uT*je+F$kZ#o)eaEQ%M97oPhrG7hB&ZV;4X z$)W}DWbYJ%EoWxu{1ju=xNw~Rdlb5wmY1_XGEF;W^Cj#&N2}}!fBHzqz&bI*0*FM! zA)OQl;sYph5|Elwwh>C-wOK8kS=v|jt5VO!$8qtdpP(G=77fJkEJ~)$x_DxA&c0#T za?%5*uKA#Eo1b7dpgDf2t$E5KO?cXL_C98Bxgg%uK(AIQOdAwHlCN5#p1w&S;m#9~ z9`sdBMc4Lm0B&k(zmf1c>UYB^|p?$*7wO&8bsMDsCiY(rYGn z!My$rB^U6+=XjJHAe;&)r2`t0dVYoejBk1N6qh~5+48o0_RX7F<5ITY6$U_Peu{1%{H_D9=w4zG;2AlJO_104h zWkk0o*fG6>XxXu*zuV%jUl5ZluW$MdEoVSC5sU;MaIp3s)WOf`=dh9+-k)>euLv@Tl>4rmd3Y7 zW}{4D^?m7hU3D^CB2O@HuNyWUab+6M(EO}em^OHT$k0cqyTToCXiQ(WENw1`TG~^D zQ>J)9Tv|68b;@PDaV{iqxe3b{)0vCMo;r0IuYa7oyS?XM@(}uBo}rj zhLeem0w75zi9`XOFB9UN2}pZ6AfX%k(2^nO*(j}*St`?sIzd+{UlI?tjYZx}1a8S$ zKz-2Oe)$no)}O^azd)wpjTIbpaz+CXR;69FVjLVm&_xbNXtS9ETVnBumME4lsfPVk z-w}Z@6u{Y4!_ll-F+2{8#82adGmeYxRq6-k{O@R#D@4kX^AmcL6kFiEC$F z)nWzn;zMK%6M3(ewXl9_CsZrN{A$e9ueOPl1j@SspG;QlbHRBxUs>I&YM95z_B93z zIqSrX79bjelvskBv)E6|K?qtMx-MRIgYH=iQm_<=DS?5V|+6WN@)0 z2}+W1@Aaqn4aYq5A9138OJsirk;h6l*Afkk8X$CTvR=2o3ggcE@W^^r2OLT8yYNg| z_LL3_vFzY2EVmJ^j+A~4N*61DrQ?4^pXSw2x}fgk!&CDUlR$V+zp&8%9k^b``L=NU zi{L&Y2vC?{Y@)q6^?1m3pV0&4D@fvPX#Ol2EA$*dfn)X_rN!zYO7-__|BQ$#CG!{F z?eqwf)=AeFOx+*VaV$o)!_c;MP_?9PL)>3~jDxfHtM~sLbS>iRAHr-5P0hc`BR4*F zY<9X*rC;xC0g#kQF?s-J*z?q0vhUP2CLgZ!jor3RLi6gyRR5dSB^_e9=;62?ZD99!%y3AHdBuPsrhSJw;~$X zDvvr9i=$A1wAZnixI{dB5rUBLXw|>FPhKN}@pVlKtSP_K7b;GHrP)>25RyZ-1jrY? zBzJ-(}4ig39F3gwg zHY!euGoJo&i*`Ag_=kiic|#ib$2*#T6Z=DK8NMk2BcyG2o;INcA#0Y@*KxTd)xpVin>S;ZaA+hz4QhTi`-1(1}*kbCWt0?3O4 zGf}C8{Cv0XKgYw(HxPR++{4)$v^>1-zP6@SaMkOj;DFx&k|dgM5+EtNBI!w(TPmTS zeDw1VDr#vfoFUMC>qIouuqFxRB{VVtC*7Xn-@~qW7Wh%?D9N4E1V7iQfY$XZp>@5A zXjrubN*BrvlP+t-#>$qiBXWiNO#_4q%gQ~>j3Y!a5ibYs=~Mr}nqmO4G4CHUs$EUl zrf{D(5jf=Hi?#n<7teeyV^zB}tA(m%3!`C;vZz|7FsQ$nx|o#Eh?o~;2XCw@e1wqM zyn_Y3j(*eMHxCeN$$Y@v9a`OL`ZD26fy;jDghhiJGi{`(cqJ}-y~eKdcX8fBmK(WX z|36kLfnn``g89%E%ocbz-=J%4X4?uDQ8C5@3rq_jljxfVNV4KCR`$pPK=Zk4>;x_B zLpwIWf%)A;MeqA20!OYsg4HQcy#K`JA}@0-Rpg^PH^9W6jnSfJDN(RkoxOKq#ukU} zLSqp zu~G|E2@XE?2MXm$!odAk;jppyg4L;;NKo>c{Nd7Sn*nWp#N^&h(DtXY$e~F3o7m0# z@IA-7FNJcjM(~d2MYPIkqraH{hLC zwnP0|m5?t_F3`G+F>%cC;DTcpFO(NE2QiR7wJV`P?Mk9u(byH&+fSlyK6sWp zEKu%f3$hvs!vFHyyd z7O*8Cr>3ql>siiaKU^&69%65l*)vPW_*{H-YO7Kj z$C;aSUNwe5l_4ghBO?bJ-oboaX6IpO?Y}*MbX-+jVZylqs3o)*rArh>r|{JEv20Z2U4fSx`V3-KTmkPRvmmITHOfI`!yvDtDd@P`#oteg3?oc@-u~BO%JR z0I_xpnGcRrh4~Sl95zW%9-F*+Urhzz3J`ho=D4+dTVh7?k?|5rU^HwjPTPc^_e_;WVCbz*?oF z`5q118+@~E?xC|DzX<%_3CEiSsBuxVj|=A&q+xb>-O6?V+2$6yh5!rFFYXPmr`Uh` zx@K#hsudyR3<1^}>$OXr0O+%EbX=V6aYv7e)IBA$9|3oYI459KJ2S1`@mksR&wuV7ll1r0mRxZ z^ca8)nWRr&x&=qK`+|#_H&>2Wg+h@S6&o+N!sZi>V6oE4{HWxPF)#vax3DFzgTm(Q zKjT_Zlj~HAI^{p#c=T3GUfDun&o%(Db`2W=j_gmr4`03s#ri$xK!|Xy^Br^hd>r1c zX5tdtYd-6bddjvFa0*2qrTv0428IE(>?Fs&?0p~px$^4mCuN@+of}tuyKh0ykdTj2 zaSbN#ZXr5n&iIqhWeb38zfJOyxG*;YWKh6&9KNLTVio$@Hmr)%OZ%f>o}}=JXF(A+ zC$2x2``UxoOqOZdh6CJ`j^?cm86YXwDFQ-W>S1^48gr2#N?)mT5&Zjmcl7&1>m`GK0c<3FsW`4`Lcl|nnblPTs6X@U9`ghNtn9Ut5nzy7@F zRm+$acB2P~wOiOefQ(AN0Zw1O4M$gR(S7Y}Gaa?cisw6c`1<3k1{1b_y;rF1kzd9; z{+ZzfV>x-UiYD3JWUo;Fe*Qs_%F?oHL4S+&Ls`DU|TnAYtlNg;N!IEE{Co{7+LUVQGN zt#Ed7v}9*GB1n!%6fXY3c+H}jR{Zu&N7=&Sc_6%>hq^YJwntnCGg5`!cmYBPXYC&9 z25=dU_nk*B)5HaW+p$s2a&b<756fL7Ury02d&K=EhAk6M^}})82&Kcq|8%tXnTAQe zTAh?4rrA)WQW?z{*bN7&qXmeSYsfr~e6e z88IGjZl8?CmBrsGBBJ8%mK?aTk&+k9MQn5myHNsUmwRaS1Olp9zkKk z8GI)6YJ%;*|0=m>mma){6*gDI=;C>zXa%PQwg!EeZxp3=e-u3jrF;^cYfdOC|W4R*c5i71c;Se$aW6gr1UFw=JIVgNGRs_cTdGn zKZqv^x&Jx>4JTMjZR?f1qxm8!B7OaC?G`E-W1mvmf!c|vy-4h{u^50+ZEJ|q@H`1J zow}!hkAIlp%LgHFAx`FkWf$}%FQIXb4j|jEhjt|jTueV9|F>aSzvnD?Uf5#3etI{U z^_I5(^;v!z=iDBNt<^)G=UU^^LKUcnHU1ed?JzLCb)B73rouYXZguhcOhoe^$adSp^Od{${*nz-zp9DK1z)9k0-rvx{ zk;0#N?Gw;4Z4rbZ3P3rU&dAwQymtGYol{_1QM|U!yNKw!r3Y_nBq}2g8+iwFnryUZoc_jBw{HJoeYuIKFbUt#(DQH^ z4M4WJhHfA<$#c5z?3FvPzb>AV>h6xoXi!P~netI!B_AdAUl#wh!%K%^U<;8O6hMu%uWF9nR`g|Xgi$N(Mgfp*ZlP@mkl_wR6?1Aa7khhO zIk6KK4wNp@JmQ~=ICM$WHRTDfB&~4SLep4Oy}^b>VW*DF09552q!jj&Mf1aV&(sXg zi|HqL{o!l3c5@E25}UZ8E9}Mr5cjY%gpgk81-wwRYLRsdexC!$m#aaW0p zUT@KJft|#anM_bRS_l_Q*W31I8`#P{%#0(1IxdQQx zj{`yl*N^~biKBUM$=zV!1PmGMKY@^Va9jx%h23lSRMeBODTRbb-6}U^b5n`GJ_f6> z8#F+yu7?-p6!Fwzo+cJ6MyxAiG=yr^6Uf5*>YZV{dkVFfrCZn zGd}1UKvI>oRO}JBfI~YLg}rCXIyk+gkL0XY{^xf8FWc+&MHO}fE!tzy0I_xpT?xQK z6UE%qdLo)sEiSrvej%Sxdvu0Z;(i;i}^VymBLPO7Ngo? z#YpjRX}VC8w_d@nGdIQVVP{!BCg`0b-uR{(O9FLqm#TH%Ne3yM+w}$ieixjYTovXE6XHB%JD^<9T#k za1b|rUyCW`7m1^Jcca+x8ZarTuygnX0_xaSm?go(gFVymV|l?Fl#0XP51((8AGSs6 zXg8?Tr3MF(O@1VI&d@Nbn5X%Z6dRwQvU!Ld_iY+ffy3&-$YmlvtsPE}F?F5zNv_}& z9TFWDIBT%?jG_sX!Vb{Dnl>y7`-sjBv2RWn$+?^FcDc9qh=*wStszy}H8_A+yM_J< z;D6~Qea`s~E?yJ2n7eJ6faWzyh%VC0uxQjAy#>5@V9zGr(R`NVY8yF$wOhz3$=Zh; z?t`E{O99jKe~(62({iFxiBC{ID>1;bR8(AoQ7G&N1&}SSK|h&rCiL`3KhX7uoXpM^t-Wd7*mt;RVcAfs!5ebkX4*{+& zi^5*BLJ8d5G7bgvn23&j#@)}g-?HPPZo!74up1OWtldIs7LE+HD0Uyag1bKAISBj@ z&O(J^c|{lI>Z4F}Fq25mPPpHBr-c$uS(1CtXb7y`SZXtpD*)GlMPc7CqX%a8tS2@9 zxaKqWeYo``Fl|Dzw5<$6VK*3nShcKhAhEzDo6axNhV zJ*tn{-dsYKdRN#D1|ZgMp;RGElb|gwo?6Vs6?4<-W#MKy3VCv-N$8$I?)zN)Fm82* z3_)q=6a-xooy;Ax8vvx{!=|t&`Dw8z?7#JFf*muYNYT_)R=lJ6bg9jhU4Lg$ z*f|al2thqsD&c~}x;U;Mi;i{0*Cj3?@o~PM>uQV1RNu8m^bU}np21ZT6IC@m(%eU1 z1-(-}>n0=$E9T?6H^#16(l?^N4&21beWDpk-tr2x&MsAvGyyS_!p;$25Ki?Mp9WTa zi1;ixRD(n#4h$nNai&5No$kst`|0FX=tUoN>qJh3Hy8 z+dl(UN{ZigJ^bFG)$hB+_YB9G@eT_&YO=AiQyV6Qox@cSv}IA)t^VkZ$z4QlP)Wjz zsyks<#G}{m#NLPXmit(*0NLgm(ur_fhCBc52hXurLNVVkqdR8y6m<|qf|6k9nsYdH zO*qclP@UxT1w1K*9Rxwt9UdS#r4nH0&S`>2wlh$vxVYPo-11(1UmMcU#$`%dntY1T zOem|jofM5>pVqHAHcye-`@rb6XCEH8?4z=`sQ>g+98_-r+2$HHg>WQ8b~Y9T@WS7t z&_yD3Xkd6OTFrF#)N~vR>D>Oh8Ks4~Lle zM6Uw9)`?ai)`!Bb7l7>a2q~SIRMVqc>do*v=)J0@M?ylP;2s&&z8(%O>>;^_Rvo*G z#XCh`Y(sett>9oTmbzVXoa{)zk{zA{cb9;uQu|0L?Cnge;QapvNj}BzvG;bIxZz@& z8%28g>RMsf3qY*hLe>G?oD7QjacA6lD6W|M?46F<<-}`x-1Yy6rjw<-)X6;F(PCY8 z+~C@n6O+Q8?99lbu-jS;#K^X)oDhN^Ata*8C~L**uuozOtW$+u=K!(35z-1gm%$n8 z_QMz0dtBUkcICv*SU6BT9~sR&I`&@&9B>r2pKu&pl@8`oRim`A&y2Q@b2mk)w4TD=(7ks@6i;PF71qboq zd63vSzL$5h7_ZNbXG~)=DC{&(EB(t>jYVPiw4Q_}Rf`FV;EI?3tr=EMwH^n&7mdEs zRX#190c4ZM`$9RDiL@eAhNrxDA0x43(-Ee9)2V3T@y6V(84|yz z>X&@rd1Y%{S}dBnor#fegos692cU{!XQ?&P_2(KmxwLt&u}Z24hgmq+D{b2|RW=Jix5YVt?2&3Y^zbUSFL6 z#M(WyA(ARW2?lH&z33j`a`RD|#MDyzFrQY&0RR94(n&-?RHumv_AKm&;ccp8%9bnG zc~&?>2?x$YS-5Iz933p|+$A;OH~KqcCKQ_ar8JAeUZreNxNjbZhyL#{Yl}U6{e_eE zsS`N?P7_D-zPeZr-2lWbWGldB@VELh!KBxar{|sTw7%@&qo8i?a=x~vRdLlz{CSvD zC*rMk*|q8os? zhdR>~GE&mufCv78VL7ked{o=R+fRy|{dWR8-pPD4dxP(k>Lehku&XkmaNz){$fB^z zl(M%%0kcGVbMfdonVm|J8x%mkGD~iH`M#>*a`RzPzkpz=IY|BfDY;zQ11ZAqzl%$N zvDOGJYTATFVP}+g1V><|bTXGnV#e5;Ofua7#5HULII>?3Zv^B$2kwcBr%y|J*ZZ-N zpQFWHLIpeL7W0k^Gh|7T!^?NtG*>Oj;-CQT0i@Pt_lN!`oNh|`y9+O!Zm(17_|OSJ z=)l|DLdOx{9{}PBb2D=J;KQe=BF;A+R=DEvQ0`v6!<*!9g^M%eqvy?dm*#6@tq*9)Lb2vV0sc zROx7bn1%K`4Z8$b6!w(fSZa-=&~h9X37*W<*L6y-CrIkSx4DH5B;XbRM6`yT(2~&< zq?d0z6pa}Hhl9L>`Ed4S|4u1K0+OjqQ+38tYXmxeonoDy0vUk5i!PDZNlakt#L%a!Adku30ECEVfctu3^(D&a z*3*8eBpNa(bIre#%a8zz!k)G}E`V^n*|e6W4XOr+*pv+hAe6~1o^OihQ087h2$?6f zP6QY~tyL+Ss`UG(M+q?18UZ2zVmY-{>7{yPRimK|3LsyuU9{{o!9sB8rgl~YC#SY9 z)nB6-e{ZC935YA~t|8i934;a*o$N06h++wRd^e8c3n%jA z&hNjJ@zk~uzW1jc2_!`z!W6v1#n^$7B9Z?CON&-~Wupmn00000NkvXXu0mjfJv-}n literal 0 HcmV?d00001 diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/cup.png b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/cup.png new file mode 100644 index 0000000000000000000000000000000000000000..1e1fa5cffaa371512b3f8e32719ba112386df30e GIT binary patch literal 12210 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 A#{d8T literal 0 HcmV?d00001 diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/frontend.png b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/frontend.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1702946af657968905ba966b587a0a729ff022 GIT binary patch literal 20709 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 v!evvV?F3g1`PHsvbpHPv{@dYt4gTD literal 0 HcmV?d00001 diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/keyboard.png b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9d00f047e6c9b29eda92937ca4d9551752c61f GIT binary patch literal 3620 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 R6@^Y^Y+&}+TRm6A{{W>aY&HM@ literal 0 HcmV?d00001 diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/storage.png b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/img/storage.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd5bf0d0a2e4e811e481fbdecd0aeae0e724987 GIT binary patch literal 21007 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:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(n){t(n).trigger(e.end)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var s in n)if(Object.prototype.hasOwnProperty.call(n,s)){var r=n[s],o=e[s],a=o&&i.isElement(o)?"element":(l=o,{}.toString.call(l).match(/\s([a-zA-Z]+)/)[1].toLowerCase());if(!new RegExp(r).test(a))throw new Error(t.toUpperCase()+': Option "'+s+'" provided type "'+a+'" but expected type "'+r+'".')}var l}};return e=("undefined"==typeof window||!window.QUnit)&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,i.supportsTransitionEnd()&&(t.event.special[i.TRANSITION_END]={bindType:e.end,delegateType:e.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),i}(e),L=(a="alert",h="."+(l="bs.alert"),c=(o=e).fn[a],u={CLOSE:"close"+h,CLOSED:"closed"+h,CLICK_DATA_API:"click"+h+".data-api"},f="alert",d="fade",_="show",g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.removeData(this._element,l),this._element=null},e._getRootElement=function(t){var e=P.getSelectorFromElement(t),n=!1;return e&&(n=o(e)[0]),n||(n=o(t).closest("."+f)[0]),n},e._triggerCloseEvent=function(t){var e=o.Event(u.CLOSE);return o(t).trigger(e),e},e._removeElement=function(t){var e=this;o(t).removeClass(_),P.supportsTransitionEnd()&&o(t).hasClass(d)?o(t).one(P.TRANSITION_END,function(n){return e._destroyElement(t,n)}).emulateTransitionEnd(150):this._destroyElement(t)},e._destroyElement=function(t){o(t).detach().trigger(u.CLOSED).remove()},t._jQueryInterface=function(e){return this.each(function(){var n=o(this),i=n.data(l);i||(i=new t(this),n.data(l,i)),"close"===e&&i[e](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),o(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),o.fn[a]=g._jQueryInterface,o.fn[a].Constructor=g,o.fn[a].noConflict=function(){return o.fn[a]=c,g._jQueryInterface},g),R=(m="button",E="."+(v="bs.button"),T=".data-api",y=(p=e).fn[m],C="active",I="btn",A="focus",b='[data-toggle^="button"]',D='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+T,FOCUS_BLUR_DATA_API:"focus"+E+T+" blur"+E+T},k=function(){function t(t){this._element=t}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=p(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&p(this._element).hasClass(C))t=!1;else{var s=p(n).find(w)[0];s&&p(s).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!p(this._element).hasClass(C),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!p(this._element).hasClass(C)),t&&p(this._element).toggleClass(C)},e.dispose=function(){p.removeData(this._element,v),this._element=null},t._jQueryInterface=function(e){return this.each(function(){var n=p(this).data(v);n||(n=new t(this),p(this).data(v,n)),"toggle"===e&&n[e]()})},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),p(document).on(O.CLICK_DATA_API,b,function(t){t.preventDefault();var e=t.target;p(e).hasClass(I)||(e=p(e).closest(N)),k._jQueryInterface.call(p(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,b,function(t){var e=p(t.target).closest(N)[0];p(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),p.fn[m]=k._jQueryInterface,p.fn[m].Constructor=k,p.fn[m].noConflict=function(){return p.fn[m]=y,k._jQueryInterface},k),j=function(t){var e="carousel",n="bs.carousel",i="."+n,o=t.fn[e],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h="next",c="prev",u="left",f="right",d={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},_="carousel",g="active",p="slide",m="carousel-item-right",v="carousel-item-left",E="carousel-item-next",T="carousel-item-prev",y={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},C=function(){function o(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(y.INDICATORS)[0],this._addEventListeners()}var C=o.prototype;return C.next=function(){this._isSliding||this._slide(h)},C.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},C.prev=function(){this._isSliding||this._slide(c)},C.pause=function(e){e||(this._isPaused=!0),t(this._element).find(y.NEXT_PREV)[0]&&P.supportsTransitionEnd()&&(P.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},C.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},C.to=function(e){var n=this;this._activeElement=t(this._element).find(y.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?h:c;this._slide(s,this._items[e])}},C.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},C._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},C._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},C._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},C._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(y.ITEM)),this._items.indexOf(e)},C._getItemByDirection=function(t,e){var n=t===h,i=t===c,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===c?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},C._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(y.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},C._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(y.ACTIVE).removeClass(g);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(g)}},C._slide=function(e,n){var i,s,r,o=this,a=t(this._element).find(y.ACTIVE_ITEM)[0],l=this._getItemIndex(a),c=n||a&&this._getItemByDirection(e,a),_=this._getItemIndex(c),C=Boolean(this._interval);if(e===h?(i=v,s=E,r=u):(i=m,s=T,r=f),c&&t(c).hasClass(g))this._isSliding=!1;else if(!this._triggerSlideEvent(c,r).isDefaultPrevented()&&a&&c){this._isSliding=!0,C&&this.pause(),this._setActiveIndicatorElement(c);var I=t.Event(d.SLID,{relatedTarget:c,direction:r,from:l,to:_});P.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(c).addClass(s),P.reflow(c),t(a).addClass(i),t(c).addClass(i),t(a).one(P.TRANSITION_END,function(){t(c).removeClass(i+" "+s).addClass(g),t(a).removeClass(g+" "+s+" "+i),o._isSliding=!1,setTimeout(function(){return t(o._element).trigger(I)},0)}).emulateTransitionEnd(600)):(t(a).removeClass(g),t(c).addClass(g),this._isSliding=!1,t(this._element).trigger(I)),C&&this.cycle()}},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},a,t(this).data());"object"==typeof e&&(s=r({},s,e));var l="string"==typeof e?e:s.slide;if(i||(i=new o(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof l){if("undefined"==typeof i[l])throw new TypeError('No method named "'+l+'"');i[l]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(e){var i=P.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(_)){var a=r({},t(s).data(),t(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(t(s),a),l&&t(s).data(n).to(l),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(d.CLICK_DATA_API,y.DATA_SLIDE,C._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(y.DATA_RIDE).each(function(){var e=t(this);C._jQueryInterface.call(e,e.data())})}),t.fn[e]=C._jQueryInterface,t.fn[e].Constructor=C,t.fn[e].noConflict=function(){return t.fn[e]=o,C._jQueryInterface},C}(e),H=function(t){var e="collapse",n="bs.collapse",i="."+n,o=t.fn[e],a={toggle:!0,parent:""},l={toggle:"boolean",parent:"(string|element)"},h={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},c="show",u="collapse",f="collapsing",d="collapsed",_="width",g="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},m=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s0&&(this._selector=o,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var o=i.prototype;return o.toggle=function(){t(this._element).hasClass(c)?this.hide():this.show()},o.show=function(){var e,s,r=this;if(!this._isTransitioning&&!t(this._element).hasClass(c)&&(this._parent&&0===(e=t.makeArray(t(this._parent).find(p.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(e=null),!(e&&(s=t(e).not(this._selector).data(n))&&s._isTransitioning))){var o=t.Event(h.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){e&&(i._jQueryInterface.call(t(e).not(this._selector),"hide"),s||t(e).data(n,null));var a=this._getDimension();t(this._element).removeClass(u).addClass(f),this._element.style[a]=0,this._triggerArray.length>0&&t(this._triggerArray).removeClass(d).attr("aria-expanded",!0),this.setTransitioning(!0);var l=function(){t(r._element).removeClass(f).addClass(u).addClass(c),r._element.style[a]="",r.setTransitioning(!1),t(r._element).trigger(h.SHOWN)};if(P.supportsTransitionEnd()){var _="scroll"+(a[0].toUpperCase()+a.slice(1));t(this._element).one(P.TRANSITION_END,l).emulateTransitionEnd(600),this._element.style[a]=this._element[_]+"px"}else l()}}},o.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(c)){var n=t.Event(h.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",P.reflow(this._element),t(this._element).addClass(f).removeClass(u).removeClass(c),this._triggerArray.length>0)for(var s=0;s0&&t(n).toggleClass(d,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(e){var n=P.getSelectorFromElement(e);return n?t(n)[0]:null},i._jQueryInterface=function(e){return this.each(function(){var s=t(this),o=s.data(n),l=r({},a,s.data(),"object"==typeof e&&e);if(!o&&l.toggle&&/show|hide/.test(e)&&(l.toggle=!1),o||(o=new i(this,l),s.data(n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),i}();return t(document).on(h.CLICK_DATA_API,p.DATA_TOGGLE,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var i=t(this),s=P.getSelectorFromElement(this);t(s).each(function(){var e=t(this),s=e.data(n)?"toggle":i.data();m._jQueryInterface.call(e,s)})}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),W=function(t){var e="dropdown",i="bs.dropdown",o="."+i,a=".data-api",l=t.fn[e],h=new RegExp("38|40|27"),c={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,CLICK:"click"+o,CLICK_DATA_API:"click"+o+a,KEYDOWN_DATA_API:"keydown"+o+a,KEYUP_DATA_API:"keyup"+o+a},u="disabled",f="show",d="dropup",_="dropright",g="dropleft",p="dropdown-menu-right",m="dropdown-menu-left",v="position-static",E='[data-toggle="dropdown"]',T=".dropdown form",y=".dropdown-menu",C=".navbar-nav",I=".dropdown-menu .dropdown-item:not(.disabled)",A="top-start",b="top-end",D="bottom-start",S="bottom-end",w="right-start",N="left-start",O={offset:0,flip:!0,boundary:"scrollParent"},k={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},L=function(){function a(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var l=a.prototype;return l.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(u)){var e=a._getParentFromElement(this._element),i=t(this._menu).hasClass(f);if(a._clearMenus(),!i){var s={relatedTarget:this._element},r=t.Event(c.SHOW,s);if(t(e).trigger(r),!r.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof n)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var o=this._element;t(e).hasClass(d)&&(t(this._menu).hasClass(m)||t(this._menu).hasClass(p))&&(o=e),"scrollParent"!==this._config.boundary&&t(e).addClass(v),this._popper=new n(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===t(e).closest(C).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(f),t(e).toggleClass(f).trigger(t.Event(c.SHOWN,s))}}}},l.dispose=function(){t.removeData(this._element,i),t(this._element).off(o),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},l.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},l._addEventListeners=function(){var e=this;t(this._element).on(c.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},l._getConfig=function(n){return n=r({},this.constructor.Default,t(this._element).data(),n),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},l._getMenuElement=function(){if(!this._menu){var e=a._getParentFromElement(this._element);this._menu=t(e).find(y)[0]}return this._menu},l._getPlacement=function(){var e=t(this._element).parent(),n=D;return e.hasClass(d)?(n=A,t(this._menu).hasClass(p)&&(n=b)):e.hasClass(_)?n=w:e.hasClass(g)?n=N:t(this._menu).hasClass(p)&&(n=S),n},l._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},l._getPopperConfig=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset,{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new a(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},a._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(E)),s=0;s0&&r--,40===e.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right

',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},f="show",d="out",_={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,INSERTED:"inserted"+o,CLICK:"click"+o,FOCUSIN:"focusin"+o,FOCUSOUT:"focusout"+o,MOUSEENTER:"mouseenter"+o,MOUSELEAVE:"mouseleave"+o},g="fade",p="show",m=".tooltip-inner",v=".arrow",E="hover",T="focus",y="click",C="manual",I=function(){function a(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var I=a.prototype;return I.enable=function(){this._isEnabled=!0},I.disable=function(){this._isEnabled=!1},I.toggleEnabled=function(){this._isEnabled=!this._isEnabled},I.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},I.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},I.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),o=P.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&t(r).addClass(g);var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:v},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d&&e._leave(null,e)};P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(this.tip).one(P.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},I.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==f&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,this._activeTrigger[E]=!1,P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(i).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},I.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},I.isWithContent=function(){return Boolean(this.getTitle())},I.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},I.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},I.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(m),this.getTitle()),e.removeClass(g+" "+p)},I.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},I.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},I._getAttachment=function(t){return c[t.toUpperCase()]},I._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==C){var i=n===E?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===E?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},I._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},I._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T:E]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===f?n._hoverState=f:(clearTimeout(n._timeout),n._hoverState=f,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===f&&n.show()},n.config.delay.show):n.show())},I._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T:E]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d&&n.hide()},n.config.delay.hide):n.hide())},I._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},I._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},I._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},I._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},I._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},I._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(g),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return o}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),x=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},U.Default,{placement:"right",trigger:"click",content:"",template:''}),h=r({},U.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",d=".popover-body",_={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},g=function(r){var o,g;function p(){return r.apply(this,arguments)||this}g=r,(o=p).prototype=Object.create(g.prototype),o.prototype.constructor=o,o.__proto__=g;var m=p.prototype;return m.isWithContent=function(){return this.getTitle()||this._getContent()},m.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},m.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},m.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(d),n),e.removeClass(c+" "+u)},m._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},m._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},p._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new p(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(p,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),p}(U);return t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),K=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,o=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},c="dropdown-item",u="active",f={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d="offset",_="position",g=function(){function o(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+f.NAV_LINKS+","+this._config.target+" "+f.LIST_ITEMS+","+this._config.target+" "+f.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var g=o.prototype;return g.refresh=function(){var e=this,n=this._scrollElement===this._scrollElement.window?d:_,i="auto"===this._config.method?n:this._config.method,s=i===_?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n,r=P.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var o=n.getBoundingClientRect();if(o.width||o.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},g.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},g._getConfig=function(n){if("string"!=typeof(n=r({},a,n)).target){var i=t(n.target).attr("id");i||(i=P.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return P.typeCheckConfig(e,n,l),n},g._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},g._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},g._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},g._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=P,t.Alert=L,t.Button=R,t.Carousel=j,t.Collapse=H,t.Dropdown=W,t.Modal=M,t.Popover=x,t.Scrollspy=K,t.Tab=V,t.Tooltip=U,Object.defineProperty(t,"__esModule",{value:!0})}); +//# sourceMappingURL=bootstrap.min.js.map diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/js/jquery-3.2.1.slim.min.js b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/js/jquery-3.2.1.slim.min.js new file mode 100644 index 000000000..105d00e61 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/js/jquery-3.2.1.slim.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a); +}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}}),r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var _a,ab=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?_a:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),_a={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ab[b]||r.find.attr;ab[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ab[g],ab[g]=e,e=null!=c(a,b,d)?g:null,ab[g]=f),e}});var bb=/^(?:input|select|textarea|button)$/i,cb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function db(a){var b=a.match(L)||[];return b.join(" ")}function eb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,eb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,eb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,eb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=eb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+db(eb(c))+" ").indexOf(b)>-1)return!0;return!1}});var fb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(fb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:db(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var gb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!gb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,gb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.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(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var hb=/\[\]$/,ib=/\r?\n/g,jb=/^(?:submit|button|image|reset|file)$/i,kb=/^(?:input|select|textarea|keygen)/i;function lb(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||hb.test(a)?d(a,e):lb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d); +});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)lb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)lb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&kb.test(this.nodeName)&&!jb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ib,"\r\n")}}):{name:b.name,value:c.replace(ib,"\r\n")}}).get()}}),r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="
",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var mb=a.jQuery,nb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=nb),b&&a.jQuery===r&&(a.jQuery=mb),r},b||(a.jQuery=a.$=r),r}); diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/js/popper.min.js b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/js/popper.min.js new file mode 100644 index 000000000..0f20d2a89 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/static/js/popper.min.js @@ -0,0 +1,5 @@ +/* + Copyright (C) Federico Zivolo 2017 + Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). + */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:e?e.ownerDocument.documentElement:document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var l=a.commonAncestorContainer;if(e!==l&&t!==l||i.contains(n))return p(l)?l:r(l);var f=s(e);return f.host?d(f.host,t):d(e,s(t).host)}function a(e){var t=1=o.clientWidth&&i>=o.clientHeight}),l=0i[e]&&!t.escapeWithReference&&(n=_(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=X,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var i;if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var n=o.element;if('string'==typeof n){if(n=e.instance.popper.querySelector(n),!n)return e;}else if(!e.instance.popper.contains(n))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',g=a?'bottom':'right',u=L(n)[l];d[g]-us[g]&&(e.offsets.popper[m]+=d[m]+u-s[g]),e.offsets.popper=c(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=J(_(s[l]-u,v),0),e.arrowElement=n,e.offsets.arrow=(i={},pe(i,m,Math.round(v)),pe(i,h,''),i),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(k(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=y(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=x(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case le.FLIP:p=[i,n];break;case le.CLOCKWISE:p=q(i);break;case le.COUNTERCLOCKWISE:p=q(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=x(i);var a=e.offsets.popper,l=e.offsets.reference,f=X,m='left'===i&&f(a.right)>f(l.left)||'right'===i&&f(a.left)f(l.top)||'bottom'===i&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,w=-1!==['top','bottom'].indexOf(i),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),y&&(r=K(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=C(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[o]-(s?n[p?'width':'height']:0),e.placement=x(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.right + + + + + + + +
+
+ +
+
+
+ +
+
+

+

+ 价格: + 库存: + + 购买 + +

+
+
+
+
+
+
+ + diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/detail.html b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/detail.html new file mode 100644 index 000000000..c323947d1 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/detail.html @@ -0,0 +1,41 @@ + + + + + + +
+
+
+
+
+ +
+
+

+

+ 价格: + 库存: +

+
+
+
+
+
+
+ + diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/header.html b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/header.html new file mode 100644 index 000000000..98f2358a9 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/header.html @@ -0,0 +1,258 @@ + + + + + + + Appactive Demo + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+
+
+
+
+
+
绿色格子-流量路径
+
+
+
+
+
+
+
+
+
+
+ +
+
center
+
gateway
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/index.html b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/index.html new file mode 100644 index 000000000..4943051cf --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/frontend/src/main/resources/templates/index.html @@ -0,0 +1,39 @@ + + + + + + +
+
+
+
+
+ +
+
+ +
+

+
+
+
+
+
+
+ + diff --git a/spring-cloud-alibaba-examples/appactive-example/product/Dockerfile b/spring-cloud-alibaba-examples/appactive-example/product/Dockerfile new file mode 100644 index 000000000..42035b0ca --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/Dockerfile @@ -0,0 +1,18 @@ +FROM openjdk:8-jdk-alpine + +WORKDIR /app +COPY target/product-0.2.1.jar /app +# 设置文件夹操作权限 +RUN chown -R root:root /app/* && \ + chmod a+rw -R /app/* +#EXPOSE 8089 +USER root:root + +ARG UNITFLAG=default + +ENV TZ=Asia/Shanghai \ + UNITFLAG=$UNITFLAG \ + LANG="en_US.UTF-8" + +ENTRYPOINT ["sh", "-c"] +CMD ["java -jar /app/product-0.2.1.jar"] diff --git a/spring-cloud-alibaba-examples/appactive-example/product/pom.xml b/spring-cloud-alibaba-examples/appactive-example/product/pom.xml new file mode 100644 index 000000000..df1d4f16d --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/pom.xml @@ -0,0 +1,59 @@ + + + + + + 4.0.0 + + + com.alibaba.cloud + spring-cloud-alibaba-examples + ${revision} + ../../pom.xml + + + product + Spring Cloud Starter Alibaba Appactive Example - Product Service + jar + + + 8 + 8 + true + + + + + com.alibaba.cloud + appactive-example-common + ${revision} + + + org.springframework.boot + spring-boot-starter-web + + + + mysql + mysql-connector-java + 5.1.40 + + + + diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/ProductApplication.java b/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/ProductApplication.java new file mode 100644 index 000000000..37dcb1c22 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/ProductApplication.java @@ -0,0 +1,128 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.product; + +import java.util.List; + +import com.alibaba.cloud.example.common.RPCType; +import com.alibaba.cloud.example.common.entity.Product; +import com.alibaba.cloud.example.common.entity.ResultHolder; +import com.alibaba.cloud.example.common.service.OrderDAO; +import com.alibaba.cloud.example.common.service.ProductServiceNormal; +import com.alibaba.cloud.example.common.service.ProductServiceUnit; +import com.alibaba.cloud.example.common.service.ProductServiceUnitHidden; +import io.appactive.java.api.base.AppContextClient; +import io.appactive.support.log.LogUtil; +import org.slf4j.Logger; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +@SpringBootApplication +@ComponentScan(basePackages = { "com.alibaba.cloud.example" }) +@EntityScan("com.alibaba.cloud.example.*") +@Controller +@RequestMapping("/") +@EnableDiscoveryClient +@EnableFeignClients(basePackages = { "com.alibaba.cloud.example" }) +public class ProductApplication { + + private static final Logger logger = LogUtil.getLogger(); + + @Autowired + OrderDAO orderDAO; + + @Value("${spring.application.name}") + private String appName; + + @Autowired + private ProductServiceNormal productServiceNormal; + + @Autowired + private ProductServiceUnit productServiceUnit; + + @Autowired + private ProductServiceUnitHidden productServiceUnitHidden; + + public static void main(String[] args) { + SpringApplication.run(ProductApplication.class, args); + } + + @RequestMapping("/echo") + @ResponseBody + public String echo( + @RequestParam(required = false, defaultValue = "jack") String user) { + String s = String.valueOf(user); + return String.format("%s get %s", s, productServiceNormal.list().toString()); + } + + @RequestMapping("/list") + @ResponseBody + public ResultHolder> list() { + return productServiceNormal.list(); + } + + @RequestMapping("/detailHidden") + @ResponseBody + public ResultHolder detailHidden( + @RequestParam(required = false, defaultValue = "12") String pId) { + // unit + logger.info("detailHidden, routerId: {}, pId: {}", AppContextClient.getRouteId(), + pId); + return productServiceUnitHidden.detail(pId); + } + + @RequestMapping("/detail") + @ResponseBody + public ResultHolder detail( + @RequestParam(required = false, defaultValue = "12") String rId, + @RequestParam(required = false, defaultValue = "12") String pId) { + // unit + logger.info("detail, routerId: {}, pId: {}", AppContextClient.getRouteId(), pId); + return productServiceUnit.detail(rId, pId); + } + + @RequestMapping("/buy") + @ResponseBody + public ResultHolder buy( + @RequestParam(required = false, defaultValue = "Dubbo") RPCType rpcType, + @RequestParam(required = false, defaultValue = "12") String rId, + @RequestParam(required = false, defaultValue = "12") String pId, + @RequestParam(required = false, defaultValue = "5") Integer number) { + logger.info("buy, routerId: {}, rpcType: {}", AppContextClient.getRouteId(), + rpcType); + return orderDAO.buy(rId, pId, number); + + } + + @RequestMapping("/check") + @ResponseBody + public String check() { + return "OK From " + appName; + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/init/InitData.java b/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/init/InitData.java new file mode 100644 index 000000000..ddc03e0c0 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/init/InitData.java @@ -0,0 +1,96 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.product.init; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; + +import com.alibaba.cloud.example.common.entity.Product; +import com.alibaba.cloud.example.product.repository.ProductRepository; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import static com.alibaba.cloud.example.common.Constants.CENTER_FLAG; + +@Component +public class InitData implements ApplicationRunner { + + @Resource + ProductRepository productRepository; + + @Value("${appactive.unit}") + private String unit; + + @Override + public void run(ApplicationArguments args) throws Exception { + + if (!CENTER_FLAG.equals(unit)) { + return; + } + + List products = new ArrayList<>(4); + Product p1 = new Product(); + p1.setId("12"); + p1.setName("书包"); + p1.setImg("/img/backpack.png"); + p1.setDescription("好用的书包"); + p1.setPrice(300); + p1.setNumber(10); + products.add(p1); + + Product p2 = new Product(); + p2.setId("14"); + p2.setName("球拍"); + p2.setImg("/img/badminton.png"); + p2.setDescription("好用的球拍"); + p2.setPrice(200); + p2.setNumber(20); + products.add(p2); + + Product p3 = new Product(); + p3.setId("16"); + p3.setName("键盘"); + p3.setImg("/img/keyboard.png"); + p3.setDescription("好用的键盘"); + p3.setPrice(800); + p3.setNumber(50); + products.add(p3); + + Product p4 = new Product(); + p4.setId("18"); + p4.setName("茶杯"); + p4.setImg("/img/cup.png"); + p4.setDescription("好用的茶杯"); + p4.setPrice(100); + p4.setNumber(60); + products.add(p4); + + try { + productRepository.deleteAll(); + productRepository.saveAll(products); + } + catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/repository/ProductRepository.java b/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/repository/ProductRepository.java new file mode 100644 index 000000000..9db9fc530 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/repository/ProductRepository.java @@ -0,0 +1,25 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.product.repository; + +import com.alibaba.cloud.example.common.entity.Product; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProductRepository extends JpaRepository { + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/service/ProductServiceNormalImpl.java b/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/service/ProductServiceNormalImpl.java new file mode 100644 index 000000000..71b922001 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/service/ProductServiceNormalImpl.java @@ -0,0 +1,44 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.product.service; + +import java.util.List; + +import com.alibaba.cloud.example.common.entity.Product; +import com.alibaba.cloud.example.common.entity.ResultHolder; +import com.alibaba.cloud.example.common.service.ProductServiceNormal; +import com.alibaba.cloud.example.product.repository.ProductRepository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +public class ProductServiceNormalImpl implements ProductServiceNormal { + + @Autowired + ProductRepository productRepository; + + @Value("${appactive.unit}") + private String unit; + + @Override + public ResultHolder> list() { + return new ResultHolder<>(productRepository.findAll()); + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/service/ProductServiceUnitHiddenImpl.java b/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/service/ProductServiceUnitHiddenImpl.java new file mode 100644 index 000000000..87b0c5537 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/service/ProductServiceUnitHiddenImpl.java @@ -0,0 +1,49 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.product.service; + +import com.alibaba.cloud.example.common.entity.Product; +import com.alibaba.cloud.example.common.entity.ResultHolder; +import com.alibaba.cloud.example.common.service.ProductServiceUnitHidden; +import com.alibaba.cloud.example.product.repository.ProductRepository; +import io.appactive.java.api.base.AppContextClient; +import io.appactive.support.log.LogUtil; +import org.slf4j.Logger; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +public class ProductServiceUnitHiddenImpl implements ProductServiceUnitHidden { + + private static final Logger logger = LogUtil.getLogger(); + + @Autowired + ProductRepository productRepository; + + @Value("${appactive.unit}") + private String unit; + + @Override + public ResultHolder detail(String pId) { + String rId = AppContextClient.getRouteId(); + logger.info("detail: " + pId + ",rId " + rId); + return new ResultHolder<>(productRepository.findById(pId).orElse(new Product())); + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/service/ProductServiceUnitImpl.java b/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/service/ProductServiceUnitImpl.java new file mode 100644 index 000000000..dd45c2d57 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/java/com/alibaba/cloud/example/product/service/ProductServiceUnitImpl.java @@ -0,0 +1,47 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.product.service; + +import com.alibaba.cloud.example.common.entity.Product; +import com.alibaba.cloud.example.common.entity.ResultHolder; +import com.alibaba.cloud.example.common.service.ProductServiceUnit; +import com.alibaba.cloud.example.product.repository.ProductRepository; +import io.appactive.support.log.LogUtil; +import org.slf4j.Logger; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +public class ProductServiceUnitImpl implements ProductServiceUnit { + + private static final Logger logger = LogUtil.getLogger(); + + @Autowired + ProductRepository productRepository; + + @Value("${appactive.unit}") + private String unit; + + @Override + public ResultHolder detail(String rId, String pId) { + // unit + return new ResultHolder<>(productRepository.findById(pId).orElse(new Product())); + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/application.properties b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/application.properties new file mode 100644 index 000000000..dd7b2fa74 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/application.properties @@ -0,0 +1,20 @@ +server.port=8087 +spring.application.name=product +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/product?characterEncoding=utf8&useSSL=false&serverTimezone=GMT +spring.datasource.username=root +spring.datasource.password=root +spring.datasource.driver-class-name=com.mysql.jdbc.Driver +spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=false +appactive.unit=center +appactive.app=product +spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 +feign.client.config.default.connectTimeout=5000 +feign.client.config.default.readTimeout=5000 +spring.cloud.appactive.filter.core-path=/detailHidden/*,/detail/* +spring.cloud.appactive.filter.global-path=/buy/* +spring.cloud.appactive.filter.general-path=/* + +storage.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.appactive.consumer.AppactiveRule + diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/css/bootstrap.min.css b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/css/bootstrap.min.css new file mode 100644 index 000000000..c814524fe --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0 (https://getbootstrap.com) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-control{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-control::before{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#6c757d!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/img/frontend.png b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/img/frontend.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1702946af657968905ba966b587a0a729ff022 GIT binary patch literal 20709 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 v!evvV?F3g1`PHsvbpHPv{@dYt4gTD literal 0 HcmV?d00001 diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/img/product.png b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/img/product.png new file mode 100644 index 0000000000000000000000000000000000000000..34e7c4fa142e3d4e6c2b8c5fd6704ceb7da392ea GIT binary patch literal 19353 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 R6@^Y^Y+&}+TRm6A{{W>aY&HM@ literal 0 HcmV?d00001 diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/img/storage.png b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/img/storage.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd5bf0d0a2e4e811e481fbdecd0aeae0e724987 GIT binary patch literal 21007 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:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(n){t(n).trigger(e.end)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var s in n)if(Object.prototype.hasOwnProperty.call(n,s)){var r=n[s],o=e[s],a=o&&i.isElement(o)?"element":(l=o,{}.toString.call(l).match(/\s([a-zA-Z]+)/)[1].toLowerCase());if(!new RegExp(r).test(a))throw new Error(t.toUpperCase()+': Option "'+s+'" provided type "'+a+'" but expected type "'+r+'".')}var l}};return e=("undefined"==typeof window||!window.QUnit)&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,i.supportsTransitionEnd()&&(t.event.special[i.TRANSITION_END]={bindType:e.end,delegateType:e.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),i}(e),L=(a="alert",h="."+(l="bs.alert"),c=(o=e).fn[a],u={CLOSE:"close"+h,CLOSED:"closed"+h,CLICK_DATA_API:"click"+h+".data-api"},f="alert",d="fade",_="show",g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.removeData(this._element,l),this._element=null},e._getRootElement=function(t){var e=P.getSelectorFromElement(t),n=!1;return e&&(n=o(e)[0]),n||(n=o(t).closest("."+f)[0]),n},e._triggerCloseEvent=function(t){var e=o.Event(u.CLOSE);return o(t).trigger(e),e},e._removeElement=function(t){var e=this;o(t).removeClass(_),P.supportsTransitionEnd()&&o(t).hasClass(d)?o(t).one(P.TRANSITION_END,function(n){return e._destroyElement(t,n)}).emulateTransitionEnd(150):this._destroyElement(t)},e._destroyElement=function(t){o(t).detach().trigger(u.CLOSED).remove()},t._jQueryInterface=function(e){return this.each(function(){var n=o(this),i=n.data(l);i||(i=new t(this),n.data(l,i)),"close"===e&&i[e](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),o(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),o.fn[a]=g._jQueryInterface,o.fn[a].Constructor=g,o.fn[a].noConflict=function(){return o.fn[a]=c,g._jQueryInterface},g),R=(m="button",E="."+(v="bs.button"),T=".data-api",y=(p=e).fn[m],C="active",I="btn",A="focus",b='[data-toggle^="button"]',D='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+T,FOCUS_BLUR_DATA_API:"focus"+E+T+" blur"+E+T},k=function(){function t(t){this._element=t}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=p(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&p(this._element).hasClass(C))t=!1;else{var s=p(n).find(w)[0];s&&p(s).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!p(this._element).hasClass(C),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!p(this._element).hasClass(C)),t&&p(this._element).toggleClass(C)},e.dispose=function(){p.removeData(this._element,v),this._element=null},t._jQueryInterface=function(e){return this.each(function(){var n=p(this).data(v);n||(n=new t(this),p(this).data(v,n)),"toggle"===e&&n[e]()})},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),p(document).on(O.CLICK_DATA_API,b,function(t){t.preventDefault();var e=t.target;p(e).hasClass(I)||(e=p(e).closest(N)),k._jQueryInterface.call(p(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,b,function(t){var e=p(t.target).closest(N)[0];p(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),p.fn[m]=k._jQueryInterface,p.fn[m].Constructor=k,p.fn[m].noConflict=function(){return p.fn[m]=y,k._jQueryInterface},k),j=function(t){var e="carousel",n="bs.carousel",i="."+n,o=t.fn[e],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h="next",c="prev",u="left",f="right",d={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},_="carousel",g="active",p="slide",m="carousel-item-right",v="carousel-item-left",E="carousel-item-next",T="carousel-item-prev",y={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},C=function(){function o(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(y.INDICATORS)[0],this._addEventListeners()}var C=o.prototype;return C.next=function(){this._isSliding||this._slide(h)},C.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},C.prev=function(){this._isSliding||this._slide(c)},C.pause=function(e){e||(this._isPaused=!0),t(this._element).find(y.NEXT_PREV)[0]&&P.supportsTransitionEnd()&&(P.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},C.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},C.to=function(e){var n=this;this._activeElement=t(this._element).find(y.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?h:c;this._slide(s,this._items[e])}},C.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},C._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},C._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},C._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},C._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(y.ITEM)),this._items.indexOf(e)},C._getItemByDirection=function(t,e){var n=t===h,i=t===c,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===c?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},C._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(y.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},C._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(y.ACTIVE).removeClass(g);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(g)}},C._slide=function(e,n){var i,s,r,o=this,a=t(this._element).find(y.ACTIVE_ITEM)[0],l=this._getItemIndex(a),c=n||a&&this._getItemByDirection(e,a),_=this._getItemIndex(c),C=Boolean(this._interval);if(e===h?(i=v,s=E,r=u):(i=m,s=T,r=f),c&&t(c).hasClass(g))this._isSliding=!1;else if(!this._triggerSlideEvent(c,r).isDefaultPrevented()&&a&&c){this._isSliding=!0,C&&this.pause(),this._setActiveIndicatorElement(c);var I=t.Event(d.SLID,{relatedTarget:c,direction:r,from:l,to:_});P.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(c).addClass(s),P.reflow(c),t(a).addClass(i),t(c).addClass(i),t(a).one(P.TRANSITION_END,function(){t(c).removeClass(i+" "+s).addClass(g),t(a).removeClass(g+" "+s+" "+i),o._isSliding=!1,setTimeout(function(){return t(o._element).trigger(I)},0)}).emulateTransitionEnd(600)):(t(a).removeClass(g),t(c).addClass(g),this._isSliding=!1,t(this._element).trigger(I)),C&&this.cycle()}},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},a,t(this).data());"object"==typeof e&&(s=r({},s,e));var l="string"==typeof e?e:s.slide;if(i||(i=new o(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof l){if("undefined"==typeof i[l])throw new TypeError('No method named "'+l+'"');i[l]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(e){var i=P.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(_)){var a=r({},t(s).data(),t(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(t(s),a),l&&t(s).data(n).to(l),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(d.CLICK_DATA_API,y.DATA_SLIDE,C._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(y.DATA_RIDE).each(function(){var e=t(this);C._jQueryInterface.call(e,e.data())})}),t.fn[e]=C._jQueryInterface,t.fn[e].Constructor=C,t.fn[e].noConflict=function(){return t.fn[e]=o,C._jQueryInterface},C}(e),H=function(t){var e="collapse",n="bs.collapse",i="."+n,o=t.fn[e],a={toggle:!0,parent:""},l={toggle:"boolean",parent:"(string|element)"},h={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},c="show",u="collapse",f="collapsing",d="collapsed",_="width",g="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},m=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s0&&(this._selector=o,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var o=i.prototype;return o.toggle=function(){t(this._element).hasClass(c)?this.hide():this.show()},o.show=function(){var e,s,r=this;if(!this._isTransitioning&&!t(this._element).hasClass(c)&&(this._parent&&0===(e=t.makeArray(t(this._parent).find(p.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(e=null),!(e&&(s=t(e).not(this._selector).data(n))&&s._isTransitioning))){var o=t.Event(h.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){e&&(i._jQueryInterface.call(t(e).not(this._selector),"hide"),s||t(e).data(n,null));var a=this._getDimension();t(this._element).removeClass(u).addClass(f),this._element.style[a]=0,this._triggerArray.length>0&&t(this._triggerArray).removeClass(d).attr("aria-expanded",!0),this.setTransitioning(!0);var l=function(){t(r._element).removeClass(f).addClass(u).addClass(c),r._element.style[a]="",r.setTransitioning(!1),t(r._element).trigger(h.SHOWN)};if(P.supportsTransitionEnd()){var _="scroll"+(a[0].toUpperCase()+a.slice(1));t(this._element).one(P.TRANSITION_END,l).emulateTransitionEnd(600),this._element.style[a]=this._element[_]+"px"}else l()}}},o.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(c)){var n=t.Event(h.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",P.reflow(this._element),t(this._element).addClass(f).removeClass(u).removeClass(c),this._triggerArray.length>0)for(var s=0;s0&&t(n).toggleClass(d,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(e){var n=P.getSelectorFromElement(e);return n?t(n)[0]:null},i._jQueryInterface=function(e){return this.each(function(){var s=t(this),o=s.data(n),l=r({},a,s.data(),"object"==typeof e&&e);if(!o&&l.toggle&&/show|hide/.test(e)&&(l.toggle=!1),o||(o=new i(this,l),s.data(n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),i}();return t(document).on(h.CLICK_DATA_API,p.DATA_TOGGLE,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var i=t(this),s=P.getSelectorFromElement(this);t(s).each(function(){var e=t(this),s=e.data(n)?"toggle":i.data();m._jQueryInterface.call(e,s)})}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),W=function(t){var e="dropdown",i="bs.dropdown",o="."+i,a=".data-api",l=t.fn[e],h=new RegExp("38|40|27"),c={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,CLICK:"click"+o,CLICK_DATA_API:"click"+o+a,KEYDOWN_DATA_API:"keydown"+o+a,KEYUP_DATA_API:"keyup"+o+a},u="disabled",f="show",d="dropup",_="dropright",g="dropleft",p="dropdown-menu-right",m="dropdown-menu-left",v="position-static",E='[data-toggle="dropdown"]',T=".dropdown form",y=".dropdown-menu",C=".navbar-nav",I=".dropdown-menu .dropdown-item:not(.disabled)",A="top-start",b="top-end",D="bottom-start",S="bottom-end",w="right-start",N="left-start",O={offset:0,flip:!0,boundary:"scrollParent"},k={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},L=function(){function a(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var l=a.prototype;return l.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(u)){var e=a._getParentFromElement(this._element),i=t(this._menu).hasClass(f);if(a._clearMenus(),!i){var s={relatedTarget:this._element},r=t.Event(c.SHOW,s);if(t(e).trigger(r),!r.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof n)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var o=this._element;t(e).hasClass(d)&&(t(this._menu).hasClass(m)||t(this._menu).hasClass(p))&&(o=e),"scrollParent"!==this._config.boundary&&t(e).addClass(v),this._popper=new n(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===t(e).closest(C).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(f),t(e).toggleClass(f).trigger(t.Event(c.SHOWN,s))}}}},l.dispose=function(){t.removeData(this._element,i),t(this._element).off(o),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},l.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},l._addEventListeners=function(){var e=this;t(this._element).on(c.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},l._getConfig=function(n){return n=r({},this.constructor.Default,t(this._element).data(),n),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},l._getMenuElement=function(){if(!this._menu){var e=a._getParentFromElement(this._element);this._menu=t(e).find(y)[0]}return this._menu},l._getPlacement=function(){var e=t(this._element).parent(),n=D;return e.hasClass(d)?(n=A,t(this._menu).hasClass(p)&&(n=b)):e.hasClass(_)?n=w:e.hasClass(g)?n=N:t(this._menu).hasClass(p)&&(n=S),n},l._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},l._getPopperConfig=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset,{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new a(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},a._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(E)),s=0;s0&&r--,40===e.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right

',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},f="show",d="out",_={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,INSERTED:"inserted"+o,CLICK:"click"+o,FOCUSIN:"focusin"+o,FOCUSOUT:"focusout"+o,MOUSEENTER:"mouseenter"+o,MOUSELEAVE:"mouseleave"+o},g="fade",p="show",m=".tooltip-inner",v=".arrow",E="hover",T="focus",y="click",C="manual",I=function(){function a(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var I=a.prototype;return I.enable=function(){this._isEnabled=!0},I.disable=function(){this._isEnabled=!1},I.toggleEnabled=function(){this._isEnabled=!this._isEnabled},I.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},I.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},I.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),o=P.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&t(r).addClass(g);var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:v},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d&&e._leave(null,e)};P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(this.tip).one(P.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},I.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==f&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,this._activeTrigger[E]=!1,P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(i).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},I.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},I.isWithContent=function(){return Boolean(this.getTitle())},I.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},I.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},I.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(m),this.getTitle()),e.removeClass(g+" "+p)},I.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},I.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},I._getAttachment=function(t){return c[t.toUpperCase()]},I._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==C){var i=n===E?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===E?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},I._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},I._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T:E]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===f?n._hoverState=f:(clearTimeout(n._timeout),n._hoverState=f,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===f&&n.show()},n.config.delay.show):n.show())},I._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T:E]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d&&n.hide()},n.config.delay.hide):n.hide())},I._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},I._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},I._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},I._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},I._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},I._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(g),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return o}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),x=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},U.Default,{placement:"right",trigger:"click",content:"",template:''}),h=r({},U.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",d=".popover-body",_={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},g=function(r){var o,g;function p(){return r.apply(this,arguments)||this}g=r,(o=p).prototype=Object.create(g.prototype),o.prototype.constructor=o,o.__proto__=g;var m=p.prototype;return m.isWithContent=function(){return this.getTitle()||this._getContent()},m.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},m.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},m.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(d),n),e.removeClass(c+" "+u)},m._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},m._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},p._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new p(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(p,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),p}(U);return t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),K=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,o=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},c="dropdown-item",u="active",f={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d="offset",_="position",g=function(){function o(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+f.NAV_LINKS+","+this._config.target+" "+f.LIST_ITEMS+","+this._config.target+" "+f.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var g=o.prototype;return g.refresh=function(){var e=this,n=this._scrollElement===this._scrollElement.window?d:_,i="auto"===this._config.method?n:this._config.method,s=i===_?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n,r=P.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var o=n.getBoundingClientRect();if(o.width||o.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},g.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},g._getConfig=function(n){if("string"!=typeof(n=r({},a,n)).target){var i=t(n.target).attr("id");i||(i=P.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return P.typeCheckConfig(e,n,l),n},g._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},g._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},g._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},g._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=P,t.Alert=L,t.Button=R,t.Carousel=j,t.Collapse=H,t.Dropdown=W,t.Modal=M,t.Popover=x,t.Scrollspy=K,t.Tab=V,t.Tooltip=U,Object.defineProperty(t,"__esModule",{value:!0})}); +//# sourceMappingURL=bootstrap.min.js.map diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/js/jquery-3.2.1.slim.min.js b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/js/jquery-3.2.1.slim.min.js new file mode 100644 index 000000000..105d00e61 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/js/jquery-3.2.1.slim.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a); +}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}}),r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var _a,ab=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?_a:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),_a={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ab[b]||r.find.attr;ab[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ab[g],ab[g]=e,e=null!=c(a,b,d)?g:null,ab[g]=f),e}});var bb=/^(?:input|select|textarea|button)$/i,cb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function db(a){var b=a.match(L)||[];return b.join(" ")}function eb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,eb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,eb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,eb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=eb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+db(eb(c))+" ").indexOf(b)>-1)return!0;return!1}});var fb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(fb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:db(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var gb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!gb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,gb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.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(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var hb=/\[\]$/,ib=/\r?\n/g,jb=/^(?:submit|button|image|reset|file)$/i,kb=/^(?:input|select|textarea|keygen)/i;function lb(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||hb.test(a)?d(a,e):lb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d); +});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)lb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)lb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&kb.test(this.nodeName)&&!jb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ib,"\r\n")}}):{name:b.name,value:c.replace(ib,"\r\n")}}).get()}}),r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="
",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var mb=a.jQuery,nb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=nb),b&&a.jQuery===r&&(a.jQuery=mb),r},b||(a.jQuery=a.$=r),r}); diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/js/popper.min.js b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/js/popper.min.js new file mode 100644 index 000000000..0f20d2a89 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/static/js/popper.min.js @@ -0,0 +1,5 @@ +/* + Copyright (C) Federico Zivolo 2017 + Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). + */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:e?e.ownerDocument.documentElement:document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var l=a.commonAncestorContainer;if(e!==l&&t!==l||i.contains(n))return p(l)?l:r(l);var f=s(e);return f.host?d(f.host,t):d(e,s(t).host)}function a(e){var t=1=o.clientWidth&&i>=o.clientHeight}),l=0i[e]&&!t.escapeWithReference&&(n=_(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=X,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var i;if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var n=o.element;if('string'==typeof n){if(n=e.instance.popper.querySelector(n),!n)return e;}else if(!e.instance.popper.contains(n))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',g=a?'bottom':'right',u=L(n)[l];d[g]-us[g]&&(e.offsets.popper[m]+=d[m]+u-s[g]),e.offsets.popper=c(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=J(_(s[l]-u,v),0),e.arrowElement=n,e.offsets.arrow=(i={},pe(i,m,Math.round(v)),pe(i,h,''),i),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(k(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=y(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=x(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case le.FLIP:p=[i,n];break;case le.CLOCKWISE:p=q(i);break;case le.COUNTERCLOCKWISE:p=q(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=x(i);var a=e.offsets.popper,l=e.offsets.reference,f=X,m='left'===i&&f(a.right)>f(l.left)||'right'===i&&f(a.left)f(l.top)||'bottom'===i&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,w=-1!==['top','bottom'].indexOf(i),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),y&&(r=K(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=C(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[o]-(s?n[p?'width':'height']:0),e.placement=x(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.right + + + + + +
+ +
+ +
+ + diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/detail.html b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/detail.html new file mode 100644 index 000000000..53646488d --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/detail.html @@ -0,0 +1,27 @@ + + + + + + +
+ +
+ +
+ + diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/header.html b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/header.html new file mode 100644 index 000000000..3761822c7 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/header.html @@ -0,0 +1,195 @@ + + + + + + + AppActive Demo + + + + + + + + + + + + +
+
+ + +
+
+
+
+
+ +
+
center
+
gateway
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + + + +
+ + diff --git a/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/index.html b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/index.html new file mode 100644 index 000000000..53646488d --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/product/src/main/resources/templates/index.html @@ -0,0 +1,27 @@ + + + + + + +
+ +
+ +
+ + diff --git a/spring-cloud-alibaba-examples/appactive-example/readme-zh.md b/spring-cloud-alibaba-examples/appactive-example/readme-zh.md new file mode 100644 index 000000000..6af75217a --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/readme-zh.md @@ -0,0 +1,217 @@ +# AppActive Example + +## 项目说明 + +[![vTlxsA.jpg](https://s1.ax1x.com/2022/09/04/vTlxsA.jpg)](https://imgse.com/i/vTlxsA) + +本 demo 整体架构如图。 + +注: + +- 应用共同依赖的注册中心 Nacos 和 数据库 MySQL 未在图中展示出来。 +- 本 demo 的命令通道依赖于 Nacos。 + +### 核心概念 + +异地多活的思想类比于日常中的鸡蛋不要放在一个篮子里面,通过对业务应用进行单元化拆分部署,使得一个单元的故障影响面限定在特定单元内。在基于 AppActive 做应用多活方案中,可根据应用属性将应用分为全局、核心和一般服务 3 类,其又可归属到中心单元和普通单元 2 类单元中,单元一般用来指代机房。 + +3 类服务: +- 全局服务:强一致性的服务(例如库存、金额等),无法做异地多活单元化拆分,其需要在中心单元进行服务读写。 +- 核心服务:做单元化拆分的业务应用,根据预设的多活规则,根据请求信息在特定单元进行读写的业务,核心业务的拆分是异地多活系统建设中的核心。 +- 普通服务:属于系统非核心链路上的业务,对数据一致性要求较低的应用,一般出于成本考虑不做单元化拆分。 + + +2 类单元: + +- 中心单元:中心单元,也可称为中心机房,可承载全局、核心和普通服务 3 类,其一般在机房硬件配置上较一般单元高。 +- 一般单元:其他非中心单元的单元,用来承载非全局服务以外的其他服务,也可称为一般机房。 + + + +本 example 中共有 3 个应用,按照距离(调用链路)终端用户由近及远分别为: + +- frontend: 前端应用,接受用户请求,请求到实际数据后返回 +- product: 产品应用,提供三个服务: + - 产品列表: 普通服务 + - 产品详情: 单元服务 + - 产品下单: 中心服务 +- storage: 库存应用,供下单服务扣减库存 + +应用在中心单元(Center)和 普通单元(unit) 各部署一套(对等部署)。 + +图中绿色格子代表了本次请求的调用链路。 + +## 示例 + +### 快速接入 +在启动示例进行演示之前,我们先了解一下 Spring Cloud 应用如何使用 AppActive 所提供的异地多活能力。 +**注意 本章节只是为了便于您理解接入方式,本示例代码中已经完成接入工作,您无需再进行修改。** + +1. 首先,修改 pom.xml 文件,在 provider 和 consumer 已添加最新 `spring-cloud-alibaba-dependencies` 的基础上添加以下 maven 依赖。 + + + com.alibaba.cloud + spring-cloud-starter-alibaba-appactive + + +2. 在 Provider 应用的 `application.properties` 配置文件中给特定接口配置分流策略。其中后缀 `core-path` 用于配置核心服务,`global-path` 用于配置全局服务,`general-path` 用于配置一般服务,比如 demo 中的 product 应用分流策略配置如下: + + spring.cloud.appactive.filter.core-path=/detailHidden/*,/detail/* + spring.cloud.appactive.filter.global-path=/buy/* + spring.cloud.appactive.filter.general-path=/* + +3. 在 Consumer 应用的 `application.properties` 配置客户端负载均衡为 AppActive 所提供的负载均衡算法,配置方式如下,注意需要将`[service-name]`替换成具体的待消费服务名。 + + [service-name].ribbon.NFLoadBalancerRuleClassName =com.alibaba.cloud.appactive.consumer.AppactiveRule + + +### 快速启动 + +1. 启动 Nacos, MySQL, 并往 Nacos 中推送多活规则: + + - 在 `appactive-example` 目录下,执行:`docker-compose -f component-quickstart.yml up -d` 启动 Nacos, MySQL。 + - 执行以下命令:`curl -X POST 'http://127.0.0.1:8848/nacos/v1/console/namespaces' -d 'customNamespaceId=appactiveDemoNamespaceId&namespaceName=appactiveDemoNamespaceName&namespaceDesc=appactiveDemoNamespaceDesc'` 在 Nacos 配置中心中创建一个演示用命名空间 appactiveDemoNamespaceId。 + - 执行以下命令:`sh baseline.sh 2 NACOS appactiveDemoNamespaceId`,往命名空间中推送多活规则。多活规则说明如下: + - `appactive.dataId.idSourceRulePath`: 描述如何从 http 流量中提取路由标 + - `appactive.dataId.transformerRulePath`: 描述如何解析路由标 + - `appactive.dataId.trafficRouteRulePath`: 描述路由标和单元的映射关系 + - `appactive.dataId.dataScopeRuleDirectoryPath_mysql-product`: 描述数据库的属性 + + +2. 启动 5 套应用,启动参数分别为: + +- frontend + ``` + -Dappactive.channelTypeEnum=NACOS + -Dappactive.namespaceId=appactiveDemoNamespaceId + -Dappactive.unit=unit + -Dappactive.app=frontend + -Dio.appactive.demo.unitlist=center,unit + -Dio.appactive.demo.applist=frontend,product,storage + -Dserver.port=8875 + ``` +- product + ``` + -Dappactive.channelTypeEnum=NACOS + -Dappactive.namespaceId=appactiveDemoNamespaceId + -Dappactive.unit=center + -Dappactive.app=product + -Dspring.datasource.url=jdbc:mysql://127.0.0.1:3306/product?characterEncoding=utf8&useSSL=false&serverTimezone=GMT&activeInstanceId=mysql&activeDbName=product + -Dserver.port=8883 + ``` + ``` + -Dappactive.channelTypeEnum=NACOS + -Dappactive.namespaceId=appactiveDemoNamespaceId + -Dappactive.unit=unit + -Dappactive.app=product + -Dspring.datasource.url=jdbc:mysql://127.0.0.1:3306/product?characterEncoding=utf8&useSSL=false&serverTimezone=GMT&activeInstanceId=mysql&activeDbName=product + -Dserver.port=8873 + ``` +- storage + ``` + -Dappactive.channelTypeEnum=NACOS + -Dappactive.namespaceId=appactiveDemoNamespaceId + -Dappactive.unit=center + -Dappactive.app=storage + -Dspring.datasource.url=jdbc:mysql://127.0.0.1:3306/product?characterEncoding=utf8&useSSL=false&serverTimezone=GMT + -Dserver.port=8881 + ``` + ``` + -Dappactive.channelTypeEnum=NACOS + -Dappactive.namespaceId=appactiveDemoNamespaceId + -Dappactive.unit=unit + -Dappactive.app=storage + -Dspring.datasource.url=jdbc:mysql://127.0.0.1:3306/product?characterEncoding=utf8&useSSL=false&serverTimezone=GMT + -Dserver.port=8871 + ``` + +## 效果演示 + +1. 归属于一般(Unit)单元的普通应用服务调用演示。在浏览器中输入:`http://127.0.0.1:8079/listProduct` 地址,可见请求通过 frontend 应用被发送给了 product。 + + [![vTlxsA.jpg](https://s1.ax1x.com/2022/09/04/vTlxsA.jpg)](https://imgse.com/i/vTlxsA) + + 由于上述路径中的 `/listProduct` 在 product 应用中匹配到的是 `/*` 路径规则,根据规则内容,该服务属于普通应用做了未做单元化拆分,所以frontend 在从注册中心获取的 product 地址列表中不存在倾向性,会随机选择地址进行请求发送。因此多次请求上述路径,会看到请求在 product 的一般(Unit)和 中心(center)单元应用中来回切换。 + +2. 归属于 unit 单元的核心应用服务调用演示。在浏览器中输入:`http://127.0.0.1:8079/detailProduct` 路径,由于上述路径中的 `/detailProduct` 在 product 应用中匹配到的是 `/detail/*` 路径规则,根据规则内容,该服务属于核心应用做了单元会拆分,其会根据请求中 Header, Cookie 或请求参数中的变量具体的值去判断该请求的下游单元类型,由于事先配置如下切流规则(具体可见 rule 目录下的 idUnitMapping.json 文件内容): + ``` + { + "itemType": "UnitRuleItem", + "items": [ + { + "name": "unit", + "conditions": [ + { + "@userIdBetween": [ + "0~1999" + ] + } + ] + }, + { + "name": "center", + "conditions": [ + { + "@userIdBetween": [ + "2000~9999" + ] + } + ] + } + ] + } + ``` + 上述规则表示,用户Id为 0 ~ 1999 的请求将发送给下游提供者中的一般(Unit)单元中的核心应用实例,用户Id为 2000 ~ 9999 的请求将发送给下游提供者中的中心(Center)单元全局应用实例。 + 如下图,模拟一个用户Id为 1999 的请求,可见请求通过 frontend 发送到了下游中 product 的一般(Unit)单元中的核心应用实例。 + + [![1xnI7.jpg](https://s1.328888.xyz/2022/09/05/1xnI7.jpg)](https://imgloc.com/i/1xnI7) + + 如下图,模拟一个用户Id为 2000 的请求,可见请求通过 frontend 发送到了下游中 product 的中心(center)单元中的全局应用实例。 + + [![1xAHk.jpg](https://s1.328888.xyz/2022/09/05/1xAHk.jpg)](https://imgloc.com/i/1xAHk) + +3. 归属于中心(Center)单元的全局应用服务调用演示。在浏览器中输入:`http://127.0.0.1:8079/buyProduct` 路径,由于上述路径中的 `/buyProduct` 在 product 和 storage 应用中匹配到的是 `/buy/*` 路径规则,根据规则内容,该服务属于全局应用未做单元会拆分,其会直接将请求发送到下游的中心(Center)单元中全局应用实例。 + + [![1s4Oi.jpg](https://s1.328888.xyz/2022/09/04/1s4Oi.jpg)](https://imgloc.com/i/1s4Oi) + +4. 切流演示。切流时主要做了如下几件事: + - 构建新的映射关系规则和禁写规则(手动) + - 将禁写规则推送给应用 + - 等待数据追平后将新的映射关系规则推送给应用 + 接下来演示的切流规则,会将用户Id为 0 ~ 2999 的请求将发送给下游提供者中的一般(Unit)单元中的核心应用实例,用户Id为 3000 ~ 9999 的请求将发送给下游提供者中的中心(Center)单元中的全局应用实例。具体的规则详情见 idUnitMappingNext.json: + ``` + { + "itemType": "UnitRuleItem", + "items": [ + { + "name": "unit", + "conditions": [ + { + "@userIdBetween": [ + "0~2999" + ] + } + ] + }, + { + "name": "center", + "conditions": [ + { + "@userIdBetween": [ + "3000~9999" + ] + } + ] + } + ] + } + ``` + 如下图,模拟一个用户Id为 2999 的请求,可见请求通过 frontend 发送到了下游中 product 的 unit 单元中的核心应用实例,切流规则生效。 + [![1xUnd.jpg](https://s1.328888.xyz/2022/09/05/1xUnd.jpg)](https://imgloc.com/i/1xUnd) + + 如下图,模拟一个用户Id为 3000 的请求,可见请求通过 frontend 发送到了下游中 product 的 center 单元中的全局应用实例,切流规则生效。 + [![1xpgr.jpg](https://s1.328888.xyz/2022/09/05/1xpgr.jpg)](https://imgloc.com/i/1xpgr) + + + + diff --git a/spring-cloud-alibaba-examples/appactive-example/readme.md b/spring-cloud-alibaba-examples/appactive-example/readme.md new file mode 100644 index 000000000..92516cb0b --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/readme.md @@ -0,0 +1,216 @@ +# AppActive Example + +## Introduction + +[![vTlxsA.jpg](https://s1.ax1x.com/2022/09/04/vTlxsA.jpg)](https://imgse.com/i/vTlxsA) + +The overall structure of this demo is shown above. + +Note: + +- The registry Nacos and database MySQL that the application depends on are not shown in the figure. +- The demo uses Nacos as a command channel + +### Core Concept + +concept + +The idea of multi-activity in different places is analogous to that eggs in daily life should not be placed in one basket. By splitting and deploying business applications in units, the impact of a unit's failure is limited to a specific unit. In the application multi-activity scheme based on AppActive, applications can be divided into three categories: global business, core business and shared business according to application attributes, which can be classified into two types of units: center unit and general unit. Units are generally used to refer to server room. + +3 types applications: +- Global application: business applications (such as inventory, amount, etc.) with strong consistency cannot be split between multiple activities in different places, and they need to read and write services in the center unit. +- Core application: an application that is divided into units, an application that reads and writes in a specific unit according to the preset multi-active rules and request information. +- General application: It belongs to the business on the non-core link of the system, has low requirements on data consistency, and is not divided into units. + +2 types units: + +- Center unit: also known as the center server room, can carry three types of global, core and general services, and generally has higher hardware configuration than the normal unit in the server room. +- Normal unit: other non-central units, used to carry services other than non-global services, can also be called general server rooms. + +There are three applications in demo, according to the distance (call link) of the end user from near and far: + +- frontend: frontend application, accept user requests, and return after requesting actual data. +- product: product application, providing three services: + - product List: General Service + - product Details: Unit Service + - product order: central service, relying on inventory application +- storage: storage application, it provide create orders service for users. + +The applications are deployed in each of the center and normal unit. + +The green grid in the figure represents the call link of the request. + +## Instructions for use + +### Quick start +Before starting the example for demonstration, let's take a look at how Spring Cloud applications use the remote multi-active capabilities provided by AppActive. +**Note, this chapter is only for your understanding of the access method. The access work has been completed in this examples, and you do not need to modify it.** + +1. First, modify the pom.xml file to add the following maven dependencies based on the latest `spring-cloud-alibaba-dependencies` added to the provider and consumer. + + + com.alibaba.cloud + spring-cloud-starter-alibaba-appactive + + +2. Configure offload policies for specific interfaces in the `application.properties` configuration file of the Provider application. The suffix `core-path` is used to configure core services, `global-path` is used to configure global services, and `general-path` is used to configure general services. For example, the product application distribution strategy in the demo is configured as follows + + spring.cloud.appactive.filter.core-path=/detailHidden/*,/detail/* + spring.cloud.appactive.filter.global-path=/buy/* + spring.cloud.appactive.filter.general-path=/* + +3. In the `application.properties` of the Consumer application, configure the client load balancing as the load balancing algorithm provided by AppActive. The configuration method is as follows. Note that `[service-name]` needs to be replaced with the specific service name to be consumed. + + [service-name].ribbon.NFLoadBalancerRuleClassName =com.alibaba.cloud.appactive.consumer.AppactiveRule + + +### Presentation preparation + +1. Start Nacos, MySQL, and push multi-active rules to Nacos: + + - In the `appactive-example` directory, execute: `docker-compose -f component-quickstart.yml up -d` to start Nacos, MySQL. + - Execute the following command: `curl -X POST 'http://127.0.0.1:8848/nacos/v1/console/namespaces' -d 'customNamespaceId=appactiveDemoNamespaceId&namespaceName=appactiveDemoNamespaceName&namespaceDesc=appactiveDemoNamespaceDesc'` Create a demo named in Nacos configuration center Space appactiveDemoNamespaceId. + - Execute the following command: `sh baseline.sh 2 NACOS appactiveDemoNamespaceId` to push the multi-active rule to the namespace. The multi-live rules are described as follows: + - `appactive.dataId.idSourceRulePath`: Describes how to extract routing tokens from http traffic + - `appactive.dataId.transformerRulePath`: Describes how to parse routing tokens + - `appactive.dataId.trafficRouteRulePath`: Describes the mapping between routing labels and units + - `appactive.dataId.dataScopeRuleDirectoryPath_mysql-product`: Properties that describe the database + + +2. Start five sets of applications, the startup parameters are: + +- frontend + ``` + -Dappactive.channelTypeEnum=NACOS + -Dappactive.namespaceId=appactiveDemoNamespaceId + -Dappactive.unit=unit + -Dappactive.app=frontend + -Dio.appactive.demo.unitlist=center,unit + -Dio.appactive.demo.applist=frontend,product,storage + -Dserver.port=8875 + ``` +- product + ``` + -Dappactive.channelTypeEnum=NACOS + -Dappactive.namespaceId=appactiveDemoNamespaceId + -Dappactive.unit=center + -Dappactive.app=product + -Dspring.datasource.url=jdbc:mysql://127.0.0.1:3306/product?characterEncoding=utf8&useSSL=false&serverTimezone=GMT&activeInstanceId=mysql&activeDbName=product + -Dserver.port=8883 + ``` + ``` + -Dappactive.channelTypeEnum=NACOS + -Dappactive.namespaceId=appactiveDemoNamespaceId + -Dappactive.unit=unit + -Dappactive.app=product + -Dspring.datasource.url=jdbc:mysql://127.0.0.1:3306/product?characterEncoding=utf8&useSSL=false&serverTimezone=GMT&activeInstanceId=mysql&activeDbName=product + -Dserver.port=8873 + ``` +- storage + ``` + -Dappactive.channelTypeEnum=NACOS + -Dappactive.namespaceId=appactiveDemoNamespaceId + -Dappactive.unit=center + -Dappactive.app=storage + -Dspring.datasource.url=jdbc:mysql://127.0.0.1:3306/product?characterEncoding=utf8&useSSL=false&serverTimezone=GMT + -Dserver.port=8881 + ``` + ``` + -Dappactive.channelTypeEnum=NACOS + -Dappactive.namespaceId=appactiveDemoNamespaceId + -Dappactive.unit=unit + -Dappactive.app=storage + -Dspring.datasource.url=jdbc:mysql://127.0.0.1:3306/product?characterEncoding=utf8&useSSL=false&serverTimezone=GMT + -Dserver.port=8871 + ``` + +## Demonstration process + +1. Demonstration of general service calls belonging to the normal unit. Typing: `http://127.0.0.1:8079/listProduct` address in the browser, it can be seen that the request is sent to the product through the frontend application. + + [![vTlxsA.jpg](https://s1.ax1x.com/2022/09/04/vTlxsA.jpg)](https://imgse.com/i/vTlxsA) + + Since `/listProduct` in the above path matches the `/*` path rule in the product application, which corresponds to the normal unit, frontend does not have a tendency in the product address list obtained from the registry, and will randomly select an address for request sending. So requesting the above path multiple times will see the request switch back and forth between the normal and center units of the product. + +2. Demonstration of core service calls belonging to the different unit by request information. Typing: `http://127.0.0.1:8079/detailProduct` in the browser, because the `/detailProduct` in the above path matches the `/detail/*` path rule in the product application, corresponding to the normal(unit) unit, it will be based on the request The specific value of the variable in the Header, Cookie or request parameter is used to determine the downstream unit type of the request, because the following flow switching rules are configured in advance (for details, see the content of the idUnitMapping.json file in the rule directory): + ``` + { + "itemType": "UnitRuleItem", + "items": [ + { + "name": "unit", + "conditions": [ + { + "@userIdBetween": [ + "0~1999" + ] + } + ] + }, + { + "name": "center", + "conditions": [ + { + "@userIdBetween": [ + "2000~9999" + ] + } + ] + } + ] + } + ``` + The above rules mean that requests with user IDs of 0 ~ 1999 will be sent to the noraml(unit) in the downstream provider, and requests with user IDs of 2000 ~ 9999 will be sent to the center unit of the downstream provider. + As shown in the figure below, a request with a user ID of 1999 is simulated. It can be seen that the request is sent to the normal unit of product in the downstream through the frontend. + + [![1xnI7.jpg](https://s1.328888.xyz/2022/09/05/1xnI7.jpg)](https://imgloc.com/i/1xnI7) + + As shown in the figure below, a request with a user ID of 2000 is simulated. It can be seen that the request is sent to the center unit node of the product in the downstream through the frontend. + + [![1xAHk.jpg](https://s1.328888.xyz/2022/09/05/1xAHk.jpg)](https://imgloc.com/i/1xAHk) + +3. Demonstration of global service invocation belonging to the center unit. Typing: `http://127.0.0.1:8079/buyProduct` path in the browser, because the `/buyProduct` in the above path matches the `/buy/*` path rule in the product and storage applications, corresponding to the center unit, it will directly send the request to the downstream center unit node. + + [![1s4Oi.jpg](https://s1.328888.xyz/2022/09/04/1s4Oi.jpg)](https://imgloc.com/i/1s4Oi) + +4. Cut flow demo. The main things to do when cutting flow are as follows: + - Build new mapping relationship rules and write prohibition rules (manually). + - Push the write prohibition rules to the application. + - Push the new mapping relationship rules to the application after waiting for the data to equalize. + The streaming rule demonstrated next will send requests with user IDs 0 ~ 2999 to the normal(called unit) unit in the downstream provider, and requests with user IDs 3000 ~ 9999 will be sent to the center(called center) unit in the downstream provider. For specific rules, see idUnitMappingNext.json: + ``` + { + "itemType": "UnitRuleItem", + "items": [ + { + "name": "unit", + "conditions": [ + { + "@userIdBetween": [ + "0~2999" + ] + } + ] + }, + { + "name": "center", + "conditions": [ + { + "@userIdBetween": [ + "3000~9999" + ] + } + ] + } + ] + } + ``` + As shown in the figure below, a request with a user ID of 2999 is simulated. It can be seen that the request is sent to the unit node of the product in the downstream through the frontend, and the flow switching rule takes effect. + [![1xUnd.jpg](https://s1.328888.xyz/2022/09/05/1xUnd.jpg)](https://imgloc.com/i/1xUnd) + + As shown in the figure below, a request with a user ID of 3000 is simulated. It can be seen that the request is sent to the center unit node of the product in the downstream through the frontend, and the cut flow rule takes effect. + [![1xpgr.jpg](https://s1.328888.xyz/2022/09/05/1xpgr.jpg)](https://imgloc.com/i/1xpgr) + + + + diff --git a/spring-cloud-alibaba-examples/appactive-example/rule/dbProperty.json b/spring-cloud-alibaba-examples/appactive-example/rule/dbProperty.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/rule/dbProperty.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/appactive-example/rule/forbiddenRule.json b/spring-cloud-alibaba-examples/appactive-example/rule/forbiddenRule.json new file mode 100644 index 000000000..6fd264dc0 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/rule/forbiddenRule.json @@ -0,0 +1,15 @@ +{ + "itemType": "ForbiddenRuleItem", + "items": [ + { + "name": "between", + "conditions": [ + { + "@userIdBetween": [ + "2000~2999" + ] + } + ] + } + ] +} diff --git a/spring-cloud-alibaba-examples/appactive-example/rule/forbiddenRuleEmpty.json b/spring-cloud-alibaba-examples/appactive-example/rule/forbiddenRuleEmpty.json new file mode 100644 index 000000000..f7e24b72c --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/rule/forbiddenRuleEmpty.json @@ -0,0 +1,4 @@ +{ + "itemType": "ForbiddenRuleItem", + "items": [] +} diff --git a/spring-cloud-alibaba-examples/appactive-example/rule/idSource.json b/spring-cloud-alibaba-examples/appactive-example/rule/idSource.json new file mode 100644 index 000000000..8b7c536d9 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/rule/idSource.json @@ -0,0 +1,4 @@ +{ + "source": "arg,header,cookie", + "tokenKey": "r_id" +} diff --git a/spring-cloud-alibaba-examples/appactive-example/rule/idTransformer.json b/spring-cloud-alibaba-examples/appactive-example/rule/idTransformer.json new file mode 100644 index 000000000..135fb17c8 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/rule/idTransformer.json @@ -0,0 +1,7 @@ +[ + { + "id": "userIdBetween", + "mod": "10000" + } +] + diff --git a/spring-cloud-alibaba-examples/appactive-example/rule/idUnitMapping.json b/spring-cloud-alibaba-examples/appactive-example/rule/idUnitMapping.json new file mode 100644 index 000000000..3fa0b18d5 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/rule/idUnitMapping.json @@ -0,0 +1,25 @@ +{ + "itemType": "UnitRuleItem", + "items": [ + { + "name": "unit", + "conditions": [ + { + "@userIdBetween": [ + "0~1999" + ] + } + ] + }, + { + "name": "center", + "conditions": [ + { + "@userIdBetween": [ + "2000~9999" + ] + } + ] + } + ] +} diff --git a/spring-cloud-alibaba-examples/appactive-example/rule/idUnitMappingNext.json b/spring-cloud-alibaba-examples/appactive-example/rule/idUnitMappingNext.json new file mode 100644 index 000000000..dafde8b6b --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/rule/idUnitMappingNext.json @@ -0,0 +1,25 @@ +{ + "itemType": "UnitRuleItem", + "items": [ + { + "name": "unit", + "conditions": [ + { + "@userIdBetween": [ + "0~2999" + ] + } + ] + }, + { + "name": "center", + "conditions": [ + { + "@userIdBetween": [ + "3000~9999" + ] + } + ] + } + ] +} diff --git a/spring-cloud-alibaba-examples/appactive-example/rule/transformerBetween.json b/spring-cloud-alibaba-examples/appactive-example/rule/transformerBetween.json new file mode 100644 index 000000000..5c13358c3 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/rule/transformerBetween.json @@ -0,0 +1,4 @@ +{ + "id": "userIdBetween", + "mod": "10000" +} diff --git a/spring-cloud-alibaba-examples/appactive-example/storage/Dockerfile b/spring-cloud-alibaba-examples/appactive-example/storage/Dockerfile new file mode 100644 index 000000000..b0fd3d6a0 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/storage/Dockerfile @@ -0,0 +1,18 @@ +FROM openjdk:8-jdk-alpine + +WORKDIR /app +COPY target/storage-0.2.1.jar /app +# 设置文件夹操作权限 +RUN chown -R root:root /app/* && \ + chmod a+rw -R /app/* +#EXPOSE 8090 +USER root:root + +ARG UNITFLAG=default + +ENV TZ=Asia/Shanghai \ + UNITFLAG=$UNITFLAG \ + LANG="en_US.UTF-8" + +ENTRYPOINT ["sh", "-c"] +CMD ["java -jar /app/storage-0.2.1.jar"] diff --git a/spring-cloud-alibaba-examples/appactive-example/storage/pom.xml b/spring-cloud-alibaba-examples/appactive-example/storage/pom.xml new file mode 100644 index 000000000..25e5c1b70 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/storage/pom.xml @@ -0,0 +1,45 @@ + + + + 4.0.0 + + + com.alibaba.cloud + spring-cloud-alibaba-examples + ${revision} + ../../pom.xml + + + storage + Spring Cloud Starter Alibaba Appactive Example - Storage Service + jar + + + 8 + 8 + true + + + + + com.alibaba.cloud + appactive-example-common + ${revision} + + + + mysql + mysql-connector-java + 5.1.40 + + + + com.alibaba.msha + client-bridge-db-mysql + 0.2.1 + + + + diff --git a/spring-cloud-alibaba-examples/appactive-example/storage/src/main/java/com/alibaba/cloud/example/storage/StorageApplication.java b/spring-cloud-alibaba-examples/appactive-example/storage/src/main/java/com/alibaba/cloud/example/storage/StorageApplication.java new file mode 100644 index 000000000..76ce8aca1 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/storage/src/main/java/com/alibaba/cloud/example/storage/StorageApplication.java @@ -0,0 +1,86 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.storage; + +import com.alibaba.cloud.example.common.entity.ResultHolder; +import com.alibaba.cloud.example.storage.service.OrderServiceImpl; +import io.appactive.java.api.base.AppContextClient; +import io.appactive.support.log.LogUtil; +import org.slf4j.Logger; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; +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.bind.annotation.RestController; + +@SpringBootApplication +@EntityScan("com.alibaba.cloud.example.*") +@ComponentScan(basePackages = { "com.alibaba.cloud.example" }) +@RestController("/") +@EnableDiscoveryClient +@EnableFeignClients(basePackages = { "com.alibaba.cloud.example" }) +public class StorageApplication { + + private static final Logger logger = LogUtil.getLogger(); + + @Autowired + OrderServiceImpl orderService; + + @Value("${spring.application.name}") + private String appName; + + public static void main(String[] args) { + SpringApplication.run(StorageApplication.class, args); + } + + /** + * buy1 is just for bypassing center service protection. + * @param rId rId + * @param id id + * @param number number + * @return resultHolder resultHolder + */ + @RequestMapping({ "/buy", "/buy1" }) + @ResponseBody + public ResultHolder buy( + @RequestParam(required = false, defaultValue = "jack") String rId, + @RequestParam(required = false, defaultValue = "12") String id, + @RequestParam(required = false, defaultValue = "1") Integer number) { + String routerId = AppContextClient.getRouteId(); + logger.info("buy, routerId: {}, pid: {}, number: {}", routerId, id, number); + ResultHolder resultHolder = orderService.buy(rId, id, number); + resultHolder + .setResult(String.format("routerId %s bought %d of item %s, result: %s", + routerId, number, id, resultHolder.getResult())); + return resultHolder; + } + + @RequestMapping("/check") + @ResponseBody + public String check() { + return "OK From " + appName; + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/storage/src/main/java/com/alibaba/cloud/example/storage/repository/ProductRepository.java b/spring-cloud-alibaba-examples/appactive-example/storage/src/main/java/com/alibaba/cloud/example/storage/repository/ProductRepository.java new file mode 100644 index 000000000..09a1b3a21 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/storage/src/main/java/com/alibaba/cloud/example/storage/repository/ProductRepository.java @@ -0,0 +1,25 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.storage.repository; + +import com.alibaba.cloud.example.common.entity.Product; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProductRepository extends JpaRepository { + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/storage/src/main/java/com/alibaba/cloud/example/storage/service/OrderServiceImpl.java b/spring-cloud-alibaba-examples/appactive-example/storage/src/main/java/com/alibaba/cloud/example/storage/service/OrderServiceImpl.java new file mode 100644 index 000000000..914c74801 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/storage/src/main/java/com/alibaba/cloud/example/storage/service/OrderServiceImpl.java @@ -0,0 +1,77 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.example.storage.service; + +import java.util.Optional; + +import com.alibaba.cloud.example.common.entity.Product; +import com.alibaba.cloud.example.common.entity.ResultHolder; +import com.alibaba.cloud.example.common.service.OrderDAO; +import com.alibaba.cloud.example.storage.repository.ProductRepository; +import io.appactive.support.log.LogUtil; +import org.slf4j.Logger; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +public class OrderServiceImpl implements OrderDAO.OrderService { + + private static final Logger logger = LogUtil.getLogger(); + + @Autowired + ProductRepository repository; + + @Value("${appactive.unit}") + private String unit; + + @Override + public ResultHolder buy(String rId, String pId, Integer number) { + String result = null; + try { + Optional op = repository.findById(pId); + if (op.isPresent()) { + // todo 扣库存,应该强校验 + Product p = op.get(); + int oldNum = p.getNumber(); + int left = oldNum - number; + if (left >= 0) { + p.setNumber(left); + p = repository.save(p); + if (p.getNumber() + number != oldNum) { + result = "storage not consist"; + } + else { + result = "success"; + } + } + else { + result = "sold out"; + } + } + else { + result = "no such product"; + } + } + catch (Throwable e) { + result = e.getCause().getCause().getMessage(); + } + return new ResultHolder<>(result); + } + +} diff --git a/spring-cloud-alibaba-examples/appactive-example/storage/src/main/resources/application.properties b/spring-cloud-alibaba-examples/appactive-example/storage/src/main/resources/application.properties new file mode 100644 index 000000000..1cca378e3 --- /dev/null +++ b/spring-cloud-alibaba-examples/appactive-example/storage/src/main/resources/application.properties @@ -0,0 +1,16 @@ +server.port=8085 +spring.application.name=storage +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/product?characterEncoding=utf8&useSSL=false&serverTimezone=GMT +spring.datasource.username=root +spring.datasource.password=root +#spring.datasource.driver-class-name=com.mysql.jdbc.Driver +spring.datasource.driver-class-name=io.appactive.db.mysql.driver.Driver +spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=false +appactive.unit=center +appactive.app=storage +spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 +spring.cloud.appactive.filter.global-path=/buy/* +spring.cloud.appactive.filter.general-path=/* diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/pom.xml b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/pom.xml index 4b0e61f19..69d4a6f69 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/pom.xml +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/pom.xml @@ -1,68 +1,72 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - - com.alibaba.cloud - nacos-discovery-example - ${revision} - - 4.0.0 + + com.alibaba.cloud + nacos-discovery-example + ${revision} + + 4.0.0 - nacos-discovery-consumer-example - Spring Cloud Starter Alibaba Nacos Discovery Consumer Example - Example demonstrating how to use nacos discovery - jar + nacos-discovery-consumer-example + Spring Cloud Starter Alibaba Nacos Discovery Consumer Example + Example demonstrating how to use nacos discovery + jar - - - org.springframework.boot - spring-boot-starter-web - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - + + + org.springframework.boot + spring-boot-starter-web + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.alibaba.cloud + spring-cloud-starter-alibaba-appactive + - - org.springframework.boot - spring-boot-starter-actuator - + + org.springframework.boot + spring-boot-starter-actuator + - - org.springframework.cloud - spring-cloud-starter-netflix-ribbon - + + org.springframework.cloud + spring-cloud-starter-netflix-ribbon + - - org.springframework.cloud - spring-cloud-starter-openfeign - + + org.springframework.cloud + spring-cloud-starter-openfeign + - - com.alibaba.cloud - spring-cloud-starter-alibaba-sentinel - + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + - + - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-deploy-plugin - ${maven-deploy-plugin.version} - - true - - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-deploy-plugin + ${maven-deploy-plugin.version} + + true + + + + diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/src/main/resources/application.properties b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/src/main/resources/application.properties index c1071da86..c8b4e4318 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/src/main/resources/application.properties +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/src/main/resources/application.properties @@ -3,19 +3,17 @@ server.port=18083 management.endpoints.web.exposure.include=* spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.discovery.fail-fast=true - spring.cloud.nacos.username=nacos spring.cloud.nacos.password=nacos - feign.sentinel.enabled=true - spring.cloud.sentinel.transport.dashboard=localhost:8080 spring.cloud.sentinel.eager=true - spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json spring.cloud.sentinel.datasource.ds1.file.data-type=json spring.cloud.sentinel.datasource.ds1.file.rule-type=flow - spring.cloud.sentinel.datasource.ds2.file.file=classpath: degraderule.json spring.cloud.sentinel.datasource.ds2.file.data-type=json spring.cloud.sentinel.datasource.ds2.file.rule-type=degrade +#service-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.AvailabilityFilteringRule +service-provider.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.appactive.consumer.AppactiveRule + diff --git a/spring-cloud-alibaba-examples/pom.xml b/spring-cloud-alibaba-examples/pom.xml index 3fe4aa790..3c7a9d80e 100644 --- a/spring-cloud-alibaba-examples/pom.xml +++ b/spring-cloud-alibaba-examples/pom.xml @@ -23,6 +23,10 @@ sentinel-example/sentinel-webflux-example sentinel-example/sentinel-spring-cloud-gateway-example sentinel-example/sentinel-zuul-example + appactive-example/common + appactive-example/frontend + appactive-example/product + appactive-example/storage nacos-example/nacos-discovery-example nacos-example/nacos-config-example nacos-example/nacos-gateway-example diff --git a/spring-cloud-alibaba-starters/pom.xml b/spring-cloud-alibaba-starters/pom.xml index 0476ad963..6773cb080 100644 --- a/spring-cloud-alibaba-starters/pom.xml +++ b/spring-cloud-alibaba-starters/pom.xml @@ -25,6 +25,7 @@ spring-cloud-starter-alibaba-sentinel spring-cloud-alibaba-sentinel-datasource spring-cloud-alibaba-sentinel-gateway + spring-cloud-starter-alibaba-appactive spring-cloud-alibaba-commons diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/.gitignore b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/.gitignore new file mode 100644 index 000000000..549e00a2a --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/pom.xml new file mode 100644 index 000000000..b46b48068 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/pom.xml @@ -0,0 +1,98 @@ + + + 4.0.0 + + com.alibaba.cloud + spring-cloud-alibaba-starters + ${revision} + ../pom.xml + + + spring-cloud-starter-alibaba-appactive + Spring Cloud Starter Alibaba Appactive + + + 0.2.1 + + + + + com.alibaba.msha + appactive-java-api + ${appactive.version} + + + com.alibaba.msha + client-rule + ${appactive.version} + + + com.alibaba.msha + client-bridge-rpc-base + ${appactive.version} + + + org.springframework.boot + spring-boot + true + + + org.springframework.cloud + spring-cloud-openfeign-core + true + + + io.github.openfeign + feign-java8 + 9.5.1 + compile + + + org.springframework.cloud + spring-cloud-starter-netflix-ribbon + + + com.alibaba.msha + client-bridge-servlet + 0.2.1 + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + compile + + + javax.servlet + javax.servlet-api + 4.0.1 + compile + + + org.springframework.boot + spring-boot-configuration-processor + 2.4.0 + true + + + org.springframework.boot + spring-boot-autoconfigure + ${spring-boot.version} + compile + + + com.google.guava + guava + 31.1-jre + + + com.alibaba + fastjson + 2.0.11 + + + + + + + diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/AppactiveProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/AppactiveProperties.java new file mode 100644 index 000000000..ffe668223 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/AppactiveProperties.java @@ -0,0 +1,94 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.core.env.Environment; +import org.springframework.util.StringUtils; + +/** + * @author ChengPu raozihao + * @description + * @date 2022/8/15 + */ +@ConfigurationProperties("spring.cloud.appactive.filter") +public class AppactiveProperties { + + private String[] corePath; + + private String[] globalPath; + + private String[] generalPath; + + @Autowired + private Environment environment; + + public String[] getCorePath() { + return corePath; + } + + void setCorePath(String[] corePath) { + this.corePath = corePath; + } + + public String[] getGlobalPath() { + return globalPath; + } + + void setGlobalPath(String[] globalPath) { + this.globalPath = globalPath; + } + + public String[] getGeneralPath() { + return generalPath; + } + + void setGeneralPath(String[] generalPath) { + this.generalPath = generalPath; + } + + @PostConstruct + public void init() { + this.overrideFromEnv(environment); + } + + public void overrideFromEnv(Environment env) { + + if (StringUtils.isEmpty(this.getCorePath())) { + String coreValue = env + .resolvePlaceholders("${spring.cloud.appactive.filter.core-path:}"); + String[] cores = coreValue.split(","); + this.setCorePath(cores); + } + if (StringUtils.isEmpty(this.getGlobalPath())) { + String globalValue = env + .resolvePlaceholders("${spring.cloud.appactive.filter.global-path:}"); + String[] globals = globalValue.split(","); + this.setGlobalPath(globals); + } + if (StringUtils.isEmpty(this.getGeneralPath())) { + String generalValue = env.resolvePlaceholders( + "${spring.cloud.appactive.filter.general-path:}"); + String[] generals = generalValue.split(","); + this.setGeneralPath(generals); + } + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/common/ServiceMeta.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/common/ServiceMeta.java new file mode 100644 index 000000000..ebad23a9d --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/common/ServiceMeta.java @@ -0,0 +1,64 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.common; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public class ServiceMeta implements Comparable { + + private String uriPrefix; + + private String ra; + + public ServiceMeta() { + } + + public ServiceMeta(String uriPrefix, String ra) { + this.uriPrefix = uriPrefix; + this.ra = ra; + } + + public String getUriPrefix() { + return uriPrefix; + } + + public void setUriPrefix(String uriPrefix) { + this.uriPrefix = uriPrefix; + } + + public String getRa() { + return ra; + } + + public void setRa(String ra) { + this.ra = ra; + } + + @Override + public String toString() { + return "ServiceMeta{" + "uriPrefix='" + uriPrefix + '\'' + ", ra=" + ra + '}'; + } + + @Override + public int compareTo(ServiceMeta o) { + int pre = this.uriPrefix.compareTo(o.getUriPrefix()); + return pre == 0 ? this.ra.compareTo(o.getRa()) : pre; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/common/ServiceMetaObject.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/common/ServiceMetaObject.java new file mode 100644 index 000000000..717b2855d --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/common/ServiceMetaObject.java @@ -0,0 +1,74 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.common; + +import java.util.List; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public class ServiceMetaObject { + + private List serviceMetaList; + + /** + * string of serviceMetaList. + */ + private String meta; + + private String md5OfList; + + public ServiceMetaObject(List serviceMetaList, String md5OfList) { + this.serviceMetaList = serviceMetaList; + this.md5OfList = md5OfList; + } + + public ServiceMetaObject() { + } + + public List getServiceMetaList() { + return serviceMetaList; + } + + public void setServiceMetaList(List serviceMetaList) { + this.serviceMetaList = serviceMetaList; + } + + public String getMd5OfList() { + return md5OfList; + } + + public void setMd5OfList(String md5OfList) { + this.md5OfList = md5OfList; + } + + public String getMeta() { + return meta; + } + + public void setMeta(String meta) { + this.meta = meta; + } + + @Override + public String toString() { + return "ServiceMetaObject{" + "serviceMetaList=" + serviceMetaList + + ", md5OfList='" + md5OfList + '\'' + '}'; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/common/UriContext.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/common/UriContext.java new file mode 100644 index 000000000..ba3358356 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/common/UriContext.java @@ -0,0 +1,42 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.common; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public final class UriContext { + + private UriContext() { + } + + private static final ThreadLocal URI_INFO = new ThreadLocal(); + + public static void clearContext() { + URI_INFO.remove(); + } + + public static String getUriPath() { + return URI_INFO.get(); + } + + public static void setUriPath(String targetUnit) { + URI_INFO.set(targetUnit); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/config/FilterAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/config/FilterAutoConfiguration.java new file mode 100644 index 000000000..1bd3929f5 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/config/FilterAutoConfiguration.java @@ -0,0 +1,76 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.config; + +import com.alibaba.cloud.appactive.AppactiveProperties; +import com.alibaba.cloud.appactive.provider.CoreServiceFilter; +import com.alibaba.cloud.appactive.provider.GlobalServiceFilter; +import io.appactive.servlet.RequestFilter; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author ChengPu raozihao + * @description + * @date 2022/8/15 + */ +@Configuration +public class FilterAutoConfiguration { + + @Autowired + private AppactiveProperties appactiveProperties; + + @Bean + public FilterRegistrationBean appActiveCenterServiceFilter() { + if (appactiveProperties.getGlobalPath() == null) { + return null; + } + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + GlobalServiceFilter reqResFilter = new GlobalServiceFilter(); + filterRegistrationBean.setFilter(reqResFilter); + filterRegistrationBean.addUrlPatterns(appactiveProperties.getGlobalPath()); + return filterRegistrationBean; + } + + @Bean + public FilterRegistrationBean appActiveUnitServiceFilter() { + if (appactiveProperties.getCorePath() == null) { + return null; + } + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + CoreServiceFilter reqResFilter = new CoreServiceFilter(); + filterRegistrationBean.setFilter(reqResFilter); + filterRegistrationBean.addUrlPatterns(appactiveProperties.getCorePath()); + return filterRegistrationBean; + } + + @Bean + public FilterRegistrationBean appActiveNormalServiceFilter() { + if (appactiveProperties.getGeneralPath() == null) { + return null; + } + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + RequestFilter reqResFilter = new RequestFilter(); + filterRegistrationBean.setFilter(reqResFilter); + filterRegistrationBean.addUrlPatterns(appactiveProperties.getGeneralPath()); + return filterRegistrationBean; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/config/FilterPropertiesAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/config/FilterPropertiesAutoConfiguration.java new file mode 100644 index 000000000..c91067ab7 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/config/FilterPropertiesAutoConfiguration.java @@ -0,0 +1,37 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.config; + +import com.alibaba.cloud.appactive.AppactiveProperties; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author ChengPu raozihao + * @description + * @date 2022/8/15 + */ +@Configuration +public class FilterPropertiesAutoConfiguration { + + @Bean + public AppactiveProperties appactiveProperties() { + return new AppactiveProperties(); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/constant/Constants.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/constant/Constants.java new file mode 100644 index 000000000..101c5997d --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/constant/Constants.java @@ -0,0 +1,33 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.constant; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public final class Constants { + + /** + * Router Id header key. + */ + public static final String ROUTER_ID_HEADER_KEY = "appactive-router-id"; + + private Constants() { + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/AppactivePredicate.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/AppactivePredicate.java new file mode 100644 index 000000000..f4fce8e4d --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/AppactivePredicate.java @@ -0,0 +1,124 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.consumer; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.alibaba.cloud.appactive.common.ServiceMeta; +import com.alibaba.cloud.appactive.common.UriContext; +import com.alibaba.cloud.nacos.ribbon.NacosServer; +import com.alibaba.fastjson.JSONObject; +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.AbstractServerPredicate; +import com.netflix.loadbalancer.IRule; +import com.netflix.loadbalancer.PredicateKey; +import io.appactive.java.api.base.AppContextClient; +import io.appactive.java.api.base.constants.AppactiveConstant; +import io.appactive.java.api.base.constants.ResourceActiveType; +import io.appactive.java.api.rule.traffic.TrafficRouteRuleService; +import io.appactive.java.api.utils.lang.StringUtils; +import io.appactive.rule.ClientRuleService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.util.AntPathMatcher; + +/** + * @author ChengPu raozihao + * @description + * @date 2022/8/20 + */ +public class AppactivePredicate extends AbstractServerPredicate { + + private static final Logger logger = LoggerFactory + .getLogger(AppactivePredicate.class); + + private final TrafficRouteRuleService trafficRouteRuleService = ClientRuleService + .getTrafficRouteRuleService(); + + private final AntPathMatcher antPathMatcher = new AntPathMatcher(); + + public AppactivePredicate(IRule rule, IClientConfig clientConfig) { + super(rule, clientConfig); + } + + public AppactivePredicate(IRule rule) { + super(rule); + } + + @Override + public boolean apply(PredicateKey predicateKey) { + // Just support Nacos Registry now, if it's a NacosServer, return true directly. + if (!(predicateKey.getServer() instanceof NacosServer)) { + return true; + } + NacosServer server = (NacosServer) predicateKey.getServer(); + + // uriPath of the request. + String uriPath = UriContext.getUriPath(); + Map metadata = server.getMetadata(); + // zone + String unitType = metadata.get("ut"); + String svcMeta = metadata.get("svc_meta"); + String version = metadata.get("svc_meta_v"); + if (unitType == null || svcMeta == null || version == null) { + return true; + } + String serviceType = null; + List serviceMetas = JSONObject.parseArray(svcMeta, + ServiceMeta.class); + Map matchingPatterns = new HashMap<>(); + for (ServiceMeta sm : serviceMetas) { + if (antPathMatcher.match(sm.getUriPrefix(), uriPath)) { + matchingPatterns.put(sm.getUriPrefix(), sm.getRa()); + } + } + Comparator patternComparator = antPathMatcher + .getPatternComparator(uriPath); + if (!matchingPatterns.isEmpty()) { + List urls = new ArrayList<>(matchingPatterns.keySet()); + urls.sort(patternComparator); + serviceType = matchingPatterns.get(urls.get(0)); + } + + if (!StringUtils.isBlank(serviceType) && ResourceActiveType.CENTER_RESOURCE_TYPE + .equalsIgnoreCase(serviceType)) { + return AppactiveConstant.CENTER_FLAG.equalsIgnoreCase(unitType); + } + else if (!StringUtils.isBlank(serviceType) + && ResourceActiveType.UNIT_RESOURCE_TYPE.equalsIgnoreCase(serviceType)) { + // routeId of the request. + String routeId = AppContextClient.getRouteId(); + if (routeId == null) { + return false; + } + + // targetUnit setting by users, such as unit0,unit1,...,unitn. + String targetUnitByRouteId = trafficRouteRuleService + .getUnitByRouteId(routeId); + return !StringUtils.isBlank(targetUnitByRouteId) + && targetUnitByRouteId.equalsIgnoreCase(unitType); + } + + return true; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/AppactiveRule.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/AppactiveRule.java new file mode 100644 index 000000000..3a5a0bc96 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/AppactiveRule.java @@ -0,0 +1,49 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.consumer; + +import com.netflix.loadbalancer.AbstractServerPredicate; +import com.netflix.loadbalancer.CompositePredicate; +import com.netflix.loadbalancer.ILoadBalancer; +import com.netflix.loadbalancer.PredicateBasedRule; + +/** + * @description + * @author ChengPu raozihao + * @date 2022/8/21 + */ +public class AppactiveRule extends PredicateBasedRule { + + private AbstractServerPredicate predicate; + + public AppactiveRule() { + super(); + predicate = CompositePredicate.withPredicate(new AppactivePredicate(this, null)) + .addFallbackPredicate(AbstractServerPredicate.alwaysTrue()).build(); + } + + @Override + public void setLoadBalancer(ILoadBalancer lb) { + super.setLoadBalancer(lb); + } + + @Override + public AbstractServerPredicate getPredicate() { + return predicate; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ConsumerAutoConfig.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ConsumerAutoConfig.java new file mode 100644 index 000000000..034d26468 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ConsumerAutoConfig.java @@ -0,0 +1,95 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.consumer; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.PostConstruct; + +import feign.RequestInterceptor; +import feign.codec.Decoder; +import feign.optionals.OptionalDecoder; +import io.appactive.support.lang.CollectionUtils; +import io.appactive.support.log.LogUtil; +import org.slf4j.Logger; + +import org.springframework.beans.factory.ObjectFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; +import org.springframework.cloud.openfeign.support.ResponseEntityDecoder; +import org.springframework.cloud.openfeign.support.SpringDecoder; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.web.client.RestTemplate; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +@Configuration +public class ConsumerAutoConfig { + + private static final Logger logger = LogUtil.getLogger(); + + @Autowired + ApplicationContext context; + + @Autowired(required = false) + RestTemplate restTemplate; + + @Autowired + private ObjectFactory messageConverters; + + @Bean + @ConditionalOnMissingBean + public Decoder appActiveFeignDecoder() { + return new OptionalDecoder( + new ResponseEntityDecoder(new SpringDecoder(this.messageConverters))); + } + + @Bean + public BeanPostProcessor feignDecoderPostProcessor() { + return new FeignDecoderPostProcessor(context); + } + + @Bean + public RequestInterceptor routerIdTransmissionRequestInterceptor() { + return new RouterIdTransmissionRequestInterceptor(); + } + + @PostConstruct + public void init() { + if (restTemplate != null) { + List interceptors = restTemplate + .getInterceptors(); + if (CollectionUtils.isEmpty(interceptors)) { + interceptors = new ArrayList<>(); + } + interceptors.add(new ReqResInterceptor()); + logger.info( + "ConsumerAutoConfig adding interceptor for restTemplate[{}]......", + restTemplate.getClass()); + restTemplate.setInterceptors(interceptors); + } + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/FeignDecoderPostProcessor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/FeignDecoderPostProcessor.java new file mode 100644 index 000000000..b0bf1f9e7 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/FeignDecoderPostProcessor.java @@ -0,0 +1,78 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.consumer; + +import feign.codec.Decoder; +import io.appactive.support.log.LogUtil; +import org.slf4j.Logger; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.ApplicationContext; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public class FeignDecoderPostProcessor implements BeanPostProcessor { + + private static final Logger logger = LogUtil.getLogger(); + + final ApplicationContext context; + + public FeignDecoderPostProcessor(ApplicationContext context) { + this.context = context; + } + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) + throws BeansException { + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) + throws BeansException { + // there does`t have to be a Decoder(when using default), so we added a default + if (bean instanceof Decoder) { + if ("appActiveFeignDecoder".equals(beanName)) { + logger.info( + "FeignDecoderPostProcessor replacing defaultDecoder {} ......", + beanName); + } + else { + logger.info( + "FeignDecoderPostProcessor replacing customizedDecoder {} ......", + beanName); + } + Decoder decoder = (Decoder) bean; + // wrap original decoder + return new ResponseInterceptor(decoder); + + /// another way + // Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), + // bean.getClass().getInterfaces(), + // (proxy1, method, args) -> { + // String result = (String) method.invoke(bean, args); + // return result.toUpperCase(); + // }); + // return proxy; + } + return bean; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ReqResInterceptor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ReqResInterceptor.java new file mode 100644 index 000000000..056fa6e24 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ReqResInterceptor.java @@ -0,0 +1,56 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.consumer; + +import java.io.IOException; + +import com.alibaba.cloud.appactive.common.UriContext; +import com.alibaba.cloud.appactive.constant.Constants; +import io.appactive.java.api.base.AppContextClient; +import io.appactive.support.log.LogUtil; +import org.slf4j.Logger; + +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public class ReqResInterceptor implements ClientHttpRequestInterceptor { + + private static final Logger logger = LogUtil.getLogger(); + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, + ClientHttpRequestExecution execution) throws IOException { + + request.getHeaders().add(Constants.ROUTER_ID_HEADER_KEY, + AppContextClient.getRouteId()); + UriContext.setUriPath(request.getURI().getPath()); + + ClientHttpResponse response = execution.execute(request, body); + + logger.info("ReqResInterceptor uri {} for request {} got cleared", + UriContext.getUriPath(), request.getURI()); + UriContext.clearContext(); + return response; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ResponseInterceptor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ResponseInterceptor.java new file mode 100644 index 000000000..21e03eacd --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ResponseInterceptor.java @@ -0,0 +1,55 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.consumer; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.Objects; + +import com.alibaba.cloud.appactive.common.UriContext; +import feign.FeignException; +import feign.Response; +import feign.codec.Decoder; +import io.appactive.support.log.LogUtil; +import org.slf4j.Logger; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public class ResponseInterceptor implements Decoder { + + private static final Logger logger = LogUtil.getLogger(); + + final Decoder delegate; + + public ResponseInterceptor(Decoder delegate) { + Objects.requireNonNull(delegate, "Decoder must not be null. "); + this.delegate = delegate; + } + + @Override + public Object decode(Response response, Type type) + throws IOException, FeignException { + Object object = delegate.decode(response, type); + logger.info("ResponseInterceptor uri {} for request {} got cleared by {}", + UriContext.getUriPath(), response.request().url(), delegate.getClass()); + UriContext.clearContext(); + return object; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/RouterIdTransmissionRequestInterceptor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/RouterIdTransmissionRequestInterceptor.java new file mode 100644 index 000000000..8f958f6cd --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/RouterIdTransmissionRequestInterceptor.java @@ -0,0 +1,53 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.consumer; + +import javax.servlet.http.HttpServletRequest; + +import com.alibaba.cloud.appactive.common.UriContext; +import com.alibaba.cloud.appactive.constant.Constants; +import feign.RequestInterceptor; +import feign.RequestTemplate; +import io.appactive.java.api.base.AppContextClient; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public class RouterIdTransmissionRequestInterceptor implements RequestInterceptor { + + @Override + public void apply(RequestTemplate requestTemplate) { + ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder + .getRequestAttributes(); + if (requestAttributes == null) { + return; + } + HttpServletRequest request = requestAttributes.getRequest(); + if (request == null) { + return; + } + requestTemplate.header(Constants.ROUTER_ID_HEADER_KEY, + AppContextClient.getRouteId()); + // store uri for routing filter + UriContext.setUriPath(requestTemplate.url()); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ServerMeta.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ServerMeta.java new file mode 100644 index 000000000..bd13dde04 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/consumer/ServerMeta.java @@ -0,0 +1,31 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.consumer; + +import java.util.Map; + +import com.netflix.loadbalancer.Server; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public interface ServerMeta { + + Map getMetaMap(Server server); + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/CoreServiceFilter.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/CoreServiceFilter.java new file mode 100644 index 000000000..79511fd9d --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/CoreServiceFilter.java @@ -0,0 +1,100 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.provider; + +import java.io.IOException; + +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.alibaba.cloud.appactive.constant.Constants; +import io.appactive.java.api.base.AppContextClient; +import io.appactive.java.api.base.constants.AppactiveConstant; +import io.appactive.java.api.bridge.servlet.ServletService; +import io.appactive.java.api.rule.TrafficMachineService; +import io.appactive.java.api.rule.machine.AbstractMachineUnitRuleService; +import io.appactive.java.api.rule.traffic.TrafficRouteRuleService; +import io.appactive.java.api.utils.lang.StringUtils; +import io.appactive.rule.ClientRuleService; +import io.appactive.support.log.LogUtil; + +import org.springframework.http.HttpStatus; +import org.springframework.web.server.ResponseStatusException; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public class CoreServiceFilter implements Filter { + + private final TrafficRouteRuleService trafficRouteRuleService = ClientRuleService + .getTrafficRouteRuleService(); + + private final AbstractMachineUnitRuleService machineUnitRuleService = ClientRuleService + .getMachineUnitRuleService(); + + private final TrafficMachineService trafficMachineService = new TrafficMachineService( + trafficRouteRuleService, machineUnitRuleService); + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + if (!(request instanceof HttpServletRequest + && response instanceof HttpServletResponse)) { + chain.doFilter(request, response); + return; + } + HttpServletRequest httpRequest = (HttpServletRequest) request; + String routerId = ServletService.getRouteIdFromHeader(httpRequest, + Constants.ROUTER_ID_HEADER_KEY); + if (StringUtils.isBlank(routerId)) { + throw new ResponseStatusException(HttpStatus.FORBIDDEN, + "no routerId provided for this request"); + } + if (!trafficMachineService.isInCurrentUnit(routerId)) { + throw new ResponseStatusException(HttpStatus.FORBIDDEN, + "routerId " + routerId + " does not belong in core : " + + machineUnitRuleService.getCurrentUnit()); + } + AppContextClient.setUnitContext(routerId); + LogUtil.info(AppactiveConstant.PROJECT_NAME + "-routerIdFilter-doFilter-header:" + + AppContextClient.getRouteId()); + chain.doFilter(request, response); + clear(); + } + + @Override + public void destroy() { + + } + + private void clear() { + AppContextClient.clearUnitContext(); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/GeneralServiceFilter.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/GeneralServiceFilter.java new file mode 100644 index 000000000..0448c9532 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/GeneralServiceFilter.java @@ -0,0 +1,51 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.provider; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public class GeneralServiceFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + // todo + chain.doFilter(request, response); + } + + @Override + public void destroy() { + + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/GlobalServiceFilter.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/GlobalServiceFilter.java new file mode 100644 index 000000000..08d00c6ab --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/GlobalServiceFilter.java @@ -0,0 +1,75 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.provider; + +import java.io.IOException; + +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 com.alibaba.cloud.appactive.constant.Constants; +import io.appactive.java.api.base.AppContextClient; +import io.appactive.java.api.bridge.servlet.ServletService; +import io.appactive.java.api.rule.machine.AbstractMachineUnitRuleService; +import io.appactive.java.api.utils.lang.StringUtils; +import io.appactive.rule.ClientRuleService; + +import org.springframework.http.HttpStatus; +import org.springframework.web.server.ResponseStatusException; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public class GlobalServiceFilter implements Filter { + + private final AbstractMachineUnitRuleService machineUnitRuleService = ClientRuleService + .getMachineUnitRuleService(); + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + if (!machineUnitRuleService.isCenterUnit()) { + throw new ResponseStatusException(HttpStatus.FORBIDDEN, + "this is not global machine : " + + machineUnitRuleService.getCurrentUnit()); + } + HttpServletRequest httpRequest = (HttpServletRequest) request; + String routerId = ServletService.getRouteIdFromHeader(httpRequest, + Constants.ROUTER_ID_HEADER_KEY); + if (StringUtils.isNotBlank(routerId)) { + AppContextClient.setUnitContext(routerId); + } + chain.doFilter(request, response); + } + + @Override + public void destroy() { + + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/NacosAutoConfig.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/NacosAutoConfig.java new file mode 100644 index 000000000..37b9517c6 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/NacosAutoConfig.java @@ -0,0 +1,47 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.provider; + +import java.util.List; + +import javax.annotation.PostConstruct; + +import com.alibaba.cloud.nacos.registry.NacosRegistration; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Configuration; + +/** + * @author mageekchiu + */ +@Configuration +public class NacosAutoConfig { + + @Autowired + private List beanList; + + @Autowired(required = false) + private NacosRegistration nacosRegistration; + + @PostConstruct + public void init() { + URIRegister.collectUris(beanList); + Register.doRegisterNacos(nacosRegistration); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/Register.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/Register.java new file mode 100644 index 000000000..a603d95f5 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/Register.java @@ -0,0 +1,50 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.provider; + +import java.util.Map; + +import com.alibaba.cloud.appactive.common.ServiceMetaObject; +import com.alibaba.cloud.nacos.registry.NacosRegistration; +import io.appactive.java.api.bridge.rpc.constants.constant.RPCConstant; +import io.appactive.java.api.rule.machine.AbstractMachineUnitRuleService; +import io.appactive.rule.ClientRuleService; + +/** + * @author mageekchiu + */ +public final class Register { + + private Register() { + } + + private static final AbstractMachineUnitRuleService machineUnitRuleService = ClientRuleService + .getMachineUnitRuleService(); + + public static void doRegisterNacos(NacosRegistration nacosRegistration) { + Map map = nacosRegistration.getMetadata(); + map.put(RPCConstant.URL_UNIT_LABEL_KEY, machineUnitRuleService.getCurrentUnit()); + ServiceMetaObject serviceMetaObject = URIRegister.getServiceMetaObject(); + if (serviceMetaObject == null) { + return; + } + map.put(RPCConstant.SPRING_CLOUD_SERVICE_META, serviceMetaObject.getMeta()); + map.put(RPCConstant.SPRING_CLOUD_SERVICE_META_VERSION, + serviceMetaObject.getMd5OfList()); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/URIRegister.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/URIRegister.java new file mode 100644 index 000000000..117718d2d --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/java/com/alibaba/cloud/appactive/provider/URIRegister.java @@ -0,0 +1,117 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.appactive.provider; + +import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +import javax.servlet.Filter; + +import com.alibaba.cloud.appactive.common.ServiceMeta; +import com.alibaba.cloud.appactive.common.ServiceMetaObject; +import com.alibaba.fastjson.JSON; +import io.appactive.java.api.base.constants.ResourceActiveType; +import io.appactive.support.lang.CollectionUtils; +import org.apache.commons.codec.digest.DigestUtils; + +import org.springframework.boot.web.servlet.FilterRegistrationBean; + +/** + * @author raozihao, mageekchiu + * @author Steve + */ +public final class URIRegister { + + private static final String MATCH_ALL = "/**"; + + private static ServiceMetaObject serviceMetaObject; + + private URIRegister() { + } + + public static void collectUris(List filterRegistrationBeans) { + if (CollectionUtils.isNotEmpty(filterRegistrationBeans)) { + List serviceMetaList = new LinkedList<>(); + boolean hasWildChar = false; + for (FilterRegistrationBean filterRegistrationBean : filterRegistrationBeans) { + Filter filter = filterRegistrationBean.getFilter(); + if (filter == null) { + continue; + } + if (filter instanceof CoreServiceFilter) { + Collection urlPatterns = filterRegistrationBean + .getUrlPatterns(); + for (String urlPattern : urlPatterns) { + if (MATCH_ALL.equalsIgnoreCase(urlPattern)) { + hasWildChar = true; + } + ServiceMeta serviceMeta = new ServiceMeta(urlPattern, + ResourceActiveType.UNIT_RESOURCE_TYPE); + serviceMetaList.add(serviceMeta); + } + } + else if (filter instanceof GlobalServiceFilter) { + Collection urlPatterns = filterRegistrationBean + .getUrlPatterns(); + for (String urlPattern : urlPatterns) { + if (MATCH_ALL.equalsIgnoreCase(urlPattern)) { + hasWildChar = true; + } + ServiceMeta serviceMeta = new ServiceMeta(urlPattern, + ResourceActiveType.CENTER_RESOURCE_TYPE); + serviceMetaList.add(serviceMeta); + } + } + else if (filter instanceof GeneralServiceFilter) { + Collection urlPatterns = filterRegistrationBean + .getUrlPatterns(); + for (String urlPattern : urlPatterns) { + if (MATCH_ALL.equalsIgnoreCase(urlPattern)) { + hasWildChar = true; + } + ServiceMeta serviceMeta = new ServiceMeta(urlPattern, + ResourceActiveType.NORMAL_RESOURCE_TYPE); + serviceMetaList.add(serviceMeta); + } + } + } + if (CollectionUtils.isNotEmpty(serviceMetaList)) { + if (!hasWildChar) { + // 保证所有 service(app+uri) 都纳入管理,不然不好做缓存管理 + ServiceMeta serviceMeta = new ServiceMeta(MATCH_ALL, + ResourceActiveType.NORMAL_RESOURCE_TYPE); + serviceMetaList.add(serviceMeta); + } + serviceMetaObject = new ServiceMetaObject(); + Collections.sort(serviceMetaList); + serviceMetaObject.setServiceMetaList(serviceMetaList); + String meta = JSON.toJSONString(serviceMetaList); + serviceMetaObject.setMeta(meta); + String md5 = DigestUtils.md5Hex(meta.getBytes(StandardCharsets.UTF_8)); + serviceMetaObject.setMd5OfList(md5); + } + } + } + + public static ServiceMetaObject getServiceMetaObject() { + return serviceMetaObject; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..be560c27a --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-appactive/src/main/resources/META-INF/spring.factories @@ -0,0 +1,5 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.alibaba.cloud.appactive.provider.NacosAutoConfig,\ + com.alibaba.cloud.appactive.consumer.ConsumerAutoConfig,\ + com.alibaba.cloud.appactive.config.FilterPropertiesAutoConfiguration,\ + com.alibaba.cloud.appactive.config.FilterAutoConfiguration \ No newline at end of file