diff --git a/README.md b/README.md index c50fcd9..e7b122d 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,3060 @@ +## 最新 280多份,程序员,面试题,大汇总 +## 整理那么辛苦,求个 Star,Fork 谢谢 -# 一些笔记,测试代码 +最近又赶上跳槽的高峰期,好多粉丝,都问我要有没有最新面试题,我连日加班好多天,终于整理好了,280多份面试题大全,我会持续更新中,马上就会整理更多! -### spring-boot-redis +## 题库非常全面,累计 10000+ 道 -[Spring Boot 中使用 Redis](http://www.ymq.io/2017/10/13/redis-jedis-spring-boot-example/) +包括 Java 集合、JVM、多线程、并发编程、设计模式、SpringBoot、SpringCloud、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈! -### spring-boot-rabbitmq +## 面试题技术大类,索引,直达 -[Spring Boot 中使用 RabbitMQ](http://www.ymq.io/2017/10/16/rabbitmq-spring-boot-example/) +| | | | | | +| ------------ | ------------ | ------------ | ------------ | ------------ | +| [Java](https://github.com/souyunku/DevBooks#java) | [Jvm](https://github.com/souyunku/DevBooks#jvm) | [Dubbo](https://github.com/souyunku/DevBooks#dubbo) | [MySQL](https://github.com/souyunku/DevBooks#mysql) | [并发编程](https://github.com/souyunku/DevBooks#并发编程) | +| [Spring](https://github.com/souyunku/DevBooks#spring) | [SpringBoot](https://github.com/souyunku/DevBooks#springboot) | [SpringCloud](https://github.com/souyunku/DevBooks#springcloud) | [ZooKeeper](https://github.com/souyunku/DevBooks#zookeeper) | [大数据](https://github.com/souyunku/DevBooks#大数据) | +| [Redis](https://github.com/souyunku/DevBooks#redis) | [React](https://github.com/souyunku/DevBooks#react) | [RabbitMQ](https://github.com/souyunku/DevBooks#rabbitmq) | [Elasticsearch](https://github.com/souyunku/DevBooks#elasticsearch) | [Kafka](https://github.com/souyunku/DevBooks#kafka) | +| [MyBatis](https://github.com/souyunku/DevBooks#mybatis) | [Linux](https://github.com/souyunku/DevBooks#linux) | [MongoDB](https://github.com/souyunku/DevBooks#mongodb) | [Oracle](https://github.com/souyunku/DevBooks#oracle) | [Netty](https://github.com/souyunku/DevBooks#netty) | +| [Nginx](https://github.com/souyunku/DevBooks#nginx) | [Python](https://github.com/souyunku/DevBooks#python) | [Android](https://github.com/souyunku/DevBooks#android) | [Vue](https://github.com/souyunku/DevBooks#vue) | [前端](https://github.com/souyunku/DevBooks#前端) | +| [JavaScript](https://github.coms/souyunku/DevBooks#javascript) | [HTML](https://github.com/souyunku/DevBooks#html) | [Memcached](https://github.com/souyunku/DevBooks#memcached) | []() | []() | -### spring-boot-kafka -[Spring Boot 中使用 kafka](http://www.ymq.io/2017/10/17/kafka-spring-boot-example/) +## 新增:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) +## 新增:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) -### spring-boot-solr-cloud -[Spring Boot 中使用 SolrCloud](http://www.ymq.io/2017/10/18/solr-cloud-spring-boot-example/) +### Java -### spring-boot-mybatis +**1、** [Java常见2021年最新面试题附答案解析](https://github.com/souyunku/DevBooks#Java常见2021年最新面试题附答案解析) +**2、** [Java常见面试题及答案汇总2021年最新版](https://github.com/souyunku/DevBooks#Java常见面试题及答案汇总2021年最新版) +**3、** [Java常见面试题2021年及答案汇总](https://github.com/souyunku/DevBooks#Java常见面试题2021年及答案汇总) +**4、** [Java最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#Java最新2021年面试题及答案汇总版) +**5、** [Java最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Java最新2021年面试题大汇总附答案) +**6、** [Java最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Java最新2021年面试题附答案解析大汇总) +**7、** [Java最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Java最新2021年面试题高级面试题及附答案解析) +**8、** [Java最新基础面试题及答案整理](https://github.com/souyunku/DevBooks#Java最新基础面试题及答案整理) +**9、** [Java最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Java最新面试题2021年常见面试题及答案汇总) +**10、** [Java最新面试题及答案整理汇总版](https://github.com/souyunku/DevBooks#Java最新面试题及答案整理汇总版) +**11、** [Java最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#Java最新面试题及答案附答案汇总) +**12、** [Java最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#Java最新面试题2021年面试题及答案汇总) +**13、** [Java最新面试题常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Java最新面试题常见面试题及答案汇总) +**14、** [Java面试2021秋招面试问题附答案](https://github.com/souyunku/DevBooks#Java面试2021秋招面试问题附答案) +**15、** [Java面试题及答案整理汇总2021年最新版](https://github.com/souyunku/DevBooks#Java面试题及答案整理汇总2021年最新版) +**16、** [Java面试题及答案整理2021年最新汇总版](https://github.com/souyunku/DevBooks#Java面试题及答案整理2021年最新汇总版) +**17、** [Java面试题大全带答案持续更新](https://github.com/souyunku/DevBooks#Java面试题大全带答案持续更新) +**18、** [Java面试题大汇总2021年附答案解析](https://github.com/souyunku/DevBooks#Java面试题大汇总2021年附答案解析) +**19、** [Java面试题大汇总2021面试题及答案汇总](https://github.com/souyunku/DevBooks#Java面试题大汇总2021面试题及答案汇总) +**20、** [Java面试题目大汇总附参考答案](https://github.com/souyunku/DevBooks#Java面试题目大汇总附参考答案) +**21、** [Java高级面试题及答案2021版](https://github.com/souyunku/DevBooks#Java高级面试题及答案2021版) +**22、** [Java高级面试题及答案企业真面试题](https://github.com/souyunku/DevBooks#Java高级面试题及答案企业真面试题) +**23、** [Java高级面试题及答案最新版](https://github.com/souyunku/DevBooks#Java高级面试题及答案最新版) +**24、** [Java高级面试题合集附答案解析](https://github.com/souyunku/DevBooks#Java高级面试题合集附答案解析) +**25、** [Java高级面试题整理及答案](https://github.com/souyunku/DevBooks#Java高级面试题整理及答案) +**26、** [Java高级面试题中级面试题大汇总](https://github.com/souyunku/DevBooks#Java高级面试题中级面试题大汇总) -[Spring Boot 中使用 MyBatis 整合 Druid 多数据源](http://www.ymq.io/2017/10/20/mybatis-spring-boot-example/) +### Jvm -### spring-boot-dubbo +**1、** [Jvm最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#Jvm最新2021年面试题及答案汇总版) +**2、** [Jvm最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Jvm最新2021年面试题大汇总附答案) +**3、** [Jvm最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Jvm最新2021年面试题附答案解析大汇总) +**4、** [Jvm最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Jvm最新2021年面试题高级面试题及附答案解析) +**5、** [Jvm最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Jvm最新面试题2021年常见面试题及答案汇总) +**6、** [Jvm最新面试题及答案整理汇总版](https://github.com/souyunku/DevBooks#Jvm最新面试题及答案整理汇总版) +**7、** [Jvm最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#Jvm最新面试题及答案附答案汇总) +**8、** [Jvm最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#Jvm最新面试题2021年面试题及答案汇总) +**9、** [Jvm最新面试题常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Jvm最新面试题常见面试题及答案汇总) -[Spring Boot 中使用 Dubbo 详解](http://www.ymq.io/2017/10/27/dubbo-spring-boot-example/) +### Dubbo -### spring-boot-swagger +**1、** [Dubbo最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Dubbo最新2021年面试题大汇总附答案) +**2、** [Dubbo最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Dubbo最新2021年面试题附答案解析大汇总) +**3、** [Dubbo最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Dubbo最新2021年面试题高级面试题及附答案解析) +**4、** [Dubbo最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Dubbo最新面试题2021年常见面试题及答案汇总) +**5、** [Dubbo最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#Dubbo最新面试题及答案附答案汇总) +**6、** [Dubbo最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#Dubbo最新面试题2021年面试题及答案汇总) -[Spring Boot 中使用 swagger  笔记未更新 ]() +### MySQL -### spring-boot-logback +**1、** [MySQL最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#MySQL最新2021年面试题及答案汇总版) +**2、** [MySQL最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#MySQL最新2021年面试题大汇总附答案) +**3、** [MySQL最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#MySQL最新2021年面试题附答案解析大汇总) +**4、** [MySQL最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#MySQL最新2021年面试题高级面试题及附答案解析) +**5、** [MySQL最新基础面试题及答案整理](https://github.com/souyunku/DevBooks#MySQL最新基础面试题及答案整理) +**6、** [MySQL最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#MySQL最新面试题2021年常见面试题及答案汇总) +**7、** [MySQL最新面试题及答案整理汇总版](https://github.com/souyunku/DevBooks#MySQL最新面试题及答案整理汇总版) +**8、** [MySQL最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#MySQL最新面试题及答案附答案汇总) +**9、** [MySQL最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#MySQL最新面试题2021年面试题及答案汇总) +**10、** [MySQL最新面试题常见面试题及答案汇总](https://github.com/souyunku/DevBooks#MySQL最新面试题常见面试题及答案汇总) +**11、** [MySQL高级面试题及答案企业真面试题](https://github.com/souyunku/DevBooks#MySQL高级面试题及答案企业真面试题) +**12、** [MySQL高级面试题整理及答案](https://github.com/souyunku/DevBooks#MySQL高级面试题整理及答案) +**13、** [MySQL高级面试题中级面试题大汇总](https://github.com/souyunku/DevBooks#MySQL高级面试题中级面试题大汇总) -[Spring Boot 中使用 logback  配置 ](http://www.ymq.io/2017/10/30/spring-boot-logback-example/) +### 并发编程 -### spring-boot-elasticsearch +**1、** [并发编程最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#并发编程最新2021年面试题及答案汇总版) +**2、** [并发编程最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#并发编程最新2021年面试题大汇总附答案) +**3、** [并发编程最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#并发编程最新2021年面试题附答案解析大汇总) +**4、** [并发编程最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#并发编程最新2021年面试题高级面试题及附答案解析) +**5、** [并发编程最新基础面试题及答案整理](https://github.com/souyunku/DevBooks#并发编程最新基础面试题及答案整理) +**6、** [并发编程最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#并发编程最新面试题2021年常见面试题及答案汇总) +**7、** [并发编程最新面试题及答案整理汇总版](https://github.com/souyunku/DevBooks#并发编程最新面试题及答案整理汇总版) +**8、** [并发编程最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#并发编程最新面试题及答案附答案汇总) +**9、** [并发编程最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#并发编程最新面试题2021年面试题及答案汇总) +**10、** [并发编程最新面试题常见面试题及答案汇总](https://github.com/souyunku/DevBooks#并发编程最新面试题常见面试题及答案汇总) +**11、** [并发编程面试题及答案整理2021年最新汇总版](https://github.com/souyunku/DevBooks#并发编程面试题及答案整理2021年最新汇总版) +**12、** [并发编程面试题大汇总2021年附答案解析](https://github.com/souyunku/DevBooks#并发编程面试题大汇总2021年附答案解析) +**13、** [并发编程高级面试题及答案2021版](https://github.com/souyunku/DevBooks#并发编程高级面试题及答案2021版) +**14、** [并发编程高级面试题及答案企业真面试题](https://github.com/souyunku/DevBooks#并发编程高级面试题及答案企业真面试题) +**15、** [并发编程高级面试题合集附答案解析](https://github.com/souyunku/DevBooks#并发编程高级面试题合集附答案解析) +**16、** [并发编程高级面试题整理及答案](https://github.com/souyunku/DevBooks#并发编程高级面试题整理及答案) +**17、** [并发编程高级面试题中级面试题大汇总](https://github.com/souyunku/DevBooks#并发编程高级面试题中级面试题大汇总) -[Spring Boot 中使用 elasticsearch 笔记未更新 ]() +### Spring -### spring-boot-elasticsearch-demo +**1、** [Spring最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#Spring最新2021年面试题及答案汇总版) +**2、** [Spring最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Spring最新2021年面试题大汇总附答案) +**3、** [Spring最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Spring最新2021年面试题附答案解析大汇总) +**4、** [Spring最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Spring最新2021年面试题高级面试题及附答案解析) +**5、** [Spring最新基础面试题及答案整理](https://github.com/souyunku/DevBooks#Spring最新基础面试题及答案整理) +**6、** [Spring最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Spring最新面试题2021年常见面试题及答案汇总) +**7、** [Spring最新面试题及答案整理汇总版](https://github.com/souyunku/DevBooks#Spring最新面试题及答案整理汇总版) +**8、** [Spring最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#Spring最新面试题及答案附答案汇总) +**9、** [Spring最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#Spring最新面试题2021年面试题及答案汇总) +**10、** [Spring最新面试题常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Spring最新面试题常见面试题及答案汇总) +**11、** [Spring面试题及答案整理汇总2021年最新版](https://github.com/souyunku/DevBooks#Spring面试题及答案整理汇总2021年最新版) +**12、** [Spring面试题及答案整理2021年最新汇总版](https://github.com/souyunku/DevBooks#Spring面试题及答案整理2021年最新汇总版) +**13、** [Spring面试题大全带答案持续更新](https://github.com/souyunku/DevBooks#Spring面试题大全带答案持续更新) +**14、** [Spring面试题大汇总2021年附答案解析](https://github.com/souyunku/DevBooks#Spring面试题大汇总2021年附答案解析) +**15、** [Spring面试题大汇总2021面试题及答案汇总](https://github.com/souyunku/DevBooks#Spring面试题大汇总2021面试题及答案汇总) +**16、** [Spring高级面试题及答案2021版](https://github.com/souyunku/DevBooks#Spring高级面试题及答案2021版) +**17、** [Spring高级面试题及答案企业真面试题](https://github.com/souyunku/DevBooks#Spring高级面试题及答案企业真面试题) +**18、** [Spring高级面试题及答案最新版](https://github.com/souyunku/DevBooks#Spring高级面试题及答案最新版) +**19、** [Spring高级面试题合集附答案解析](https://github.com/souyunku/DevBooks#Spring高级面试题合集附答案解析) +**20、** [Spring高级面试题整理及答案](https://github.com/souyunku/DevBooks#Spring高级面试题整理及答案) +**21、** [Spring高级面试题中级面试题大汇总](https://github.com/souyunku/DevBooks#Spring高级面试题中级面试题大汇总) -[Spring Boot 中使用 Java API 调用 Elasticsearch](http://www.ymq.io/2017/11/06/ElasticSearch-example/) +### SpringBoot -### spring-boot-lucene-demo +**1、** [SpringBoot最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#SpringBoot最新2021年面试题及答案汇总版) +**2、** [SpringBoot最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#SpringBoot最新2021年面试题大汇总附答案) +**3、** [SpringBoot最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#SpringBoot最新2021年面试题附答案解析大汇总) +**4、** [SpringBoot最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#SpringBoot最新2021年面试题高级面试题及附答案解析) +**5、** [SpringBoot最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#SpringBoot最新面试题2021年常见面试题及答案汇总) +**6、** [SpringBoot最新面试题及答案整理汇总版](https://github.com/souyunku/DevBooks#SpringBoot最新面试题及答案整理汇总版) +**7、** [SpringBoot最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#SpringBoot最新面试题及答案附答案汇总) +**8、** [SpringBoot最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#SpringBoot最新面试题2021年面试题及答案汇总) + +### SpringCloud + +**1、** [SpringCloud最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#SpringCloud最新2021年面试题及答案汇总版) +**2、** [SpringCloud最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#SpringCloud最新2021年面试题大汇总附答案) +**3、** [SpringCloud最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#SpringCloud最新2021年面试题附答案解析大汇总) +**4、** [SpringCloud最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#SpringCloud最新2021年面试题高级面试题及附答案解析) +**5、** [SpringCloud最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#SpringCloud最新面试题2021年常见面试题及答案汇总) +**6、** [SpringCloud最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#SpringCloud最新面试题及答案附答案汇总) +**7、** [SpringCloud最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#SpringCloud最新面试题2021年面试题及答案汇总) + +### ZooKeeper + +**1、** [ZooKeeper最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#ZooKeeper最新2021年面试题大汇总附答案) +**2、** [ZooKeeper最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#ZooKeeper最新2021年面试题附答案解析大汇总) +**3、** [ZooKeeper最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#ZooKeeper最新2021年面试题高级面试题及附答案解析) +**4、** [ZooKeeper最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#ZooKeeper最新面试题2021年常见面试题及答案汇总) + +### 大数据 + +**1、** [大数据最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#大数据最新2021年面试题及答案汇总版) +**2、** [大数据最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#大数据最新2021年面试题大汇总附答案) +**3、** [大数据最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#大数据最新2021年面试题附答案解析大汇总) +**4、** [大数据最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#大数据最新2021年面试题高级面试题及附答案解析) +**5、** [大数据最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#大数据最新面试题2021年常见面试题及答案汇总) +**6、** [大数据最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#大数据最新面试题及答案附答案汇总) +**7、** [大数据最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#大数据最新面试题2021年面试题及答案汇总) + +### Redis + +**1、** [Redis最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#Redis最新2021年面试题及答案汇总版) +**2、** [Redis最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Redis最新2021年面试题大汇总附答案) +**3、** [Redis最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Redis最新2021年面试题附答案解析大汇总) +**4、** [Redis最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Redis最新2021年面试题高级面试题及附答案解析) +**5、** [Redis最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Redis最新面试题2021年常见面试题及答案汇总) +**6、** [Redis最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#Redis最新面试题及答案附答案汇总) +**7、** [Redis最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#Redis最新面试题2021年面试题及答案汇总) + +### React + +**1、** [React最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#React最新2021年面试题大汇总附答案) +**2、** [React最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#React最新2021年面试题附答案解析大汇总) +**3、** [React最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#React最新2021年面试题高级面试题及附答案解析) +**4、** [React最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#React最新面试题2021年常见面试题及答案汇总) +**5、** [React最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#React最新面试题2021年面试题及答案汇总) + +### RabbitMQ + +**1、** [RabbitMQ最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#RabbitMQ最新2021年面试题大汇总附答案) +**2、** [RabbitMQ最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#RabbitMQ最新2021年面试题附答案解析大汇总) +**3、** [RabbitMQ最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#RabbitMQ最新2021年面试题高级面试题及附答案解析) +**4、** [RabbitMQ最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#RabbitMQ最新面试题2021年常见面试题及答案汇总) +**5、** [RabbitMQ最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#RabbitMQ最新面试题2021年面试题及答案汇总) + +### Elasticsearch + +**1、** [Elasticsearch最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Elasticsearch最新2021年面试题大汇总附答案) +**2、** [Elasticsearch最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Elasticsearch最新2021年面试题附答案解析大汇总) +**3、** [Elasticsearch最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Elasticsearch最新2021年面试题高级面试题及附答案解析) +**4、** [Elasticsearch最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Elasticsearch最新面试题2021年常见面试题及答案汇总) +**5、** [Elasticsearch最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#Elasticsearch最新面试题2021年面试题及答案汇总) + +### Kafka + +**1、** [Kafka最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Kafka最新2021年面试题大汇总附答案) +**2、** [Kafka最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Kafka最新2021年面试题附答案解析大汇总) +**3、** [Kafka最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Kafka最新2021年面试题高级面试题及附答案解析) +**4、** [Kafka最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Kafka最新面试题2021年常见面试题及答案汇总) +**5、** [Kafka最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#Kafka最新面试题及答案附答案汇总) +**6、** [Kafka最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#Kafka最新面试题2021年面试题及答案汇总) + +### MyBatis + +**1、** [MyBatis最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#MyBatis最新2021年面试题大汇总附答案) +**2、** [MyBatis最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#MyBatis最新2021年面试题附答案解析大汇总) +**3、** [MyBatis最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#MyBatis最新2021年面试题高级面试题及附答案解析) +**4、** [MyBatis最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#MyBatis最新面试题2021年常见面试题及答案汇总) +**5、** [MyBatis最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#MyBatis最新面试题2021年面试题及答案汇总) + +### Linux + +**1、** [Linux最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#Linux最新2021年面试题及答案汇总版) +**2、** [Linux最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Linux最新2021年面试题大汇总附答案) +**3、** [Linux最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Linux最新2021年面试题附答案解析大汇总) +**4、** [Linux最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Linux最新2021年面试题高级面试题及附答案解析) +**5、** [Linux最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Linux最新面试题2021年常见面试题及答案汇总) +**6、** [Linux最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#Linux最新面试题及答案附答案汇总) +**7、** [Linux最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#Linux最新面试题2021年面试题及答案汇总) + +### MongoDB + +**1、** [MongoDB最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#MongoDB最新2021年面试题大汇总附答案) +**2、** [MongoDB最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#MongoDB最新2021年面试题附答案解析大汇总) +**3、** [MongoDB最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#MongoDB最新2021年面试题高级面试题及附答案解析) + +### Oracle + +**1、** [Oracle最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Oracle最新2021年面试题大汇总附答案) +**2、** [Oracle最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Oracle最新2021年面试题附答案解析大汇总) +**3、** [Oracle最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Oracle最新2021年面试题高级面试题及附答案解析) +**4、** [Oracle最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Oracle最新面试题2021年常见面试题及答案汇总) +**5、** [Oracle最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#Oracle最新面试题2021年面试题及答案汇总) + +### Netty + +**1、** [Netty最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Netty最新2021年面试题附答案解析大汇总) +**2、** [Netty最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Netty最新2021年面试题高级面试题及附答案解析) + +### Nginx + +**1、** [Nginx最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Nginx最新2021年面试题大汇总附答案) +**2、** [Nginx最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Nginx最新2021年面试题附答案解析大汇总) +**3、** [Nginx最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Nginx最新2021年面试题高级面试题及附答案解析) + +### Memcached + +**1、** [Memcached最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Memcached最新2021年面试题高级面试题及附答案解析) + +### Python + +**1、** [Python最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#Python最新2021年面试题及答案汇总版) +**2、** [Python最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Python最新2021年面试题大汇总附答案) +**3、** [Python最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Python最新2021年面试题附答案解析大汇总) +**4、** [Python最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Python最新2021年面试题高级面试题及附答案解析) +**5、** [Python最新基础面试题及答案整理](https://github.com/souyunku/DevBooks#Python最新基础面试题及答案整理) +**6、** [Python最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Python最新面试题2021年常见面试题及答案汇总) +**7、** [Python最新面试题及答案整理汇总版](https://github.com/souyunku/DevBooks#Python最新面试题及答案整理汇总版) +**8、** [Python最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#Python最新面试题及答案附答案汇总) +**9、** [Python最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#Python最新面试题2021年面试题及答案汇总) +**10、** [Python最新面试题常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Python最新面试题常见面试题及答案汇总) +**11、** [Python高级面试题及答案企业真面试题](https://github.com/souyunku/DevBooks#Python高级面试题及答案企业真面试题) + +### Android + +**1、** [Android最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Android最新2021年面试题大汇总附答案) +**2、** [Android最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Android最新2021年面试题附答案解析大汇总) +**3、** [Android最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Android最新2021年面试题高级面试题及附答案解析) +**4、** [Android最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Android最新面试题2021年常见面试题及答案汇总) +**5、** [Android最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#Android最新面试题及答案附答案汇总) +**6、** [Android最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#Android最新面试题2021年面试题及答案汇总) + +### Vue + +**1、** [Vue最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#Vue最新2021年面试题及答案汇总版) +**2、** [Vue最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#Vue最新2021年面试题大汇总附答案) +**3、** [Vue最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#Vue最新2021年面试题附答案解析大汇总) +**4、** [Vue最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#Vue最新2021年面试题高级面试题及附答案解析) +**5、** [Vue最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#Vue最新面试题2021年常见面试题及答案汇总) +**6、** [Vue最新面试题及答案整理汇总版](https://github.com/souyunku/DevBooks#Vue最新面试题及答案整理汇总版) +**7、** [Vue最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#Vue最新面试题及答案附答案汇总) +**8、** [Vue最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#Vue最新面试题2021年面试题及答案汇总) + +### 前端 + +**1、** [前端最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#前端最新2021年面试题及答案汇总版) +**2、** [前端最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#前端最新2021年面试题大汇总附答案) +**3、** [前端最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#前端最新2021年面试题附答案解析大汇总) +**4、** [前端最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#前端最新2021年面试题高级面试题及附答案解析) +**5、** [前端最新基础面试题及答案整理](https://github.com/souyunku/DevBooks#前端最新基础面试题及答案整理) +**6、** [前端最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#前端最新面试题2021年常见面试题及答案汇总) +**7、** [前端最新面试题及答案整理汇总版](https://github.com/souyunku/DevBooks#前端最新面试题及答案整理汇总版) +**8、** [前端最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#前端最新面试题及答案附答案汇总) +**9、** [前端最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#前端最新面试题2021年面试题及答案汇总) +**10、** [前端最新面试题常见面试题及答案汇总](https://github.com/souyunku/DevBooks#前端最新面试题常见面试题及答案汇总) +**11、** [前端面试题及答案整理汇总2021年最新版](https://github.com/souyunku/DevBooks#前端面试题及答案整理汇总2021年最新版) +**12、** [前端面试题及答案整理2021年最新汇总版](https://github.com/souyunku/DevBooks#前端面试题及答案整理2021年最新汇总版) +**13、** [前端面试题大汇总2021年附答案解析](https://github.com/souyunku/DevBooks#前端面试题大汇总2021年附答案解析) +**14、** [前端高级面试题及答案2021版](https://github.com/souyunku/DevBooks#前端高级面试题及答案2021版) +**15、** [前端高级面试题及答案企业真面试题](https://github.com/souyunku/DevBooks#前端高级面试题及答案企业真面试题) +**16、** [前端高级面试题合集附答案解析](https://github.com/souyunku/DevBooks#前端高级面试题合集附答案解析) +**17、** [前端高级面试题整理及答案](https://github.com/souyunku/DevBooks#前端高级面试题整理及答案) +**18、** [前端高级面试题中级面试题大汇总](https://github.com/souyunku/DevBooks#前端高级面试题中级面试题大汇总) + +### JavaScript + +**1、** [JavaScript最新2021年面试题及答案汇总版](https://github.com/souyunku/DevBooks#JavaScript最新2021年面试题及答案汇总版) +**2、** [JavaScript最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#JavaScript最新2021年面试题大汇总附答案) +**3、** [JavaScript最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#JavaScript最新2021年面试题附答案解析大汇总) +**4、** [JavaScript最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#JavaScript最新2021年面试题高级面试题及附答案解析) +**5、** [JavaScript最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#JavaScript最新面试题2021年常见面试题及答案汇总) +**6、** [JavaScript最新面试题及答案整理汇总版](https://github.com/souyunku/DevBooks#JavaScript最新面试题及答案整理汇总版) +**7、** [JavaScript最新面试题及答案附答案汇总](https://github.com/souyunku/DevBooks#JavaScript最新面试题及答案附答案汇总) +**8、** [JavaScript最新面试题2021年面试题及答案汇总](https://github.com/souyunku/DevBooks#JavaScript最新面试题2021年面试题及答案汇总) + +### HTML + +**1、** [HTML最新2021年面试题大汇总附答案](https://github.com/souyunku/DevBooks#HTML最新2021年面试题大汇总附答案) +**2、** [HTML最新2021年面试题附答案解析大汇总](https://github.com/souyunku/DevBooks#HTML最新2021年面试题附答案解析大汇总) +**3、** [HTML最新2021年面试题高级面试题及附答案解析](https://github.com/souyunku/DevBooks#HTML最新2021年面试题高级面试题及附答案解析) +**4、** [HTML最新面试题2021年常见面试题及答案汇总](https://github.com/souyunku/DevBooks#HTML最新面试题2021年常见面试题及答案汇总) + + +## Java常见2021年最新面试题,附答案解析 + +**1、** [为什么wait()方法和notify()/notifyAll()方法要在同步块中被调用](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见2021年最新面试题,附答案解析.md#1为什么wait方法和notify/notifyAll方法要在同步块中被调用) +**2、** [Files的常用方法都有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见2021年最新面试题,附答案解析.md#2Files的常用方法都有哪些) +**3、** [形成死锁的四个必要条件是什么](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见2021年最新面试题,附答案解析.md#3形成死锁的四个必要条件是什么) +**4、** [线程的状态](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见2021年最新面试题,附答案解析.md#4线程的状态) +**5、** [请解释什么是Tomcat Coyote ?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见2021年最新面试题,附答案解析.md#5请解释什么是Tomcat-Coyote-) +**6、** [Sql优化有那些方法?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见2021年最新面试题,附答案解析.md#6Sql优化有那些方法) +**7、** [复制算法(copying)](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见2021年最新面试题,附答案解析.md#7复制算法copying) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见2021年最新面试题,附答案解析.md) + +## Java常见面试题及答案汇总,2021年最新版 + +**1、** [String 属于基础的数据类型吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题及答案汇总,2021年最新版.md#1String-属于基础的数据类型吗) +**2、** [对于JDK自带的监控和性能分析工具用过哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题及答案汇总,2021年最新版.md#2对于JDK自带的监控和性能分析工具用过哪些) +**3、** [说下有哪些类加载器?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题及答案汇总,2021年最新版.md#3说下有哪些类加载器) +**4、** [说说Java 垃圾回收机制](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题及答案汇总,2021年最新版.md#4说说Java-垃圾回收机制) +**5、** [什么是Java Timer 类?如何创建一个有特定时间间隔的任务?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题及答案汇总,2021年最新版.md#5什么是Java-Timer-类如何创建一个有特定时间间隔的任务) +**6、** [类的实例化顺序](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题及答案汇总,2021年最新版.md#6类的实例化顺序) +**7、** [JVM 提供的常用工具](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题及答案汇总,2021年最新版.md#7JVM-提供的常用工具) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题及答案汇总,2021年最新版.md) + +## Java常见面试题,2021年及答案汇总 + +**1、** [单例模式使用注意事项:](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题,2021年及答案汇总.md#1单例模式使用注意事项:) +**2、** [什么时候用断言(assert)?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题,2021年及答案汇总.md#2什么时候用断言assert) +**3、** [构造器(constructor)是否可被重写(override)?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题,2021年及答案汇总.md#3构造器constructor是否可被重写override) +**4、** [Java应用程序与小程序之间有那些差别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题,2021年及答案汇总.md#4Java应用程序与小程序之间有那些差别) +**5、** [解释一下什么叫AOP(面向切面编程)?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题,2021年及答案汇总.md#5解释一下什么叫AOP面向切面编程) +**6、** [Jsp指令有那些?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题,2021年及答案汇总.md#6Jsp指令有那些) +**7、** [直接内存是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题,2021年及答案汇总.md#7直接内存是什么) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java常见面试题,2021年及答案汇总.md) + +## Java最新2021年面试题及答案,汇总版 + +**1、** [并行和并发有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题及答案,汇总版.md#1并行和并发有什么区别) +**2、** [什么是拆装箱?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题及答案,汇总版.md#2什么是拆装箱) +**3、** [String str="i"与 String str=new String("i")一样吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题及答案,汇总版.md#3String-str="i"与-String-str=new-String"i"一样吗) +**4、** [是否可以继承String类?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题及答案,汇总版.md#4是否可以继承String类) +**5、** [什么是自旋](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题及答案,汇总版.md#5什么是自旋) +**6、** [线程的调度策略](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题及答案,汇总版.md#6线程的调度策略) +**7、** [TreeMap 和 TreeSet 在排序时如何比较元素?Collections 工具类中的 sort()方法如何比较元素?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题及答案,汇总版.md#7TreeMap-和-TreeSet-在排序时如何比较元素Collections-工具类中的-sort方法如何比较元素) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题及答案,汇总版.md) + +## Java最新2021年面试题大汇总,附答案 + +**1、** [Javascript中常用的事件有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题大汇总,附答案.md#1Javascript中常用的事件有哪些) +**2、** [Array 和 ArrayList 有何区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题大汇总,附答案.md#2Array-和-ArrayList-有何区别) +**3、** [什么是线程池(thread pool)?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题大汇总,附答案.md#3什么是线程池thread-pool) +**4、** [JSP中的静态包含和动态包含有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题大汇总,附答案.md#4JSP中的静态包含和动态包含有什么区别) +**5、** [启动一个线程是调用run()还是start()方法?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题大汇总,附答案.md#5启动一个线程是调用run还是start方法) +**6、** [Java反射创建对象效率高还是通过new创建对象的效率高?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题大汇总,附答案.md#6Java反射创建对象效率高还是通过new创建对象的效率高) +**7、** [构造器注入和 setter 依赖注入,那种方式更好?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题大汇总,附答案.md#7构造器注入和-setter-依赖注入那种方式更好) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题大汇总,附答案.md) + +## Java最新2021年面试题附答案解析,大汇总 + +**1、** [重载和重写的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题附答案解析,大汇总.md#1重载和重写的区别) +**2、** [实现可见性的方法有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题附答案解析,大汇总.md#2实现可见性的方法有哪些) +**3、** [js如何实现页面刷新呢?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题附答案解析,大汇总.md#3js如何实现页面刷新呢) +**4、** [什么是Executors框架?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题附答案解析,大汇总.md#4什么是Executors框架) +**5、** [Java中集合框架的有几个?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题附答案解析,大汇总.md#5Java中集合框架的有几个) +**6、** [描述一下JVM加载class文件的原理机制?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题附答案解析,大汇总.md#6描述一下JVM加载class文件的原理机制) +**7、** [你能保证 GC 执行吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题附答案解析,大汇总.md#7你能保证-GC-执行吗) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题附答案解析,大汇总.md) + +## Java最新2021年面试题,高级面试题及附答案解析 + +**1、** [如何设置请求的编码以及响应内容的类型?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题,高级面试题及附答案解析.md#1如何设置请求的编码以及响应内容的类型) +**2、** [如果使用Object作为HashMap的Key,应该怎么办呢?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题,高级面试题及附答案解析.md#2如果使用Object作为HashMap的Key应该怎么办呢) +**3、** [Java中notify 和 notifyAll有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题,高级面试题及附答案解析.md#3Java中notify-和-notifyAll有什么区别) +**4、** [为什么要使用并发编程](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题,高级面试题及附答案解析.md#4为什么要使用并发编程) +**5、** [ArrayList与LinkedList有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题,高级面试题及附答案解析.md#5ArrayList与LinkedList有什么区别) +**6、** [如何检查出两个给定的字符串是反序的?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题,高级面试题及附答案解析.md#6如何检查出两个给定的字符串是反序的) +**7、** [Java对象创建过程](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题,高级面试题及附答案解析.md#7Java对象创建过程) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新2021年面试题,高级面试题及附答案解析.md) + +## Java最新基础面试题及答案整理 + +**1、** [怎样通过 Java 程序来判断 JVM 是 32 位 还是 64位?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新基础面试题及答案整理.md#1怎样通过-Java-程序来判断-JVM-是-32-位-还是-64位) +**2、** [怎么在JDBC内调用一个存储过程](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新基础面试题及答案整理.md#2怎么在JDBC内调用一个存储过程) +**3、** [你对线程优先级的理解是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新基础面试题及答案整理.md#3你对线程优先级的理解是什么) +**4、** [你平时工作中用过的JVM常用基本配置参数有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新基础面试题及答案整理.md#4你平时工作中用过的JVM常用基本配置参数有哪些) +**5、** [说明Tomcat配置了多少个Valve?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新基础面试题及答案整理.md#5说明Tomcat配置了多少个Valve) +**6、** [抽象类必须要有抽象方法吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新基础面试题及答案整理.md#6抽象类必须要有抽象方法吗) +**7、** [多线程的常用方法](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新基础面试题及答案整理.md#7多线程的常用方法) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新基础面试题及答案整理.md) + +## Java最新面试题2021年,常见面试题及答案汇总 + +**1、** [你知道哪些内存分配与回收策略?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题2021年,常见面试题及答案汇总.md#1你知道哪些内存分配与回收策略) +**2、** [Java 如何实现多线程之间的通讯和协作?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题2021年,常见面试题及答案汇总.md#2Java-如何实现多线程之间的通讯和协作) +**3、** [生产环境 CPU 占用过高,你如何解决?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题2021年,常见面试题及答案汇总.md#3生产环境-CPU-占用过高你如何解决) +**4、** [32 位和 64 位的 JVM,int 类型变量的长度是多数?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题2021年,常见面试题及答案汇总.md#432-位和-64-位的-JVMint-类型变量的长度是多数) +**5、** [switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题2021年,常见面试题及答案汇总.md#5switch-是否能作用在byte-上是否能作用在long-上是否能作用在String上) +**6、** [43.将下java中的math类有那些常用方法?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题2021年,常见面试题及答案汇总.md#643将下java中的math类有那些常用方法) +**7、** [你经常使用什么并发容器,为什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题2021年,常见面试题及答案汇总.md#7你经常使用什么并发容器为什么) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题2021年,常见面试题及答案汇总.md) + +## Java最新面试题及答案整理,汇总版 + +**1、** [什么是 FutureTask](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案整理,汇总版.md#1什么是-FutureTask) +**2、** [当一个线程进入一个对象的 synchronized 方法 A 之后,其它线程是否可进入此对象的 synchronized 方法 B?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案整理,汇总版.md#2当一个线程进入一个对象的-synchronized-方法-A-之后其它线程是否可进入此对象的-synchronized-方法-B) +**3、** [你了解过哪些垃圾收集器?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案整理,汇总版.md#3你了解过哪些垃圾收集器) +**4、** [集合的特点](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案整理,汇总版.md#4集合的特点) +**5、** [方法区溢出的原因?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案整理,汇总版.md#5方法区溢出的原因) +**6、** [串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案整理,汇总版.md#6串行serial收集器和吞吐量throughput收集器的区别是什么) +**7、** [强引用、软引用、弱引用、虚引用是什么,有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案整理,汇总版.md#7强引用软引用弱引用虚引用是什么有什么区别) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案整理,汇总版.md) + +## Java最新面试题及答案附答案汇总 + +**1、** [Jsp包含那些隐藏对象或者内建对象](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案附答案汇总.md#1Jsp包含那些隐藏对象或者内建对象) +**2、** [除了使用new创建对象之外,还可以用什么方法创建对象?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案附答案汇总.md#2除了使用new创建对象之外还可以用什么方法创建对象) +**3、** [常见的计算机网络协议有那些?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案附答案汇总.md#3常见的计算机网络协议有那些) +**4、** [什么是并发容器的实现?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案附答案汇总.md#4什么是并发容器的实现) +**5、** [使用sql写出一个分页程序?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案附答案汇总.md#5使用sql写出一个分页程序) +**6、** [如何将字符串反转?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案附答案汇总.md#6如何将字符串反转) +**7、** [抽象类能使用 final 修饰吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案附答案汇总.md#7抽象类能使用-final-修饰吗) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题及答案附答案汇总.md) + +## Java最新面试题,2021年面试题及答案汇总 + +**1、** [如何自定义一个异常](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,2021年面试题及答案汇总.md#1如何自定义一个异常) +**2、** [如何修改tomcat的端口号?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,2021年面试题及答案汇总.md#2如何修改tomcat的端口号) +**3、** [Array与ArrayList有什么不一样?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,2021年面试题及答案汇总.md#3Array与ArrayList有什么不一样) +**4、** [有哪些打破了双亲委托机制的案例?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,2021年面试题及答案汇总.md#4有哪些打破了双亲委托机制的案例) +**5、** [synchronized的作用?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,2021年面试题及答案汇总.md#5synchronized的作用) +**6、** [重载与重写](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,2021年面试题及答案汇总.md#6重载与重写) +**7、** [类ExampleA继承Exception,类ExampleB继承ExampleA。](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,2021年面试题及答案汇总.md#7类ExampleA继承Exception类ExampleB继承ExampleA。) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,2021年面试题及答案汇总.md) + +## Java最新面试题,常见面试题及答案汇总 + +**1、** [如何在 Windows 和 Linux 上查找哪个线程cpu利用率最高?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,常见面试题及答案汇总.md#1如何在-Windows-和-Linux-上查找哪个线程cpu利用率最高) +**2、** [标记清除算法( Mark-Sweep)](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,常见面试题及答案汇总.md#2标记清除算法-Mark-Sweep) +**3、** [对象的访问方式有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,常见面试题及答案汇总.md#3对象的访问方式有哪些) +**4、** [模块化编程与热插拔](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,常见面试题及答案汇总.md#4模块化编程与热插拔) +**5、** [请解释如何配置Tomcat来使用IIS和NTLM ?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,常见面试题及答案汇总.md#5请解释如何配置Tomcat来使用IIS和NTLM-) +**6、** [GC 垃圾收集器](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,常见面试题及答案汇总.md#6GC-垃圾收集器) +**7、** [适配器模式和代理模式之前有什么不同?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,常见面试题及答案汇总.md#7适配器模式和代理模式之前有什么不同) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java最新面试题,常见面试题及答案汇总.md) + +## Java面试2021秋招面试问题,附答案 + +**1、** [集合框架底层数据结构](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试2021秋招面试问题,附答案.md#1集合框架底层数据结构) +**2、** [什么是JDK?什么是JRE?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试2021秋招面试问题,附答案.md#2什么是JDK什么是JRE) +**3、** [日期和时间:](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试2021秋招面试问题,附答案.md#3日期和时间:) +**4、** [描述一下 JVM 加载 class 文件的原理机制](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试2021秋招面试问题,附答案.md#4描述一下-JVM-加载-class-文件的原理机制) +**5、** [并发关键字 synchronized ?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试2021秋招面试问题,附答案.md#5并发关键字-synchronized-) +**6、** [List,Set,Map三者的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试2021秋招面试问题,附答案.md#6ListSetMap三者的区别) +**7、** [Tcp协议的特点](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试2021秋招面试问题,附答案.md#7Tcp协议的特点) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试2021秋招面试问题,附答案.md) + +## Java面试题及答案整理汇总,2021年最新版 + +**1、** [抽象类(abstract class)和接口(interface)有什么异同?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理汇总,2021年最新版.md#1抽象类abstract-class和接口interface有什么异同) +**2、** [请说出与线程同步以及线程调度相关的方法。](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理汇总,2021年最新版.md#2请说出与线程同步以及线程调度相关的方法。) +**3、** [Java线程数过多会造成什么异常?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理汇总,2021年最新版.md#3Java线程数过多会造成什么异常) +**4、** [三种代理的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理汇总,2021年最新版.md#4三种代理的区别) +**5、** [说几个常见的编译时异常类?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理汇总,2021年最新版.md#5说几个常见的编译时异常类) +**6、** [什么是ORM?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理汇总,2021年最新版.md#6什么是ORM) +**7、** [简述一下面向对象的”六原则一法则”。](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理汇总,2021年最新版.md#7简述一下面向对象的六原则一法则。) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理汇总,2021年最新版.md) + +## Java面试题及答案整理,2021年最新,汇总版 + +**1、** [jspservlet中通信作用域有那些?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理,2021年最新,汇总版.md#1jspservlet中通信作用域有那些) +**2、** [什么是线程池?有哪几种创建方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理,2021年最新,汇总版.md#2什么是线程池有哪几种创建方式) +**3、** [ThreadPoolExecutor饱和策略有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理,2021年最新,汇总版.md#3ThreadPoolExecutor饱和策略有哪些) +**4、** [Java 中 ++ 操作符是线程安全的吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理,2021年最新,汇总版.md#4Java-中-++-操作符是线程安全的吗) +**5、** [各种回收器,各自优缺点,重点CMS、G1](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理,2021年最新,汇总版.md#5各种回收器各自优缺点重点CMSG1) +**6、** [说说类加载的过程](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理,2021年最新,汇总版.md#6说说类加载的过程) +**7、** [Java 中 interrupted 和 isInterrupted 方法的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理,2021年最新,汇总版.md#7Java-中-interrupted-和-isInterrupted-方法的区别) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题及答案整理,2021年最新,汇总版.md) + +## Java面试题大全带答案,持续更新 + +**1、** [怎么检测一个线程是否拥有锁?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大全带答案,持续更新.md#1怎么检测一个线程是否拥有锁) +**2、** [什么是竞争条件?你怎样发现和解决竞争?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大全带答案,持续更新.md#2什么是竞争条件你怎样发现和解决竞争) +**3、** [什么是方法内联?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大全带答案,持续更新.md#3什么是方法内联) +**4、** [volatile 修饰符的有过什么实践?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大全带答案,持续更新.md#4volatile-修饰符的有过什么实践) +**5、** [什么是DAO模式?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大全带答案,持续更新.md#5什么是DAO模式) +**6、** [实际开发中应用场景哪里用到了模板方法](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大全带答案,持续更新.md#6实际开发中应用场景哪里用到了模板方法) +**7、** [Java 中会存在内存泄漏吗,请简单描述。](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大全带答案,持续更新.md#7Java-中会存在内存泄漏吗请简单描述。) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大全带答案,持续更新.md) + +## Java面试题大汇总,2021年附答案解析 + +**1、** [怎么打破双亲委派模型?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021年附答案解析.md#1怎么打破双亲委派模型) +**2、** [UML中有哪些常用的图?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021年附答案解析.md#2UML中有哪些常用的图) +**3、** [如何在两个线程间共享数据?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021年附答案解析.md#3如何在两个线程间共享数据) +**4、** [类、方法、成员变量和局部变量的可用修饰符 -](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021年附答案解析.md#4类方法成员变量和局部变量的可用修饰符--) +**5、** [线程池四种创建方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021年附答案解析.md#5线程池四种创建方式) +**6、** [Iterator 怎么使用?有什么特点?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021年附答案解析.md#6Iterator-怎么使用有什么特点) +**7、** [JVM 的内存模型以及分区情况和作用](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021年附答案解析.md#7JVM-的内存模型以及分区情况和作用) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021年附答案解析.md) + +## Java面试题大汇总,2021面试题及答案汇总 + +**1、** [能够找到 Reference Chain 的对象,就一定会存活么?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021面试题及答案汇总.md#1能够找到-Reference-Chain-的对象就一定会存活么) +**2、** [什么情况下会发生栈内存溢出?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021面试题及答案汇总.md#2什么情况下会发生栈内存溢出) +**3、** [怎么获取 Java 程序使用的内存?堆使用的百分比?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021面试题及答案汇总.md#3怎么获取-Java-程序使用的内存堆使用的百分比) +**4、** [synchronized和ReentrantLock的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021面试题及答案汇总.md#4synchronized和ReentrantLock的区别) +**5、** [如果你提交任务时,线程池队列已满,这时会发生什么](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021面试题及答案汇总.md#5如果你提交任务时线程池队列已满这时会发生什么) +**6、** [什么是接口?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021面试题及答案汇总.md#6什么是接口) +**7、** [Java 中怎么打印数组?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021面试题及答案汇总.md#7Java-中怎么打印数组) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题大汇总,2021面试题及答案汇总.md) + +## Java面试题目大汇总,附参考答案 + +**1、** [多线程中 synchronized 锁升级的原理是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题目大汇总,附参考答案.md#1多线程中-synchronized-锁升级的原理是什么) +**2、** [java 中操作字符串都有哪些类?它们之间有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题目大汇总,附参考答案.md#2java-中操作字符串都有哪些类它们之间有什么区别) +**3、** [url是什么?由哪些部分组成?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题目大汇总,附参考答案.md#3url是什么由哪些部分组成) +**4、** [类加载有几个过程?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题目大汇总,附参考答案.md#4类加载有几个过程) +**5、** [死锁与活锁的区别,死锁与饥饿的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题目大汇总,附参考答案.md#5死锁与活锁的区别死锁与饥饿的区别) +**6、** [线程类的构造方法、静态块是被哪个线程调用的](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题目大汇总,附参考答案.md#6线程类的构造方法静态块是被哪个线程调用的) +**7、** [遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java 中 List 遍历的最佳实践是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题目大汇总,附参考答案.md#7遍历一个-List-有哪些不同的方式每种方法的实现原理是什么Java-中-List-遍历的最佳实践是什么) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java面试题目大汇总,附参考答案.md) + +## Java高级面试题及答案,2021版 + +**1、** [CyclicBarrier和CountDownLatch的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,2021版.md#1CyclicBarrier和CountDownLatch的区别) +**2、** [Java 中,嵌套公共静态类与顶级类有什么不同?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,2021版.md#2Java-中嵌套公共静态类与顶级类有什么不同) +**3、** [volatile 能使得一个非原子操作变成原子操作吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,2021版.md#3volatile-能使得一个非原子操作变成原子操作吗) +**4、** [乐观锁和悲观锁的理解及如何实现,有哪些实现方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,2021版.md#4乐观锁和悲观锁的理解及如何实现有哪些实现方式) +**5、** [你都用过G1垃圾回收器的哪几个重要参数?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,2021版.md#5你都用过G1垃圾回收器的哪几个重要参数) +**6、** [串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,2021版.md#6串行serial收集器和吞吐量throughput收集器的区别是什么) +**7、** [JVM 有哪些运行时内存区域?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,2021版.md#7JVM-有哪些运行时内存区域) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,2021版.md) + +## Java高级面试题及答案,企业真面试题 + +**1、** [什么是线程同步和线程互斥,有哪几种实现方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,企业真面试题.md#1什么是线程同步和线程互斥有哪几种实现方式) +**2、** [JVM 运行时内存](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,企业真面试题.md#2JVM-运行时内存) +**3、** [什么是同步任务?什么是异步任务?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,企业真面试题.md#3什么是同步任务什么是异步任务) +**4、** [重排序实际执行的指令步骤](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,企业真面试题.md#4重排序实际执行的指令步骤) +**5、** [WeakHashMap 是怎么工作的?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,企业真面试题.md#5WeakHashMap-是怎么工作的) +**6、** [什么是重排序](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,企业真面试题.md#6什么是重排序) +**7、** [Java 中的 LinkedList 是单向链表还是双向链表?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,企业真面试题.md#7Java-中的-LinkedList-是单向链表还是双向链表) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,企业真面试题.md) + +## Java高级面试题及答案,最新版 + +**1、** [Java都有那些开发平台?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,最新版.md#1Java都有那些开发平台) +**2、** [CopyOnWriteArrayList 的使用场景?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,最新版.md#2CopyOnWriteArrayList-的使用场景) +**3、** [你如何确保main()方法所在的线程是Java 程序最后结束的线程?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,最新版.md#3你如何确保main方法所在的线程是Java-程序最后结束的线程) +**4、** [Java 中怎么获取一份线程 dump 文件?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,最新版.md#4Java-中怎么获取一份线程-dump-文件) +**5、** [Object类常用方法有那些?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,最新版.md#5Object类常用方法有那些) +**6、** [原型模式的应用场景](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,最新版.md#6原型模式的应用场景) +**7、** [Servlet生命周期内调用的方法过程?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,最新版.md#7Servlet生命周期内调用的方法过程) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题及答案,最新版.md) + +## Java高级面试题合集,附答案解析 + +**1、** [什么是观察者模式](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题合集,附答案解析.md#1什么是观察者模式) +**2、** [Executors类是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题合集,附答案解析.md#2Executors类是什么) +**3、** [分代回收](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题合集,附答案解析.md#3分代回收) +**4、** [运行时栈帧包含哪些结构?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题合集,附答案解析.md#4运行时栈帧包含哪些结构) +**5、** [Java 中堆和栈有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题合集,附答案解析.md#5Java-中堆和栈有什么区别) +**6、** [62、volatile 变量和 atomic 变量有什么不同?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题合集,附答案解析.md#662volatile-变量和-atomic-变量有什么不同) +**7、** [谈谈双亲委派模型](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题合集,附答案解析.md#7谈谈双亲委派模型) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题合集,附答案解析.md) + +## Java高级面试题整理及答案 + +**1、** [常用并发列队的介绍:](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题整理及答案.md#1常用并发列队的介绍:) +**2、** [sleep() 和 wait() 有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题整理及答案.md#2sleep-和-wait-有什么区别) +**3、** [TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题整理及答案.md#3TreeMap和TreeSet在排序时如何比较元素Collections工具类中的sort方法如何比较元素) +**4、** [为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题整理及答案.md#4为什么我们调用-start-方法时会执行-run-方法为什么我们不能直接调用-run-方法) +**5、** [能否使用任何类作为 Map 的 key?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题整理及答案.md#5能否使用任何类作为-Map-的-key) +**6、** [字符串常量存放在哪个区域?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题整理及答案.md#6字符串常量存放在哪个区域) +**7、** [CMS都有哪些问题?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题整理及答案.md#7CMS都有哪些问题) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题整理及答案.md) + +## Java高级面试题,中级面试题,大汇总 + +**1、** [工厂模式好处](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题,中级面试题,大汇总.md#1工厂模式好处) +**2、** [什么是线程池? 为什么要使用它?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题,中级面试题,大汇总.md#2什么是线程池-为什么要使用它) +**3、** [多线程应用场景](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题,中级面试题,大汇总.md#3多线程应用场景) +**4、** [怎么打出线程栈信息?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题,中级面试题,大汇总.md#4怎么打出线程栈信息) +**5、** [举例说明同步和异步。](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题,中级面试题,大汇总.md#5举例说明同步和异步。) +**6、** [ZGC 了解吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题,中级面试题,大汇总.md#6ZGC-了解吗) +**7、** [继承和组合之间有什么不同?](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题,中级面试题,大汇总.md#7继承和组合之间有什么不同) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/Java/Java高级面试题,中级面试题,大汇总.md) + +## Jvm最新2021年面试题及答案,汇总版 + +**1、** [JVM调优命令有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题及答案,汇总版.md#1JVM调优命令有哪些) +**2、** [说说类加载的过程](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题及答案,汇总版.md#2说说类加载的过程) +**3、** [创建对象的过程是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题及答案,汇总版.md#3创建对象的过程是什么) +**4、** [引用计数法](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题及答案,汇总版.md#4引用计数法) +**5、** [堆的作用是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题及答案,汇总版.md#5堆的作用是什么) +**6、** [什么是堆](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题及答案,汇总版.md#6什么是堆) +**7、** [JVM 年轻代到年老代的晋升过程的判断条件是什么呢?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题及答案,汇总版.md#7JVM-年轻代到年老代的晋升过程的判断条件是什么呢) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题及答案,汇总版.md) + +## Jvm最新2021年面试题大汇总,附答案 + +**1、** [Java 内存分配](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题大汇总,附答案.md#1Java-内存分配) +**2、** [GC Roots 有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题大汇总,附答案.md#2GC-Roots-有哪些) +**3、** [JVM垃圾回收机制,何时触发MinorGC等操作](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题大汇总,附答案.md#3JVM垃圾回收机制何时触发MinorGC等操作) +**4、** [解释 Java 堆空间及 GC?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题大汇总,附答案.md#4解释-Java-堆空间及-GC) +**5、** [SWAP会影响性能么?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题大汇总,附答案.md#5SWAP会影响性能么) +**6、** [32、volatile关键字的原理是什么?干什么用的?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题大汇总,附答案.md#632volatile关键字的原理是什么干什么用的) +**7、** [怎么打出线程栈信息?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题大汇总,附答案.md#7怎么打出线程栈信息) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题大汇总,附答案.md) + +## Jvm最新2021年面试题附答案解析,大汇总 + +**1、** [双亲委派](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题附答案解析,大汇总.md#1双亲委派) +**2、** [如何判断一个类是无用的类?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题附答案解析,大汇总.md#2如何判断一个类是无用的类) +**3、** [谈谈你知道的垃圾收集器](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题附答案解析,大汇总.md#3谈谈你知道的垃圾收集器) +**4、** [Java 虚拟机栈的作用?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题附答案解析,大汇总.md#4Java-虚拟机栈的作用) +**5、** [JAVA虚引用](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题附答案解析,大汇总.md#5JAVA虚引用) +**6、** [CMS都有哪些问题?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题附答案解析,大汇总.md#6CMS都有哪些问题) +**7、** [谈谈你知道的垃圾回收算法](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题附答案解析,大汇总.md#7谈谈你知道的垃圾回收算法) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题附答案解析,大汇总.md) + +## Jvm最新2021年面试题,高级面试题及附答案解析 + +**1、** [描述一下JVM加载class文件的原理机制?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题,高级面试题及附答案解析.md#1描述一下JVM加载class文件的原理机制) +**2、** [如何判断对象可以被回收](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题,高级面试题及附答案解析.md#2如何判断对象可以被回收) +**3、** [JAVA8 与元数据](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题,高级面试题及附答案解析.md#3JAVA8-与元数据) +**4、** [垃圾回收的优点和原理。说说2种回收机制](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题,高级面试题及附答案解析.md#4垃圾回收的优点和原理。说说2种回收机制) +**5、** [能够找到 Reference Chain 的对象,就一定会存活么?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题,高级面试题及附答案解析.md#5能够找到-Reference-Chain-的对象就一定会存活么) +**6、** [Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题,高级面试题及附答案解析.md#6Java-堆的结构是什么样子的什么是堆中的永久代Perm-Gen-space) +**7、** [JVM垃圾回收时候如何确定垃圾?什么是GC Roots?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题,高级面试题及附答案解析.md#7JVM垃圾回收时候如何确定垃圾什么是GC-Roots) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新2021年面试题,高级面试题及附答案解析.md) + +## Jvm最新面试题2021年,常见面试题及答案汇总 + +**1、** [JVM 有哪些运行时内存区域?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题2021年,常见面试题及答案汇总.md#1JVM-有哪些运行时内存区域) +**2、** [栈帧都有哪些数据?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题2021年,常见面试题及答案汇总.md#2栈帧都有哪些数据) +**3、** [什么是逃逸分析?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题2021年,常见面试题及答案汇总.md#3什么是逃逸分析) +**4、** [请你谈谈对OOM的认识](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题2021年,常见面试题及答案汇总.md#4请你谈谈对OOM的认识) +**5、** [OSGI( 动态模型系统)](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题2021年,常见面试题及答案汇总.md#5OSGI-动态模型系统) +**6、** [你都用过G1垃圾回收器的哪几个重要参数?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题2021年,常见面试题及答案汇总.md#6你都用过G1垃圾回收器的哪几个重要参数) +**7、** [类初始化的情况有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题2021年,常见面试题及答案汇总.md#7类初始化的情况有哪些) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题2021年,常见面试题及答案汇总.md) + +## Jvm最新面试题及答案整理,汇总版 + +**1、** [你熟悉哪些垃圾收集算法?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案整理,汇总版.md#1你熟悉哪些垃圾收集算法) +**2、** [有哪些 GC 算法?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案整理,汇总版.md#2有哪些-GC-算法) +**3、** [Java对象的布局了解过吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案整理,汇总版.md#3Java对象的布局了解过吗) +**4、** [你了解过哪些垃圾收集器?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案整理,汇总版.md#4你了解过哪些垃圾收集器) +**5、** [你能保证 GC 执行吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案整理,汇总版.md#5你能保证-GC-执行吗) +**6、** [强引用、软引用、弱引用、虚引用是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案整理,汇总版.md#6强引用软引用弱引用虚引用是什么) +**7、** [类加载是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案整理,汇总版.md#7类加载是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案整理,汇总版.md) + +## Jvm最新面试题及答案附答案汇总 + +**1、** [堆溢出的原因?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案附答案汇总.md#1堆溢出的原因) +**2、** [程序计数器有什么作用?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案附答案汇总.md#2程序计数器有什么作用) +**3、** [32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案附答案汇总.md#332-位-JVM-和-64-位-JVM-的最大堆内存分别是多数) +**4、** [永久代](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案附答案汇总.md#4永久代) +**5、** [JRE、JDK、JVM 及 JIT 之间有什么不同?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案附答案汇总.md#5JREJDKJVM-及-JIT-之间有什么不同) +**6、** [类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案附答案汇总.md#6类加载为什么要使用双亲委派模式有没有什么场景是打破了这个模式) +**7、** [什么是内存屏障?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案附答案汇总.md#7什么是内存屏障) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题及答案附答案汇总.md) + +## Jvm最新面试题,2021年面试题及答案汇总 + +**1、** [分代收集算法](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,2021年面试题及答案汇总.md#1分代收集算法) +**2、** [虚拟机栈(线程私有)](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,2021年面试题及答案汇总.md#2虚拟机栈线程私有) +**3、** [JVM新生代中为什么要分为Eden和Survivor?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,2021年面试题及答案汇总.md#3JVM新生代中为什么要分为Eden和Survivor) +**4、** [G1 收集器](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,2021年面试题及答案汇总.md#4G1-收集器) +**5、** [MinorGC,MajorGC、FullGC都什么时候发生?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,2021年面试题及答案汇总.md#5MinorGCMajorGCFullGC都什么时候发生) +**6、** [你知道哪些GC类型?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,2021年面试题及答案汇总.md#6你知道哪些GC类型) +**7、** [什么情况会造成元空间溢出?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,2021年面试题及答案汇总.md#7什么情况会造成元空间溢出) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,2021年面试题及答案汇总.md) + +## Jvm最新面试题,常见面试题及答案汇总 + +**1、** [调优命令有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,常见面试题及答案汇总.md#1调优命令有哪些) +**2、** [什么是方法区](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,常见面试题及答案汇总.md#2什么是方法区) +**3、** [64 位 JVM 中,int 的长度是多数?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,常见面试题及答案汇总.md#364-位-JVM-中int-的长度是多数) +**4、** [JVM 内存区域](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,常见面试题及答案汇总.md#4JVM-内存区域) +**5、** [什么是happen-before原则?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,常见面试题及答案汇总.md#5什么是happen-before原则) +**6、** [讲讲什么情况下会出现内存溢出,内存泄漏?](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,常见面试题及答案汇总.md#6讲讲什么情况下会出现内存溢出内存泄漏) +**7、** [JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,常见面试题及答案汇总.md#7JVM-选项--XX:+UseCompressedOops-有什么作用为什么要使用) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Jvm/Jvm最新面试题,常见面试题及答案汇总.md) + +## Dubbo最新2021年面试题大汇总,附答案 + +**1、** [Dubbo 超时设置有哪些方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题大汇总,附答案.md#1Dubbo-超时设置有哪些方式) +**2、** [Dubbo 是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题大汇总,附答案.md#2Dubbo-是什么) +**3、** [Dubbo 支持服务降级吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题大汇总,附答案.md#3Dubbo-支持服务降级吗) +**4、** [同一个服务多个注册的情况下可以直连某一个服务吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题大汇总,附答案.md#4同一个服务多个注册的情况下可以直连某一个服务吗) +**5、** [RPC使用了哪些关键技术,主流RPC框架有哪些](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题大汇总,附答案.md#5RPC使用了哪些关键技术主流RPC框架有哪些) +**6、** [Dubbo 集群容错有几种方案?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题大汇总,附答案.md#6Dubbo-集群容错有几种方案) +**7、** [Dubbo 的注册中心集群挂掉,发布者和订阅者之间还能通信么?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题大汇总,附答案.md#7Dubbo-的注册中心集群挂掉发布者和订阅者之间还能通信么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题大汇总,附答案.md) + +## Dubbo最新2021年面试题附答案解析,大汇总 + +**1、** [dubbo 在安全机制方面如何解决的?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题附答案解析,大汇总.md#1dubbo-在安全机制方面如何解决的) +**2、** [Dubbo必须依赖的包有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题附答案解析,大汇总.md#2Dubbo必须依赖的包有哪些) +**3、** [Dubbo可以对结果进行缓存吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题附答案解析,大汇总.md#3Dubbo可以对结果进行缓存吗) +**4、** [Dubbo 支持哪些协议,它们的优缺点有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题附答案解析,大汇总.md#4Dubbo-支持哪些协议它们的优缺点有哪些) +**5、** [Dubbo 使用的是什么通信框架?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题附答案解析,大汇总.md#5Dubbo-使用的是什么通信框架) +**6、** [Dubbo Monitor 实现原理?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题附答案解析,大汇总.md#6Dubbo-Monitor-实现原理) +**7、** [服务调用是阻塞的吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题附答案解析,大汇总.md#7服务调用是阻塞的吗) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题附答案解析,大汇总.md) + +## Dubbo最新2021年面试题,高级面试题及附答案解析 + +**1、** [一般使用什么注册中心?还有别的选择吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题,高级面试题及附答案解析.md#1一般使用什么注册中心还有别的选择吗) +**2、** [Dubbo支持服务多协议吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题,高级面试题及附答案解析.md#2Dubbo支持服务多协议吗) +**3、** [说说核心的配置有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题,高级面试题及附答案解析.md#3说说核心的配置有哪些) +**4、** [RPC使用了哪些关键技术,从调用者的角度看:](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题,高级面试题及附答案解析.md#4RPC使用了哪些关键技术从调用者的角度看:) +**5、** [什么是RPC](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题,高级面试题及附答案解析.md#5什么是RPC) +**6、** [Dubbo 的默认集群容错方案?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题,高级面试题及附答案解析.md#6Dubbo-的默认集群容错方案) +**7、** [Dubbo 的架构设计](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题,高级面试题及附答案解析.md#7Dubbo-的架构设计) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新2021年面试题,高级面试题及附答案解析.md) + +## Dubbo最新面试题2021年,常见面试题及答案汇总 + +**1、** [Dubbo 超时时间怎样设置?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题2021年,常见面试题及答案汇总.md#1Dubbo-超时时间怎样设置) +**2、** [Dubbo 推荐什么协议?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题2021年,常见面试题及答案汇总.md#2Dubbo-推荐什么协议) +**3、** [为什么要用 Dubbo?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题2021年,常见面试题及答案汇总.md#3为什么要用-Dubbo) +**4、** [在使用过程中都遇到了些什么问题?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题2021年,常见面试题及答案汇总.md#4在使用过程中都遇到了些什么问题) +**5、** [dubbo 服务集群配置(集群容错模式)](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题2021年,常见面试题及答案汇总.md#5dubbo-服务集群配置集群容错模式) +**6、** [如何解决服务调用链过长的问题?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题2021年,常见面试题及答案汇总.md#6如何解决服务调用链过长的问题) +**7、** [RPC使用了哪些关键技术,Dubbo](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题2021年,常见面试题及答案汇总.md#7RPC使用了哪些关键技术Dubbo) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题2021年,常见面试题及答案汇总.md) + +## Dubbo最新面试题及答案附答案汇总 + +**1、** [RPC使用了哪些关键技术,服务调用](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题及答案附答案汇总.md#1RPC使用了哪些关键技术服务调用) +**2、** [RPC使用了哪些关键技术,RPC的实现原理架构图](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题及答案附答案汇总.md#2RPC使用了哪些关键技术RPC的实现原理架构图) +**3、** [注册了多个同一样的服务,如果测试指定的某一个服务呢?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题及答案附答案汇总.md#3注册了多个同一样的服务如果测试指定的某一个服务呢) +**4、** [RPC使用了哪些关键技术,Thrift](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题及答案附答案汇总.md#4RPC使用了哪些关键技术Thrift) +**5、** [默认使用什么序列化框架,你知道的还有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题及答案附答案汇总.md#5默认使用什么序列化框架你知道的还有哪些) +**6、** [服务上线怎么兼容旧版本?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题及答案附答案汇总.md#6服务上线怎么兼容旧版本) +**7、** [RPC框架需要解决的问题?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题及答案附答案汇总.md#7RPC框架需要解决的问题) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题及答案附答案汇总.md) + +## Dubbo最新面试题,2021年面试题及答案汇总 + +**1、** [RPC使用了哪些关键技术,服务注册中心](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题,2021年面试题及答案汇总.md#1RPC使用了哪些关键技术服务注册中心) +**2、** [Dubbo服务降级,失败重试怎么做?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题,2021年面试题及答案汇总.md#2Dubbo服务降级失败重试怎么做) +**3、** [服务上线怎么不影响旧版本?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题,2021年面试题及答案汇总.md#3服务上线怎么不影响旧版本) +**4、** [Dubbo 支持哪些协议,它们的优缺点有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题,2021年面试题及答案汇总.md#4Dubbo-支持哪些协议它们的优缺点有哪些) +**5、** [服务调用超时问题怎么解决?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题,2021年面试题及答案汇总.md#5服务调用超时问题怎么解决) +**6、** [Dubbo 支持分布式事务吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题,2021年面试题及答案汇总.md#6Dubbo-支持分布式事务吗) +**7、** [Dubbo 支持哪些序列化方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题,2021年面试题及答案汇总.md#7Dubbo-支持哪些序列化方式) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Dubbo/Dubbo最新面试题,2021年面试题及答案汇总.md) + +## MySQL最新2021年面试题及答案,汇总版 + +**1、** [SQL语句主要分为哪几类](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题及答案,汇总版.md#1SQL语句主要分为哪几类) +**2、** [读写分离常见方案?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题及答案,汇总版.md#2读写分离常见方案) +**3、** [数据库自增主键可能遇到什么问题。](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题及答案,汇总版.md#3数据库自增主键可能遇到什么问题。) +**4、** [什么是死锁?怎么解决?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题及答案,汇总版.md#4什么是死锁怎么解决) +**5、** [关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题及答案,汇总版.md#5关心过业务系统里面的sql耗时吗统计过慢查询吗对慢查询都怎么优化过) +**6、** [怎么创建索引的,有什么好处,有哪些分类](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题及答案,汇总版.md#6怎么创建索引的有什么好处有哪些分类) +**7、** [B树和B+树的区别,数据库为什么使用B+树而不是B树?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题及答案,汇总版.md#7B树和B+树的区别数据库为什么使用B+树而不是B树) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题及答案,汇总版.md) + +## MySQL最新2021年面试题大汇总,附答案 + +**1、** [有多少种日志](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题大汇总,附答案.md#1有多少种日志) +**2、** [前缀索引](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题大汇总,附答案.md#2前缀索引) +**3、** [SQL语言包括哪几部分?每部分都有哪些操作关键字?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题大汇总,附答案.md#3SQL语言包括哪几部分每部分都有哪些操作关键字) +**4、** [Myql中的事务回滚机制概述](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题大汇总,附答案.md#4Myql中的事务回滚机制概述) +**5、** [从锁的类别角度讲,MySQL都有哪些锁呢?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题大汇总,附答案.md#5从锁的类别角度讲MySQL都有哪些锁呢) +**6、** [聚簇索引和非聚簇索引,在查询数据的时候有区别吗?为什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题大汇总,附答案.md#6聚簇索引和非聚簇索引在查询数据的时候有区别吗为什么) +**7、** [如何显示前50行?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题大汇总,附答案.md#7如何显示前50行) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题大汇总,附答案.md) + +## MySQL最新2021年面试题附答案解析,大汇总 + +**1、** [一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题附答案解析,大汇总.md#1一个6亿的表a一个3亿的表b通过外间tid关联你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。) +**2、** [什么是幻读,脏读,不可重复读呢?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题附答案解析,大汇总.md#2什么是幻读脏读不可重复读呢) +**3、** [使用索引查询一定能提高查询的性能吗?为什么](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题附答案解析,大汇总.md#3使用索引查询一定能提高查询的性能吗为什么) +**4、** [你怎么知道SQL语句性能是高还是低](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题附答案解析,大汇总.md#4你怎么知道SQL语句性能是高还是低) +**5、** [事物的四大特性(ACID)介绍一下?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题附答案解析,大汇总.md#5事物的四大特性ACID介绍一下) +**6、** [为什么要尽量设定一个主键?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题附答案解析,大汇总.md#6为什么要尽量设定一个主键) +**7、** [MySQL中InnoDB引擎的行锁是怎么实现的?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题附答案解析,大汇总.md#7MySQL中InnoDB引擎的行锁是怎么实现的) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题附答案解析,大汇总.md) + +## MySQL最新2021年面试题,高级面试题及附答案解析 + +**1、** [非主键索引一定会查询多次吗?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题,高级面试题及附答案解析.md#1非主键索引一定会查询多次吗) +**2、** [SQL的生命周期?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题,高级面试题及附答案解析.md#2SQL的生命周期) +**3、** [B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据,](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题,高级面试题及附答案解析.md#3B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据) +**4、** [什么是数据库连接池?为什么需要数据库连接池呢?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题,高级面试题及附答案解析.md#4什么是数据库连接池为什么需要数据库连接池呢) +**5、** [如何显示前50行?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题,高级面试题及附答案解析.md#5如何显示前50行) +**6、** [MySQL数据库cpu飙升到500%的话他怎么处理?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题,高级面试题及附答案解析.md#6MySQL数据库cpu飙升到500%的话他怎么处理) +**7、** [SQL注入漏洞产生的原因?如何防止?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题,高级面试题及附答案解析.md#7SQL注入漏洞产生的原因如何防止) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新2021年面试题,高级面试题及附答案解析.md) + +## MySQL最新基础面试题及答案整理 + +**1、** [简单总结下](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新基础面试题及答案整理.md#1简单总结下) +**2、** [索引失效情况? ==校验SQL语句是否使用了索引方式为:](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新基础面试题及答案整理.md#2索引失效情况-==校验SQL语句是否使用了索引方式为:) +**3、** [为什么要使用视图?什么是视图?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新基础面试题及答案整理.md#3为什么要使用视图什么是视图) +**4、** [索引不适合哪些场景](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新基础面试题及答案整理.md#4索引不适合哪些场景) +**5、** [count(1)、count(*) 与 count(列名) 的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新基础面试题及答案整理.md#5count1count*-与-count列名-的区别) +**6、** [索引有哪几种类型?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新基础面试题及答案整理.md#6索引有哪几种类型) +**7、** [列的字符串类型可以是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新基础面试题及答案整理.md#7列的字符串类型可以是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新基础面试题及答案整理.md) + +## MySQL最新面试题2021年,常见面试题及答案汇总 + +**1、** [如果一个表有一列定义为TIMESTAMP,将发生什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题2021年,常见面试题及答案汇总.md#1如果一个表有一列定义为TIMESTAMP将发生什么) +**2、** [SQL 约束有哪几种呢?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题2021年,常见面试题及答案汇总.md#2SQL-约束有哪几种呢) +**3、** [一条Sql的执行顺序?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题2021年,常见面试题及答案汇总.md#3一条Sql的执行顺序) +**4、** [数据库索引的原理,为什么要用 B+树,为什么不用二叉树?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题2021年,常见面试题及答案汇总.md#4数据库索引的原理为什么要用-B+树为什么不用二叉树) +**5、** [使用悲观锁](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题2021年,常见面试题及答案汇总.md#5使用悲观锁) +**6、** [InnoDB存储引擎的锁的算法有三种](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题2021年,常见面试题及答案汇总.md#6InnoDB存储引擎的锁的算法有三种) +**7、** [索引哪些情况会失效](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题2021年,常见面试题及答案汇总.md#7索引哪些情况会失效) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题2021年,常见面试题及答案汇总.md) + +## MySQL最新面试题及答案整理,汇总版 + +**1、** [什么是存储过程?有哪些优缺点?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案整理,汇总版.md#1什么是存储过程有哪些优缺点) +**2、** [MySQL5.6和MySQL5.7对索引做了哪些优化?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案整理,汇总版.md#2MySQL56和MySQL57对索引做了哪些优化) +**3、** [关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案整理,汇总版.md#3关心过业务系统里面的sql耗时吗统计过慢查询吗对慢查询都怎么优化过) +**4、** [最左匹配原则?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案整理,汇总版.md#4最左匹配原则) +**5、** [使用B+树的好处](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案整理,汇总版.md#5使用B+树的好处) +**6、** [BLOB和TEXT有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案整理,汇总版.md#6BLOB和TEXT有什么区别) +**7、** [什么是幻读,脏读,不可重复读呢?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案整理,汇总版.md#7什么是幻读脏读不可重复读呢) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案整理,汇总版.md) + +## MySQL最新面试题及答案附答案汇总 + +**1、** [说说MySQL 的基础架构图](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案附答案汇总.md#1说说MySQL-的基础架构图) +**2、** [列的字符串类型可以是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案附答案汇总.md#2列的字符串类型可以是什么) +**3、** [SQL 约束有哪几种?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案附答案汇总.md#3SQL-约束有哪几种) +**4、** [drop、delete与truncate的区别](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案附答案汇总.md#4dropdelete与truncate的区别) +**5、** [说一下大表查询的优化方案](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案附答案汇总.md#5说一下大表查询的优化方案) +**6、** [为什么索引结构默认使用B+Tree,而不是Hash,二叉树,红黑树?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案附答案汇总.md#6为什么索引结构默认使用B+Tree而不是Hash二叉树红黑树) +**7、** [什么是非标准字符串类型?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案附答案汇总.md#7什么是非标准字符串类型) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题及答案附答案汇总.md) + +## MySQL最新面试题,2021年面试题及答案汇总 + +**1、** [CHAR和VARCHAR的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,2021年面试题及答案汇总.md#1CHAR和VARCHAR的区别) +**2、** [MYSQL的主从延迟,你怎么解决?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,2021年面试题及答案汇总.md#2MYSQL的主从延迟你怎么解决) +**3、** [什么是数据库事务?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,2021年面试题及答案汇总.md#3什么是数据库事务) +**4、** [一条SQL语句在MySQL中如何执行的?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,2021年面试题及答案汇总.md#4一条SQL语句在MySQL中如何执行的) +**5、** [视图的缺点](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,2021年面试题及答案汇总.md#5视图的缺点) +**6、** [主键使用自增ID还是UUID,为什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,2021年面试题及答案汇总.md#6主键使用自增ID还是UUID为什么) +**7、** [覆盖索引是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,2021年面试题及答案汇总.md#7覆盖索引是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,2021年面试题及答案汇总.md) + +## MySQL最新面试题,常见面试题及答案汇总 + +**1、** [什么是最左前缀原则?什么是最左匹配原则?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,常见面试题及答案汇总.md#1什么是最左前缀原则什么是最左匹配原则) +**2、** [主键、外键和索引的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,常见面试题及答案汇总.md#2主键外键和索引的区别) +**3、** [B树和B+树的区别](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,常见面试题及答案汇总.md#3B树和B+树的区别) +**4、** [索引的基本原理](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,常见面试题及答案汇总.md#4索引的基本原理) +**5、** [谈谈六种关联查询,使用场景。](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,常见面试题及答案汇总.md#5谈谈六种关联查询使用场景。) +**6、** [varchar(50)中50的涵义](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,常见面试题及答案汇总.md#6varchar50中50的涵义) +**7、** [隔离级别与锁的关系](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,常见面试题及答案汇总.md#7隔离级别与锁的关系) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL最新面试题,常见面试题及答案汇总.md) + +## MySQL高级面试题及答案,企业真面试题 + +**1、** [SQL语句的语法顺序:](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题及答案,企业真面试题.md#1SQL语句的语法顺序:) +**2、** [什么是锁?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题及答案,企业真面试题.md#2什么是锁) +**3、** [MySQL中有哪几种锁,列举一下?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题及答案,企业真面试题.md#3MySQL中有哪几种锁列举一下) +**4、** [优化LIMIT分页](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题及答案,企业真面试题.md#4优化LIMIT分页) +**5、** [列对比运算符是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题及答案,企业真面试题.md#5列对比运算符是什么) +**6、** [怎么查询SQL语句是否使用了索引查询?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题及答案,企业真面试题.md#6怎么查询SQL语句是否使用了索引查询) +**7、** [锁的优化策略](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题及答案,企业真面试题.md#7锁的优化策略) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题及答案,企业真面试题.md) + +## MySQL高级面试题整理及答案 + +**1、** [备份计划,MySQLdump以及xtranbackup的实现原理](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题整理及答案.md#1备份计划MySQLdump以及xtranbackup的实现原理) +**2、** [CHAR和VARCHAR的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题整理及答案.md#2CHAR和VARCHAR的区别) +**3、** [数据库存储日期格式时,如何考虑时区转换问题?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题整理及答案.md#3数据库存储日期格式时如何考虑时区转换问题) +**4、** [如何通俗地理解三个范式?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题整理及答案.md#4如何通俗地理解三个范式) +**5、** [什么是触发器?触发器的使用场景有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题整理及答案.md#5什么是触发器触发器的使用场景有哪些) +**6、** [数据库结构优化](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题整理及答案.md#6数据库结构优化) +**7、** [优化WHERE子句](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题整理及答案.md#7优化WHERE子句) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题整理及答案.md) + +## MySQL高级面试题,中级面试题,大汇总 + +**1、** [创建索引的三种方式](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题,中级面试题,大汇总.md#1创建索引的三种方式) +**2、** [MySQL 分页](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题,中级面试题,大汇总.md#2MySQL-分页) +**3、** [如果要存储用户的密码散列,应该使用什么字段进行存储?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题,中级面试题,大汇总.md#3如果要存储用户的密码散列应该使用什么字段进行存储) +**4、** [列值为NULL时,查询是否会用到索引?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题,中级面试题,大汇总.md#4列值为NULL时查询是否会用到索引) +**5、** [UNION与UNION ALL的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题,中级面试题,大汇总.md#5UNION与UNION-ALL的区别) +**6、** [SQL语句优化的一些方法](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题,中级面试题,大汇总.md#6SQL语句优化的一些方法) +**7、** [如果要存储用户的密码散列,应该使用什么字段进行存储?](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题,中级面试题,大汇总.md#7如果要存储用户的密码散列应该使用什么字段进行存储) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MySQL/MySQL高级面试题,中级面试题,大汇总.md) + +## 并发编程最新2021年面试题及答案,汇总版 + +**1、** [什么是指令重排序?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题及答案,汇总版.md#1什么是指令重排序) +**2、** [ThreadPoolExecutor饱和策略有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题及答案,汇总版.md#2ThreadPoolExecutor饱和策略有哪些) +**3、** [什么是并发容器的实现?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题及答案,汇总版.md#3什么是并发容器的实现) +**4、** [volatile 能使得一个非原子操作变成原子操作吗?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题及答案,汇总版.md#4volatile-能使得一个非原子操作变成原子操作吗) +**5、** [如果你提交任务时,线程池队列已满,这时会发生什么](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题及答案,汇总版.md#5如果你提交任务时线程池队列已满这时会发生什么) +**6、** [synchronized可重入的原理](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题及答案,汇总版.md#6synchronized可重入的原理) +**7、** [非堵塞队列:](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题及答案,汇总版.md#7非堵塞队列:) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题及答案,汇总版.md) + +## 并发编程最新2021年面试题大汇总,附答案 + +**1、** [实现可见性的方法有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题大汇总,附答案.md#1实现可见性的方法有哪些) +**2、** [Java 8 为什么要将永久代(PermGen)替换为元空间(MetaSpace)呢?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题大汇总,附答案.md#2Java-8-为什么要将永久代PermGen替换为元空间MetaSpace呢) +**3、** [线程 B 怎么知道线程 A 修改了变量](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题大汇总,附答案.md#3线程-B-怎么知道线程-A-修改了变量) +**4、** [直接内存是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题大汇总,附答案.md#4直接内存是什么) +**5、** [JVM 出现 fullGC 很频繁,怎么去线上排查问题](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题大汇总,附答案.md#5JVM-出现-fullGC-很频繁怎么去线上排查问题) +**6、** [说下有哪些类加载器?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题大汇总,附答案.md#6说下有哪些类加载器) +**7、** [notify() 和 notifyAll() 有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题大汇总,附答案.md#7notify-和-notifyAll-有什么区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题大汇总,附答案.md) + +## 并发编程最新2021年面试题附答案解析,大汇总 + +**1、** [线程的调度策略](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题附答案解析,大汇总.md#1线程的调度策略) +**2、** [JRE、JDK、JVM 及 JIT 之间有什么不同?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题附答案解析,大汇总.md#2JREJDKJVM-及-JIT-之间有什么不同) +**3、** [线程的 run()和 start()有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题附答案解析,大汇总.md#3线程的-run和-start有什么区别) +**4、** [简述Java的对象结构](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题附答案解析,大汇总.md#4简述Java的对象结构) +**5、** [什么是原子操作?在Java Concurrency API中有哪些原子类(atomic classes)?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题附答案解析,大汇总.md#5什么是原子操作在Java-Concurrency-API中有哪些原子类atomic-classes) +**6、** [为什么wait(), notify()和notifyAll ()必须在同步方法或者同步块中被调用?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题附答案解析,大汇总.md#6为什么wait,-notify和notifyAll-必须在同步方法或者同步块中被调用) +**7、** [分区收集算法](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题附答案解析,大汇总.md#7分区收集算法) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题附答案解析,大汇总.md) + +## 并发编程最新2021年面试题,高级面试题及附答案解析 + +**1、** [请你谈谈对OOM的认识](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题,高级面试题及附答案解析.md#1请你谈谈对OOM的认识) +**2、** [详细介绍一下JVM内存模型](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题,高级面试题及附答案解析.md#2详细介绍一下JVM内存模型) +**3、** [Java Concurrency API中的Lock接口(Lock interface)是什么?对比同步它有什么优势?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题,高级面试题及附答案解析.md#3Java-Concurrency-API中的Lock接口Lock-interface是什么对比同步它有什么优势) +**4、** [JAVA 强引用](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题,高级面试题及附答案解析.md#4JAVA-强引用) +**5、** [synchronized、volatile、CAS比较](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题,高级面试题及附答案解析.md#5synchronizedvolatileCAS比较) +**6、** [JAVA软引用](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题,高级面试题及附答案解析.md#6JAVA软引用) +**7、** [类加载的过程是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题,高级面试题及附答案解析.md#7类加载的过程是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新2021年面试题,高级面试题及附答案解析.md) + +## 并发编程最新基础面试题及答案整理 + +**1、** [重排序遵守的规则](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新基础面试题及答案整理.md#1重排序遵守的规则) +**2、** [synchronized的作用?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新基础面试题及答案整理.md#2synchronized的作用) +**3、** [类初始化的情况有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新基础面试题及答案整理.md#3类初始化的情况有哪些) +**4、** [你如何确保main()方法所在的线程是Java 程序最后结束的线程?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新基础面试题及答案整理.md#4你如何确保main方法所在的线程是Java-程序最后结束的线程) +**5、** [JVM 的内存模型以及分区情况和作用](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新基础面试题及答案整理.md#5JVM-的内存模型以及分区情况和作用) +**6、** [Java 中你怎样唤醒一个阻塞的线程?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新基础面试题及答案整理.md#6Java-中你怎样唤醒一个阻塞的线程) +**7、** [描述一下JVM加载class文件的原理机制?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新基础面试题及答案整理.md#7描述一下JVM加载class文件的原理机制) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新基础面试题及答案整理.md) + +## 并发编程最新面试题2021年,常见面试题及答案汇总 + +**1、** [什么是可重入锁(ReentrantLock)?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题2021年,常见面试题及答案汇总.md#1什么是可重入锁ReentrantLock) +**2、** [Java的双亲委托机制是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题2021年,常见面试题及答案汇总.md#2Java的双亲委托机制是什么) +**3、** [谈谈你知道的垃圾收集器](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题2021年,常见面试题及答案汇总.md#3谈谈你知道的垃圾收集器) +**4、** [什么叫线程安全?servlet 是线程安全吗?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题2021年,常见面试题及答案汇总.md#4什么叫线程安全servlet-是线程安全吗) +**5、** [怎么检测一个线程是否拥有锁?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题2021年,常见面试题及答案汇总.md#5怎么检测一个线程是否拥有锁) +**6、** [有哪些打破了双亲委托机制的案例?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题2021年,常见面试题及答案汇总.md#6有哪些打破了双亲委托机制的案例) +**7、** [线程与进程的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题2021年,常见面试题及答案汇总.md#7线程与进程的区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题2021年,常见面试题及答案汇总.md) + +## 并发编程最新面试题及答案整理,汇总版 + +**1、** [死锁的原因](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案整理,汇总版.md#1死锁的原因) +**2、** [怎么看死锁的线程?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案整理,汇总版.md#2怎么看死锁的线程) +**3、** [多线程同步和互斥有几种实现方法,都是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案整理,汇总版.md#3多线程同步和互斥有几种实现方法都是什么) +**4、** [如何停止一个正在运行的线程?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案整理,汇总版.md#4如何停止一个正在运行的线程) +**5、** [JVM内存模型](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案整理,汇总版.md#5JVM内存模型) +**6、** [什么是方法区](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案整理,汇总版.md#6什么是方法区) +**7、** [描述一下什么情况下,对象会从年轻代进入老年代](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案整理,汇总版.md#7描述一下什么情况下对象会从年轻代进入老年代) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案整理,汇总版.md) + +## 并发编程最新面试题及答案附答案汇总 + +**1、** [运行时数据区是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案附答案汇总.md#1运行时数据区是什么) +**2、** [对象的内存布局了解吗?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案附答案汇总.md#2对象的内存布局了解吗) +**3、** [多线程应用场景](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案附答案汇总.md#3多线程应用场景) +**4、** [分配CPU和IO密集:](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案附答案汇总.md#4分配CPU和IO密集:) +**5、** [你有哪些手段来排查 OOM 的问题?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案附答案汇总.md#5你有哪些手段来排查-OOM-的问题) +**6、** [说说自己是怎么使用 synchronized 关键字,在项目中用到了吗](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案附答案汇总.md#6说说自己是怎么使用-synchronized-关键字在项目中用到了吗) +**7、** [什么情况会造成元空间溢出?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案附答案汇总.md#7什么情况会造成元空间溢出) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题及答案附答案汇总.md) + +## 并发编程最新面试题,2021年面试题及答案汇总 + +**1、** [线程池有什么优点?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,2021年面试题及答案汇总.md#1线程池有什么优点) +**2、** [生产上如何配置垃圾收集器的?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,2021年面试题及答案汇总.md#2生产上如何配置垃圾收集器的) +**3、** [什么是原子类](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,2021年面试题及答案汇总.md#3什么是原子类) +**4、** [volatile有什么用?能否用一句话说明下volatile的应用场景?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,2021年面试题及答案汇总.md#4volatile有什么用能否用一句话说明下volatile的应用场景) +**5、** [线程的状态流转图](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,2021年面试题及答案汇总.md#5线程的状态流转图) +**6、** [如何确保线程安全?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,2021年面试题及答案汇总.md#6如何确保线程安全) +**7、** [创建对象的过程是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,2021年面试题及答案汇总.md#7创建对象的过程是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,2021年面试题及答案汇总.md) + +## 并发编程最新面试题,常见面试题及答案汇总 + +**1、** [对于JDK自带的监控和性能分析工具用过哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,常见面试题及答案汇总.md#1对于JDK自带的监控和性能分析工具用过哪些) +**2、** [MinorGC、MajorGC、FullGC 什么时候发生?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,常见面试题及答案汇总.md#2MinorGCMajorGCFullGC-什么时候发生) +**3、** [Java 中会存在内存泄漏?简述一下](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,常见面试题及答案汇总.md#3Java-中会存在内存泄漏简述一下) +**4、** [finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,常见面试题及答案汇总.md#4finalize方法什么时候被调用析构函数finalization的目的是什么) +**5、** [ZGC 了解吗?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,常见面试题及答案汇总.md#5ZGC-了解吗) +**6、** [说说ZGC垃圾收集器的工作原理](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,常见面试题及答案汇总.md#6说说ZGC垃圾收集器的工作原理) +**7、** [你知道哪些故障处理工具?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,常见面试题及答案汇总.md#7你知道哪些故障处理工具) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程最新面试题,常见面试题及答案汇总.md) + +## 并发编程面试题及答案整理,2021年最新,汇总版 + +**1、** [Java 中怎么获取一份线程 dump 文件?你如何在 Java 中获取线程堆栈?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题及答案整理,2021年最新,汇总版.md#1Java-中怎么获取一份线程-dump-文件你如何在-Java-中获取线程堆栈) +**2、** [如何创建守护线程?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题及答案整理,2021年最新,汇总版.md#2如何创建守护线程) +**3、** [如何判断对象是否是垃圾?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题及答案整理,2021年最新,汇总版.md#3如何判断对象是否是垃圾) +**4、** [JVM 年轻代到年老代的晋升过程的判断条件是什么呢?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题及答案整理,2021年最新,汇总版.md#4JVM-年轻代到年老代的晋升过程的判断条件是什么呢) +**5、** [ParNew 垃圾收集器(Serial+多线程)](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题及答案整理,2021年最新,汇总版.md#5ParNew-垃圾收集器Serial+多线程) +**6、** [你都用过G1垃圾回收器的哪几个重要参数?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题及答案整理,2021年最新,汇总版.md#6你都用过G1垃圾回收器的哪几个重要参数) +**7、** [CAS 的会产生什么问题?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题及答案整理,2021年最新,汇总版.md#7CAS-的会产生什么问题) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题及答案整理,2021年最新,汇总版.md) + +## 并发编程面试题大汇总,2021年附答案解析 + +**1、** [线程之间是如何通信的?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题大汇总,2021年附答案解析.md#1线程之间是如何通信的) +**2、** [说一下 runnable 和 callable 有什么区别](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题大汇总,2021年附答案解析.md#2说一下-runnable-和-callable-有什么区别) +**3、** [什么是方法内联?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题大汇总,2021年附答案解析.md#3什么是方法内联) +**4、** [守护线程和用户线程有什么区别呢?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题大汇总,2021年附答案解析.md#4守护线程和用户线程有什么区别呢) +**5、** [垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题大汇总,2021年附答案解析.md#5垃圾回收器的基本原理是什么垃圾回收器可以马上回收内存吗有什么办法主动通知虚拟机进行垃圾回收) +**6、** [谈谈对 OOM 的认识](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题大汇总,2021年附答案解析.md#6谈谈对-OOM-的认识) +**7、** [synchronized 和 ReentrantLock 区别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题大汇总,2021年附答案解析.md#7synchronized-和-ReentrantLock-区别是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程面试题大汇总,2021年附答案解析.md) + +## 并发编程高级面试题及答案,2021版 + +**1、** [为什么你应该在循环中检查等待条件?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,2021版.md#1为什么你应该在循环中检查等待条件) +**2、** [内存溢出和内存泄漏的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,2021版.md#2内存溢出和内存泄漏的区别) +**3、** [如何判断一个类是无用的类?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,2021版.md#3如何判断一个类是无用的类) +**4、** [用过ConcurrentHashMap,讲一下他和HashTable的不同之处?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,2021版.md#4用过ConcurrentHashMap讲一下他和HashTable的不同之处) +**5、** [JVM 有哪些运行时内存区域?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,2021版.md#5JVM-有哪些运行时内存区域) +**6、** [阻塞队列和非阻塞队列区别](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,2021版.md#6阻塞队列和非阻塞队列区别) +**7、** [并行和并发有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,2021版.md#7并行和并发有什么区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,2021版.md) + +## 并发编程高级面试题及答案,企业真面试题 + +**1、** [Java的内存模型是什么?(JMM是什么?)](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,企业真面试题.md#1Java的内存模型是什么JMM是什么) +**2、** [CyclicBarrier和CountDownLatch的区别](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,企业真面试题.md#2CyclicBarrier和CountDownLatch的区别) +**3、** [Java 中垃圾收集的方法有哪些](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,企业真面试题.md#3Java-中垃圾收集的方法有哪些) +**4、** [生产环境服务器变慢,如何诊断处理?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,企业真面试题.md#4生产环境服务器变慢如何诊断处理) +**5、** [CMS都有哪些问题?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,企业真面试题.md#5CMS都有哪些问题) +**6、** [怎样通过 Java 程序来判断 JVM 是 32 位 还是 64位?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,企业真面试题.md#6怎样通过-Java-程序来判断-JVM-是-32-位-还是-64位) +**7、** [什么叫线程安全?servlet是线程安全吗?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,企业真面试题.md#7什么叫线程安全servlet是线程安全吗) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题及答案,企业真面试题.md) + +## 并发编程高级面试题合集,附答案解析 + +**1、** [Java 中 ConcurrentHashMap 的并发度是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题合集,附答案解析.md#1Java-中-ConcurrentHashMap-的并发度是什么) +**2、** [运行时栈帧包含哪些结构?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题合集,附答案解析.md#2运行时栈帧包含哪些结构) +**3、** [什么是类加载器,类加载器有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题合集,附答案解析.md#3什么是类加载器类加载器有哪些) +**4、** [Java 线程数过多会造成什么异常?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题合集,附答案解析.md#4Java-线程数过多会造成什么异常) +**5、** [如何合理分配线程池大小?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题合集,附答案解析.md#5如何合理分配线程池大小) +**6、** [如何在两个线程间共享数据?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题合集,附答案解析.md#6如何在两个线程间共享数据) +**7、** [描述一下 JVM 加载 class 文件的原理机制](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题合集,附答案解析.md#7描述一下-JVM-加载-class-文件的原理机制) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题合集,附答案解析.md) + +## 并发编程高级面试题整理及答案 + +**1、** [为什么HashTable是线程安全的?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题整理及答案.md#1为什么HashTable是线程安全的) +**2、** [什么是Daemon线程?它有什么意义?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题整理及答案.md#2什么是Daemon线程它有什么意义) +**3、** [如何判断一个常量是废弃常量 ?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题整理及答案.md#3如何判断一个常量是废弃常量-) +**4、** [对象是怎么从年轻代进入老年代的?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题整理及答案.md#4对象是怎么从年轻代进入老年代的) +**5、** [什么是CAS](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题整理及答案.md#5什么是CAS) +**6、** [Java中用到的线程调度算法是什么](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题整理及答案.md#6Java中用到的线程调度算法是什么) +**7、** [Java 的引用有哪些类型?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题整理及答案.md#7Java-的引用有哪些类型) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题整理及答案.md) + +## 并发编程高级面试题,中级面试题,大汇总 + +**1、** [Java 如何实现多线程之间的通讯和协作?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题,中级面试题,大汇总.md#1Java-如何实现多线程之间的通讯和协作) +**2、** [Java中用到的线程调度算法是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题,中级面试题,大汇总.md#2Java中用到的线程调度算法是什么) +**3、** [在新生代-复制算法](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题,中级面试题,大汇总.md#3在新生代-复制算法) +**4、** [说说线程栈](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题,中级面试题,大汇总.md#4说说线程栈) +**5、** [Linux环境下如何查找哪个线程使用CPU最长](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题,中级面试题,大汇总.md#5Linux环境下如何查找哪个线程使用CPU最长) +**6、** [动态改变构造](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题,中级面试题,大汇总.md#6动态改变构造) +**7、** [谈谈你知道的垃圾回收算法](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题,中级面试题,大汇总.md#7谈谈你知道的垃圾回收算法) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/并发编程/并发编程高级面试题,中级面试题,大汇总.md) + +## Spring最新2021年面试题及答案,汇总版 + +**1、** [前后端分离,如何维护接口文档 ?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题及答案,汇总版.md#1前后端分离如何维护接口文档-) +**2、** [SpringBoot 的核心注解是哪个?它主要由哪几个注解组成的?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题及答案,汇总版.md#2SpringBoot-的核心注解是哪个它主要由哪几个注解组成的) +**3、** [SpringBoot、Spring MVC 和 Spring 有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题及答案,汇总版.md#3SpringBootSpring-MVC-和-Spring-有什么区别) +**4、** [Spring MVC里面拦截器是怎么写的](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题及答案,汇总版.md#4Spring-MVC里面拦截器是怎么写的) +**5、** [什么是服务降级](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题及答案,汇总版.md#5什么是服务降级) +**6、** [如何在 spring 中启动注解装配?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题及答案,汇总版.md#6如何在-spring-中启动注解装配) +**7、** [bootstrap.yml和application.yml有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题及答案,汇总版.md#7bootstrapyml和applicationyml有什么区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题及答案,汇总版.md) + +## Spring最新2021年面试题大汇总,附答案 + +**1、** [微服务测试的主要障碍是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题大汇总,附答案.md#1微服务测试的主要障碍是什么) +**2、** [能否举一个例子来解释更多 Staters 的内容?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题大汇总,附答案.md#2能否举一个例子来解释更多-Staters-的内容) +**3、** [开启 SpringBoot 特性有哪几种方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题大汇总,附答案.md#3开启-SpringBoot-特性有哪几种方式) +**4、** [Spring Cloud Config](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题大汇总,附答案.md#4Spring-Cloud-Config) +**5、** [Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题大汇总,附答案.md#5Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别) +**6、** [什么是JavaConfig?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题大汇总,附答案.md#6什么是JavaConfig) +**7、** [什么是执行器停机?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题大汇总,附答案.md#7什么是执行器停机) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题大汇总,附答案.md) + +## Spring最新2021年面试题附答案解析,大汇总 + +**1、** [@RequestMapping注解的作用](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题附答案解析,大汇总.md#1@RequestMapping注解的作用) +**2、** [什么是Spring Initializer?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题附答案解析,大汇总.md#2什么是Spring-Initializer) +**3、** [SpringBoot 配置加载顺序?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题附答案解析,大汇总.md#3SpringBoot-配置加载顺序) +**4、** [Spring MVC用什么对象从后台向前台传递数据的?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题附答案解析,大汇总.md#4Spring-MVC用什么对象从后台向前台传递数据的) +**5、** [我们如何监视所有SpringBoot微服务?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题附答案解析,大汇总.md#5我们如何监视所有SpringBoot微服务) +**6、** [什么是Spring的MVC框架?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题附答案解析,大汇总.md#6什么是Spring的MVC框架) +**7、** [你可以在Spring中注入一个null 和一个空字符串吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题附答案解析,大汇总.md#7你可以在Spring中注入一个null-和一个空字符串吗) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题附答案解析,大汇总.md) + +## Spring最新2021年面试题,高级面试题及附答案解析 + +**1、** [如何重新加载SpringBoot上的更改,而无需重新启动服务器?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题,高级面试题及附答案解析.md#1如何重新加载SpringBoot上的更改而无需重新启动服务器) +**2、** [不同版本的 Spring Framework 有哪些主要功能?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题,高级面试题及附答案解析.md#2不同版本的-Spring-Framework-有哪些主要功能) +**3、** [自动装配有哪些局限性 ?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题,高级面试题及附答案解析.md#3自动装配有哪些局限性-) +**4、** [IOC的优点是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题,高级面试题及附答案解析.md#4IOC的优点是什么) +**5、** [什么是基于注解的容器配置?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题,高级面试题及附答案解析.md#5什么是基于注解的容器配置) +**6、** [使用 SpringBoot 启动连接到内存数据库 H2 的 JPA 应用程序需要哪些依赖项?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题,高级面试题及附答案解析.md#6使用-SpringBoot-启动连接到内存数据库-H2-的-JPA-应用程序需要哪些依赖项) +**7、** [Spring Framework 中有多少个模块,它们分别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题,高级面试题及附答案解析.md#7Spring-Framework-中有多少个模块它们分别是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新2021年面试题,高级面试题及附答案解析.md) + +## Spring最新基础面试题及答案整理 + +**1、** [path=”users”, collectionResourceRel=”users” 如何与 Spring Data Rest 一起使用?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新基础面试题及答案整理.md#1path=users,-collectionResourceRel=users-如何与-Spring-Data-Rest-一起使用) +**2、** [SpringBoot集成mybatis的过程](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新基础面试题及答案整理.md#2SpringBoot集成mybatis的过程) +**3、** [什么是 AOP?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新基础面试题及答案整理.md#3什么是-AOP) +**4、** [SpringBoot 实现热部署有哪几种方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新基础面试题及答案整理.md#4SpringBoot-实现热部署有哪几种方式) +**5、** [解释基于XML Schema方式的切面实现。](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新基础面试题及答案整理.md#5解释基于XML-Schema方式的切面实现。) +**6、** [什么是Semantic监控?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新基础面试题及答案整理.md#6什么是Semantic监控) +**7、** [为什么我们不建议在实际的应用程序中使用 Spring Data Rest?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新基础面试题及答案整理.md#7为什么我们不建议在实际的应用程序中使用-Spring-Data-Rest) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新基础面试题及答案整理.md) + +## Spring最新面试题2021年,常见面试题及答案汇总 + +**1、** [SpringBoot常用的starter有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题2021年,常见面试题及答案汇总.md#1SpringBoot常用的starter有哪些) +**2、** [SpringCloud Config 可以实现实时刷新吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题2021年,常见面试题及答案汇总.md#2SpringCloud-Config-可以实现实时刷新吗) +**3、** [什么是Swagger?你用SpringBoot实现了它吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题2021年,常见面试题及答案汇总.md#3什么是Swagger你用SpringBoot实现了它吗) +**4、** [什么是代理?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题2021年,常见面试题及答案汇总.md#4什么是代理) +**5、** [运行 SpringBoot 有哪几种方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题2021年,常见面试题及答案汇总.md#5运行-SpringBoot-有哪几种方式) +**6、** [如何使用 SpringBoot 实现异常处理?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题2021年,常见面试题及答案汇总.md#6如何使用-SpringBoot-实现异常处理) +**7、** [什么是领域驱动设计?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题2021年,常见面试题及答案汇总.md#7什么是领域驱动设计) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题2021年,常见面试题及答案汇总.md) + +## Spring最新面试题及答案整理,汇总版 + +**1、** [如何设计一套API接口](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案整理,汇总版.md#1如何设计一套API接口) +**2、** [如何实现动态Zuul网关路由转发](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案整理,汇总版.md#2如何实现动态Zuul网关路由转发) +**3、** [什么是SpringBoot?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案整理,汇总版.md#3什么是SpringBoot) +**4、** [SpringBoot 需要独立的容器运行吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案整理,汇总版.md#4SpringBoot-需要独立的容器运行吗) +**5、** [SpringBoot 中的监视器是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案整理,汇总版.md#5SpringBoot-中的监视器是什么) +**6、** [什么是 AOP 通知](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案整理,汇总版.md#6什么是-AOP-通知) +**7、** [SpringBoot如何实现打包](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案整理,汇总版.md#7SpringBoot如何实现打包) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案整理,汇总版.md) + +## Spring最新面试题及答案附答案汇总 + +**1、** [什么是 Hystrix?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案附答案汇总.md#1什么是-Hystrix) +**2、** [Ribbon是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案附答案汇总.md#2Ribbon是什么) +**3、** [微服务的端到端测试意味着什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案附答案汇总.md#3微服务的端到端测试意味着什么) +**4、** [Container在微服务中的用途是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案附答案汇总.md#4Container在微服务中的用途是什么) +**5、** [SOA和微服务架构之间的主要区别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案附答案汇总.md#5SOA和微服务架构之间的主要区别是什么) +**6、** [Eureka如何 保证AP](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案附答案汇总.md#6Eureka如何-保证AP) +**7、** [SpringBoot 常用的 Starter 有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案附答案汇总.md#7SpringBoot-常用的-Starter-有哪些) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题及答案附答案汇总.md) + +## Spring最新面试题,2021年面试题及答案汇总 + +**1、** [Spring Framework 有哪些不同的功能?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,2021年面试题及答案汇总.md#1Spring-Framework-有哪些不同的功能) +**2、** [为什么需要学习Spring Cloud](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,2021年面试题及答案汇总.md#2为什么需要学习Spring-Cloud) +**3、** [什么是基于Java的Spring注解配置? 给一些注解的例子.](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,2021年面试题及答案汇总.md#3什么是基于Java的Spring注解配置-给一些注解的例子) +**4、** [Spring配置文件](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,2021年面试题及答案汇总.md#4Spring配置文件) +**5、** [Spring AOP and AspectJ AOP 有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,2021年面试题及答案汇总.md#5Spring-AOP-and-AspectJ-AOP-有什么区别) +**6、** [什么是依赖注入?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,2021年面试题及答案汇总.md#6什么是依赖注入) +**7、** [RequestMapping 和 GetMapping 的不同之处在哪里?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,2021年面试题及答案汇总.md#7RequestMapping-和-GetMapping-的不同之处在哪里) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,2021年面试题及答案汇总.md) + +## Spring最新面试题,常见面试题及答案汇总 + +**1、** [什么是REST / RESTful以及它的用途是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,常见面试题及答案汇总.md#1什么是REST-/-RESTful以及它的用途是什么) +**2、** [[@Required ](/Required ) 注解有什么用?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,常见面试题及答案汇总.md#2[@Required-]/Required--注解有什么用) +**3、** [Nginx与Ribbon的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,常见面试题及答案汇总.md#3Nginx与Ribbon的区别) +**4、** [什么是Spring IOC 容器?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,常见面试题及答案汇总.md#4什么是Spring-IOC-容器) +**5、** [什么是Netflix Feign?它的优点是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,常见面试题及答案汇总.md#5什么是Netflix-Feign它的优点是什么) +**6、** [SpringBoot 中的 starter 到底是什么 ?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,常见面试题及答案汇总.md#6SpringBoot-中的-starter-到底是什么-) +**7、** [什么是YAML?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,常见面试题及答案汇总.md#7什么是YAML) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring最新面试题,常见面试题及答案汇总.md) + +## Spring面试题及答案整理汇总,2021年最新版 + +**1、** [什么是 JavaConfig?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理汇总,2021年最新版.md#1什么是-JavaConfig) +**2、** [Spring Cloud Consul](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理汇总,2021年最新版.md#2Spring-Cloud-Consul) +**3、** [分布式配置中心的作用?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理汇总,2021年最新版.md#3分布式配置中心的作用) +**4、** [哪些是重要的bean生命周期方法? 你能重载它们吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理汇总,2021年最新版.md#4哪些是重要的bean生命周期方法-你能重载它们吗) +**5、** [什么是 AOP什么是引入?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理汇总,2021年最新版.md#5什么是-AOP什么是引入) +**6、** [SpringCloud主要项目](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理汇总,2021年最新版.md#6SpringCloud主要项目) +**7、** [Ribbon底层实现原理](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理汇总,2021年最新版.md#7Ribbon底层实现原理) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理汇总,2021年最新版.md) + +## Spring面试题及答案整理,2021年最新,汇总版 + +**1、** [SpringBoot 打成的 jar 和普通的 jar 有什么区别 ?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理,2021年最新,汇总版.md#1SpringBoot-打成的-jar-和普通的-jar-有什么区别-) +**2、** [SpringBoot默认支持的日志框架有哪些?可以进行哪些设置?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理,2021年最新,汇总版.md#2SpringBoot默认支持的日志框架有哪些可以进行哪些设置) +**3、** [微服务限流 dubbo限流:dubbo提供了多个和请求相关的filter:ActiveLimitFilter ExecuteLimitFilter TPSLimiterFilter](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理,2021年最新,汇总版.md#3微服务限流-dubbo限流:dubbo提供了多个和请求相关的filter:ActiveLimitFilter-ExecuteLimitFilter-TPSLimiterFilter) +**4、** [在微服务中,如何保护服务?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理,2021年最新,汇总版.md#4在微服务中如何保护服务) +**5、** [使用 Spring 访问 Hibernate 的方法有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理,2021年最新,汇总版.md#5使用-Spring-访问-Hibernate-的方法有哪些) +**6、** [如何给Spring 容器提供配置元数据?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理,2021年最新,汇总版.md#6如何给Spring-容器提供配置元数据) +**7、** [Spring Cache 三种常用的缓存注解和意义?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理,2021年最新,汇总版.md#7Spring-Cache-三种常用的缓存注解和意义) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题及答案整理,2021年最新,汇总版.md) + +## Spring面试题大全带答案,持续更新 + +**1、** [springcloud和dubbo有哪些区别](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大全带答案,持续更新.md#1springcloud和dubbo有哪些区别) +**2、** [有哪些不同类型的IOC(依赖注入)方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大全带答案,持续更新.md#2有哪些不同类型的IOC依赖注入方式) +**3、** [Spring Cloud Stream](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大全带答案,持续更新.md#3Spring-Cloud-Stream) +**4、** [什么是Spring MVC框架的控制器?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大全带答案,持续更新.md#4什么是Spring-MVC框架的控制器) +**5、** [解释Spring支持的几种bean的作用域。](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大全带答案,持续更新.md#5解释Spring支持的几种bean的作用域。) +**6、** [链路跟踪Sleuth](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大全带答案,持续更新.md#6链路跟踪Sleuth) +**7、** [什么是feigin?它的优点是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大全带答案,持续更新.md#7什么是feigin它的优点是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大全带答案,持续更新.md) + +## Spring面试题大汇总,2021年附答案解析 + +**1、** [SpringBoot 自动配置原理是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021年附答案解析.md#1SpringBoot-自动配置原理是什么) +**2、** [什么是基于注解的容器配置](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021年附答案解析.md#2什么是基于注解的容器配置) +**3、** [我们如何连接一个像 MySQL 或者Orcale 一样的外部数据库?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021年附答案解析.md#3我们如何连接一个像-MySQL-或者Orcale-一样的外部数据库) +**4、** [使用Spring通过什么方式访问Hibernate?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021年附答案解析.md#4使用Spring通过什么方式访问Hibernate) +**5、** [SpringBoot性能如何优化](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021年附答案解析.md#5SpringBoot性能如何优化) +**6、** [SpringBoot 最大的优势是什么呢?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021年附答案解析.md#6SpringBoot-最大的优势是什么呢) +**7、** [RequestMapping 和 GetMapping 的不同之处在哪里?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021年附答案解析.md#7RequestMapping-和-GetMapping-的不同之处在哪里) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021年附答案解析.md) + +## Spring面试题大汇总,2021面试题及答案汇总 + +**1、** [Zuul网关如何搭建集群](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021面试题及答案汇总.md#1Zuul网关如何搭建集群) +**2、** [解释JDBC抽象和DAO模块。](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021面试题及答案汇总.md#2解释JDBC抽象和DAO模块。) +**3、** [spring 支持哪些 ORM 框架](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021面试题及答案汇总.md#3spring-支持哪些-ORM-框架) +**4、** [spring boot 核心配置文件是什么?bootstrap、properties 和 application、properties 有何区别 ?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021面试题及答案汇总.md#4spring-boot-核心配置文件是什么bootstrapproperties-和-applicationproperties-有何区别-) +**5、** [SpringBoot 的核心注解是哪个?它主要由哪几个注解组成的?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021面试题及答案汇总.md#5SpringBoot-的核心注解是哪个它主要由哪几个注解组成的) +**6、** [@RestController和@Controller的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021面试题及答案汇总.md#6@RestController和@Controller的区别) +**7、** [SpringBoot 的核心注解是哪个?它主要由哪几个注解组成的?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021面试题及答案汇总.md#7SpringBoot-的核心注解是哪个它主要由哪几个注解组成的) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring面试题大汇总,2021面试题及答案汇总.md) + +## Spring高级面试题及答案,2021版 + +**1、** [您使用了哪些 starter maven 依赖项?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,2021版.md#1您使用了哪些-starter-maven-依赖项) +**2、** [SpringBoot支持哪些嵌入式容器?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,2021版.md#2SpringBoot支持哪些嵌入式容器) +**3、** [创建一个 SpringBoot Project 的最简单的方法是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,2021版.md#3创建一个-SpringBoot-Project-的最简单的方法是什么) +**4、** [Spring Cloud Zookeeper](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,2021版.md#4Spring-Cloud-Zookeeper) +**5、** [SpringBoot 的核心配置文件有哪几个?它们的区别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,2021版.md#5SpringBoot-的核心配置文件有哪几个它们的区别是什么) +**6、** [JPA 和 Hibernate 有哪些区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,2021版.md#6JPA-和-Hibernate-有哪些区别) +**7、** [什么是Hystrix?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,2021版.md#7什么是Hystrix) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,2021版.md) + +## Spring高级面试题及答案,企业真面试题 + +**1、** [运行 SpringBoot 有哪几种方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,企业真面试题.md#1运行-SpringBoot-有哪几种方式) +**2、** [SpringBoot 的核心配置文件有哪几个?它们的区别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,企业真面试题.md#2SpringBoot-的核心配置文件有哪几个它们的区别是什么) +**3、** [如何覆盖SpringBoot项目的默认属性?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,企业真面试题.md#3如何覆盖SpringBoot项目的默认属性) +**4、** [开启SpringBoot特性有哪几种方式?(创建SpringBoot项目的两种方式)](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,企业真面试题.md#4开启SpringBoot特性有哪几种方式创建SpringBoot项目的两种方式) +**5、** [如何使用 SpringBoot 自动重装我的应用程序?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,企业真面试题.md#5如何使用-SpringBoot-自动重装我的应用程序) +**6、** [Spring、SpringBoot、SpringMVC的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,企业真面试题.md#6SpringSpringBootSpringMVC的区别) +**7、** [什么是Spring Actuator?它有什么优势?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,企业真面试题.md#7什么是Spring-Actuator它有什么优势) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,企业真面试题.md) + +## Spring高级面试题及答案,最新版 + +**1、** [怎样在方法里面得到Request,或者Session?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,最新版.md#1怎样在方法里面得到Request,或者Session) +**2、** [康威定律是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,最新版.md#2康威定律是什么) +**3、** [[@Required ](/Required ) 注解有什么用?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,最新版.md#3[@Required-]/Required--注解有什么用) +**4、** [缓存机制:](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,最新版.md#4缓存机制:) +**5、** [解释基于注解的切面实现](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,最新版.md#5解释基于注解的切面实现) +**6、** [什么是 Spring IOC 容器?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,最新版.md#6什么是-Spring-IOC-容器) +**7、** [哪些是重要的bean生命周期方法?你能重载它们吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,最新版.md#7哪些是重要的bean生命周期方法你能重载它们吗) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题及答案,最新版.md) + +## Spring高级面试题合集,附答案解析 + +**1、** [如何重新加载 SpringBoot 上的更改,而无需重新启动服务器?SpringBoot项目如何热部署?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题合集,附答案解析.md#1如何重新加载-SpringBoot-上的更改而无需重新启动服务器SpringBoot项目如何热部署) +**2、** [运行 SpringBoot 有哪几种方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题合集,附答案解析.md#2运行-SpringBoot-有哪几种方式) +**3、** [保护 SpringBoot 应用有哪些方法?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题合集,附答案解析.md#3保护-SpringBoot-应用有哪些方法) +**4、** [Spring Cloud OpenFeign](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题合集,附答案解析.md#4Spring-Cloud-OpenFeign) +**5、** [什么是 WebSockets?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题合集,附答案解析.md#5什么是-WebSockets) +**6、** [什么是 Apache Kafka?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题合集,附答案解析.md#6什么是-Apache-Kafka) +**7、** [网关与过滤器有什么区别](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题合集,附答案解析.md#7网关与过滤器有什么区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题合集,附答案解析.md) + +## Spring高级面试题整理及答案 + +**1、** [如何使用SpringBoot实现异常处理?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题整理及答案.md#1如何使用SpringBoot实现异常处理) +**2、** [@Controller注解的作用](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题整理及答案.md#2@Controller注解的作用) +**3、** [什么是 AOP什么是目标对象?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题整理及答案.md#3什么是-AOP什么是目标对象) +**4、** [当 SpringBoot 应用程序作为 Java 应用程序运行时,后台会发生什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题整理及答案.md#4当-SpringBoot-应用程序作为-Java-应用程序运行时后台会发生什么) +**5、** [服务注册和发现是什么意思?Spring Cloud如何实现?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题整理及答案.md#5服务注册和发现是什么意思Spring-Cloud如何实现) +**6、** [什么是Idempotence以及它在哪里使用?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题整理及答案.md#6什么是Idempotence以及它在哪里使用) +**7、** [SpringBoot 中如何解决跨域问题 ?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题整理及答案.md#7SpringBoot-中如何解决跨域问题-) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题整理及答案.md) + +## Spring高级面试题,中级面试题,大汇总 + +**1、** [SpringBoot运行项目的几种方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题,中级面试题,大汇总.md#1SpringBoot运行项目的几种方式) +**2、** [SpringBoot Starter的工作原理](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题,中级面试题,大汇总.md#2SpringBoot-Starter的工作原理) +**3、** [SpringBoot多数据源拆分的思路](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题,中级面试题,大汇总.md#3SpringBoot多数据源拆分的思路) +**4、** [您对微服务架构中的语义监控有何了解?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题,中级面试题,大汇总.md#4您对微服务架构中的语义监控有何了解) +**5、** [什么是通知(Advice)?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题,中级面试题,大汇总.md#5什么是通知Advice) +**6、** [如何集成SpringBoot和ActiveMQ?](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题,中级面试题,大汇总.md#6如何集成SpringBoot和ActiveMQ) +**7、** [微服务限流 http限流:我们使⽤nginx的limitzone来完成:](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题,中级面试题,大汇总.md#7微服务限流-http限流:我们使⽤nginx的limitzone来完成:) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Spring/Spring高级面试题,中级面试题,大汇总.md) + +## SpringBoot最新2021年面试题及答案,汇总版 + +**1、** [使用 SpringBoot 启动连接到内存数据库 H2 的 JPA 应用程序需要哪些依赖项?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题及答案,汇总版.md#1使用-SpringBoot-启动连接到内存数据库-H2-的-JPA-应用程序需要哪些依赖项) +**2、** [spring boot 核心的两个配置文件:](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题及答案,汇总版.md#2spring-boot-核心的两个配置文件:) +**3、** [SpringBoot 的核心配置文件有哪几个?它们的区别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题及答案,汇总版.md#3SpringBoot-的核心配置文件有哪几个它们的区别是什么) +**4、** [SpringBoot 还提供了其它的哪些 Starter Project Options?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题及答案,汇总版.md#4SpringBoot-还提供了其它的哪些-Starter-Project-Options) +**5、** [如何在 SpringBoot 启动的时候运行一些特定的代码?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题及答案,汇总版.md#5如何在-SpringBoot-启动的时候运行一些特定的代码) +**6、** [什么是Swagger?你用SpringBoot实现了它吗?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题及答案,汇总版.md#6什么是Swagger你用SpringBoot实现了它吗) +**7、** [什么是 Spring Profiles?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题及答案,汇总版.md#7什么是-Spring-Profiles) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题及答案,汇总版.md) + +## SpringBoot最新2021年面试题大汇总,附答案 + +**1、** [我们如何监视所有 SpringBoot 微服务?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题大汇总,附答案.md#1我们如何监视所有-SpringBoot-微服务) +**2、** [如何使用 SpringBoot 部署到不同的服务器?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题大汇总,附答案.md#2如何使用-SpringBoot-部署到不同的服务器) +**3、** [运行 SpringBoot 有哪几种方式?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题大汇总,附答案.md#3运行-SpringBoot-有哪几种方式) +**4、** [你如何理解 SpringBoot 配置加载顺序?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题大汇总,附答案.md#4你如何理解-SpringBoot-配置加载顺序) +**5、** [SpringBoot 的核心注解是哪个?它主要由哪几个注解组成的?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题大汇总,附答案.md#5SpringBoot-的核心注解是哪个它主要由哪几个注解组成的) +**6、** [什么是YAML?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题大汇总,附答案.md#6什么是YAML) +**7、** [什么是SpringBoot](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题大汇总,附答案.md#7什么是SpringBoot) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题大汇总,附答案.md) + +## SpringBoot最新2021年面试题附答案解析,大汇总 + +**1、** [如何集成 SpringBoot 和 ActiveMQ?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题附答案解析,大汇总.md#1如何集成-SpringBoot-和-ActiveMQ) +**2、** [项目中前后端分离部署,所以需要解决跨域的问题。](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题附答案解析,大汇总.md#2项目中前后端分离部署所以需要解决跨域的问题。) +**3、** [如何在SpringBoot中禁用Actuator端点安全性?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题附答案解析,大汇总.md#3如何在SpringBoot中禁用Actuator端点安全性) +**4、** [如何在SpringBoot中禁用Actuator端点安全性?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题附答案解析,大汇总.md#4如何在SpringBoot中禁用Actuator端点安全性) +**5、** [SpringBoot与SpringCloud 区别](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题附答案解析,大汇总.md#5SpringBoot与SpringCloud-区别) +**6、** [SpringBoot运行项目的几种方式?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题附答案解析,大汇总.md#6SpringBoot运行项目的几种方式) +**7、** [SpringBoot自动配置的原理](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题附答案解析,大汇总.md#7SpringBoot自动配置的原理) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题附答案解析,大汇总.md) + +## SpringBoot最新2021年面试题,高级面试题及附答案解析 + +**1、** [SpringBoot 怎么用好自动配置,精髓:](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题,高级面试题及附答案解析.md#1SpringBoot-怎么用好自动配置精髓:) +**2、** [SpringBoot 配置加载顺序?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题,高级面试题及附答案解析.md#2SpringBoot-配置加载顺序) +**3、** [如何重新加载SpringBoot上的更改,而无需重新启动服务器?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题,高级面试题及附答案解析.md#3如何重新加载SpringBoot上的更改而无需重新启动服务器) +**4、** [如何使用 SpringBoot 生成一个 WAR 文件?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题,高级面试题及附答案解析.md#4如何使用-SpringBoot-生成一个-WAR-文件) +**5、** [SpringBoot 是否可以使用 XML 配置 ?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题,高级面试题及附答案解析.md#5SpringBoot-是否可以使用-XML-配置-) +**6、** [开启 SpringBoot 特性有哪几种方式?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题,高级面试题及附答案解析.md#6开启-SpringBoot-特性有哪几种方式) +**7、** [SpringBoot 最大的优势是什么呢?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题,高级面试题及附答案解析.md#7SpringBoot-最大的优势是什么呢) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新2021年面试题,高级面试题及附答案解析.md) + +## SpringBoot最新面试题2021年,常见面试题及答案汇总 + +**1、** [SpringBoot微服务中如何实现 session 共享 ?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题2021年,常见面试题及答案汇总.md#1SpringBoot微服务中如何实现-session-共享-) +**2、** [SpringBoot 的核心注解是哪个?它主要由哪几个注解组成的?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题2021年,常见面试题及答案汇总.md#2SpringBoot-的核心注解是哪个它主要由哪几个注解组成的) +**3、** [Spring Initializr 是创建 SpringBoot Projects 的唯一方法吗?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题2021年,常见面试题及答案汇总.md#3Spring-Initializr-是创建-SpringBoot-Projects-的唯一方法吗) +**4、** [能否举一个例子来解释更多 Staters 的内容?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题2021年,常见面试题及答案汇总.md#4能否举一个例子来解释更多-Staters-的内容) +**5、** [运行 SpringBoot 有哪几种方式?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题2021年,常见面试题及答案汇总.md#5运行-SpringBoot-有哪几种方式) +**6、** [什么是 WebSockets?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题2021年,常见面试题及答案汇总.md#6什么是-WebSockets) +**7、** [SpringBoot Starter 的工作原理是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题2021年,常见面试题及答案汇总.md#7SpringBoot-Starter-的工作原理是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题2021年,常见面试题及答案汇总.md) + +## SpringBoot最新面试题及答案整理,汇总版 + +**1、** [如何在自定义端口上运行SpringBoot应用程序?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案整理,汇总版.md#1如何在自定义端口上运行SpringBoot应用程序) +**2、** [SpringBoot 的核心注解是哪个?它主要由哪几个注解组成的?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案整理,汇总版.md#2SpringBoot-的核心注解是哪个它主要由哪几个注解组成的) +**3、** [什么是WebSockets?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案整理,汇总版.md#3什么是WebSockets) +**4、** [spring boot 核心配置文件是什么?bootstrap.properties 和 application.properties 有何区别 ?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案整理,汇总版.md#4spring-boot-核心配置文件是什么bootstrapproperties-和-applicationproperties-有何区别-) +**5、** [SpringBoot有哪些优点?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案整理,汇总版.md#5SpringBoot有哪些优点) +**6、** [SpringBoot中的监视器是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案整理,汇总版.md#6SpringBoot中的监视器是什么) +**7、** [SpringData 项目所支持的关系数据存储技术:](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案整理,汇总版.md#7SpringData-项目所支持的关系数据存储技术:) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案整理,汇总版.md) + +## SpringBoot最新面试题及答案附答案汇总 + +**1、** [SpringBoot 的核心注解是哪个?它主要由哪几个注解组成的?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案附答案汇总.md#1SpringBoot-的核心注解是哪个它主要由哪几个注解组成的) +**2、** [SpringBoot 的核心配置文件有哪几个?它们的区别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案附答案汇总.md#2SpringBoot-的核心配置文件有哪几个它们的区别是什么) +**3、** [SpringBoot多数据源事务如何管理](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案附答案汇总.md#3SpringBoot多数据源事务如何管理) +**4、** [我们如何监视所有SpringBoot微服务?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案附答案汇总.md#4我们如何监视所有SpringBoot微服务) +**5、** [什么是Spring Profiles?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案附答案汇总.md#5什么是Spring-Profiles) +**6、** [SpringBoot 2.X 有什么新特性?与 1.X 有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案附答案汇总.md#6SpringBoot-2X-有什么新特性与-1X-有什么区别) +**7、** [什么是嵌入式服务器?我们为什么要使用嵌入式服务器呢?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案附答案汇总.md#7什么是嵌入式服务器我们为什么要使用嵌入式服务器呢) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题及答案附答案汇总.md) + +## SpringBoot最新面试题,2021年面试题及答案汇总 + +**1、** [SpringBoot 的配置文件有哪几种格式?它们有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题,2021年面试题及答案汇总.md#1SpringBoot-的配置文件有哪几种格式它们有什么区别) +**2、** [什么是SpringBoot ?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题,2021年面试题及答案汇总.md#2什么是SpringBoot-) +**3、** [什么是 Spring Batch?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题,2021年面试题及答案汇总.md#3什么是-Spring-Batch) +**4、** [什么是 Swagger?你用 SpringBoot 实现了它吗?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题,2021年面试题及答案汇总.md#4什么是-Swagger你用-SpringBoot-实现了它吗) +**5、** [什么是执行器停机?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题,2021年面试题及答案汇总.md#5什么是执行器停机) +**6、** [如何使用 SpringBoot 实现全局异常处理?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题,2021年面试题及答案汇总.md#6如何使用-SpringBoot-实现全局异常处理) +**7、** [什么是Spring Initializer?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题,2021年面试题及答案汇总.md#7什么是Spring-Initializer) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringBoot/SpringBoot最新面试题,2021年面试题及答案汇总.md) + +## SpringCloud最新2021年面试题及答案,汇总版 + +**1、** [什么是Hystrix?它如何实现容错?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题及答案,汇总版.md#1什么是Hystrix它如何实现容错) +**2、** [什么是Hystrix?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题及答案,汇总版.md#2什么是Hystrix) +**3、** [Container在微服务中的用途是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题及答案,汇总版.md#3Container在微服务中的用途是什么) +**4、** [Spring Cloud Security](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题及答案,汇总版.md#4Spring-Cloud-Security) +**5、** [什么是Spring Cloud?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题及答案,汇总版.md#5什么是Spring-Cloud) +**6、** [什么是Spring Cloud Bus?我们需要它吗?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题及答案,汇总版.md#6什么是Spring-Cloud-Bus我们需要它吗) +**7、** [Spring Cloud 和dubbo区别?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题及答案,汇总版.md#7Spring-Cloud-和dubbo区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题及答案,汇总版.md) + +## SpringCloud最新2021年面试题大汇总,附答案 + +**1、** [服务注册和发现是什么意思?Spring Cloud如何实现?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题大汇总,附答案.md#1服务注册和发现是什么意思Spring-Cloud如何实现) +**2、** [在微服务中,如何保护服务?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题大汇总,附答案.md#2在微服务中如何保护服务) +**3、** [如何配置SpringBoot应用程序日志记录?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题大汇总,附答案.md#3如何配置SpringBoot应用程序日志记录) +**4、** [什么是凝聚力?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题大汇总,附答案.md#4什么是凝聚力) +**5、** [什么是Eureka](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题大汇总,附答案.md#5什么是Eureka) +**6、** [设计微服务的最佳实践是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题大汇总,附答案.md#6设计微服务的最佳实践是什么) +**7、** [您对微服务架构中的语义监控有何了解?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题大汇总,附答案.md#7您对微服务架构中的语义监控有何了解) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题大汇总,附答案.md) + +## SpringCloud最新2021年面试题附答案解析,大汇总 + +**1、** [什么是Netflix Feign?它的优点是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题附答案解析,大汇总.md#1什么是Netflix-Feign它的优点是什么) +**2、** [什么是微服务中的反应性扩展?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题附答案解析,大汇总.md#2什么是微服务中的反应性扩展) +**3、** [Spring Cloud Sleuth](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题附答案解析,大汇总.md#3Spring-Cloud-Sleuth) +**4、** [SpringCloud Config 可以实现实时刷新吗?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题附答案解析,大汇总.md#4SpringCloud-Config-可以实现实时刷新吗) +**5、** [如何覆盖SpringBoot项目的默认属性?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题附答案解析,大汇总.md#5如何覆盖SpringBoot项目的默认属性) +**6、** [Web,RESTful API在微服务中的作用是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题附答案解析,大汇总.md#6WebRESTful-API在微服务中的作用是什么) +**7、** [在使用微服务架构时,您面临哪些挑战?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题附答案解析,大汇总.md#7在使用微服务架构时您面临哪些挑战) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题附答案解析,大汇总.md) + +## SpringCloud最新2021年面试题,高级面试题及附答案解析 + +**1、** [什么是微服务架构](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题,高级面试题及附答案解析.md#1什么是微服务架构) +**2、** [Eureka怎么实现高可用](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题,高级面试题及附答案解析.md#2Eureka怎么实现高可用) +**3、** [如何设置服务发现?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题,高级面试题及附答案解析.md#3如何设置服务发现) +**4、** [SpringBoot和SpringCloud的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题,高级面试题及附答案解析.md#4SpringBoot和SpringCloud的区别) +**5、** [您将如何在微服务上执行安全测试?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题,高级面试题及附答案解析.md#5您将如何在微服务上执行安全测试) +**6、** [Spring Cloud Config](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题,高级面试题及附答案解析.md#6Spring-Cloud-Config) +**7、** [负载平衡的意义什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题,高级面试题及附答案解析.md#7负载平衡的意义什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新2021年面试题,高级面试题及附答案解析.md) + +## SpringCloud最新面试题2021年,常见面试题及答案汇总 + +**1、** [如何设计一套API接口](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题2021年,常见面试题及答案汇总.md#1如何设计一套API接口) +**2、** [21、在Spring MVC应用程序中使用WebMvcTest注释有什么用处?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题2021年,常见面试题及答案汇总.md#221在Spring-MVC应用程序中使用WebMvcTest注释有什么用处) +**3、** [多个消费者调⽤同⼀接⼝,eruka默认的分配⽅式是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题2021年,常见面试题及答案汇总.md#3多个消费者调⽤同⼀接⼝eruka默认的分配⽅式是什么) +**4、** [Ribbon底层实现原理](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题2021年,常见面试题及答案汇总.md#4Ribbon底层实现原理) +**5、** [PACT在微服务架构中的用途是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题2021年,常见面试题及答案汇总.md#5PACT在微服务架构中的用途是什么) +**6、** [微服务架构有哪些优势?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题2021年,常见面试题及答案汇总.md#6微服务架构有哪些优势) +**7、** [你对SpringBoot有什么了解?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题2021年,常见面试题及答案汇总.md#7你对SpringBoot有什么了解) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题2021年,常见面试题及答案汇总.md) + +## SpringCloud最新面试题及答案附答案汇总 + +**1、** [什么是微服务](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题及答案附答案汇总.md#1什么是微服务) +**2、** [什么是Semantic监控?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题及答案附答案汇总.md#2什么是Semantic监控) +**3、** [Nginx与Ribbon的区别](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题及答案附答案汇总.md#3Nginx与Ribbon的区别) +**4、** [Ribbon和Feign的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题及答案附答案汇总.md#4Ribbon和Feign的区别) +**5、** [Ribbon和Feign调用服务的区别](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题及答案附答案汇总.md#5Ribbon和Feign调用服务的区别) +**6、** [springcloud核⼼组件及其作⽤,以及springcloud⼯作原理:](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题及答案附答案汇总.md#6springcloud核⼼组件及其作⽤以及springcloud⼯作原理:) +**7、** [为什么需要域驱动设计(DDD)?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题及答案附答案汇总.md#7为什么需要域驱动设计DDD) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题及答案附答案汇总.md) + +## SpringCloud最新面试题,2021年面试题及答案汇总 + +**1、** [服务雪崩?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题,2021年面试题及答案汇总.md#1服务雪崩) +**2、** [康威定律是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题,2021年面试题及答案汇总.md#2康威定律是什么) +**3、** [Spring Cloud 实现服务注册和发现的原理是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题,2021年面试题及答案汇总.md#3Spring-Cloud-实现服务注册和发现的原理是什么) +**4、** [什么是客户证书?](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题,2021年面试题及答案汇总.md#4什么是客户证书) +**5、** [Spring Cloud和SpringBoot版本对应关系](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题,2021年面试题及答案汇总.md#5Spring-Cloud和SpringBoot版本对应关系) +**6、** [谈谈服务降级、熔断、服务隔离](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题,2021年面试题及答案汇总.md#6谈谈服务降级熔断服务隔离) +**7、** [Spring Cloud Consul](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题,2021年面试题及答案汇总.md#7Spring-Cloud-Consul) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/SpringCloud/SpringCloud最新面试题,2021年面试题及答案汇总.md) + +## ZooKeeper最新2021年面试题大汇总,附答案 + +**1、** [ZooKeeper 提供了什么?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题大汇总,附答案.md#1ZooKeeper-提供了什么) +**2、** [服务器角色](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题大汇总,附答案.md#2服务器角色) +**3、** [集群最少要几台机器,集群规则是怎样的?集群中有 3 台服务器,其中一个节点宕机,这个时候 Zookeeper 还可以使用吗?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题大汇总,附答案.md#3集群最少要几台机器集群规则是怎样的集群中有-3-台服务器其中一个节点宕机这个时候-Zookeeper-还可以使用吗) +**4、** [Zookeeper集群管理(文件系统、通知机制)](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题大汇总,附答案.md#4Zookeeper集群管理文件系统通知机制) +**5、** [会话管理](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题大汇总,附答案.md#5会话管理) +**6、** [客户端回调Watcher](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题大汇总,附答案.md#6客户端回调Watcher) +**7、** [zookeeper 是如何保证事务的顺序一致性的?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题大汇总,附答案.md#7zookeeper-是如何保证事务的顺序一致性的) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题大汇总,附答案.md) + +## ZooKeeper最新2021年面试题附答案解析,大汇总 + +**1、** [zookeeper是如何选取主leader的?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题附答案解析,大汇总.md#1zookeeper是如何选取主leader的) +**2、** [Zookeeper工作原理](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题附答案解析,大汇总.md#2Zookeeper工作原理) +**3、** [发布订阅的两种设计模式?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题附答案解析,大汇总.md#3发布订阅的两种设计模式) +**4、** [zk的命名服务(文件系统)](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题附答案解析,大汇总.md#4zk的命名服务文件系统) +**5、** [发现?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题附答案解析,大汇总.md#5发现) +**6、** [ZNode的类型?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题附答案解析,大汇总.md#6ZNode的类型) +**7、** [四种类型的数据节点 Znode](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题附答案解析,大汇总.md#7四种类型的数据节点-Znode) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题附答案解析,大汇总.md) + +## ZooKeeper最新2021年面试题,高级面试题及附答案解析 + +**1、** [Zookeeper分布式锁(文件系统、通知机制)](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题,高级面试题及附答案解析.md#1Zookeeper分布式锁文件系统通知机制) +**2、** [分布式通知和协调](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题,高级面试题及附答案解析.md#2分布式通知和协调) +**3、** [ZAB和Paxos算法的联系与区别?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题,高级面试题及附答案解析.md#3ZAB和Paxos算法的联系与区别) +**4、** [BASE理论?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题,高级面试题及附答案解析.md#4BASE理论) +**5、** [Zookeeper Watcher 机制 -- 数据变更通知](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题,高级面试题及附答案解析.md#5Zookeeper-Watcher-机制----数据变更通知) +**6、** [机器中为什么会有leader?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题,高级面试题及附答案解析.md#6机器中为什么会有leader) +**7、** [ZooKeeper用推/拉模式?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题,高级面试题及附答案解析.md#7ZooKeeper用推/拉模式) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新2021年面试题,高级面试题及附答案解析.md) + +## ZooKeeper最新面试题2021年,常见面试题及答案汇总 + +**1、** [客户端回调 Watcher](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新面试题2021年,常见面试题及答案汇总.md#1客户端回调-Watcher) +**2、** [A是根节点,如何表达A子节点下的B节点?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新面试题2021年,常见面试题及答案汇总.md#2A是根节点如何表达A子节点下的B节点) +**3、** [如何识别请求的先后顺序?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新面试题2021年,常见面试题及答案汇总.md#3如何识别请求的先后顺序) +**4、** [如何创建一个ZNode?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新面试题2021年,常见面试题及答案汇总.md#4如何创建一个ZNode) +**5、** [Zookeeper 和 Dubbo 的关系?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新面试题2021年,常见面试题及答案汇总.md#5Zookeeper-和-Dubbo-的关系) +**6、** [Zookeeper的典型应用场景](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新面试题2021年,常见面试题及答案汇总.md#6Zookeeper的典型应用场景) +**7、** [服务器的3中角色?](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新面试题2021年,常见面试题及答案汇总.md#7服务器的3中角色) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/ZooKeeper/ZooKeeper最新面试题2021年,常见面试题及答案汇总.md) + +## 大数据最新2021年面试题及答案,汇总版 + +**1、** [SSH工作的端口号是?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题及答案,汇总版.md#1SSH工作的端口号是) +**2、** [什么是udf](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题及答案,汇总版.md#2什么是udf) +**3、** [单机(本地)模式中的注意点?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题及答案,汇总版.md#3单机本地模式中的注意点) +**4、** [Namenode、Job tracker和task tracker的端口号是?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题及答案,汇总版.md#4NamenodeJob-tracker和task-tracker的端口号是) +**5、** [全分布式环境下为什么需求password-less SSH?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题及答案,汇总版.md#5全分布式环境下为什么需求password-less-SSH) +**6、** [假如Namenode中没有数据会怎么样?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题及答案,汇总版.md#6假如Namenode中没有数据会怎么样) +**7、** [简述hive中的虚拟列的作用?使用它注意事项](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题及答案,汇总版.md#7简述hive中的虚拟列的作用使用它注意事项) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题及答案,汇总版.md) + +## 大数据最新2021年面试题大汇总,附答案 + +**1、** [insert into 和override write区别](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题大汇总,附答案.md#1insert-into-和override-write区别) +**2、** [过滤器有什么用途:](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题大汇总,附答案.md#2过滤器有什么用途:) +**3、** [spark的优化怎么做?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题大汇总,附答案.md#3spark的优化怎么做) +**4、** [描述一下hadoop中,有哪些地方使用到了缓存机制,作用分别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题大汇总,附答案.md#4描述一下hadoop中有哪些地方使用到了缓存机制作用分别是什么) +**5、** [为什么hive的分区](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题大汇总,附答案.md#5为什么hive的分区) +**6、** [Hive与关系型数据库的关系?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题大汇总,附答案.md#6Hive与关系型数据库的关系) +**7、** [简单说一下hadoop的map-reduce模型](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题大汇总,附答案.md#7简单说一下hadoop的map-reduce模型) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题大汇总,附答案.md) + +## 大数据最新2021年面试题附答案解析,大汇总 + +**1、** [HDFS存储机制](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题附答案解析,大汇总.md#1HDFS存储机制) +**2、** [storm怎么保障消息不丢失](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题附答案解析,大汇总.md#2storm怎么保障消息不丢失) +**3、** [在Hadoop_PID_DIR中,PID代表了什么?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题附答案解析,大汇总.md#3在Hadoop_PID_DIR中PID代表了什么) +**4、** [hive sql知识点](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题附答案解析,大汇总.md#4hive-sql知识点) +**5、** [三个datanode中当有一个datanode出现错误时会怎样?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题附答案解析,大汇总.md#5三个datanode中当有一个datanode出现错误时会怎样) +**6、** [hdfs-site.xml的3个主要属性?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题附答案解析,大汇总.md#6hdfs-sitexml的3个主要属性) +**7、** [那当下又该如何配置?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题附答案解析,大汇总.md#7那当下又该如何配置) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题附答案解析,大汇总.md) + +## 大数据最新2021年面试题,高级面试题及附答案解析 + +**1、** [hive如何控制权限](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题,高级面试题及附答案解析.md#1hive如何控制权限) +**2、** [hive中存放的是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题,高级面试题及附答案解析.md#2hive中存放的是什么) +**3、** [RDD 是什么](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题,高级面试题及附答案解析.md#3RDD-是什么) +**4、** [给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题,高级面试题及附答案解析.md#4给定ab两个文件各存放50亿个url每个url各占64字节内存限制是4G让你找出ab文件共同的url) +**5、** [hdfs的体系结构](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题,高级面试题及附答案解析.md#5hdfs的体系结构) +**6、** [请列出你所知道的hadoop调度器,并简要说明其工作方法](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题,高级面试题及附答案解析.md#6请列出你所知道的hadoop调度器并简要说明其工作方法) +**7、** [对于hadoop自带的wordcount的例子,value就是一个叠加的数字,所以map一结束就可以进行reduce的value叠加,而不必要等到所有的map结束再去进行reduce的value叠加。](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题,高级面试题及附答案解析.md#7对于hadoop自带的wordcount的例子value就是一个叠加的数字所以map一结束就可以进行reduce的value叠加而不必要等到所有的map结束再去进行reduce的value叠加。) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新2021年面试题,高级面试题及附答案解析.md) + +## 大数据最新面试题2021年,常见面试题及答案汇总 + +**1、** [Kafka的消费](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题2021年,常见面试题及答案汇总.md#1Kafka的消费) +**2、** [描述Hbase,ZooKeeper搭建过程](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题2021年,常见面试题及答案汇总.md#2描述HbaseZooKeeper搭建过程) +**3、** [什么是队列](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题2021年,常见面试题及答案汇总.md#3什么是队列) +**4、** [hbase内部机制是什么](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题2021年,常见面试题及答案汇总.md#4hbase内部机制是什么) +**5、** [查看所有的topic](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题2021年,常见面试题及答案汇总.md#5查看所有的topic) +**6、** [hadoop框架怎么来优化](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题2021年,常见面试题及答案汇总.md#6hadoop框架怎么来优化) +**7、** [什么是DAG](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题2021年,常见面试题及答案汇总.md#7什么是DAG) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题2021年,常见面试题及答案汇总.md) + +## 大数据最新面试题及答案附答案汇总 + +**1、** [Kafka与传统消息队列的区别](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题及答案附答案汇总.md#1Kafka与传统消息队列的区别) +**2、** [HBase简单读写流程?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题及答案附答案汇总.md#2HBase简单读写流程) +**3、** [如何确认hadoop集群的健康状况](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题及答案附答案汇总.md#3如何确认hadoop集群的健康状况) +**4、** [简答说一下hadoop的map-reduce编程模型](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题及答案附答案汇总.md#4简答说一下hadoop的map-reduce编程模型) +**5、** [Master文件是否提供了多个入口?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题及答案附答案汇总.md#5Master文件是否提供了多个入口) +**6、** [有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题及答案附答案汇总.md#6有10个文件每个文件1G每个文件的每一行存放的都是用户的query每个文件的query都可能重复。要求你按照query的频度排序。) +**7、** [如何重启Namenode?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题及答案附答案汇总.md#7如何重启Namenode) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题及答案附答案汇总.md) + +## 大数据最新面试题,2021年面试题及答案汇总 + +**1、** [Kafka怎么保证消息不丢失机制](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题,2021年面试题及答案汇总.md#1Kafka怎么保证消息不丢失机制) +**2、** [列族怎么创建比较好 <=2](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题,2021年面试题及答案汇总.md#2列族怎么创建比较好-<=2) +**3、** [HDFS写文件的步骤:](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题,2021年面试题及答案汇总.md#3HDFS写文件的步骤:) +**4、** [Hadoop需求什么样的网络?](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题,2021年面试题及答案汇总.md#4Hadoop需求什么样的网络) +**5、** [hive数仓开发的基本流程](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题,2021年面试题及答案汇总.md#5hive数仓开发的基本流程) +**6、** [hive是什么](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题,2021年面试题及答案汇总.md#6hive是什么) +**7、** [hive 跟hbase的区别](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题,2021年面试题及答案汇总.md#7hive-跟hbase的区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/大数据/大数据最新面试题,2021年面试题及答案汇总.md) + +## Redis最新2021年面试题及答案,汇总版 + +**1、** [都有哪些办法可以降低 Redis 的内存使用情况呢?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题及答案,汇总版.md#1都有哪些办法可以降低-Redis-的内存使用情况呢) +**2、** [SCAN系列命令注意事项](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题及答案,汇总版.md#2SCAN系列命令注意事项) +**3、** [Redis回收进程如何工作的?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题及答案,汇总版.md#3Redis回收进程如何工作的) +**4、** [使用过 Redis 分布式锁么,它是什么回事?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题及答案,汇总版.md#4使用过-Redis-分布式锁么它是什么回事) +**5、** [如果有大量的 key 需要设置同一时间过期,一般需要注意什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题及答案,汇总版.md#5如果有大量的-key-需要设置同一时间过期一般需要注意什么) +**6、** [什么是Redis?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题及答案,汇总版.md#6什么是Redis) +**7、** [Redis对象有5种类型](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题及答案,汇总版.md#7Redis对象有5种类型) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题及答案,汇总版.md) + +## Redis最新2021年面试题大汇总,附答案 + +**1、** [Redis通讯协议](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题大汇总,附答案.md#1Redis通讯协议) +**2、** [Redis中的管道有什么用?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题大汇总,附答案.md#2Redis中的管道有什么用) +**3、** [假如 Redis 里面有 1 亿个key,其中有 10w 个key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题大汇总,附答案.md#3假如-Redis-里面有-1-亿个key其中有-10w-个key-是以某个固定的已知的前缀开头的如果将它们全部找出来) +**4、** [一个字符串类型的值能存储最大容量是多少?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题大汇总,附答案.md#4一个字符串类型的值能存储最大容量是多少) +**5、** [缓冲内存](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题大汇总,附答案.md#5缓冲内存) +**6、** [Redis 中设置过期时间主要通过以下四种方式](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题大汇总,附答案.md#6Redis-中设置过期时间主要通过以下四种方式) +**7、** [Redis的内存用完了会发生什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题大汇总,附答案.md#7Redis的内存用完了会发生什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题大汇总,附答案.md) + +## Redis最新2021年面试题附答案解析,大汇总 + +**1、** [Redis有哪几种数据淘汰策略?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题附答案解析,大汇总.md#1Redis有哪几种数据淘汰策略) +**2、** [Redis如何做大量数据插入?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题附答案解析,大汇总.md#2Redis如何做大量数据插入) +**3、** [Redis前端启动命令](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题附答案解析,大汇总.md#3Redis前端启动命令) +**4、** [Redis 开启AOF](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题附答案解析,大汇总.md#4Redis-开启AOF) +**5、** [Memcache与Redis的区别都有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题附答案解析,大汇总.md#5Memcache与Redis的区别都有哪些) +**6、** [Reids持久化触发条件](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题附答案解析,大汇总.md#6Reids持久化触发条件) +**7、** [RDB和AOF的优缺点](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题附答案解析,大汇总.md#7RDB和AOF的优缺点) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题附答案解析,大汇总.md) + +## Redis最新2021年面试题,高级面试题及附答案解析 + +**1、** [MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题,高级面试题及附答案解析.md#1MySQL里有2000w数据Redis中只存20w的数据如何保证Redis中的数据都是热点数据) +**2、** [Reids三种不同删除策略](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题,高级面试题及附答案解析.md#2Reids三种不同删除策略) +**3、** [怎么测试Redis的连通性?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题,高级面试题及附答案解析.md#3怎么测试Redis的连通性) +**4、** [Redis集群之间是如何复制的?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题,高级面试题及附答案解析.md#4Redis集群之间是如何复制的) +**5、** [是否使用过Redis集群,集群的原理是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题,高级面试题及附答案解析.md#5是否使用过Redis集群集群的原理是什么) +**6、** [Redis集群方案什么情况下会导致整个集群不可用?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题,高级面试题及附答案解析.md#6Redis集群方案什么情况下会导致整个集群不可用) +**7、** [Redis事物的了解CAS(check-and-set 操作实现乐观锁 )?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题,高级面试题及附答案解析.md#7Redis事物的了解CAScheck-and-set-操作实现乐观锁-) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新2021年面试题,高级面试题及附答案解析.md) + +## Redis最新面试题2021年,常见面试题及答案汇总 + +**1、** [Redis提供了哪几种持久化方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题2021年,常见面试题及答案汇总.md#1Redis提供了哪几种持久化方式) +**2、** [惰性删除](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题2021年,常见面试题及答案汇总.md#2惰性删除) +**3、** [说说Redis哈希槽的概念?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题2021年,常见面试题及答案汇总.md#3说说Redis哈希槽的概念) +**4、** [缓存和数据库间数据一致性问题](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题2021年,常见面试题及答案汇总.md#4缓存和数据库间数据一致性问题) +**5、** [Redis 的回收策略(淘汰策略)](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题2021年,常见面试题及答案汇总.md#5Redis-的回收策略淘汰策略) +**6、** [Redis集群如何选择数据库?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题2021年,常见面试题及答案汇总.md#6Redis集群如何选择数据库) +**7、** [Redis 过期键的删除策略?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题2021年,常见面试题及答案汇总.md#7Redis-过期键的删除策略) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题2021年,常见面试题及答案汇总.md) + +## Redis最新面试题及答案附答案汇总 + +**1、** [Redis还提供的高级工具](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题及答案附答案汇总.md#1Redis还提供的高级工具) +**2、** [Redis回收进程如何工作的?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题及答案附答案汇总.md#2Redis回收进程如何工作的) +**3、** [Redis 如何做内存优化?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题及答案附答案汇总.md#3Redis-如何做内存优化) +**4、** [都有哪些办法可以降低Redis的内存使用情况呢?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题及答案附答案汇总.md#4都有哪些办法可以降低Redis的内存使用情况呢) +**5、** [Redis回收使用的是什么算法?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题及答案附答案汇总.md#5Redis回收使用的是什么算法) +**6、** [Redis回收进程如何工作的?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题及答案附答案汇总.md#6Redis回收进程如何工作的) +**7、** [定时删除](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题及答案附答案汇总.md#7定时删除) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题及答案附答案汇总.md) + +## Redis最新面试题,2021年面试题及答案汇总 + +**1、** [Redis内存模型](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题,2021年面试题及答案汇总.md#1Redis内存模型) +**2、** [,免费领取架构资料。](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题,2021年面试题及答案汇总.md#2免费领取架构资料。) +**3、** [使用Redis 有哪些好处?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题,2021年面试题及答案汇总.md#3使用Redis-有哪些好处) +**4、** [Redis集群最大节点个数是多少?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题,2021年面试题及答案汇总.md#4Redis集群最大节点个数是多少) +**5、** [Redis常见的几种缓存策略](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题,2021年面试题及答案汇总.md#5Redis常见的几种缓存策略) +**6、** [Redis是单线程的,如何提高多核CPU的利用率?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题,2021年面试题及答案汇总.md#6Redis是单线程的如何提高多核CPU的利用率) +**7、** [Jedis与Redisson对比有什么优缺点?](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题,2021年面试题及答案汇总.md#7Jedis与Redisson对比有什么优缺点) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Redis/Redis最新面试题,2021年面试题及答案汇总.md) + +## React最新2021年面试题大汇总,附答案 + +**1、** [如何更新组件的状态?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题大汇总,附答案.md#1如何更新组件的状态) +**2、** [为什么要用redux](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题大汇总,附答案.md#2为什么要用redux) +**3、** [diff算法?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题大汇总,附答案.md#3diff算法) +**4、** [React 中 refs 的作用是什么](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题大汇总,附答案.md#4React-中-refs-的作用是什么) +**5、** [setState到底是异步还是同步?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题大汇总,附答案.md#5setState到底是异步还是同步) +**6、** [简述flux 思想](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题大汇总,附答案.md#6简述flux-思想) +**7、** [你对 Time Slice的理解?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题大汇总,附答案.md#7你对-Time-Slice的理解) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题大汇总,附答案.md) + +## React最新2021年面试题附答案解析,大汇总 + +**1、** [说说你用react有什么坑点](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题附答案解析,大汇总.md#1说说你用react有什么坑点) +**2、** [为什么需要 React 中的路由?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题附答案解析,大汇总.md#2为什么需要-React-中的路由) +**3、** [列出 Redux 的组件。](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题附答案解析,大汇总.md#3列出-Redux-的组件。) +**4、** [什么是高阶组件(HOC)?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题附答案解析,大汇总.md#4什么是高阶组件HOC) +**5、** [React实现的移动应用中如果出现卡顿有哪些可以考虑的优化方案](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题附答案解析,大汇总.md#5React实现的移动应用中如果出现卡顿有哪些可以考虑的优化方案) +**6、** [如何在 React 中创建表单](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题附答案解析,大汇总.md#6如何在-React-中创建表单) +**7、** [redux中间件](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题附答案解析,大汇总.md#7redux中间件) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题附答案解析,大汇总.md) + +## React最新2021年面试题,高级面试题及附答案解析 + +**1、** [为什么React Router v4中使用 switch 关键字 ?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题,高级面试题及附答案解析.md#1为什么React-Router-v4中使用-switch-关键字-) +**2、** [React的请求应该放在哪个生命周期中?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题,高级面试题及附答案解析.md#2React的请求应该放在哪个生命周期中) +**3、** [那你知道Vue3.x响应式数据原理吗?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题,高级面试题及附答案解析.md#3那你知道Vue3x响应式数据原理吗) +**4、** [HOC(高阶组件)](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题,高级面试题及附答案解析.md#4HOC高阶组件) +**5、** [react组件的划分业务组件技术组件](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题,高级面试题及附答案解析.md#5react组件的划分业务组件技术组件) +**6、** [Vue模版编译原理知道吗,能简单说一下吗?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题,高级面试题及附答案解析.md#6Vue模版编译原理知道吗能简单说一下吗) +**7、** [说一下v-if和v-show的区别](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题,高级面试题及附答案解析.md#7说一下v-if和v-show的区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新2021年面试题,高级面试题及附答案解析.md) + +## React最新面试题2021年,常见面试题及答案汇总 + +**1、** [React有哪些优化性能是手段?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题2021年,常见面试题及答案汇总.md#1React有哪些优化性能是手段) +**2、** [如何在React中创建一个事件?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题2021年,常见面试题及答案汇总.md#2如何在React中创建一个事件) +**3、** [在生命周期中的哪一步你应该发起 AJAX 请求](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题2021年,常见面试题及答案汇总.md#3在生命周期中的哪一步你应该发起-AJAX-请求) +**4、** [在合成事件 和 生命周期钩子(除 componentDidUpdate) 中setState是"异步"的](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题2021年,常见面试题及答案汇总.md#4在合成事件-和-生命周期钩子除-componentDidUpdate-中setState是"异步"的) +**5、** [再说一下vue2.x中如何监测数组变化](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题2021年,常见面试题及答案汇总.md#5再说一下vue2x中如何监测数组变化) +**6、** [区分Real DOM和Virtual DOM](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题2021年,常见面试题及答案汇总.md#6区分Real-DOM和Virtual-DOM) +**7、** [解释 React 中 render() 的目的。](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题2021年,常见面试题及答案汇总.md#7解释-React-中-render-的目的。) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题2021年,常见面试题及答案汇总.md) + +## React最新面试题,2021年面试题及答案汇总 + +**1、** [简单说一下Vue2.x响应式数据原理](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题,2021年面试题及答案汇总.md#1简单说一下Vue2x响应式数据原理) +**2、** [再说一下虚拟Dom以及key属性的作用](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题,2021年面试题及答案汇总.md#2再说一下虚拟Dom以及key属性的作用) +**3、** [如何模块化 React 中的代码?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题,2021年面试题及答案汇总.md#3如何模块化-React-中的代码) +**4、** [Redux与Flux有何不同?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题,2021年面试题及答案汇总.md#4Redux与Flux有何不同) +**5、** [再说一下Computed和Watch](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题,2021年面试题及答案汇总.md#5再说一下Computed和Watch) +**6、** [react 的渲染过程中兄弟节点之间是怎么处理的也就是key值不一样的时候](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题,2021年面试题及答案汇总.md#6react-的渲染过程中兄弟节点之间是怎么处理的也就是key值不一样的时候) +**7、** [React有哪些限制?](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题,2021年面试题及答案汇总.md#7React有哪些限制) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/React/React最新面试题,2021年面试题及答案汇总.md) + +## RabbitMQ最新2021年面试题大汇总,附答案 + +**1、** [什么是Queue队列?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题大汇总,附答案.md#1什么是Queue队列) +**2、** [能够在地理上分开的不同数据中心使用 RabbitMQ cluster 么?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题大汇总,附答案.md#2能够在地理上分开的不同数据中心使用-RabbitMQ-cluster-么) +**3、** [RabbitMQ消息是如何路由的?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题大汇总,附答案.md#3RabbitMQ消息是如何路由的) +**4、** [什么是消费者Consumer?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题大汇总,附答案.md#4什么是消费者Consumer) +**5、** [消费者Consumer?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题大汇总,附答案.md#5消费者Consumer) +**6、** [集群中的节点类型?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题大汇总,附答案.md#6集群中的节点类型) +**7、** [RabbitMQ中消息可能有的几种状态?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题大汇总,附答案.md#7RabbitMQ中消息可能有的几种状态) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题大汇总,附答案.md) + +## RabbitMQ最新2021年面试题附答案解析,大汇总 + +**1、** [Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题附答案解析,大汇总.md#1KafkaActiveMQRabbitMQRocketMQ-有什么优缺点) +**2、** [如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,怎么办?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题附答案解析,大汇总.md#2如何解决消息队列的延时以及过期失效问题消息队列满了以后该怎么处理有几百万消息持续积压几小时怎么办) +**3、** [为什么不应该对所有的 message 都使用持久化机制?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题附答案解析,大汇总.md#3为什么不应该对所有的-message-都使用持久化机制) +**4、** [RabbitMQ topic 主题模式(路由模式的一种)](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题附答案解析,大汇总.md#4RabbitMQ-topic-主题模式路由模式的一种) +**5、** [事务机制?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题附答案解析,大汇总.md#5事务机制) +**6、** [什么是元数据?元数据分为哪些类型?包括哪些内容?与 cluster 相关的元数据有哪些?元数据是如何保存的?元数据在 cluster 中是如何分布的?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题附答案解析,大汇总.md#6什么是元数据元数据分为哪些类型包括哪些内容与-cluster-相关的元数据有哪些元数据是如何保存的元数据在-cluster-中是如何分布的) +**7、** [无法被路由的消息去了哪里?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题附答案解析,大汇总.md#7无法被路由的消息去了哪里) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题附答案解析,大汇总.md) + +## RabbitMQ最新2021年面试题,高级面试题及附答案解析 + +**1、** [vhost 是什么?起什么作用?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题,高级面试题及附答案解析.md#1vhost-是什么起什么作用) +**2、** [使用RabbitMQ有什么好处?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题,高级面试题及附答案解析.md#2使用RabbitMQ有什么好处) +**3、** [RabbitMQ的工作模式有几种?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题,高级面试题及附答案解析.md#3RabbitMQ的工作模式有几种) +**4、** [消息基于什么传输?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题,高级面试题及附答案解析.md#4消息基于什么传输) +**5、** [如何确保消息正确地发送至RabbitMQ? 如何确保消息接收方消费了消息?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题,高级面试题及附答案解析.md#5如何确保消息正确地发送至RabbitMQ-如何确保消息接收方消费了消息) +**6、** [MQ的优点](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题,高级面试题及附答案解析.md#6MQ的优点) +**7、** [生产者Producer?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题,高级面试题及附答案解析.md#7生产者Producer) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新2021年面试题,高级面试题及附答案解析.md) + +## RabbitMQ最新面试题2021年,常见面试题及答案汇总 + +**1、** [cluster 中 node 的失效会对 consumer 产生什么影响?若是在 cluster 中创建了mirrored queue ,这时 node 失效会对 consumer 产生什么影响?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题2021年,常见面试题及答案汇总.md#1cluster-中-node-的失效会对-consumer-产生什么影响若是在-cluster-中创建了mirrored-queue-这时-node-失效会对-consumer-产生什么影响) +**2、** [你们公司生产环境用的是什么消息中间件?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题2021年,常见面试题及答案汇总.md#2你们公司生产环境用的是什么消息中间件) +**3、** [如何保证消息的可靠性投递?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题2021年,常见面试题及答案汇总.md#3如何保证消息的可靠性投递) +**4、** [多个消费者监听一个队列时,消息如何分发?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题2021年,常见面试题及答案汇总.md#4多个消费者监听一个队列时消息如何分发) +**5、** [RabbitMQ 什么是信道?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题2021年,常见面试题及答案汇总.md#5RabbitMQ-什么是信道) +**6、** [消息如何被优先消费?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题2021年,常见面试题及答案汇总.md#6消息如何被优先消费) +**7、** [routing_key 和 binding_key 的最大长度是多少?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题2021年,常见面试题及答案汇总.md#7routing_key-和-binding_key-的最大长度是多少) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题2021年,常见面试题及答案汇总.md) + +## RabbitMQ最新面试题,2021年面试题及答案汇总 + +**1、** [如何避免消息重复投递或重复消费?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题,2021年面试题及答案汇总.md#1如何避免消息重复投递或重复消费) +**2、** [什么情况下会出现 blackholed 问题?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题,2021年面试题及答案汇总.md#2什么情况下会出现-blackholed-问题) +**3、** [什么是生产者Producer?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题,2021年面试题及答案汇总.md#3什么是生产者Producer) +**4、** [AMQP协议3层?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题,2021年面试题及答案汇总.md#4AMQP协议3层) +**5、** [为什么要使用rabbitmq](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题,2021年面试题及答案汇总.md#5为什么要使用rabbitmq) +**6、** [消息如何分发?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题,2021年面试题及答案汇总.md#6消息如何分发) +**7、** [Binding绑定?](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题,2021年面试题及答案汇总.md#7Binding绑定) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/RabbitMQ/RabbitMQ最新面试题,2021年面试题及答案汇总.md) + +## Elasticsearch最新2021年面试题大汇总,附答案 + +**1、** [介绍一下你们的个性化搜索方案?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题大汇总,附答案.md#1介绍一下你们的个性化搜索方案) +**2、** [Elasticsearch在部署时,对Linux的设置有哪些优化方法](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题大汇总,附答案.md#2Elasticsearch在部署时对Linux的设置有哪些优化方法) +**3、** [Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题大汇总,附答案.md#3Elasticsearch-对于大数据量上亿量级的聚合如何实现) +**4、** [在索引中更新 Mapping 的语法?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题大汇总,附答案.md#4在索引中更新-Mapping-的语法) +**5、** [详细描述一下 Elasticsearch 搜索的过程?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题大汇总,附答案.md#5详细描述一下-Elasticsearch-搜索的过程) +**6、** [ElasticSearch对于大数据量(上亿量级)的聚合如何实现?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题大汇总,附答案.md#6ElasticSearch对于大数据量上亿量级的聚合如何实现) +**7、** [Elasticsearch的 文档是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题大汇总,附答案.md#7Elasticsearch的-文档是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题大汇总,附答案.md) + +## Elasticsearch最新2021年面试题附答案解析,大汇总 + +**1、** [客户端在和集群连接时,如何选择特定的节点执行请求的?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题附答案解析,大汇总.md#1客户端在和集群连接时如何选择特定的节点执行请求的) +**2、** [介绍下你们电商搜索的整体技术架构。](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题附答案解析,大汇总.md#2介绍下你们电商搜索的整体技术架构。) +**3、** [详细描述一下Elasticsearch更新和删除文档的过程。](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题附答案解析,大汇总.md#3详细描述一下Elasticsearch更新和删除文档的过程。) +**4、** [ElasticSearch中的倒排索引是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题附答案解析,大汇总.md#4ElasticSearch中的倒排索引是什么) +**5、** [在安装Elasticsearch时,请说明不同的软件包及其重要性?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题附答案解析,大汇总.md#5在安装Elasticsearch时请说明不同的软件包及其重要性) +**6、** [elasticsearch 的 filesystem](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题附答案解析,大汇总.md#6elasticsearch-的-filesystem) +**7、** [Master 节点和 候选 Master节点有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题附答案解析,大汇总.md#7Master-节点和-候选-Master节点有什么区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题附答案解析,大汇总.md) + +## Elasticsearch最新2021年面试题,高级面试题及附答案解析 + +**1、** [lucence 内部结构是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题,高级面试题及附答案解析.md#1lucence-内部结构是什么) +**2、** [解释一下 Elasticsearch Node?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题,高级面试题及附答案解析.md#2解释一下-Elasticsearch-Node) +**3、** [Elasticsearch 支持哪些配置管理工具?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题,高级面试题及附答案解析.md#3Elasticsearch-支持哪些配置管理工具) +**4、** [迁移 Migration API 如何用作 Elasticsearch?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题,高级面试题及附答案解析.md#4迁移-Migration-API-如何用作-Elasticsearch) +**5、** [REST API在 Elasticsearch 方面有哪些优势?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题,高级面试题及附答案解析.md#5REST-API在-Elasticsearch-方面有哪些优势) +**6、** [什么是Elasticsearch Analyzer?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题,高级面试题及附答案解析.md#6什么是Elasticsearch-Analyzer) +**7、** [Elasticsearch 支持哪些类型的查询?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题,高级面试题及附答案解析.md#7Elasticsearch-支持哪些类型的查询) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新2021年面试题,高级面试题及附答案解析.md) + +## Elasticsearch最新面试题2021年,常见面试题及答案汇总 + +**1、** [您能否列出 与 ELK日志分析相关的应用场景?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题2021年,常见面试题及答案汇总.md#1您能否列出-与-ELK日志分析相关的应用场景) +**2、** [什么是ElasticSearch索引?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题2021年,常见面试题及答案汇总.md#2什么是ElasticSearch索引) +**3、** [Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题2021年,常见面试题及答案汇总.md#3Elasticsearch-在部署时对-Linux-的设置有哪些优化方法) +**4、** [什么是ElasticSearch脑裂?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题2021年,常见面试题及答案汇总.md#4什么是ElasticSearch脑裂) +**5、** [您能解释一下 Elasticsearch 中的 Explore API 吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题2021年,常见面试题及答案汇总.md#5您能解释一下-Elasticsearch-中的-Explore-API-吗) +**6、** [elasticsearch 数据预热](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题2021年,常见面试题及答案汇总.md#6elasticsearch-数据预热) +**7、** [Elasticsearch是如何实现master选举的?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题2021年,常见面试题及答案汇总.md#7Elasticsearch是如何实现master选举的) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题2021年,常见面试题及答案汇总.md) + +## Elasticsearch最新面试题,2021年面试题及答案汇总 + +**1、** [能列举过你使用的 X-Pack 命令吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题,2021年面试题及答案汇总.md#1能列举过你使用的-X-Pack-命令吗) +**2、** [ES在生产集群的部署架构是什么,每个索引有多大的数据量,每个索引有多少分片](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题,2021年面试题及答案汇总.md#2ES在生产集群的部署架构是什么每个索引有多大的数据量每个索引有多少分片) +**3、** [在Elasticsearch中 cat API的功能是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题,2021年面试题及答案汇总.md#3在Elasticsearch中-cat-API的功能是什么) +**4、** [详细说明ELK Stack及其内容?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题,2021年面试题及答案汇总.md#4详细说明ELK-Stack及其内容) +**5、** [详细描述一下 Elasticsearch 索引文档的过程](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题,2021年面试题及答案汇总.md#5详细描述一下-Elasticsearch-索引文档的过程) +**6、** [介绍一下你们的个性化搜索方案?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题,2021年面试题及答案汇总.md#6介绍一下你们的个性化搜索方案) +**7、** [ElasticSearch如何避免脑裂?](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题,2021年面试题及答案汇总.md#7ElasticSearch如何避免脑裂) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Elasticsearch/Elasticsearch最新面试题,2021年面试题及答案汇总.md) + +## Kafka最新2021年面试题大汇总,附答案 + +**1、** [producer 是否直接将数据发送到 broker 的 leader(主节点)?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题大汇总,附答案.md#1producer-是否直接将数据发送到-broker-的-leader主节点) +**2、** [Kafka的高可用机制是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题大汇总,附答案.md#2Kafka的高可用机制是什么) +**3、** [解释术语“主题复制因子”。](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题大汇总,附答案.md#3解释术语“主题复制因子。) +**4、** [连接器API的作用是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题大汇总,附答案.md#4连接器API的作用是什么) +**5、** [什么是Apache Kafka?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题大汇总,附答案.md#5什么是Apache-Kafka) +**6、** [消费者负载均衡策略](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题大汇总,附答案.md#6消费者负载均衡策略) +**7、** [Kafka的一些最显著的应用。](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题大汇总,附答案.md#7Kafka的一些最显著的应用。) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题大汇总,附答案.md) + +## Kafka最新2021年面试题附答案解析,大汇总 + +**1、** [为什么Kafka的复制至关重要?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题附答案解析,大汇总.md#1为什么Kafka的复制至关重要) +**2、** [Kafka中的 Broker 是干什么的?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题附答案解析,大汇总.md#2Kafka中的-Broker-是干什么的) +**3、** [Kafka 新建的分区会在哪个目录下创建](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题附答案解析,大汇总.md#3Kafka-新建的分区会在哪个目录下创建) +**4、** [Kafka的主要API有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题附答案解析,大汇总.md#4Kafka的主要API有哪些) +**5、** [为什么要使用Apache Kafka集群?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题附答案解析,大汇总.md#5为什么要使用Apache-Kafka集群) +**6、** [什么情况下一个 Broker 会从ISR中踢出去?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题附答案解析,大汇总.md#6什么情况下一个-Broker-会从ISR中踢出去) +**7、** [Kafka 与传统MQ消息系统之间有三个关键区别](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题附答案解析,大汇总.md#7Kafka-与传统MQ消息系统之间有三个关键区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题附答案解析,大汇总.md) + +## Kafka最新2021年面试题,高级面试题及附答案解析 + +**1、** [什么是Kafka中的地域复制?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题,高级面试题及附答案解析.md#1什么是Kafka中的地域复制) +**2、** [Kafka一次reblance大概要多久](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题,高级面试题及附答案解析.md#2Kafka一次reblance大概要多久) +**3、** [:35, 36, 37](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题,高级面试题及附答案解析.md#3:35,-36,-37) +**4、** [Kafka 的 ack 机制](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题,高级面试题及附答案解析.md#4Kafka-的-ack-机制) +**5、** [Kafka 判断一个节点是否还活着有那两个条件?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题,高级面试题及附答案解析.md#5Kafka-判断一个节点是否还活着有那两个条件) +**6、** [Kafka如何不消费重复数据?比如扣款,我们不能重复的扣。](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题,高级面试题及附答案解析.md#6Kafka如何不消费重复数据比如扣款我们不能重复的扣。) +**7、** [什么是多租户?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题,高级面试题及附答案解析.md#7什么是多租户) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新2021年面试题,高级面试题及附答案解析.md) + +## Kafka最新面试题2021年,常见面试题及答案汇总 + +**1、** [副本和 ISR 扮演什么角色?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题2021年,常见面试题及答案汇总.md#1副本和-ISR-扮演什么角色) +**2、** [传统的消息传递方法有哪些类型?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题2021年,常见面试题及答案汇总.md#2传统的消息传递方法有哪些类型) +**3、** [讲一讲Kafka的ack的三种机制](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题2021年,常见面试题及答案汇总.md#3讲一讲Kafka的ack的三种机制) +**4、** [简述Follower副本消息同步的完整流程](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题2021年,常见面试题及答案汇总.md#4简述Follower副本消息同步的完整流程) +**5、** [Kafka的哪些场景中使用了零拷贝(Zero Copy)?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题2021年,常见面试题及答案汇总.md#5Kafka的哪些场景中使用了零拷贝Zero-Copy) +**6、** [Kafka流的特点。](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题2021年,常见面试题及答案汇总.md#6Kafka流的特点。) +**7、** [Kafka能手动删除消息吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题2021年,常见面试题及答案汇总.md#7Kafka能手动删除消息吗) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题2021年,常见面试题及答案汇总.md) + +## Kafka最新面试题及答案附答案汇总 + +**1、** [Kafka和Flume之间的主要区别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题及答案附答案汇总.md#1Kafka和Flume之间的主要区别是什么) +**2、** [Kafka 存储在硬盘上的消息格式是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题及答案附答案汇总.md#2Kafka-存储在硬盘上的消息格式是什么) +**3、** [什么是消费者或用户?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题及答案附答案汇总.md#3什么是消费者或用户) +**4、** [为什么需要消息系统,MySQL不能满足需求吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题及答案附答案汇总.md#4为什么需要消息系统MySQL不能满足需求吗) +**5、** [3.它还可以在记录进入时对其进行处理。Apache Kafka对于新手的面试](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题及答案附答案汇总.md#53它还可以在记录进入时对其进行处理。Apache-Kafka对于新手的面试) +**6、** [解释Kafka Producer API的作用。](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题及答案附答案汇总.md#6解释Kafka-Producer-API的作用。) +**7、** [什么是消费者组?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题及答案附答案汇总.md#7什么是消费者组) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题及答案附答案汇总.md) + +## Kafka最新面试题,2021年面试题及答案汇总 + +**1、** [为什么Kafka技术很重要?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题,2021年面试题及答案汇总.md#1为什么Kafka技术很重要) +**2、** [比较传统队列系统与Apache Kafka](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题,2021年面试题及答案汇总.md#2比较传统队列系统与Apache-Kafka) +**3、** [消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题,2021年面试题及答案汇总.md#3消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1) +**4、** [如何设置Kafka能接收的最大消息的大小?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题,2021年面试题及答案汇总.md#4如何设置Kafka能接收的最大消息的大小) +**5、** [解释Kafka可以接收的消息最大为多少?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题,2021年面试题及答案汇总.md#5解释Kafka可以接收的消息最大为多少) +**6、** [为什么Kafka的复制至关重要?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题,2021年面试题及答案汇总.md#6为什么Kafka的复制至关重要) +**7、** [当ack为-1时,什么情况下,Leader 认为一条消息 Commit了?](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题,2021年面试题及答案汇总.md#7当ack为-1时什么情况下Leader-认为一条消息-Commit了) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Kafka/Kafka最新面试题,2021年面试题及答案汇总.md) + +## MyBatis最新2021年面试题大汇总,附答案 + +**1、** [JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题大汇总,附答案.md#1JDBC编程有哪些不足之处MyBatis是如何解决这些问题的) +**2、** [Mybatis映射文件中,如果A标签通过include引用了B标签的内容](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题大汇总,附答案.md#2Mybatis映射文件中如果A标签通过include引用了B标签的内容) +**3、** [IBatis 和 MyBatis 在细节上的不同有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题大汇总,附答案.md#3IBatis-和-MyBatis-在细节上的不同有哪些) +**4、** [MyBatis框架的缺点有什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题大汇总,附答案.md#4MyBatis框架的缺点有什么) +**5、** [Mybaits的优点:](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题大汇总,附答案.md#5Mybaits的优点:) +**6、** [MyBatis与Hibernate有哪些不同?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题大汇总,附答案.md#6MyBatis与Hibernate有哪些不同) +**7、** [什么是Mybatis?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题大汇总,附答案.md#7什么是Mybatis) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题大汇总,附答案.md) + +## MyBatis最新2021年面试题附答案解析,大汇总 + +**1、** [Mybatis 中如何执行批处理?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题附答案解析,大汇总.md#1Mybatis-中如何执行批处理) +**2、** [什么是MyBatis的接口绑定?有哪些实现方式?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题附答案解析,大汇总.md#2什么是MyBatis的接口绑定有哪些实现方式) +**3、** [如何获取自动生成的(主)键值?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题附答案解析,大汇总.md#3如何获取自动生成的主键值) +**4、** [在mapper中如何传递多个参数](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题附答案解析,大汇总.md#4在mapper中如何传递多个参数) +**5、** [模糊查询like语句该怎么写](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题附答案解析,大汇总.md#5模糊查询like语句该怎么写) +**6、** [Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题附答案解析,大汇总.md#6Mybatis是否支持延迟加载如果支持它的实现原理是什么) +**7、** [Mybaits的优点有什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题附答案解析,大汇总.md#7Mybaits的优点有什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题附答案解析,大汇总.md) + +## MyBatis最新2021年面试题,高级面试题及附答案解析 + +**1、** [简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题,高级面试题及附答案解析.md#1简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系) +**2、** [MyBatis框架的缺点:](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题,高级面试题及附答案解析.md#2MyBatis框架的缺点:) +**3、** [Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题,高级面试题及附答案解析.md#3Mybatis-是否支持延迟加载如果支持它的实现原理是什么) +**4、** [MyBatis与hibernate有哪些不同?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题,高级面试题及附答案解析.md#4MyBatis与hibernate有哪些不同) +**5、** [Mybatis是如何进行分页的?分页插件的原理是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题,高级面试题及附答案解析.md#5Mybatis是如何进行分页的分页插件的原理是什么) +**6、** [使用Mybatis的mapper接口调用时候有哪些要求?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题,高级面试题及附答案解析.md#6使用Mybatis的mapper接口调用时候有哪些要求) +**7、** [使用MyBatis的mapper接口调用时有哪些要求?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题,高级面试题及附答案解析.md#7使用MyBatis的mapper接口调用时有哪些要求) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新2021年面试题,高级面试题及附答案解析.md) + +## MyBatis最新面试题2021年,常见面试题及答案汇总 + +**1、** [Mybatis动态sql有什么用?执行原理?有哪些动态sql?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题2021年,常见面试题及答案汇总.md#1Mybatis动态sql有什么用执行原理有哪些动态sql) +**2、** [Mybatis是如何进行分页的?分页插件的原理是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题2021年,常见面试题及答案汇总.md#2Mybatis是如何进行分页的分页插件的原理是什么) +**3、** [MyBatis编程步骤是什么样的?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题2021年,常见面试题及答案汇总.md#3MyBatis编程步骤是什么样的) +**4、** [为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题2021年,常见面试题及答案汇总.md#4为什么说-Mybatis-是半自动-ORM-映射工具它与全自动的区别在哪里) +**5、** [Mapper 编写有哪几种方式?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题2021年,常见面试题及答案汇总.md#5Mapper-编写有哪几种方式) +**6、** [简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题2021年,常见面试题及答案汇总.md#6简述-Mybatis-的-Xml-映射文件和-Mybatis-内部数据结构之间的映射关系) +**7、** [Mybatis动态SQL?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题2021年,常见面试题及答案汇总.md#7Mybatis动态SQL) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题2021年,常见面试题及答案汇总.md) + +## MyBatis最新面试题,2021年面试题及答案汇总 + +**1、** [什么是MyBatis的接口绑定?有哪些实现方式?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题,2021年面试题及答案汇总.md#1什么是MyBatis的接口绑定有哪些实现方式) +**2、** [ORM是什么](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题,2021年面试题及答案汇总.md#2ORM是什么) +**3、** [JDBC编程有哪些不足之处,MyBatis是如何解决的?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题,2021年面试题及答案汇总.md#3JDBC编程有哪些不足之处MyBatis是如何解决的) +**4、** [讲下 MyBatis 的缓存](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题,2021年面试题及答案汇总.md#4讲下-MyBatis-的缓存) +**5、** [Mybatis 是否可以映射 Enum 枚举类?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题,2021年面试题及答案汇总.md#5Mybatis-是否可以映射-Enum-枚举类) +**6、** [当实体类中的属性名和表中的字段名不一样 ,怎么办](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题,2021年面试题及答案汇总.md#6当实体类中的属性名和表中的字段名不一样-怎么办) +**7、** [当实体类中的属性名和表中的字段名不一样 ,怎么办 ?](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题,2021年面试题及答案汇总.md#7当实体类中的属性名和表中的字段名不一样-怎么办-) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MyBatis/MyBatis最新面试题,2021年面试题及答案汇总.md) + +## Linux最新2021年面试题及答案,汇总版 + +**1、** [什么是root帐户](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题及答案,汇总版.md#1什么是root帐户) +**2、** [已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近 7 天的访问日志!请问如何解决?请给出解决办法或配置或处理命令](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题及答案,汇总版.md#2已知-apache-服务的访问日志按天记录在服务器本地目录/app/logs-下由于磁盘空间紧张现在要求只能保留最近-7-天的访问日志请问如何解决请给出解决办法或配置或处理命令) +**3、** [BASH和DOS之间的基本区别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题及答案,汇总版.md#3BASH和DOS之间的基本区别是什么) +**4、** [终端是哪个文件夹下的哪个文件?黑洞文件是哪个文件夹下的哪个命令?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题及答案,汇总版.md#4终端是哪个文件夹下的哪个文件黑洞文件是哪个文件夹下的哪个命令) +**5、** [启动shell](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题及答案,汇总版.md#5启动shell) +**6、** [绝对文件路径?相对文件路径?快捷方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题及答案,汇总版.md#6绝对文件路径相对文件路径快捷方式) +**7、** [8.迷路,我的当前位置在哪?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题及答案,汇总版.md#78迷路我的当前位置在哪) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题及答案,汇总版.md) + +## Linux最新2021年面试题大汇总,附答案 + +**1、** [如何把一个进程放到后台运行?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题大汇总,附答案.md#1如何把一个进程放到后台运行) +**2、** [怎样一页一页地查看一个大文件的内容呢?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题大汇总,附答案.md#2怎样一页一页地查看一个大文件的内容呢) +**3、** [使用哪一个命令可以查看自己文件系统的磁盘空间配额呢?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题大汇总,附答案.md#3使用哪一个命令可以查看自己文件系统的磁盘空间配额呢) +**4、** [制表符自动补全?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题大汇总,附答案.md#4制表符自动补全) +**5、** [查看http的并发请求数与其TCP连接状态](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题大汇总,附答案.md#5查看http的并发请求数与其TCP连接状态) +**6、** [查找命令的可执行文件是去哪查找的? 怎么对其进行设置及添加?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题大汇总,附答案.md#6查找命令的可执行文件是去哪查找的-怎么对其进行设置及添加) +**7、** [netstat 命令](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题大汇总,附答案.md#7netstat-命令) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题大汇总,附答案.md) + +## Linux最新2021年面试题附答案解析,大汇总 + +**1、** [你常用的Nginx模块,用来做什么](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题附答案解析,大汇总.md#1你常用的Nginx模块用来做什么) +**2、** [查看某端口是否被占用?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题附答案解析,大汇总.md#2查看某端口是否被占用) +**3、** [用tcpdump嗅探80端口的访问看看谁最高](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题附答案解析,大汇总.md#3用tcpdump嗅探80端口的访问看看谁最高) +**4、** [什么是Linux](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题附答案解析,大汇总.md#4什么是Linux) +**5、** [什么是中间件?什么是jdk?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题附答案解析,大汇总.md#5什么是中间件什么是jdk) +**6、** [ls (ls:list的缩写,查看列表)查看当前目录下的所有文件夹(ls 只列出文件名或目录名)](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题附答案解析,大汇总.md#6ls-ls:list的缩写查看列表查看当前目录下的所有文件夹ls-只列出文件名或目录名) +**7、** [RAID 是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题附答案解析,大汇总.md#7RAID-是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题附答案解析,大汇总.md) + +## Linux最新2021年面试题,高级面试题及附答案解析 + +**1、** [查看当前谁在使用该主机用什么命令? 查找自己所在的终端信息用什么命令?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题,高级面试题及附答案解析.md#1查看当前谁在使用该主机用什么命令-查找自己所在的终端信息用什么命令) +**2、** [通过什么命令指定命令提示符?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题,高级面试题及附答案解析.md#2通过什么命令指定命令提示符) +**3、** [说说TCP/IP的七层模型](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题,高级面试题及附答案解析.md#3说说TCP/IP的七层模型) +**4、** [如果一个linux新手想要知道当前系统支持的所有命令的列表,他需要怎么做?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题,高级面试题及附答案解析.md#4如果一个linux新手想要知道当前系统支持的所有命令的列表他需要怎么做) +**5、** [如何停止一个进程?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题,高级面试题及附答案解析.md#5如何停止一个进程) +**6、** [现在给你三百台服务器,你怎么对他们进行管理?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题,高级面试题及附答案解析.md#6现在给你三百台服务器你怎么对他们进行管理) +**7、** [ll (ll:list的缩写,查看列表详情)查看当前目录下的所有详细信息和文件夹(ll 结果是详细,有时间,是否可读写等信息)](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题,高级面试题及附答案解析.md#7ll-ll:list的缩写查看列表详情查看当前目录下的所有详细信息和文件夹ll-结果是详细,有时间,是否可读写等信息) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新2021年面试题,高级面试题及附答案解析.md) + +## Linux最新面试题2021年,常见面试题及答案汇总 + +**1、** [mkdir (mkdir:创建目录) 创建目录](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题2021年,常见面试题及答案汇总.md#1mkdir-mkdir:创建目录-创建目录) +**2、** [建立软链接(快捷方式),以及硬链接的命令。](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题2021年,常见面试题及答案汇总.md#2建立软链接快捷方式以及硬链接的命令。) +**3、** [删除文件?强制删除?递归删除?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题2021年,常见面试题及答案汇总.md#3删除文件强制删除递归删除) +**4、** [什么是 Linux 内核?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题2021年,常见面试题及答案汇总.md#4什么是-Linux-内核) +**5、** [同步时间命令](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题2021年,常见面试题及答案汇总.md#5同步时间命令) +**6、** [每天晚上 12 点,打包站点目录/var/www/html 备份到/data 目录下(最好每次备份按时间生成不同的备份包)](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题2021年,常见面试题及答案汇总.md#6每天晚上-12-点打包站点目录/var/www/html-备份到/data-目录下最好每次备份按时间生成不同的备份包) +**7、** [验证网络可链接命令是什么?什么原理?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题2021年,常见面试题及答案汇总.md#7验证网络可链接命令是什么什么原理) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题2021年,常见面试题及答案汇总.md) + +## Linux最新面试题及答案附答案汇总 + +**1、** [ifconfig命令](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题及答案附答案汇总.md#1ifconfig命令) +**2、** [tar (解压 压缩 命令)](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题及答案附答案汇总.md#2tar-解压-压缩-命令) +**3、** [简述raid0 raid1 raid5 三种工作模式的工作原理及特点](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题及答案附答案汇总.md#3简述raid0-raid1-raid5-三种工作模式的工作原理及特点) +**4、** [使用什么命令查看磁盘使用空间? 空闲空间呢?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题及答案附答案汇总.md#4使用什么命令查看磁盘使用空间-空闲空间呢) +**5、** [文件描述符?每个描述符的含义?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题及答案附答案汇总.md#5文件描述符每个描述符的含义) +**6、** [什么是交换空间?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题及答案附答案汇总.md#6什么是交换空间) +**7、** [讲述一下LVS三种模式的工作过程?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题及答案附答案汇总.md#7讲述一下LVS三种模式的工作过程) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题及答案附答案汇总.md) + +## Linux最新面试题,2021年面试题及答案汇总 + +**1、** [绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题,2021年面试题及答案汇总.md#1绝对路径用什么符号表示当前目录上层目录用什么表示主目录用什么表示-切换目录用什么命令) +**2、** [统计ip访问情况,要求分析nginx访问日志,找出访问页面数量在前十位的ip](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题,2021年面试题及答案汇总.md#2统计ip访问情况要求分析nginx访问日志找出访问页面数量在前十位的ip) +**3、** [MySQL数据备份工具](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题,2021年面试题及答案汇总.md#3MySQL数据备份工具) +**4、** [free 命令 (显示系统内存)](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题,2021年面试题及答案汇总.md#4free-命令-显示系统内存) +**5、** [如何写一条规则,拒绝某个ip访问本机8080端口?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题,2021年面试题及答案汇总.md#5如何写一条规则拒绝某个ip访问本机8080端口) +**6、** [怎么查看系统支持的所有信号?](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题,2021年面试题及答案汇总.md#6怎么查看系统支持的所有信号) +**7、** [请列出你了解的web服务器负载架构](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题,2021年面试题及答案汇总.md#7请列出你了解的web服务器负载架构) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Linux/Linux最新面试题,2021年面试题及答案汇总.md) + +## MongoDB最新2021年面试题大汇总,附答案 + +**1、** [mongodb是否支持事务](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题大汇总,附答案.md#1mongodb是否支持事务) +**2、** [什么是master或primary?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题大汇总,附答案.md#2什么是master或primary) +**3、** [允许空值null吗?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题大汇总,附答案.md#3允许空值null吗) +**4、** [可以把movechunk目录里的旧文件删除吗?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题大汇总,附答案.md#4可以把movechunk目录里的旧文件删除吗) +**5、** [我怎么查看 Mongo 正在使用的链接?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题大汇总,附答案.md#5我怎么查看-Mongo-正在使用的链接) +**6、** [如果块移动操作(movechunk)失败了,我需要手动清除部分转移的文档吗?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题大汇总,附答案.md#6如果块移动操作movechunk失败了,我需要手动清除部分转移的文档吗) +**7、** [MySQL与mongodb本质之间最基本的差别是什么](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题大汇总,附答案.md#7MySQL与mongodb本质之间最基本的差别是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题大汇总,附答案.md) + +## MongoDB最新2021年面试题附答案解析,大汇总 + +**1、** [提到在MongoDB中使用索引的基本语法是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题附答案解析,大汇总.md#1提到在MongoDB中使用索引的基本语法是什么) +**2、** [查看是否在主服务器上的命令语法是什么?MongoDB允许多少个主机?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题附答案解析,大汇总.md#2查看是否在主服务器上的命令语法是什么MongoDB允许多少个主机) +**3、** [解释一下MongoDB中的索引是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题附答案解析,大汇总.md#3解释一下MongoDB中的索引是什么) +**4、** [提到用于查看Mongo的命令语法正在使用链接吗?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题附答案解析,大汇总.md#4提到用于查看Mongo的命令语法正在使用链接吗) +**5、** [分片(sharding)和复制(replication)是怎样工作的?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题附答案解析,大汇总.md#5分片sharding和复制replication是怎样工作的) +**6、** [解释什么是MongoDB?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题附答案解析,大汇总.md#6解释什么是MongoDB) +**7、** [什么是非关系型数据库](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题附答案解析,大汇总.md#7什么是非关系型数据库) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题附答案解析,大汇总.md) + +## MongoDB最新2021年面试题,高级面试题及附答案解析 + +**1、** [你怎么比较MongoDB、CouchDB及CouchBase?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题,高级面试题及附答案解析.md#1你怎么比较MongoDBCouchDB及CouchBase) +**2、** [什么是NoSQL数据库?NoSQL和RDBMS有什么区别?在哪些情况下使用和不使用NoSQL数据库?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题,高级面试题及附答案解析.md#2什么是NoSQL数据库NoSQL和RDBMS有什么区别在哪些情况下使用和不使用NoSQL数据库) +**3、** [MongoDB支持存储过程吗?如果支持的话,怎么用?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题,高级面试题及附答案解析.md#3MongoDB支持存储过程吗如果支持的话怎么用) +**4、** [在MongoDB中如何排序](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题,高级面试题及附答案解析.md#4在MongoDB中如何排序) +**5、** [ObjectID"有哪些部分组成](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题,高级面试题及附答案解析.md#5ObjectID"有哪些部分组成) +**6、** [MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题,高级面试题及附答案解析.md#6MongoDB在A:{B,C}上建立索引查询A:{B,C}和A:{C,B}都会使用索引吗) +**7、** [如果在一个分片(shard)停止或者很慢的时候,我发起一个查询会怎样?](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题,高级面试题及附答案解析.md#7如果在一个分片shard停止或者很慢的时候,我发起一个查询会怎样) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/MongoDB/MongoDB最新2021年面试题,高级面试题及附答案解析.md) + +## Oracle最新2021年面试题大汇总,附答案 + +**1、** [Oracle中function和procedure的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题大汇总,附答案.md#1Oracle中function和procedure的区别) +**2、** [如何变动数据文件的大小?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题大汇总,附答案.md#2如何变动数据文件的大小) +**3、** [集合操作符](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题大汇总,附答案.md#3集合操作符) +**4、** [使用存储过程访问数据库比直接用SQL语句访问有何优点?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题大汇总,附答案.md#4使用存储过程访问数据库比直接用SQL语句访问有何优点) +**5、** [说一下,什么是Oracle分区](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题大汇总,附答案.md#5说一下什么是Oracle分区) +**6、** [说下 怎样创建一个视图,视图的好处, 视图可以控制权限吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题大汇总,附答案.md#6说下-怎样创建一个视图,视图的好处,-视图可以控制权限吗) +**7、** [说下 Oracle的导入导出有几种方式,有何区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题大汇总,附答案.md#7说下-Oracle的导入导出有几种方式有何区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题大汇总,附答案.md) + +## Oracle最新2021年面试题附答案解析,大汇总 + +**1、** [Oralce怎样存储文件,能够存储哪些文件?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题附答案解析,大汇总.md#1Oralce怎样存储文件能够存储哪些文件) +**2、** [给出数据库正常启动所经历的几种状态 ?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题附答案解析,大汇总.md#2给出数据库正常启动所经历的几种状态-) +**3、** [Oracle 分区在什么情况下使用](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题附答案解析,大汇总.md#3Oracle-分区在什么情况下使用) +**4、** [如何使用Oracle的游标?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题附答案解析,大汇总.md#4如何使用Oracle的游标) +**5、** [如何生成explain plan?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题附答案解析,大汇总.md#5如何生成explain-plan) +**6、** [举出3种可以收集three advisory statistics](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题附答案解析,大汇总.md#6举出3种可以收集three-advisory-statistics) +**7、** [什么是绑定变量?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题附答案解析,大汇总.md#7什么是绑定变量) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题附答案解析,大汇总.md) + +## Oracle最新2021年面试题,高级面试题及附答案解析 + +**1、** [给出两个检查表结构的方法](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题,高级面试题及附答案解析.md#1给出两个检查表结构的方法) +**2、** [如何在不影响子表的前提下,重建一个母表](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题,高级面试题及附答案解析.md#2如何在不影响子表的前提下重建一个母表) +**3、** [你必须利用备份恢复数据库,但是你没有控制文件,该如何解决问题呢?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题,高级面试题及附答案解析.md#3你必须利用备份恢复数据库但是你没有控制文件该如何解决问题呢) +**4、** [怎样查看数据库引擎的报错](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题,高级面试题及附答案解析.md#4怎样查看数据库引擎的报错) +**5、** [说下,内连接,左连接,右连接的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题,高级面试题及附答案解析.md#5说下内连接左连接右连接的区别) +**6、** [日志的作用是什么](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题,高级面试题及附答案解析.md#6日志的作用是什么) +**7、** [说说Oracle中经常使用到的函数](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题,高级面试题及附答案解析.md#7说说Oracle中经常使用到的函数) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新2021年面试题,高级面试题及附答案解析.md) + +## Oracle最新面试题2021年,常见面试题及答案汇总 + +**1、** [给出两个检查表结构的方法](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题2021年,常见面试题及答案汇总.md#1给出两个检查表结构的方法) +**2、** [解释冷备份和热备份的不同点以及各自的优点](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题2021年,常见面试题及答案汇总.md#2解释冷备份和热备份的不同点以及各自的优点) +**3、** [存储过程 、函数 、游标 在项目中怎么用的:](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题2021年,常见面试题及答案汇总.md#3存储过程-函数-游标-在项目中怎么用的:) +**4、** [触发器的作用有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题2021年,常见面试题及答案汇总.md#4触发器的作用有哪些) +**5、** [给出两个检查表结构的方法](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题2021年,常见面试题及答案汇总.md#5给出两个检查表结构的方法) +**6、** [给出两种相关约束?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题2021年,常见面试题及答案汇总.md#6给出两种相关约束) +**7、** [解释data block , extent 和 segment的区别(这里建议用英文术语)](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题2021年,常见面试题及答案汇总.md#7解释data-block-,-extent-和-segment的区别这里建议用英文术语) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题2021年,常见面试题及答案汇总.md) + +## Oracle最新面试题,2021年面试题及答案汇总 + +**1、** [解释$$ORACLE\_HOME和$$ORACLE_BASE的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题,2021年面试题及答案汇总.md#1解释$$ORACLE\_HOME和$$ORACLE_BASE的区别) +**2、** [Oracle跟SQL Server 2005的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题,2021年面试题及答案汇总.md#2Oracle跟SQL-Server-2005的区别) +**3、** [给出在STAR SCHEMA中的两种表及它们分别含有的数据](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题,2021年面试题及答案汇总.md#3给出在STAR-SCHEMA中的两种表及它们分别含有的数据) +**4、** [比较truncate和delete 命令](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题,2021年面试题及答案汇总.md#4比较truncate和delete-命令) +**5、** [MySQL数据库与Oracle 数据库有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题,2021年面试题及答案汇总.md#5MySQL数据库与Oracle-数据库有什么区别) +**6、** [说明如何在指定的块中迭代项目和记录?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题,2021年面试题及答案汇总.md#6说明如何在指定的块中迭代项目和记录) +**7、** [给出数据库正常启动所经历的几种状态 ?](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题,2021年面试题及答案汇总.md#7给出数据库正常启动所经历的几种状态-) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Oracle/Oracle最新面试题,2021年面试题及答案汇总.md) + +## Netty最新2021年面试题附答案解析,大汇总 + +**1、** [AIO 是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题附答案解析,大汇总.md#1AIO-是什么) +**2、** [默认情况 Netty 起多少线程?何时启动?](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题附答案解析,大汇总.md#2默认情况-Netty-起多少线程何时启动) +**3、** [什么是Netty](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题附答案解析,大汇总.md#3什么是Netty) +**4、** [Netty 支持哪些心跳类型设置?](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题附答案解析,大汇总.md#4Netty-支持哪些心跳类型设置) +**5、** [简单解析一下服务端的创建过程具体是怎样的:](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题附答案解析,大汇总.md#5简单解析一下服务端的创建过程具体是怎样的:) +**6、** [Netty 的可扩展如何体现](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题附答案解析,大汇总.md#6Netty-的可扩展如何体现) +**7、** [NIO 是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题附答案解析,大汇总.md#7NIO-是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题附答案解析,大汇总.md) + +## Netty最新2021年面试题,高级面试题及附答案解析 + +**1、** [Netty 的高性能体现在哪方面](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题,高级面试题及附答案解析.md#1Netty-的高性能体现在哪方面) +**2、** [BIO、NIO和AIO的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题,高级面试题及附答案解析.md#2BIONIO和AIO的区别) +**3、** [为什么需要心跳机制?Netty 中心跳机制了解么?](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题,高级面试题及附答案解析.md#3为什么需要心跳机制Netty-中心跳机制了解么) +**4、** [BIO、NIO 和 AIO 的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题,高级面试题及附答案解析.md#4BIONIO-和-AIO-的区别) +**5、** [BIO、NIO 有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题,高级面试题及附答案解析.md#5BIONIO-有什么区别) +**6、** [Netty 是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题,高级面试题及附答案解析.md#6Netty-是什么) +**7、** [EventloopGroup 了解么?和 EventLoop 啥关系?](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题,高级面试题及附答案解析.md#7EventloopGroup-了解么和-EventLoop-啥关系) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Netty/Netty最新2021年面试题,高级面试题及附答案解析.md) + +## Nginx最新2021年面试题大汇总,附答案 + +**1、** [Nginx的优缺点?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题大汇总,附答案.md#1Nginx的优缺点) +**2、** [请列举Nginx的一些特性?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题大汇总,附答案.md#2请列举Nginx的一些特性) +**3、** [Nginx服务器上的Master和Worker进程分别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题大汇总,附答案.md#3Nginx服务器上的Master和Worker进程分别是什么) +**4、** [正常限制访问频率(正常流量)](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题大汇总,附答案.md#4正常限制访问频率正常流量) +**5、** [fastcgi 与 cgi 的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题大汇总,附答案.md#5fastcgi-与-cgi-的区别) +**6、** [请解释是否有可能将 Nginx 的错误替换为 502 错误、503?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题大汇总,附答案.md#6请解释是否有可能将-Nginx-的错误替换为-502-错误503) +**7、** [请解释 Nginx 如何处理 HTTP 请求?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题大汇总,附答案.md#7请解释-Nginx-如何处理-HTTP-请求) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题大汇总,附答案.md) + +## Nginx最新2021年面试题附答案解析,大汇总 + +**1、** [在 Nginx 中,如何使用未定义的服务器名称来阻止处理请求?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题附答案解析,大汇总.md#1在-Nginx-中如何使用未定义的服务器名称来阻止处理请求) +**2、** [为什么Nginx性能这么高?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题附答案解析,大汇总.md#2为什么Nginx性能这么高) +**3、** [什么是正向代理和反向代理?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题附答案解析,大汇总.md#3什么是正向代理和反向代理) +**4、** [Rewrite全局变量是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题附答案解析,大汇总.md#4Rewrite全局变量是什么) +**5、** [请解释 Nginx 服务器上的 Master 和 Worker 进程分别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题附答案解析,大汇总.md#5请解释-Nginx-服务器上的-Master-和-Worker-进程分别是什么) +**6、** [为什么要用Nginx?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题附答案解析,大汇总.md#6为什么要用Nginx) +**7、** [Nginx 有哪些负载均衡策略?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题附答案解析,大汇总.md#7Nginx-有哪些负载均衡策略) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题附答案解析,大汇总.md) + +## Nginx最新2021年面试题,高级面试题及附答案解析 + +**1、** [轮询(默认)](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题,高级面试题及附答案解析.md#1轮询默认) +**2、** [为什么要做动静分离?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题,高级面试题及附答案解析.md#2为什么要做动静分离) +**3、** [权重 weight](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题,高级面试题及附答案解析.md#3权重-weight) +**4、** [如何用Nginx解决前端跨域问题?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题,高级面试题及附答案解析.md#4如何用Nginx解决前端跨域问题) +**5、** [怎么限制浏览器访问?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题,高级面试题及附答案解析.md#5怎么限制浏览器访问) +**6、** [请解释你如何通过不同于 80 的端口开启 Nginx?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题,高级面试题及附答案解析.md#6请解释你如何通过不同于-80-的端口开启-Nginx) +**7、** [请解释什么是`C10K`问题?](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题,高级面试题及附答案解析.md#7请解释什么是C10K问题) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Nginx/Nginx最新2021年面试题,高级面试题及附答案解析.md) + +## Memcached最新2021年面试题,高级面试题及附答案解析 + +**1、** [Memcached是怎么工作的?](https://github.com/souyunku/DevBooks/blob/master/docs/Memcached/Memcached最新2021年面试题,高级面试题及附答案解析.md#1Memcached是怎么工作的) +**2、** [Memcached能接受的key的最大长度是多少?](https://github.com/souyunku/DevBooks/blob/master/docs/Memcached/Memcached最新2021年面试题,高级面试题及附答案解析.md#2Memcached能接受的key的最大长度是多少) +**3、** [简述Memcached内存管理机制原理?](https://github.com/souyunku/DevBooks/blob/master/docs/Memcached/Memcached最新2021年面试题,高级面试题及附答案解析.md#3简述Memcached内存管理机制原理) +**4、** [Memcached最大能存储多大的单个item?](https://github.com/souyunku/DevBooks/blob/master/docs/Memcached/Memcached最新2021年面试题,高级面试题及附答案解析.md#4Memcached最大能存储多大的单个item) +**5、** [Memcached与Redis的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Memcached/Memcached最新2021年面试题,高级面试题及附答案解析.md#5Memcached与Redis的区别) +**6、** [Memcached能够更有效地使用内存吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Memcached/Memcached最新2021年面试题,高级面试题及附答案解析.md#6Memcached能够更有效地使用内存吗) +**7、** [如果缓存数据在导出导入之间过期了,您又怎么处理这些数据呢?](https://github.com/souyunku/DevBooks/blob/master/docs/Memcached/Memcached最新2021年面试题,高级面试题及附答案解析.md#7如果缓存数据在导出导入之间过期了您又怎么处理这些数据呢) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Memcached/Memcached最新2021年面试题,高级面试题及附答案解析.md) + +## Python最新2021年面试题及答案,汇总版 + +**1、** [在Python中有多少种运算符?解释一下算数运算符。](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题及答案,汇总版.md#1在Python中有多少种运算符解释一下算数运算符。) +**2、** [什么是断言(assert)?应用场景?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题及答案,汇总版.md#2什么是断言assert应用场景) +**3、** [什么是封装?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题及答案,汇总版.md#3什么是封装) +**4、** [什么是反射,以及应用场景](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题及答案,汇总版.md#4什么是反射以及应用场景) +**5、** [类的加载和实例化过程](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题及答案,汇总版.md#5类的加载和实例化过程) +**6、** [请解释使用*args和**kwargs的含义](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题及答案,汇总版.md#6请解释使用*args和**kwargs的含义) +**7、** [break、continue、pass是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题及答案,汇总版.md#7breakcontinuepass是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题及答案,汇总版.md) + +## Python最新2021年面试题大汇总,附答案 + +**1、** [Redis中默认有多少个哈希槽](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题大汇总,附答案.md#1Redis中默认有多少个哈希槽) +**2、** [b、B、kB、MB、GB的关系](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题大汇总,附答案.md#2bBkBMBGB的关系) +**3、** [a=range(10),则a[::-3]的值是?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题大汇总,附答案.md#3a=range10,则a[::-3]的值是) +**4、** [在python中如何拷贝一个对象,并说明他们之间的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题大汇总,附答案.md#4在python中如何拷贝一个对象并说明他们之间的区别) +**5、** [什么是C/S和B/S架构](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题大汇总,附答案.md#5什么是C/S和B/S架构) +**6、** [实例方法、静态方法和类方法的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题大汇总,附答案.md#6实例方法静态方法和类方法的区别) +**7、** [怎么移除一个字符串中的前导空格?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题大汇总,附答案.md#7怎么移除一个字符串中的前导空格) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题大汇总,附答案.md) + +## Python最新2021年面试题附答案解析,大汇总 + +**1、** [解释re模块的split()、sub()、subn()方法?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题附答案解析,大汇总.md#1解释re模块的splitsubsubn方法) +**2、** [22、iterables和iterators之间的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题附答案解析,大汇总.md#222iterables和iterators之间的区别) +**3、** [!=和is not运算符的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题附答案解析,大汇总.md#3=和is-not运算符的区别) +**4、** [Python支持多重继承吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题附答案解析,大汇总.md#4Python支持多重继承吗) +**5、** [Python中的标识符长度能有多长?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题附答案解析,大汇总.md#5Python中的标识符长度能有多长) +**6、** [请列出至少5个PEP8规范](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题附答案解析,大汇总.md#6请列出至少5个PEP8规范) +**7、** [是否使用过functools中的函数?他的作用是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题附答案解析,大汇总.md#7是否使用过functools中的函数他的作用是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题附答案解析,大汇总.md) + +## Python最新2021年面试题,高级面试题及附答案解析 + +**1、** [解决哈希冲突的算法有哪几种?分别有什么特点?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题,高级面试题及附答案解析.md#1解决哈希冲突的算法有哪几种分别有什么特点) +**2、** [曾经使用过哪些前端框架](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题,高级面试题及附答案解析.md#2曾经使用过哪些前端框架) +**3、** [如何修改本地hosts文件](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题,高级面试题及附答案解析.md#3如何修改本地hosts文件) +**4、** [简述Redis的有几种持久化策略以及比较?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题,高级面试题及附答案解析.md#4简述Redis的有几种持久化策略以及比较) +**5、** [解释一下Python中的继承?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题,高级面试题及附答案解析.md#5解释一下Python中的继承) +**6、** [使用生成器编写一个函数实现生成指定个数的斐波那契数列](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题,高级面试题及附答案解析.md#6使用生成器编写一个函数实现生成指定个数的斐波那契数列) +**7、** [什么是cdn](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题,高级面试题及附答案解析.md#7什么是cdn) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新2021年面试题,高级面试题及附答案解析.md) + +## Python最新基础面试题及答案整理 + +**1、** [有两个字符串列表a和b,每个字符串是由逗号隔开的一些字符](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新基础面试题及答案整理.md#1有两个字符串列表a和b每个字符串是由逗号隔开的一些字符) +**2、** [怎样声明多个变量并赋值?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新基础面试题及答案整理.md#2怎样声明多个变量并赋值) +**3、** [super的作用](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新基础面试题及答案整理.md#3super的作用) +**4、** [有如下代码:](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新基础面试题及答案整理.md#4有如下代码:) +**5、** [有如下链表类,请实现单链表逆置。](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新基础面试题及答案整理.md#5有如下链表类请实现单链表逆置。) +**6、** [什么是c3算法?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新基础面试题及答案整理.md#6什么是c3算法) +**7、** [编写程序,检查数字是否为Armstrong](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新基础面试题及答案整理.md#7编写程序检查数字是否为Armstrong) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新基础面试题及答案整理.md) + +## Python最新面试题2021年,常见面试题及答案汇总 + +**1、** [输入一个字符串,输出该字符串的字符的所有组合。如输入'abc',输出a,b,c,ab,ac,bc,abc.](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题2021年,常见面试题及答案汇总.md#1输入一个字符串输出该字符串的字符的所有组合。如输入'abc',输出a,b,c,ab,ac,bc,abc) +**2、** [使用python将数据库的student表中的数据写入db.txt](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题2021年,常见面试题及答案汇总.md#2使用python将数据库的student表中的数据写入dbtxt) +**3、** [如何在函数中设置一个全局变量?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题2021年,常见面试题及答案汇总.md#3如何在函数中设置一个全局变量) +**4、** [Python中的闭包是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题2021年,常见面试题及答案汇总.md#4Python中的闭包是什么) +**5、** [如何用一行代码生成[1,4,9,16,25,36,49,64,81,100]?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题2021年,常见面试题及答案汇总.md#5如何用一行代码生成[1,4,9,16,25,36,49,64,81,100]) +**6、** [前后端分离的基本原理](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题2021年,常见面试题及答案汇总.md#6前后端分离的基本原理) +**7、** [解释Python中reduce函数的用法?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题2021年,常见面试题及答案汇总.md#7解释Python中reduce函数的用法) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题2021年,常见面试题及答案汇总.md) + +## Python最新面试题及答案整理,汇总版 + +**1、** [如何更改列表的数据类型?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案整理,汇总版.md#1如何更改列表的数据类型) +**2、** [用一行Python代码,从给定列表中取出所有的偶数和奇数](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案整理,汇总版.md#2用一行Python代码从给定列表中取出所有的偶数和奇数) +**3、** [在什么情况下y!=x-(x-y)会成立?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案整理,汇总版.md#3在什么情况下y=x-x-y会成立) +**4、** [Python中使用的zip函数是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案整理,汇总版.md#4Python中使用的zip函数是什么) +**5、** [编写程序,打印斐波那契数列的前十项](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案整理,汇总版.md#5编写程序打印斐波那契数列的前十项) +**6、** [索引有什么作用,有哪些分类,有什么好处和坏处?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案整理,汇总版.md#6索引有什么作用有哪些分类有什么好处和坏处) +**7、** [简述多进程开发中join和deamon的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案整理,汇总版.md#7简述多进程开发中join和deamon的区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案整理,汇总版.md) + +## Python最新面试题及答案附答案汇总 + +**1、** [索引再什么情况下遵循最左前缀的规则?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案附答案汇总.md#1索引再什么情况下遵循最左前缀的规则) +**2、** [python递归的最大层数?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案附答案汇总.md#2python递归的最大层数) +**3、** [什么是twisted框架](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案附答案汇总.md#3什么是twisted框架) +**4、** [对列表[3,1,-4,-2]按照绝对值排序](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案附答案汇总.md#4对列表[3,1,-4,-2]按照绝对值排序) +**5、** [什么是Python?为什么它会如此流行?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案附答案汇总.md#5什么是Python为什么它会如此流行) +**6、** [字节码和机器码的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案附答案汇总.md#6字节码和机器码的区别) +**7、** [lambda表达式格式以及应用场景?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案附答案汇总.md#7lambda表达式格式以及应用场景) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题及答案附答案汇总.md) + +## Python最新面试题,2021年面试题及答案汇总 + +**1、** [求下面代码结果](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,2021年面试题及答案汇总.md#1求下面代码结果) +**2、** [如何基于Redis实现发布和订阅](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,2021年面试题及答案汇总.md#2如何基于Redis实现发布和订阅) +**3、** [Python中的字典是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,2021年面试题及答案汇总.md#3Python中的字典是什么) +**4、** [python中enumerate的意思是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,2021年面试题及答案汇总.md#4python中enumerate的意思是什么) +**5、** [MySQL常见数据库引擎及区别](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,2021年面试题及答案汇总.md#5MySQL常见数据库引擎及区别) +**6、** [列表中保留顺序和不保留顺序去重](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,2021年面试题及答案汇总.md#6列表中保留顺序和不保留顺序去重) +**7、** [什么是闭包](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,2021年面试题及答案汇总.md#7什么是闭包) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,2021年面试题及答案汇总.md) + +## Python最新面试题,常见面试题及答案汇总 + +**1、** [获取python解释器版本的方法](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,常见面试题及答案汇总.md#1获取python解释器版本的方法) +**2、** [简述线程死锁是怎么造成的。如何避免?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,常见面试题及答案汇总.md#2简述线程死锁是怎么造成的。如何避免) +**3、** [路由器和交换机的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,常见面试题及答案汇总.md#3路由器和交换机的区别) +**4、** [Python中append,insert和extend的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,常见面试题及答案汇总.md#4Python中appendinsert和extend的区别) +**5、** [编写一个函数,找出数组中没有重复的值的和](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,常见面试题及答案汇总.md#5编写一个函数找出数组中没有重复的值的和) +**6、** [python中如何使用进程池和线程池](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,常见面试题及答案汇总.md#6python中如何使用进程池和线程池) +**7、** [数据库的导入与导出命令](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,常见面试题及答案汇总.md#7数据库的导入与导出命令) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python最新面试题,常见面试题及答案汇总.md) + +## Python高级面试题及答案,企业真面试题 + +**1、** [什么是域名解析](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python高级面试题及答案,企业真面试题.md#1什么是域名解析) +**2、** [怎样将字符串转换为小写?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python高级面试题及答案,企业真面试题.md#2怎样将字符串转换为小写) +**3、** [简述jsonp及其原理](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python高级面试题及答案,企业真面试题.md#3简述jsonp及其原理) +**4、** [讲讲Python中的位运算符](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python高级面试题及答案,企业真面试题.md#4讲讲Python中的位运算符) +**5、** [在Python中如何使用多进制数字?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python高级面试题及答案,企业真面试题.md#5在Python中如何使用多进制数字) +**6、** [解释Python中map()函数?](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python高级面试题及答案,企业真面试题.md#6解释Python中map函数) +**7、** [MySQL如何创建索引](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python高级面试题及答案,企业真面试题.md#7MySQL如何创建索引) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Python/Python高级面试题及答案,企业真面试题.md) + +## Android最新2021年面试题大汇总,附答案 + +**1、** [谈MVC ,MVP,MVVM](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题大汇总,附答案.md#1谈MVC-MVPMVVM) +**2、** [AIDL的全称是什么?如何工作?能处理哪些类型的数据?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题大汇总,附答案.md#2AIDL的全称是什么如何工作能处理哪些类型的数据) +**3、** [ListView 可以显示多种类型的条目吗](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题大汇总,附答案.md#3ListView-可以显示多种类型的条目吗) +**4、** [ListView 中图片错位的问题是如何产生的](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题大汇总,附答案.md#4ListView-中图片错位的问题是如何产生的) +**5、** [andorid 应用第二次登录实现自动登录](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题大汇总,附答案.md#5andorid-应用第二次登录实现自动登录) +**6、** [什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题大汇总,附答案.md#6什么是嵌入式实时操作系统,-Android-操作系统属于实时操作系统吗) +**7、** [如何将SQLite数据库(dictionary.db文件)与apk文件一起发布](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题大汇总,附答案.md#7如何将SQLite数据库dictionarydb文件与apk文件一起发布) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题大汇总,附答案.md) + +## Android最新2021年面试题附答案解析,大汇总 + +**1、** [jni 的调用过程?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题附答案解析,大汇总.md#1jni-的调用过程) +**2、** [音视频相关类](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题附答案解析,大汇总.md#2音视频相关类) +**3、** [Activity间通过Intent传递数据大小有没有限制?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题附答案解析,大汇总.md#3Activity间通过Intent传递数据大小有没有限制) +**4、** [如何保存activity的状态?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题附答案解析,大汇总.md#4如何保存activity的状态) +**5、** [怎样对 android 进行优化?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题附答案解析,大汇总.md#5怎样对-android-进行优化) +**6、** [activity的启动模式有哪些?是什么含义](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题附答案解析,大汇总.md#6activity的启动模式有哪些是什么含义) +**7、** [属性动画](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题附答案解析,大汇总.md#7属性动画) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题附答案解析,大汇总.md) + +## Android最新2021年面试题,高级面试题及附答案解析 + +**1、** [Service生命周期](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题,高级面试题及附答案解析.md#1Service生命周期) +**2、** [Android 判断SD卡是否存在](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题,高级面试题及附答案解析.md#2Android-判断SD卡是否存在) +**3、** [内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题,高级面试题及附答案解析.md#3内存溢出和内存泄漏有什么区别何时会产生内存泄漏) +**4、** [如何在 ScrollView 中如何嵌入 ListView](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题,高级面试题及附答案解析.md#4如何在-ScrollView-中如何嵌入-ListView) +**5、** [事件分发中的 onTouch 和 onTouchEvent 有什么区别,又该如何使用?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题,高级面试题及附答案解析.md#5事件分发中的-onTouch-和-onTouchEvent-有什么区别又该如何使用) +**6、** [Android中常用布局](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题,高级面试题及附答案解析.md#6Android中常用布局) +**7、** [Intent 传递数据时,可以传递哪些类型数据?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题,高级面试题及附答案解析.md#7Intent-传递数据时可以传递哪些类型数据) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新2021年面试题,高级面试题及附答案解析.md) + +## Android最新面试题2021年,常见面试题及答案汇总 + +**1、** [简述TCP,UDP,Socket](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题2021年,常见面试题及答案汇总.md#1简述TCPUDPSocket) +**2、** [属性动画,例如一个 button 从 A 移动到 B 点,B 点还是可以响应点击事件,这个原理是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题2021年,常见面试题及答案汇总.md#2属性动画例如一个-button-从-A-移动到-B-点B-点还是可以响应点击事件这个原理是什么) +**3、** [谈谈你对 Bitmap 的理解, 什么时候应该手动调用 bitmap.recycle()](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题2021年,常见面试题及答案汇总.md#3谈谈你对-Bitmap-的理解,-什么时候应该手动调用-bitmaprecycle) +**4、** [系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题2021年,常见面试题及答案汇总.md#4系统上安装了多种浏览器能否指定某浏览器访问指定页面请说明原由。) +**5、** [RecyclerView和ListView的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题2021年,常见面试题及答案汇总.md#5RecyclerView和ListView的区别) +**6、** [java中如何引用本地语言](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题2021年,常见面试题及答案汇总.md#6java中如何引用本地语言) +**7、** [请描述下Activity的生命周期。](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题2021年,常见面试题及答案汇总.md#7请描述下Activity的生命周期。) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题2021年,常见面试题及答案汇总.md) + +## Android最新面试题及答案附答案汇总 + +**1、** [Android 引入广播机制的用意](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题及答案附答案汇总.md#1Android-引入广播机制的用意) +**2、** [内存泄露如何查看和解决](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题及答案附答案汇总.md#2内存泄露如何查看和解决) +**3、** [定位项目中,如何选取定位方案,如何平衡耗电与实时位置的精度?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题及答案附答案汇总.md#3定位项目中如何选取定位方案如何平衡耗电与实时位置的精度) +**4、** [如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题及答案附答案汇总.md#4如果后台的Activity由于某原因被系统回收了如何在被系统回收之前保存当前状态) +**5、** [什么是 IntentService?有何优点?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题及答案附答案汇总.md#5什么是-IntentService有何优点) +**6、** [什么是aar?aar是jar有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题及答案附答案汇总.md#6什么是aaraar是jar有什么区别) +**7、** [Serializable 和 Parcelable 的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题及答案附答案汇总.md#7Serializable-和-Parcelable-的区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题及答案附答案汇总.md) + +## Android最新面试题,2021年面试题及答案汇总 + +**1、** [Fragment 如何实现类似 Activity 栈的压栈和出栈效果的?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题,2021年面试题及答案汇总.md#1Fragment-如何实现类似-Activity-栈的压栈和出栈效果的) +**2、** [为什么Android引入广播机制?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题,2021年面试题及答案汇总.md#2为什么Android引入广播机制) +**3、** [AIDL 的全称是什么?如何工作?能处理哪些类型的数据?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题,2021年面试题及答案汇总.md#3AIDL-的全称是什么如何工作能处理哪些类型的数据) +**4、** [android系统的优势和不足](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题,2021年面试题及答案汇总.md#4android系统的优势和不足) +**5、** [activity在屏幕旋转时的生命周期](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题,2021年面试题及答案汇总.md#5activity在屏幕旋转时的生命周期) +**6、** [如何将打开res aw目录中的数据库文件?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题,2021年面试题及答案汇总.md#6如何将打开res-aw目录中的数据库文件) +**7、** [Android的四大组件是哪些,它们的作用?](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题,2021年面试题及答案汇总.md#7Android的四大组件是哪些它们的作用) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Android/Android最新面试题,2021年面试题及答案汇总.md) + +## Vue最新2021年面试题及答案,汇总版 + +**1、** [如何通过类别名获取 dom 元素](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题及答案,汇总版.md#1如何通过类别名获取-dom-元素) +**2、** [解释JS中的高阶函数?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题及答案,汇总版.md#2解释JS中的高阶函数) +**3、** [module.exports 和 exports 之间有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题及答案,汇总版.md#3moduleexports-和-exports-之间有什么区别) +**4、** [解释一下什么是 promise ?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题及答案,汇总版.md#4解释一下什么是-promise-) +**5、** [怎么定义vue-router的动态路由?怎么获取传过来的动态参数?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题及答案,汇总版.md#5怎么定义vue-router的动态路由怎么获取传过来的动态参数) +**6、** [如何封装一个vue组件?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题及答案,汇总版.md#6如何封装一个vue组件) +**7、** [子组件更新过程](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题及答案,汇总版.md#7子组件更新过程) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题及答案,汇总版.md) + +## Vue最新2021年面试题大汇总,附答案 + +**1、** [如何在JS中编码和解码](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题大汇总,附答案.md#1如何在JS中编码和解码) +**2、** [vue生命周期的作用是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题大汇总,附答案.md#2vue生命周期的作用是什么) +**3、** [vue中transition的理解?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题大汇总,附答案.md#3vue中transition的理解) +**4、** [导航钩子有哪些?它们有哪些参数?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题大汇总,附答案.md#4导航钩子有哪些它们有哪些参数) +**5、** [vue与react、angular的比较?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题大汇总,附答案.md#5vue与reactangular的比较) +**6、** [你们vue项目是打包了一个js文件,一个css文件,还是有多个文件?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题大汇总,附答案.md#6你们vue项目是打包了一个js文件一个css文件还是有多个文件) +**7、** [vue常用的UI组件库](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题大汇总,附答案.md#7vue常用的UI组件库) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题大汇总,附答案.md) + +## Vue最新2021年面试题附答案解析,大汇总 + +**1、** [Vue事件绑定原理说一下](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题附答案解析,大汇总.md#1Vue事件绑定原理说一下) +**2、** [vue和jQuery的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题附答案解析,大汇总.md#2vue和jQuery的区别) +**3、** [说出几种vue当中的指令和它的用法?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题附答案解析,大汇总.md#3说出几种vue当中的指令和它的用法) +**4、** [delete和Vue.delete删除数组的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题附答案解析,大汇总.md#4delete和Vuedelete删除数组的区别) +**5、** [vue与angular的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题附答案解析,大汇总.md#5vue与angular的区别) +**6、** [如何让CSS只在当前组件中起作用?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题附答案解析,大汇总.md#6如何让CSS只在当前组件中起作用) +**7、** [vue-router实现路由懒加载( 动态加载路由 )](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题附答案解析,大汇总.md#7vue-router实现路由懒加载-动态加载路由-) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题附答案解析,大汇总.md) + +## Vue最新2021年面试题,高级面试题及附答案解析 + +**1、** [vue常用的修饰符](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题,高级面试题及附答案解析.md#1vue常用的修饰符) +**2、** [v-modal的使用。](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题,高级面试题及附答案解析.md#2v-modal的使用。) +**3、** [请详细说下你对vue生命周期的理解?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题,高级面试题及附答案解析.md#3请详细说下你对vue生命周期的理解) +**4、** [如何在单页 Vue 应用(SPA)中实现路由?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题,高级面试题及附答案解析.md#4如何在单页-Vue-应用SPA中实现路由) +**5、** [$nextTick的使用](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题,高级面试题及附答案解析.md#5$nextTick的使用) +**6、** [JS中有哪些不同类型的弹出框可用](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题,高级面试题及附答案解析.md#6JS中有哪些不同类型的弹出框可用) +**7、** [如何在现有函数中添加新属性](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题,高级面试题及附答案解析.md#7如何在现有函数中添加新属性) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新2021年面试题,高级面试题及附答案解析.md) + +## Vue最新面试题2021年,常见面试题及答案汇总 + +**1、** [v-show 与 v-if 指令有何不同?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题2021年,常见面试题及答案汇总.md#1v-show-与-v-if-指令有何不同) +**2、** [Vue2中注册在router-link上事件无效解决方法](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题2021年,常见面试题及答案汇总.md#2Vue2中注册在router-link上事件无效解决方法) +**3、** [对于作为元素实现的注释框,我们希望使用户能够按下键盘上的Enter键,来将内容提交给名为 “storeComment” 的方法。在代码中对此进行演示。](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题2021年,常见面试题及答案汇总.md#3对于作为元素实现的注释框我们希望使用户能够按下键盘上的Enter键来将内容提交给名为-“storeComment-的方法。在代码中对此进行演示。) +**4、** [列出JS中的一些设计模式:](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题2021年,常见面试题及答案汇总.md#4列出JS中的一些设计模式:) +**5、** [为什么Vue被称为“渐进框架”?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题2021年,常见面试题及答案汇总.md#5为什么Vue被称为“渐进框架) +**6、** [vue更新数组时触发视图更新的方法?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题2021年,常见面试题及答案汇总.md#6vue更新数组时触发视图更新的方法) +**7、** [什么是组件?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题2021年,常见面试题及答案汇总.md#7什么是组件) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题2021年,常见面试题及答案汇总.md) + +## Vue最新面试题及答案整理,汇总版 + +**1、** [Vue-router跳转和location.href有什么区别](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案整理,汇总版.md#1Vue-router跳转和locationhref有什么区别) +**2、** [简单说一下Vue2.x响应式数据原理](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案整理,汇总版.md#2简单说一下Vue2x响应式数据原理) +**3、** [VUE的生命周期及理解?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案整理,汇总版.md#3VUE的生命周期及理解) +**4、** [axios及安装?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案整理,汇总版.md#4axios及安装) +**5、** [vue-router 是什么?它有哪些组件](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案整理,汇总版.md#5vue-router-是什么它有哪些组件) +**6、** [如何在JS中克隆对象](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案整理,汇总版.md#6如何在JS中克隆对象) +**7、** [说一下v-if和v-show的区别](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案整理,汇总版.md#7说一下v-if和v-show的区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案整理,汇总版.md) + +## Vue最新面试题及答案附答案汇总 + +**1、** [开发人员经常使用字母 “vm” 作为变量名来声明根 Vue 实例。例如 const vm = new Vue()。在这种情况下,“vm”指的是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案附答案汇总.md#1开发人员经常使用字母-“vm-作为变量名来声明根-Vue-实例。例如-const-vm-=-new-Vue。在这种情况下“vm指的是什么) +**2、** [active-class 是哪个组件的属性?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案附答案汇总.md#2active-class-是哪个组件的属性) +**3、** [简述每个周期具体适合哪些场景](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案附答案汇总.md#3简述每个周期具体适合哪些场景) +**4、** [JS中的匿名函数是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案附答案汇总.md#4JS中的匿名函数是什么) +**5、** [vue-router实现懒加载的方式?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案附答案汇总.md#5vue-router实现懒加载的方式) +**6、** [vue-router有哪几种导航钩子?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案附答案汇总.md#6vue-router有哪几种导航钩子) +**7、** [组件中的data为什么是一个函数?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案附答案汇总.md#7组件中的data为什么是一个函数) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题及答案附答案汇总.md) + +## Vue最新面试题,2021年面试题及答案汇总 + +**1、** [vue优点?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题,2021年面试题及答案汇总.md#1vue优点) +**2、** [vue.cli中怎样使用自定义的组件?有遇到过哪些问题吗?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题,2021年面试题及答案汇总.md#2vuecli中怎样使用自定义的组件有遇到过哪些问题吗) +**3、** [解释 JS 事件委托模型?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题,2021年面试题及答案汇总.md#3解释-JS-事件委托模型) +**4、** [再说一下Computed和Watch](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题,2021年面试题及答案汇总.md#4再说一下Computed和Watch) +**5、** [如何从子组件发出自定义事件?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题,2021年面试题及答案汇总.md#5如何从子组件发出自定义事件) +**6、** [mint-ui是什么?怎么使用?说出至少三个组件使用方法?](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题,2021年面试题及答案汇总.md#6mint-ui是什么怎么使用说出至少三个组件使用方法) +**7、** [说一下Vue的生命周期](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题,2021年面试题及答案汇总.md#7说一下Vue的生命周期) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/Vue/Vue最新面试题,2021年面试题及答案汇总.md) + +## 前端最新2021年面试题及答案,汇总版 + +**1、** [说说你对作用域链的理解](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题及答案,汇总版.md#1说说你对作用域链的理解) +**2、** [webSocket 如何兼容低版本浏览器?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题及答案,汇总版.md#2webSocket-如何兼容低版本浏览器) +**3、** [使用箭头函数应注意什么?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题及答案,汇总版.md#3使用箭头函数应注意什么) +**4、** [语义化的理解](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题及答案,汇总版.md#4语义化的理解) +**5、** [html5有哪些新特性、移除了那些元素?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题及答案,汇总版.md#5html5有哪些新特性移除了那些元素) +**6、** [png、jpg、gif 这些图片格式解释一下,分别什么时候用。有没有了解过webp?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题及答案,汇总版.md#6pngjpggif-这些图片格式解释一下分别什么时候用。有没有了解过webp) +**7、** [你如何对网站的文件和资源进行优化?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题及答案,汇总版.md#7你如何对网站的文件和资源进行优化) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题及答案,汇总版.md) + +## 前端最新2021年面试题大汇总,附答案 + +**1、** [CSS新特性](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题大汇总,附答案.md#1CSS新特性) +**2、** [闭包](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题大汇总,附答案.md#2闭包) +**3、** [DOM事件模型和事件流?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题大汇总,附答案.md#3DOM事件模型和事件流) +**4、** [谈一下你对网页标准和标准制定机构重要性的理解。](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题大汇总,附答案.md#4谈一下你对网页标准和标准制定机构重要性的理解。) +**5、** [平时工作中怎么样进行数据交互?如果后台没有提供数据怎么样进行开发?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题大汇总,附答案.md#5平时工作中怎么样进行数据交互如果后台没有提供数据怎么样进行开发) +**6、** [元素竖向的百分比设定是相对于容器的高度吗?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题大汇总,附答案.md#6元素竖向的百分比设定是相对于容器的高度吗) +**7、** [!! 运算符能做什么?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题大汇总,附答案.md#7-运算符能做什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题大汇总,附答案.md) + +## 前端最新2021年面试题附答案解析,大汇总 + +**1、** [什么是 event.target ?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题附答案解析,大汇总.md#1什么是-eventtarget-) +**2、** [为什么利用多个域名来存储网站资源?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题附答案解析,大汇总.md#2为什么利用多个域名来存储网站资源) +**3、** [css3有哪些新特性](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题附答案解析,大汇总.md#3css3有哪些新特性) +**4、** [Function.prototype.apply 方法的用途是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题附答案解析,大汇总.md#4Functionprototypeapply-方法的用途是什么) +**5、** [关于建站安全防护](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题附答案解析,大汇总.md#5关于建站安全防护) +**6、** [使用 CSS 预处理器吗?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题附答案解析,大汇总.md#6使用-CSS-预处理器吗) +**7、** [什么是事件捕获?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题附答案解析,大汇总.md#7什么是事件捕获) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题附答案解析,大汇总.md) + +## 前端最新2021年面试题,高级面试题及附答案解析 + +**1、** [静态网页和动态网页区别:](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题,高级面试题及附答案解析.md#1静态网页和动态网页区别:) +**2、** [表格自动换行怎么实现?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题,高级面试题及附答案解析.md#2表格自动换行怎么实现) +**3、** [说出几个http协议状态码?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题,高级面试题及附答案解析.md#3说出几个http协议状态码) +**4、** [HTML5的文件离线储存怎么使用,工作原理是什么](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题,高级面试题及附答案解析.md#4HTML5的文件离线储存怎么使用工作原理是什么) +**5、** [absolute的containing block计算方式跟正常流有什么不同?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题,高级面试题及附答案解析.md#5absolute的containing-block计算方式跟正常流有什么不同) +**6、** [Label 的作用是什么?是怎么用的?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题,高级面试题及附答案解析.md#6Label-的作用是什么是怎么用的) +**7、** [JS引用方法](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题,高级面试题及附答案解析.md#7JS引用方法) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新2021年面试题,高级面试题及附答案解析.md) + +## 前端最新基础面试题及答案整理 + +**1、** [JS作用域及作用域链](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新基础面试题及答案整理.md#1JS作用域及作用域链) +**2、** [行内元素和块级元素](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新基础面试题及答案整理.md#2行内元素和块级元素) +**3、** [JavaScript 中的虚值是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新基础面试题及答案整理.md#3JavaScript-中的虚值是什么) +**4、** [选择器优先级是怎样的?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新基础面试题及答案整理.md#4选择器优先级是怎样的) +**5、** [什么是移动端的300ms延迟?什么是点击穿透?解决方案?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新基础面试题及答案整理.md#5什么是移动端的300ms延迟什么是点击穿透解决方案) +**6、** [异步加载JS的方式有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新基础面试题及答案整理.md#6异步加载JS的方式有哪些) +**7、** [Promise 是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新基础面试题及答案整理.md#7Promise-是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新基础面试题及答案整理.md) + +## 前端最新面试题2021年,常见面试题及答案汇总 + +**1、** [为什么要初始化CSS样式?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题2021年,常见面试题及答案汇总.md#1为什么要初始化CSS样式) +**2、** [webpack的缺点](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题2021年,常见面试题及答案汇总.md#2webpack的缺点) +**3、** [commonjs?requirejs?AMD|CMD|UMD?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题2021年,常见面试题及答案汇总.md#3commonjsrequirejsAMD|CMD|UMD) +**4、** [CSS 如何阻塞文档解析?(浏览器解析过程)](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题2021年,常见面试题及答案汇总.md#4CSS-如何阻塞文档解析浏览器解析过程) +**5、** [JavaScript原型,原型链 ? 有什么特点?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题2021年,常见面试题及答案汇总.md#5JavaScript原型原型链--有什么特点) +**6、** [前端需要注意哪些 SEO ?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题2021年,常见面试题及答案汇总.md#6前端需要注意哪些-SEO-) +**7、** [label的作用是什么? 是怎么用的?**](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题2021年,常见面试题及答案汇总.md#7label的作用是什么-是怎么用的**) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题2021年,常见面试题及答案汇总.md) + +## 前端最新面试题及答案整理,汇总版 + +**1、** [说说你对promise的了解](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案整理,汇总版.md#1说说你对promise的了解) +**2、** [iframe框架有那些优缺点](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案整理,汇总版.md#2iframe框架有那些优缺点) +**3、** [AMD和CMD是什么?它们的区别有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案整理,汇总版.md#3AMD和CMD是什么它们的区别有哪些) +**4、** [v-show与v-if区别](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案整理,汇总版.md#4v-show与v-if区别) +**5、** [无样式内容闪烁(FOUC)Flash of Unstyle Content**](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案整理,汇总版.md#5无样式内容闪烁FOUCFlash-of-Unstyle-Content**) +**6、** [CSS优化](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案整理,汇总版.md#6CSS优化) +**7、** [box-sizing、transition、translate分别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案整理,汇总版.md#7box-sizingtransitiontranslate分别是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案整理,汇总版.md) + +## 前端最新面试题及答案附答案汇总 + +**1、** [行内元素定义](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案附答案汇总.md#1行内元素定义) +**2、** [解决异步回调地狱](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案附答案汇总.md#2解决异步回调地狱) +**3、** [如何创建一个没有 prototype(原型)的对象?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案附答案汇总.md#3如何创建一个没有-prototype原型的对象) +**4、** [Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案附答案汇总.md#4Doctype作用-严格模式与混杂模式如何区分它们有何意义) +**5、** [什么是 ES6 模块?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案附答案汇总.md#5什么是-ES6-模块) +**6、** [H5新特性:](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案附答案汇总.md#6H5新特性:) +**7、** [同步和异步的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案附答案汇总.md#7同步和异步的区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题及答案附答案汇总.md) + +## 前端最新面试题,2021年面试题及答案汇总 + +**1、** [什么是重绘和回流?(浏览器绘制过程)](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,2021年面试题及答案汇总.md#1什么是重绘和回流浏览器绘制过程) +**2、** [为什么在 JS 中比较两个相似的对象时返回 false?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,2021年面试题及答案汇总.md#2为什么在-JS-中比较两个相似的对象时返回-false) +**3、** [HTML元素的显示优先级?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,2021年面试题及答案汇总.md#3HTML元素的显示优先级) +**4、** [undefined 和 null 有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,2021年面试题及答案汇总.md#4undefined-和-null-有什么区别) +**5、** [浏览器解析过程:](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,2021年面试题及答案汇总.md#5浏览器解析过程:) +**6、** [那些操作会造成内存泄漏?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,2021年面试题及答案汇总.md#6那些操作会造成内存泄漏) +**7、** [HTML5 有哪些新特性、移除了那些元素?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,2021年面试题及答案汇总.md#7HTML5-有哪些新特性移除了那些元素) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,2021年面试题及答案汇总.md) + +## 前端最新面试题,常见面试题及答案汇总 + +**1、** [谁是c的构造函数?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,常见面试题及答案汇总.md#1谁是c的构造函数) +**2、** [页面可见性(Page Visibility API) 可以有哪些用途?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,常见面试题及答案汇总.md#2页面可见性Page-Visibility-API-可以有哪些用途) +**3、** [JavaScript优化](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,常见面试题及答案汇总.md#3JavaScript优化) +**4、** [javascript有哪些方法定义对象](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,常见面试题及答案汇总.md#4javascript有哪些方法定义对象) +**5、** [什么是包装对象(wrapper object)?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,常见面试题及答案汇总.md#5什么是包装对象wrapper-object) +**6、** [eval是做什么的?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,常见面试题及答案汇总.md#6eval是做什么的) +**7、** [defer和async](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,常见面试题及答案汇总.md#7defer和async) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端最新面试题,常见面试题及答案汇总.md) + +## 前端面试题及答案整理汇总,2021年最新版 + +**1、** [promise对象的用法,手写一个promise](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理汇总,2021年最新版.md#1promise对象的用法,手写一个promise) +**2、** [组件之间的传值通信](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理汇总,2021年最新版.md#2组件之间的传值通信) +**3、** [数组的排序方法(sort)?排序?汉字排序?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理汇总,2021年最新版.md#3数组的排序方法sort排序汉字排序) +**4、** [什么是作用域和作用域链?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理汇总,2021年最新版.md#4什么是作用域和作用域链) +**5、** [如何检查值是否虚值?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理汇总,2021年最新版.md#5如何检查值是否虚值) +**6、** [事件流?事件捕获?事件冒泡?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理汇总,2021年最新版.md#6事件流事件捕获事件冒泡) +**7、** [MVVM](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理汇总,2021年最新版.md#7MVVM) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理汇总,2021年最新版.md) + +## 前端面试题及答案整理,2021年最新,汇总版 + +**1、** [HTTP状态码及其含义](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理,2021年最新,汇总版.md#1HTTP状态码及其含义) +**2、** [一个满屏品字布局如何设计?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理,2021年最新,汇总版.md#2一个满屏品字布局如何设计) +**3、** [HTTP状态码](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理,2021年最新,汇总版.md#3HTTP状态码) +**4、** [数据持久化技术(ajax)?简述ajax流程###](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理,2021年最新,汇总版.md#4数据持久化技术ajax简述ajax流程###) +**5、** [key](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理,2021年最新,汇总版.md#5key) +**6、** [什么是Ajax和JSON,它们的优点和缺点](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理,2021年最新,汇总版.md#6什么是Ajax和JSON它们的优点和缺点) +**7、** [get请求传参长度的误区](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理,2021年最新,汇总版.md#7get请求传参长度的误区) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题及答案整理,2021年最新,汇总版.md) + +## 前端面试题大汇总,2021年附答案解析 + +**1、** [你对浏览器的理解?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题大汇总,2021年附答案解析.md#1你对浏览器的理解) +**2、** [介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题大汇总,2021年附答案解析.md#2介绍一下标准的CSS的盒子模型低版本IE的盒子模型有什么不同的) +**3、** [原型和原型链](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题大汇总,2021年附答案解析.md#3原型和原型链) +**4、** [页面导入样式时,使用link和@import有什么区别](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题大汇总,2021年附答案解析.md#4页面导入样式时使用link和@import有什么区别) +**5、** [让页面里的字体变清晰,变细用CSS怎么做?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题大汇总,2021年附答案解析.md#5让页面里的字体变清晰变细用CSS怎么做) +**6、** [介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题大汇总,2021年附答案解析.md#6介绍一下标准的CSS的盒子模型与低版本IE的盒子模型有什么不同的) +**7、** [HTML5 的 form 的自动完成功能是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题大汇总,2021年附答案解析.md#7HTML5-的-form-的自动完成功能是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端面试题大汇总,2021年附答案解析.md) + +## 前端高级面试题及答案,2021版 + +**1、** [编写一个 getElementsByClassName 封装函数?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,2021版.md#1编写一个-getElementsByClassName-封装函数) +**2、** [用过哪些设计模式?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,2021版.md#2用过哪些设计模式) +**3、** [如何解决跨域问题](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,2021版.md#3如何解决跨域问题) +**4、** [网络分层](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,2021版.md#4网络分层) +**5、** [什么是哈希表?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,2021版.md#5什么是哈希表) +**6、** [几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,2021版.md#6几种基本数据类型复杂数据类型值类型和引用数据类型堆栈数据结构) +**7、** [get和post的区别](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,2021版.md#7get和post的区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,2021版.md) + +## 前端高级面试题及答案,企业真面试题 + +**1、** [keep-alive](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,企业真面试题.md#1keep-alive) +**2、** [对 web 标准、可用性、可访问性的理解](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,企业真面试题.md#2对-web-标准可用性可访问性的理解) +**3、** [页面从输入URL到页面加载显示完成,这个过程中都发生了什么?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,企业真面试题.md#3页面从输入URL到页面加载显示完成这个过程中都发生了什么) +**4、** [如何创建块级格式化上下文(block formatting context),BFC有什么用](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,企业真面试题.md#4如何创建块级格式化上下文block-formatting-context,BFC有什么用) +**5、** [清除浮动的几种方式,各自的优缺点](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,企业真面试题.md#5清除浮动的几种方式各自的优缺点) +**6、** [面试常问](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,企业真面试题.md#6面试常问) +**7、** [谈谈你对重构的理解](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,企业真面试题.md#7谈谈你对重构的理解) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题及答案,企业真面试题.md) + +## 前端高级面试题合集,附答案解析 + +**1、** [HTTP状态码及其含义](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题合集,附答案解析.md#1HTTP状态码及其含义) +**2、** [margin和padding分别适合什么场景使用?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题合集,附答案解析.md#2margin和padding分别适合什么场景使用) +**3、** [什么是FOUC?如何避免](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题合集,附答案解析.md#3什么是FOUC如何避免) +**4、** [什么是 `async/await` 及其如何工作?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题合集,附答案解析.md#4什么是-async/await-及其如何工作) +**5、** [常见的浏览器端的存储技术有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题合集,附答案解析.md#5常见的浏览器端的存储技术有哪些) +**6、** [视差滚动效果?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题合集,附答案解析.md#6视差滚动效果) +**7、** [行内元素有哪些?块级元素有哪些? 空(void)元素有那些?行内元素和块级元素有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题合集,附答案解析.md#7行内元素有哪些块级元素有哪些-空void元素有那些行内元素和块级元素有什么区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题合集,附答案解析.md) + +## 前端高级面试题整理及答案 + +**1、** [介绍一下你对浏览器内核的理解?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题整理及答案.md#1介绍一下你对浏览器内核的理解) +**2、** [说说严格模式的限制](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题整理及答案.md#2说说严格模式的限制) +**3、** [null,undefined 的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题整理及答案.md#3nullundefined-的区别) +**4、** [请解释什么是事件代理](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题整理及答案.md#4请解释什么是事件代理) +**5、** [HTML5 的离线储存怎么使用,工作原理能不能解释一下?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题整理及答案.md#5HTML5-的离线储存怎么使用工作原理能不能解释一下) +**6、** [Iframe的作用?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题整理及答案.md#6Iframe的作用) +**7、** [闭包](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题整理及答案.md#7闭包) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题整理及答案.md) + +## 前端高级面试题,中级面试题,大汇总 + +**1、** [在新窗口打开链接的方法是?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题,中级面试题,大汇总.md#1在新窗口打开链接的方法是) +**2、** [如何理解同步和异步?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题,中级面试题,大汇总.md#2如何理解同步和异步) +**3、** [每个HTML文件里开头都有个很重要的东西,Doctype,知道这是干什么的吗?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题,中级面试题,大汇总.md#3每个HTML文件里开头都有个很重要的东西Doctype知道这是干什么的吗) +**4、** [常见的兼容性问题?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题,中级面试题,大汇总.md#4常见的兼容性问题) +**5、** [水平垂直居中](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题,中级面试题,大汇总.md#5水平垂直居中) +**6、** [补充get和post请求在缓存方面的区别](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题,中级面试题,大汇总.md#6补充get和post请求在缓存方面的区别) +**7、** [如何处理 HTML5 新标签的浏览器兼容问题?](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题,中级面试题,大汇总.md#7如何处理-HTML5-新标签的浏览器兼容问题) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/前端/前端高级面试题,中级面试题,大汇总.md) + +## JavaScript最新2021年面试题及答案,汇总版 + +**1、** [声明函数作用提升?声明变量和声明函数的提升有什么区别](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题及答案,汇总版.md#1声明函数作用提升声明变量和声明函数的提升有什么区别) +**2、** [["1", "2", "3"].map(parseInt) 答案是多少?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题及答案,汇总版.md#2["1",-"2",-"3"]mapparseInt-答案是多少) +**3、** [!! 运算符能做什么?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题及答案,汇总版.md#3-运算符能做什么) +**4、** [vue、react、angular](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题及答案,汇总版.md#4vuereactangular) +**5、** [什么是AJAX?如何实现?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题及答案,汇总版.md#5什么是AJAX如何实现) +**6、** [$(function(){})和window.onload 和 $(document).ready(function(){})](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题及答案,汇总版.md#6$function{}和windowonload-和-$documentreadyfunction{}) +**7、** [为什么typeof null 返回 object?如何检查一个值是否为 null?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题及答案,汇总版.md#7为什么typeof-null-返回-object如何检查一个值是否为-null) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题及答案,汇总版.md) + +## JavaScript最新2021年面试题大汇总,附答案 + +**1、** [如何copy一个dom元素?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题大汇总,附答案.md#1如何copy一个dom元素) +**2、** [sessionStorage和localstroage与cookie之间有什么关联, cookie最大存放多少字节](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题大汇总,附答案.md#2sessionStorage和localstroage与cookie之间有什么关联,-cookie最大存放多少字节) +**3、** [实现异步的方式有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题大汇总,附答案.md#3实现异步的方式有哪些) +**4、** [数据持久化技术(ajax)?简述ajax流程###](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题大汇总,附答案.md#4数据持久化技术ajax简述ajax流程###) +**5、** [什么是对象解构?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题大汇总,附答案.md#5什么是对象解构) +**6、** [通过new创建一个对象的时候,函数内部有哪些改变###](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题大汇总,附答案.md#6通过new创建一个对象的时候函数内部有哪些改变###) +**7、** [同步异步?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题大汇总,附答案.md#7同步异步) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题大汇总,附答案.md) + +## JavaScript最新2021年面试题附答案解析,大汇总 + +**1、** [Promise 是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题附答案解析,大汇总.md#1Promise-是什么) +**2、** [自执行函数?用于什么场景?好处?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题附答案解析,大汇总.md#2自执行函数用于什么场景好处) +**3、** [Function.prototype.apply 方法的用途是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题附答案解析,大汇总.md#3Functionprototypeapply-方法的用途是什么) +**4、** [如何合并两个数组?数组删除一个元素?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题附答案解析,大汇总.md#4如何合并两个数组数组删除一个元素) +**5、** [如何在一行中计算多个表达式的值?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题附答案解析,大汇总.md#5如何在一行中计算多个表达式的值) +**6、** [说说严格模式的限制](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题附答案解析,大汇总.md#6说说严格模式的限制) +**7、** [什么是回调函数?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题附答案解析,大汇总.md#7什么是回调函数) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题附答案解析,大汇总.md) + +## JavaScript最新2021年面试题,高级面试题及附答案解析 + +**1、** [变量作用域?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题,高级面试题及附答案解析.md#1变量作用域) +**2、** [事件委托?有什么好处?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题,高级面试题及附答案解析.md#2事件委托有什么好处) +**3、** [渐进增强和优雅降级](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题,高级面试题及附答案解析.md#3渐进增强和优雅降级) +**4、** [手动实现`Array.prototype.reduce`方法](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题,高级面试题及附答案解析.md#4手动实现Arrayprototypereduce方法) +**5、** [为什么要有同源限制?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题,高级面试题及附答案解析.md#5为什么要有同源限制) +**6、** [如何通过原生js 判断一个元素当前是显示还是隐藏状态?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题,高级面试题及附答案解析.md#6如何通过原生js-判断一个元素当前是显示还是隐藏状态) +**7、** [什么是预编译语音|预编译处理器?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题,高级面试题及附答案解析.md#7什么是预编译语音|预编译处理器) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新2021年面试题,高级面试题及附答案解析.md) + +## JavaScript最新面试题2021年,常见面试题及答案汇总 + +**1、** [什么是 `async/await` 及其如何工作?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题2021年,常见面试题及答案汇总.md#1什么是-async/await-及其如何工作) +**2、** [ECMAScript 是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题2021年,常见面试题及答案汇总.md#2ECMAScript-是什么) +**3、** [手动实现`Array.prototype.filter`方法](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题2021年,常见面试题及答案汇总.md#3手动实现Arrayprototypefilter方法) +**4、** [介绍js有哪些内置对象?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题2021年,常见面试题及答案汇总.md#4介绍js有哪些内置对象) +**5、** [手动实现缓存方法](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题2021年,常见面试题及答案汇总.md#5手动实现缓存方法) +**6、** [作用域和执行上下文的区别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题2021年,常见面试题及答案汇总.md#6作用域和执行上下文的区别是什么) +**7、** [ajax请求方式有几种(8种)?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题2021年,常见面试题及答案汇总.md#7ajax请求方式有几种8种) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题2021年,常见面试题及答案汇总.md) + +## JavaScript最新面试题及答案整理,汇总版 + +**1、** [如何检查值是否虚值?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案整理,汇总版.md#1如何检查值是否虚值) +**2、** [有哪些数据类型?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案整理,汇总版.md#2有哪些数据类型) +**3、** [如何理解同步和异步?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案整理,汇总版.md#3如何理解同步和异步) +**4、** [请解释什么是事件代理](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案整理,汇总版.md#4请解释什么是事件代理) +**5、** [什么是`Set`对象,它是如何工作的?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案整理,汇总版.md#5什么是Set对象它是如何工作的) +**6、** [undefined 和 null 有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案整理,汇总版.md#6undefined-和-null-有什么区别) +**7、** [你有哪些性能优化的方法?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案整理,汇总版.md#7你有哪些性能优化的方法) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案整理,汇总版.md) + +## JavaScript最新面试题及答案附答案汇总 + +**1、** [|| 运算符能做什么](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案附答案汇总.md#1||-运算符能做什么) +**2、** [如何解决跨域问题?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案附答案汇总.md#2如何解决跨域问题) +**3、** [简述ajax执行流程](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案附答案汇总.md#3简述ajax执行流程) +**4、** [介绍js的基本数据类型](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案附答案汇总.md#4介绍js的基本数据类型) +**5、** [闭包](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案附答案汇总.md#5闭包) +**6、** [强制转换 显式转换 隐式转换?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案附答案汇总.md#6强制转换-显式转换-隐式转换) +**7、** [那些操作会造成内存泄漏?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案附答案汇总.md#7那些操作会造成内存泄漏) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题及答案附答案汇总.md) + +## JavaScript最新面试题,2021年面试题及答案汇总 + +**1、** [怎么理解Promise对象?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题,2021年面试题及答案汇总.md#1怎么理解Promise对象) +**2、** [什么是 event.currentTarget??](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题,2021年面试题及答案汇总.md#2什么是-eventcurrentTarget) +**3、** [`require`/`import`之间的区别?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题,2021年面试题及答案汇总.md#3require/import之间的区别) +**4、** [this指向的各种情况都有什么?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题,2021年面试题及答案汇总.md#4this指向的各种情况都有什么) +**5、** [JS是如何实现异步的?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题,2021年面试题及答案汇总.md#5JS是如何实现异步的) +**6、** [new操作符具体干了什么呢?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题,2021年面试题及答案汇总.md#6new操作符具体干了什么呢) +**7、** [typeof?typeof [ ]返回数据类型是?](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题,2021年面试题及答案汇总.md#7typeoftypeof-[-]返回数据类型是) + +### [此处,仅展示前7道,查看更多40道...](https://github.com/souyunku/DevBooks/blob/master/docs/JavaScript/JavaScript最新面试题,2021年面试题及答案汇总.md) + +## HTML最新2021年面试题大汇总,附答案 + +**1、** [如何在页面上实现一个圆形的可点击区域](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题大汇总,附答案.md#1如何在页面上实现一个圆形的可点击区域) +**2、** [HTML5 的 form 的自动完成功能是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题大汇总,附答案.md#2HTML5-的-form-的自动完成功能是什么) +**3、** [`HTML5`的离线储存怎么使用,工作原理能不能解释一下?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题大汇总,附答案.md#3HTML5的离线储存怎么使用工作原理能不能解释一下) +**4、** [label的作用是什么? 是怎么用的?**](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题大汇总,附答案.md#4label的作用是什么-是怎么用的**) +**5、** [Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题大汇总,附答案.md#5Doctype作用-严格模式与混杂模式如何区分它们有何意义) +**6、** [实现不使用 border 画出 1 px 高的线,在不同浏览器的标准模式与怪异模式下都能保持一致的效果。](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题大汇总,附答案.md#6实现不使用-border-画出-1-px-高的线在不同浏览器的标准模式与怪异模式下都能保持一致的效果。) +**7、** [如何实现浏览器内多个标签页之间的通信?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题大汇总,附答案.md#7如何实现浏览器内多个标签页之间的通信) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题大汇总,附答案.md) + +## HTML最新2021年面试题附答案解析,大汇总 + +**1、** [浏览器架构](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题附答案解析,大汇总.md#1浏览器架构) +**2、** [为什么操作 DOM 慢?(浏览器绘制过程)](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题附答案解析,大汇总.md#2为什么操作-DOM-慢浏览器绘制过程) +**3、** [网页验证码是干嘛的,是为了解决什么安全问题?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题附答案解析,大汇总.md#3网页验证码是干嘛的是为了解决什么安全问题) +**4、** [async 和 defer 的作用是什么?有什么区别?(浏览器解析过程)](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题附答案解析,大汇总.md#4async-和-defer-的作用是什么有什么区别浏览器解析过程) +**5、** [position几个属性的作用?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题附答案解析,大汇总.md#5position几个属性的作用) +**6、** [iframe框架有那些优缺点](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题附答案解析,大汇总.md#6iframe框架有那些优缺点) +**7、** [DOCTYPE 的作用是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题附答案解析,大汇总.md#7DOCTYPE-的作用是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题附答案解析,大汇总.md) + +## HTML最新2021年面试题,高级面试题及附答案解析 + +**1、** [HTML全局属性(global attribute)有哪些](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题,高级面试题及附答案解析.md#1HTML全局属性global-attribute有哪些) +**2、** [页面导入样式时,使用link和@import有什么区别](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题,高级面试题及附答案解析.md#2页面导入样式时使用link和@import有什么区别) +**3、** [HTML元素的显示优先级?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题,高级面试题及附答案解析.md#3HTML元素的显示优先级) +**4、** [`` 的 title 和 alt 有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题,高级面试题及附答案解析.md#4-的-title-和-alt-有什么区别) +**5、** [改变元素的外边距用什么属性?改变元素的内填充用什么属性?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题,高级面试题及附答案解析.md#5改变元素的外边距用什么属性改变元素的内填充用什么属性) +**6、** [HTTP状态码及其含义](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题,高级面试题及附答案解析.md#6HTTP状态码及其含义) +**7、** [你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题,高级面试题及附答案解析.md#7你做的页面在哪些流览器测试过这些浏览器的内核分别是什么) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新2021年面试题,高级面试题及附答案解析.md) + +## HTML最新面试题2021年,常见面试题及答案汇总 + +**1、** [块级元素定义](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新面试题2021年,常见面试题及答案汇总.md#1块级元素定义) +**2、** [简述对Web 语义化的理解?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新面试题2021年,常见面试题及答案汇总.md#2简述对Web-语义化的理解) +**3、** [行内元素有哪些?块级元素有哪些?CSS的盒模型?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新面试题2021年,常见面试题及答案汇总.md#3行内元素有哪些块级元素有哪些CSS的盒模型) +**4、** [常见的浏览器端的存储技术有哪些?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新面试题2021年,常见面试题及答案汇总.md#4常见的浏览器端的存储技术有哪些) +**5、** [常见的浏览器内核比较](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新面试题2021年,常见面试题及答案汇总.md#5常见的浏览器内核比较) +**6、** [你对浏览器的理解?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新面试题2021年,常见面试题及答案汇总.md#6你对浏览器的理解) +**7、** [Canvas 和 SVG 有什么区别?](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新面试题2021年,常见面试题及答案汇总.md#7Canvas-和-SVG-有什么区别) + +### [此处,仅展示前7道,查看更多30道...](https://github.com/souyunku/DevBooks/blob/master/docs/HTML/HTML最新面试题2021年,常见面试题及答案汇总.md) -[Spring Boot 中使用 Java API 调用 lucene](http://www.ymq.io/2017/11/06/lucene-example/) diff --git "a/docs/Android/Android\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\345\244\247\346\261\207\346\200\273\357\274\214\351\231\204\347\255\224\346\241\210.md" "b/docs/Android/Android\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\345\244\247\346\261\207\346\200\273\357\274\214\351\231\204\347\255\224\346\241\210.md" new file mode 100644 index 0000000..f71681d --- /dev/null +++ "b/docs/Android/Android\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\345\244\247\346\261\207\346\200\273\357\274\214\351\231\204\347\255\224\346\241\210.md" @@ -0,0 +1,159 @@ +# Android最新2021年面试题大汇总,附答案 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、RecyclerView和ListView的区别 + +缓存上:前者缓存的是View+ViewHolder+flag,不用每次调用findViewById,后者则只是缓存View + +刷新数据方面,前者提供了局部刷新,后者则全部刷新 + + +### 2、Service和Thread的区别? + +servie是系统的组件,它由系统进程托管(servicemanager);它们之间的通信类似于client和server,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息的一种ipc。而thread是由本应用程序托管。1)、Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。 + +2)、Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。 + +既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿 Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。 + +举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。 + +因此你可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。 + + +### 3、如何将SQLite数据库(dictionary.db文件)与apk文件一起发布 + +把这个文件放在/res/raw目录下即可。res\raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件,会生成资源id。 + + +### 4、ListView 如何提高其效率? + +当 convertView 为空时,用 setTag()方法为每个 View 绑定一个存放控件的 ViewHolder 对象。当convertView 不为空, 重复利用已经创建的 view 的时候, 使用 getTag()方法获取绑定的 ViewHolder对象,这样就避免了 findViewById 对控件的层层查询,而是快速定位到控件。 复用 ConvertView,使用历史的 view,提升效率 200% + +自定义静态类 ViewHolder,减少 findViewById 的次数。提升效率 50% + +异步加载数据,分页加载数据。 + +使用 WeakRefrence 引用 ImageView 对象 + + +### 5、谈谈对Android NDK的理解 + +NDK是一系列工具的集合.NDK提供了一系列的工具,帮助开发者快速开发C或C++的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的.NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU,平台,ABI等差异,开发人员只需要简单修改 mk文件(指出"哪些文件需要编译","编译特性要求"等),就可以创建出so. + +NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作.NDK提供了一份稳定,功能有限的API头文件声明. + +Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API.从该版本的NDK中看出,这些 API支持的功能非常有限,包含有:C标准库(libc),标准数学库(libm ),压缩库(libz),Log库(liblog). + + +### 6、Android中的长度单位详解 + +``` +Px:像素 +Sp与dp也是长度单位,但是与屏幕的单位密度无关。 +``` + + +### 7、Android与服务器交互的方式中的对称加密和非对称加密是什么? + +对称加密,就是加密和解密数据都是使用同一个key,这方面的算法有DES。 + +非对称加密,加密和解密是使用不同的key。发送数据之前要先和服务端约定生成公钥和私钥,使用公钥加密的数据可以用私钥解密,反之。这方面的算法有RSA。ssh 和 ssl都是典型的非对称加密。 + + +### 8、消息推送的方式 + +**1、** 使用极光和友盟推送。 + +**2、** 使用XMPP协议(Openfire + Spark + Smack) + +**简介:**基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织完成了标准化工作。 + +**优点:**协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有开源的Java版的开发实例androidpn。 + +**缺点:**协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。 + +**3、** 使用MQTT协议(更多信息见:[mqtt.org/)][mqtt.org] + +**简介:**轻量级的、基于代理的“发布/订阅”模式的消息传输协议。 + +**优点:**协议简洁、小巧、可扩展性强、省流量、省电,目前已经应用到企业领域(参考:[mqtt.org/software),且…][mqtt.org_software] + +**缺点:**不够成熟、实现较复杂、服务端组件rsmb不开源,部署硬件成本较高。 + +**4、** 使用HTTP轮循方式 + +**简介:**定时向HTTP服务端接口(Web Service API)获取最新消息。 + +**优点:**实现简单、可控性强,部署硬件成本低。 + +**缺点:**实时性差。 + + +### 9、String,StringBuffer,StringBuilder的区别 + +String不可改变对象,一旦创建就不能修改 + +``` +String str="aaa"; +str="bbb"; +``` + +以上代码虽然改变了str,但是执行过程是回收str,把值赋给一个新的str + +StringBuffer创建之后,可以去修改 + +StringBuilder也可修改,执行效率高于StringBuffer,不安全 + +当字符赋值少使用String + +字符赋值频繁使用StringBuilder + +当多个线程同步操作数据,使用StringBuffer + + +### 10、Service 里面可以弹吐司么 + +可以。 + + +### 11、都使用过哪些自定义控件 +### 12、Android中常用布局 +### 13、谈谈Android的IPC(进程间通信)机制 +### 14、请解释下Android程序运行时权限与文件系统权限的区别。 +### 15、sim卡的EF文件是什么?有何作用 +### 16、跟activity和Task 有关的 Intent启动方式有哪些?其含义? +### 17、View的绘制原理 +### 18、Manifest.xml文件中主要包括哪些信息? +### 19、如何在 ScrollView 中如何嵌入 ListView +### 20、请描述下Activity的生命周期。 +### 21、如果Listview中的数据源发生改变,如何更新listview中的数据 +### 22、Android 应用中验证码登陆都有哪些实现方案 +### 23、音视频相关类 +### 24、Android中4大组件 +### 25、注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。 +### 26、说说 ContentProvider、ContentResolver、ContentObserver 之间的关系 +### 27、Android中任务栈的分配 +### 28、activity,service,intent之间的关系 +### 29、谈谈你对 Bitmap 的理解, 什么时候应该手动调用 bitmap.recycle() + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Android/Android\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220\357\274\214\345\244\247\346\261\207\346\200\273.md" "b/docs/Android/Android\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220\357\274\214\345\244\247\346\261\207\346\200\273.md" new file mode 100644 index 0000000..fa8776d --- /dev/null +++ "b/docs/Android/Android\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220\357\274\214\345\244\247\346\261\207\346\200\273.md" @@ -0,0 +1,206 @@ +# Android最新2021年面试题附答案解析,大汇总 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、说下Activity 的四种启动模式、应用场景 ? + +standard 标准模式: 每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在,此模式的 Activity 默认会进入启动它的 Activity 所属的任务栈中; singleTop 栈顶复用模式: 如果新 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,同时会回调 onNewIntent方法,如果新 Activity 实例已经存在但不在栈顶,那么Activity 依然会被重新创建; + +singleTask 栈内复用模式: 只要 Activity 在一个任务栈中存在,那么多次启动此 Activity 都不会重新创建实例,并回调onNewIntent 方法,此模式启动 Activity A,系统首先会寻找是否存在 A 想要的任务栈,如果不存在,就会重新创建一个任务栈,然后把创建好 A 的实例放到栈中; + +singleInstance单实例模式: 这是一种加强的 singleTask 模式,具有此种模式的 Activity 只能单独地位于一个任务栈中,且此任务栈中只有唯一一个实例; + + +### 2、请描述一下 Intent 和 IntentFilter + +``` +Intent是组件的通讯使者,可以在组件间传递消息和数据。 +IntentFilter是intent的筛选器,可以对intent的action,data,catgory,uri这些属性进行筛选,确定符合的目标组件。 +``` + + +### 3、activity与fragment区别 + +生命周期: + +fragment从创建倒销毁整个生命周期依次为onAttach()→onCreate()→onCreateView()→onActivityCreated()→onStart()→onResume()→onPause()→onStop()→onDestroyView()→onDestroy()→onDetach() + +**与activity不同的方法有** + +**1、** onAttach():当Fragment和Activity建立关联的时候调用; + +**2、** onCreateView():当Fragment创建视图调用; + +**3、** onActivityCreated:与Fragment相关联的Activity完成onCreate()之后调用; + +**4、** onDestoryView():在Fragment中的布局被移除时调用; + +**5、** onDetach():当Fragment和Activity解除关联时调用; + +**6、** activity常用的生命周期只有以下几个; + +**7、** onCreate(): 表示 Activity 正在被创建,常用来 初始化工作,比如调用 setContentView 加载界面布局资源,初始化 Activity 所需数据等; + +**8、** onRestart():表示 Activity 正在重新启动,一般情况下,当前Acitivty 从不可见重新变为可见时,OnRestart就会被调用; + +**9、** onStart(): 表示 Activity 正在被启动,此时 Activity 可见但不在前台,还处于后台,无法与用户交互; + +**10、** onResume(): 表示 Activity 获得焦点,此时 Activity 可见且在前台并开始活动,这是与 onStart 的区别所在; + +**11、** onPause(): 表示 Activity 正在停止,此时可做一些 存储数据、停止动画等工作,但是不能太耗时,因为这会影响到新 Activity的显示,onPause 必须先执行完,新 Activity 的 onResume 才会执行; + +**12、** onStop(): 表示 Activity 即将停止,可以做一些稍微重量级的回收工作,比如注销广播接收器、关闭网络连接等,同样不能太耗时; + +**13、** onDestroy(): 表示 Activity 即将被销毁,这是 Activity 生命周期中的最后一个回调,常做 回收工作、资源释放; + +**14、** 区别: + +**15、** Fragment比Activity多出四个回调周期,控制操作上更灵活; + +**16、** Fragment可以在xml文件中直接写入,也可以在Activity中动态添加; + +**17、** Fragment可以使用show()/hide()或者replace()对Fragment进行切换,切换的时候不会出现明显的效果,Activity切换的时候会有明显的翻页或其他效果; + + +### 4、android系统的优势和不足 + +Android平台手机 5大优势: + +**一、开放性** + +在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。 + +**二、挣脱运营商的束缚** + +在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年iPhone 上市 ,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈,当你可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近。 + +**三、丰富的硬件选择** + +这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,好比你从诺基亚 Symbian风格手机 一下改用苹果 iPhone ,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移,是不是非常方便呢? + +**四、不受任何限制的开发商** + +Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如可控制正是留给Android难题之一。 + +**五、无缝结合的Google应用** + +如今叱诧互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。 + +**再说Android的5大不足:** + +**一、安全和隐私** + +由于手机 与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹,Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。 + +**二、首先开卖Android手机的不是最大运营商** + +众所周知,T-Mobile在23日,于美国纽约发布 了Android首款手机G1。但是在北美市场,最大的两家运营商乃AT&T和Verizon,而目前所知取得Android手机销售权的仅有 T-Mobile和Sprint,其中T-Mobile的3G网络相对于其他三家也要逊色不少,因此,用户可以买账购买G1,能否体验到最佳的3G网络服务则要另当别论了! + +**三、运营商仍然能够影响到Android手机** + +在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这样的情况在国外市场同样出现。Android手机的另一发售运营商Sprint就将在其机型中内置其手机商店程序。 + +**四、同类机型用户减少** + +在不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源。而对于Android平台手机,由于厂商丰富,产品类型多样,这样使用同一款机型的用户越来越少,缺少统一机型的程序强化。举个稍显不当的例子,现在山寨机泛滥,品种各异,就很少有专门针对某个型号山寨机的讨论和群组,除了哪些功能异常抢眼、颇受追捧的机型以外。 + +**五、过分依赖开发商缺少标准配置** + +在使用PC端的Windows Xp系统的时候,都会内置微软Windows Media Player这样一个浏览器程序,用户可以选择更多样的播放器,如Realplay或暴风影音等。但入手开始使用默认的程序同样可以应付多样的需要。在 Android平台中,由于其开放性,软件更多依赖第三方厂商,比如Android系统的SDK中就没有内置音乐 播放器,全部依赖第三方开发,缺少了产品的统一性。 + + +### 5、跨进程通信的几种方式 + +Intent,比如拨打电话 + +ContentProvider数据库存储数据 + +Broadcast广播通信 + +AIDL通信,通过接口共享数据 + + +### 6、描述下Handler 机制 + +**1、** Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。 + +**2、** Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。 + +**3、** Message Queue(消息队列):用来存放线程放入的消息。 + +**4、** 线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。 + +Hander持有对UI主线程消息队列MessageQueue和消息循环Looper的引用,子线程可以通过Handler将消息发送到UI线程的消息队列MessageQueue中。 + + +### 7、Android 线程间通信有哪几种方式(重要) + +``` +共享内存(变量); +文件,数据库; +Handler; +Java 里的 wait(),notify(),notifyAll() +``` + + +### 8、ListView 中图片错位的问题是如何产生的 + +图片错位问题的本质源于我们的 listview 使用了缓存 convertView, 假设一种场景, 一个 listview一屏显示九个 item,那么在拉出第十个 item 的时候,事实上该 item 是重复使用了第一个 item,也就是说在第一个 item 从网络中下载图片并最终要显示的时候,其实该 item 已经不在当前显示区域内了,此时显示的后果将可能在第十个 item 上输出图像,这就导致了图片错位的问题。所以解决办法就是可见则显示,不可见则不显示。 + + +### 9、activity,fragment传值问题 + +通过Bundle传值,在activty定义变量传值,扩展fragment创建传值 + + +### 10、Serializable 和 Parcelable 的区别? + +如果存储在内存中,推荐使用parcelable,使用serialiable在序列化的时候会产生大量的临时变量,会引起频繁的GC + +如果存储在硬盘上,推荐使用Serializable,虽然serializable效率较低 + +Serializable的实现:只需要实现Serializable接口,就会自动生成一个序列化id + +Parcelable的实现:需要实现Parcelable接口,还需要Parcelable.CREATER变量 + + +### 11、定位项目中,如何选取定位方案,如何平衡耗电与实时位置的精度? +### 12、开发中都使用过哪些框架、平台 +### 13、android的数据存储 +### 14、请介绍下Android中常用的五种布局。 +### 15、AIDL的全称是什么?如何工作?能处理哪些类型的数据? +### 16、AIDL 的全称是什么?如何工作?能处理哪些类型的数据? +### 17、NDK是什么 +### 18、Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么? +### 19、Activity的状态有几种? +### 20、请介绍下 ContentProvider 是如何实现数据共享的 +### 21、Hander原理 +### 22、9.进程和线程的区别 +### 23、Android i18n +### 24、ListView 可以显示多种类型的条目吗 +### 25、如何将一个Activity设置成窗口的样式。 +### 26、描述一下android的系统架构 +### 27、什么是 AIDL?如何使用? +### 28、AsyncTask +### 29、了解IntentServices吗? +### 30、Android的四大组件是哪些,它们的作用? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Android/Android\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\357\274\214\351\253\230\347\272\247\351\235\242\350\257\225\351\242\230\345\217\212\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220.md" "b/docs/Android/Android\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\357\274\214\351\253\230\347\272\247\351\235\242\350\257\225\351\242\230\345\217\212\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220.md" new file mode 100644 index 0000000..f32bb3f --- /dev/null +++ "b/docs/Android/Android\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\357\274\214\351\253\230\347\272\247\351\235\242\350\257\225\351\242\230\345\217\212\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220.md" @@ -0,0 +1,167 @@ +# Android最新2021年面试题,高级面试题及附答案解析 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、如何将SQLite数据库(dictionary.db文件)与apk文件一起发布 + +解可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res aw目录中 + + +### 2、Fragment中add与replace的区别? + +add不会重新初始化fragment,replace每次都会; + +添加相同的fragment时,replace不会有任何变化,add会报IllegalStateException 异常; + +replace 先 remove 掉相同 id 的所有 fragment,然后在add 当前的这个 fragment,而 add 是覆盖前一个fragment。所以如果使用 add 一般会伴随 hide()和show(),避免布局重叠; + +使用 add,如果应用放在后台,或以其他方式被系统销毁,再打开时,hide()中引用的 fragment 会销毁,所以依然会出现布局重叠 bug,可以使用 replace 或使用 add时,添加一个 tag 参数; + + +### 3、Activity启动模式 + +介绍 Android 启动模式之前,先介绍两个概念task和taskAffinity + +**task:** + +翻译过来就是“任务”,是一组相互有关联的 activity 集合,可以理解为 Activity 是在 task 里面活动的。 task 存在于一个称为 back stack 的数据结构中,也就是说, task 是以栈的形式去管理 activity 的,所以也叫可以称为“任务栈”。 + +**taskAffinity:** + +官方文档解释是:"The task that the activity has an affinity for.",可以翻译为 activity 相关或者亲和的任务,这个参数标识了一个 Activity 所需要的任务栈的名字。默认情况下,所有Activity所需的任务栈的名字为应用的包名。 taskAffinity 属性主要和 singleTask 启动模式或者 allowTaskReparenting 属性配对使用。 + +**4种启动模式** + +**1、** standard: + +标准模式,也是系统默认的启动模式。假如 activity A 启动了 activity B , activity B 则会运行在 activity A 所在的任务栈中。而且每次启动一个 Activity ,都会重新创建新的实例,不管这个实例在任务中是否已经存在。非 Activity 类型的 context (如 ApplicationContext )启动 standard 模式的 Activity 时会报错。非 Activity 类型的 context 并没有所谓的任务栈,由于上面第 1 点的原因所以系统会报错。此解决办法就是为待启动 Activity 指定 FLAG_ACTIVITY_NEW_TASK 标记位,这样启动的时候系统就会为它创建一个新的任务栈。这个时候待启动 Activity 其实是以 singleTask 模式启动的。 + +**2、** singleTop: + +栈顶复用模式。假如 activity A 启动了 activity B ,就会判断 A 所在的任务栈栈顶是否是 B 的实例。如果是,则不创建新的 activity B 实例而是直接引用这个栈顶实例,同时 onNewIntent 方法会被回调,通过该方法的参数可以取得当前请求的信息;如果不是,则创建新的 activity B 实例。 + +**3、** singleTask: + +栈内复用模式。在第一次启动这个 Activity 时,系统便会创建一个新的任务,并且初始化 Activity 的实例,放在新任务的底部。不过需要满足一定条件的。那就是需要设置 taskAffinity 属性。前面也说过了, taskAffinity 属性是和 singleTask 模式搭配使用的。 + +![92_4.png][92_4.png] + +**1、** singleInstance:单实例模式。这个是 singleTask 模式的加强版,它除了具有 singleTask 模式的所有特性外,它还有一点独特的特性,那就是此模式的 Activity 只能单独地位于一个任务栈,不与其他 Activity 共存于同一个任务栈。 + + +### 4、sim卡的EF 文件有何作用 + +sim卡就是电话卡,sim卡内有自己的操作系统,用来与手机通讯的。Ef文件用来存储数据的。 + + +### 5、Fragment 在你们项目中的使用 + +Fragment 是 android3.0 以后引入的的概念,做局部内容更新更方便,原来为了到达这一点要把多个布局放到一个 activity 里面,现在可以用多 Fragment 来代替,只有在需要的时候才加载Fragment,提高性能。 + +**Fragment 的好处:** + +**1、** Fragment 可以使你能够将 activity 分离成多个可重用的组件,每个都有它自己的生命周期和UI。 + +**2、** Fragment 可以轻松得创建动态灵活的 UI 设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。 + +**3、** Fragment 是一个独立的模块,紧紧地与 activity 绑定在一起。可以运行中动态地移除、加入、交换等。 + +**4、** Fragment 提供一个新的方式让你在不同的安卓设备上统一你的 UI。 + +**5、** Fragment 解决 Activity 间的切换不流畅,轻量切换。 + +**6、** Fragment 替代 TabActivity 做导航,性能更好。 + +**7、** Fragment 在 4.2.版本中新增嵌套 fragment 使用方法,能够生成更好的界面效果。 + + +### 6、如何将打开res aw目录中的数据库文件? + +**1、** 在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。 + +**2、** 复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。 + +**3、** 在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。 + + +### 7、Android root机制 + +root指的是你有权限可以再系统上对所有档案有 "读" "写" "执行"的权力。root机器不是真正能让你的应用程序具有root权限。它原理就跟linux下的像sudo这样的命令。在系统的bin目录下放个su程序并属主是root并有suid权限。则通过su执行的命令都具有Android root权限。当然使用临时用户权限想把su拷贝的/system/bin目录并改属性并不是一件容易的事情。这里用到2个工具跟2个命令。把busybox拷贝到你有权限访问的目录然后给他赋予4755权限,你就可以用它做很多事了。 + + +### 8、GLSurfaceView + +基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图,是surfaceView的子类,openGL专用 + + +### 9、属性动画,例如一个 button 从 A 移动到 B 点,B 点还是可以响应点击事件,这个原理是什么? + +补间动画只是显示的位置变动,View 的实际位置未改变,表现为 View 移动到其他地方,点击事件仍在原处才能响应。而属性动画控件移动后事件相应就在控件移动后本身进行处理 + + +### 10、什么是IntentService?有何优点? + +IntentService 是 Service 的子类,比普通的 Service 增加了额外的功能。先看 Service 本身存在两个问题: + +``` +Service 不会专门启动一条单独的进程,Service 与它所在应用位于同一个进程中; +Service 也不是专门一条新线程,因此不应该在 Service 中直接处理耗时的任务; +``` + +特征 + +``` +会创建独立的 worker 线程来处理所有的 Intent 请求; +会创建独立的 worker 线程来处理 onHandleIntent()方法实现的代码,无需处理多线程问题; +所有请求处理完成后,IntentService 会自动停止,无需调用 stopSelf()方法停止 Service; +为 Service 的 onBind()提供默认实现,返回 null; +为 Service 的 onStartCommand 提供默认实现,将请求 Intent 添加到队列中 +``` + +使用 + +``` +让service类继承IntentService,重写onStartCommand和onHandleIntent实现 +``` + + +### 11、activity的启动模式有哪些?是什么含义 +### 12、简述JNI +### 13、补间动画 +### 14、Service 和 Activity 在同一个线程吗 +### 15、16Android性能优化 +### 16、如何启用Service,如何停用Service。 +### 17、什么是 IntentService?有何优点? +### 18、Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决? +### 19、Android 判断SD卡是否存在 +### 20、请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。 +### 21、Adapter是什么?你所接触过的adapter有那些? +### 22、请解释下 Android 程序运行时权限与文件系统权限的区别? +### 23、Android 引入广播机制的用意 +### 24、如何退出Activity +### 25、如何将SQLite数据库(dictionary.db文件)与apk文件一起发布? +### 26、广播接受者的生命周期? +### 27、Service生命周期 +### 28、ListView 如何实现分页加载 +### 29、谈谈你在工作中是怎样解决一个 bug +### 30、Activity间通过Intent传递数据大小有没有限制? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Android/Android\346\234\200\346\226\260\351\235\242\350\257\225\351\242\2302021\345\271\264\357\274\214\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" "b/docs/Android/Android\346\234\200\346\226\260\351\235\242\350\257\225\351\242\2302021\345\271\264\357\274\214\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" new file mode 100644 index 0000000..a452177 --- /dev/null +++ "b/docs/Android/Android\346\234\200\346\226\260\351\235\242\350\257\225\351\242\2302021\345\271\264\357\274\214\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" @@ -0,0 +1,224 @@ +# Android最新面试题2021年,常见面试题及答案汇总 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、请介绍下Android的数据存储方式。 + +使用SharedPreferences存储数据;文件存储数据;SQLite数据库存储数据;使用ContentProvider存储数据;网络存储数据; + +Preference,File, DataBase这三种方式分别对应的目录是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。 + +**一:使用SharedPreferences存储数据** + +首先说明SharedPreferences存储方式,它是 Android提供的用来存储一些简单配置信息的一种机制,例如:登录用户的用户名与密码。其采用了Map数据结构来存储数据,以键值的方式存储,可以简单的读取与写入,具体实例如下: + +``` +void ReadSharedPreferences() { + String strName, strPassword; + SharedPreferences user = getSharedPreferences(“user_info”, 0); + strName = user.getString(“NAME”, ””); + strPassword = user getString(“PASSWORD”, ””); +} +void WriteSharedPreferences(String strName, String strPassword) { + SharedPreferences user = getSharedPreferences(“user_info”, 0); + uer.edit(); + user.putString(“NAME”, strName); + user.putString(“PASSWORD” , strPassword); + user.commit(); +} +``` + +数据读取与写入的方法都非常简单,只是在写入的时候有些区别:先调用edit()使其处于编辑状态,然后才能修改数据,最后使用commit()提交修改的数据。实际上SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data//shares_prefs下。使用SharedPreferences是有些限制的:只能在同一个包内使用,不能在不同的包之间使用 + +**二:文件存储数** + +文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与 Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。具体实例如下 + +``` +String fn = “moandroid.log”; +FileInputStream fis = openFileInput(fn); +FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE); +``` + +**三:网络存储数** + +网络存储方式,需要与Android 网络数据包打交道,关于Android 网络数据包的详细说明,请阅读Android SDK引用了Java SDK的哪些package? + +**四:ContentProvide** + +**1、** ContentProvider简 + +当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式 + +**2、** Uri类简 + +Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider ,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成 + +**1、** scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content:// + +**2、** 主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它 + +**3、** 路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下 + +**1、** 要操作contact表中id为10的记录,可以构建这样的路径:/contact/10 + +**2、** 要操作contact表中id为10的记录的name字段, contact/10/name + +**3、** 要操作contact表中的所有记录,可以构建这样的路径:/contact? + +**4、** 要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下: + +**5、** 要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name + +**6、** 如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下: + +Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact") + +**3、** UriMatcher、ContentUrist和ContentResolver简介 + +因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从 Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。 + +**UriMatcher:用于匹配Uri,它的用法如下:** + +1.首先把你需要匹配Uri路径全部给注册上,如下 + +``` +//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。 +UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); +//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider /contact路径,返回匹配码为1 +uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码 +//如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2 +uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符 +``` + +2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用 addURI()方法传入的第三个参数,假设匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1 + +ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法 + +withAppendedId(uri, id)用于为路径加上ID部 + +parseId(uri)方法用于从路径中获取ID部 + +ContentResolver:当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用 ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据 + + +### 2、Android数字签名 + +**1、** 所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序 + +**2、** Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证 + +**3、** 如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名。 + +**4、** 数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。 + + +### 3、SQLite支持事务吗? 添加删除如何提高性能? + +在sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作 比如5000条记录也就是要5000次读写磁盘操作。 + +添加事务处理,把多条记录的插入或者删除作为一个事务 + + +### 4、说说 LruCache 底层原理 + +LruCache 使用一个 LinkedHashMap 简单的实现内存的缓存,没有软引用,都是强引用。 + +如果添加的数据大于设置的最大值,就删除最先缓存的数据来调整内存。maxSize 是通过构造方法初始化的值,他表示这个缓存能缓存的最大值是多少。 + +size 在添加和移除缓存都被更新值, 他通过 safeSizeOf 这个方法更新值。 safeSizeOf 默认返回 1,但一般我们会根据 maxSize 重写这个方法,比如认为 maxSize 代表是 KB 的话,那么就以 KB 为单位返回该项所占的内存大小。 + +除异常外,首先会判断 size 是否超过 maxSize,如果超过了就取出最先插入的缓存,如果不为空就删掉,并把 size 减去该项所占的大小。这个操作将一直循环下去,直到 size 比 maxSize 小或者缓存为空。 + + +### 5、dagger2 + +Dagger2是一个主要用于依赖注入的框架,减少初始化对象操作,降低耦合度 + + +### 6、内存溢出和内存泄漏有什么区别?何时会产生内存泄漏? + +内存溢出:当程序运行时所需的内存大于程序允许的最高内存,这时会出现内存溢出; + +内存泄漏:在一些比较消耗资源的操作中,如果操作中内存一直未被释放,就会出现内存泄漏。比如未关闭io,cursor。 + + +### 7、请介绍下 AsyncTask 的内部实现和适用的场景 + +AsyncTask 内部也是 Handler 机制来完成的,只不过 Android 提供了执行框架来提供线程池来执行相应地任务,因为线程池的大小问题,所以 AsyncTask 只应该用来执行耗时时间较短的任务,比如 HTTP 请求,大规模的下载和数据库的更改不适用于 AsyncTask,因为会导致线程池堵塞,没有线程来执行其他的任务,导致的情形是会发生 AsyncTask 根本执行不了的问题 + + +### 8、Android中,帧动画 + +帧动画是最容易实现的一种动画,这种动画更多的依赖于完善的UI资源,他的原理就是将一张张单独的图片连贯的进行播放,从而在视觉上产生一种动画的效果;有点类似于某些软件制作gif动画的方式。在有些代码中,我们还会看到android:oneshot="false" ,这个oneshot 的含义就是动画执行一次(true)还是循环执行多次。 + +``` + + + + + + +``` + + +### 9、ListView 如何定位到指定位置 + +可以通过 ListView 提供的 lv.setSelection(listView.getPosition())方法。 + + + +### 10、ListView的优化方案 + +**1、** 如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null则直接使用。在这个方法中尽可能少创建view。 + +**2、** 给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果。 + +**3、** 如果listview需要显示的item很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候再去加载接下来的20条。 + + +### 11、启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别? +### 12、横竖屏切换的Activity 生命周期变化? +### 13、如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态? +### 14、IntentService有何优点? +### 15、请介绍下ContentProvider是如何实现数据共享的。 +### 16、如何修改 Activity 进入和退出动画 +### 17、activity之间传递参数,除了intent,广播接收器,contentProvider之外,还有那些方法? +### 18、activity的生命周期 +### 19、谈MVC ,MVP,MVVM +### 20、子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么? +### 21、简述TCP,UDP,Socket +### 22、如何将打开res aw目录中的数据库文件? +### 23、让Activity变成一个窗口 +### 24、Intent 传递数据时,可以传递哪些类型数据? +### 25、android:gravity与android:layout_gravity的区别 +### 26、即时通讯是是怎么做的? +### 27、Fragment 如何实现类似 Activity 栈的压栈和出栈效果的? +### 28、View的分发机制,滑动冲突 +### 29、Fragment与activity如何传值和交互? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Android/Android\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\351\231\204\347\255\224\346\241\210\346\261\207\346\200\273.md" "b/docs/Android/Android\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\351\231\204\347\255\224\346\241\210\346\261\207\346\200\273.md" new file mode 100644 index 0000000..fffa7af --- /dev/null +++ "b/docs/Android/Android\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\351\231\204\347\255\224\346\241\210\346\261\207\346\200\273.md" @@ -0,0 +1,159 @@ +# Android最新面试题及答案附答案汇总 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、android中的动画有哪几类,它们的特点和区别是什么 + +两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。 + + +### 2、说说mvc模式的原理,它在android中的运用,android的官方建议应用程序的开发采用mvc模式。何谓mvc? + +mvc是model,view,controller的缩写,mvc包含三个部分: + +**1、** 模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。 + +**2、** 视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。 + +**3、** 控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,响应用户出发的相关事件,交给m层处理。 + +**android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:** + +**1、** 视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如果你对android了解的比较的多了话,就一定可以想到在android中也可以使用JavaScript+html等的方式作为view层,当然这里需要进行java和javascript之间的通信,幸运的是,android提供了它们之间非常方便的通信实现。 + +**2、** 控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理,这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。 + +**3、** 模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。 + + +### 3、DDMS和TraceView的区别? + +DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器 。 + + +### 4、广播注册 + +首先写一个类要继承BroadCastReceiver + +第一种:在清单文件中声明,添加 + +``` + + + + + +``` + +第二种:使用代码进行注册如: + +``` +IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); +BroadCastReceiverDemo receiver = new BroadCastReceiver(); +registerReceiver(receiver, filter); +``` + +两种注册类型的区别是: + +a.第一种是常驻型广播,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。 + +b.第二种不是常驻广播,也就是说广播跟随程序的生命周期。 + + +### 5、什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗? + +嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、 军事设备、 航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。 + + +### 6、如何切换 fragement,不重新实例化 + +翻看了 Android 官方 Doc,和一些组件的源代码,发现 replace()这个方法只是在上一个 Fragment不再需要时采用的简便方法. + +正确的切换方式是 add(),切换时 hide(),add()另一个 Fragment;再次切换时,只需 hide()当前,show()另一个。 + +这样就能做到多个 Fragment 切换不重新实例化: + + +### 7、简要解释一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver + +一个activity呈现了一个用户可以操作的可视化用户界面;一个service不包含可见的用户界面,而是在后台运行,可以与一个activity绑定,通过绑定暴露出来接口并与其进行通信;一个broadcast receiver是一个接收广播消息并做出回应的component,broadcast receiver没有界面;一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI,Intent对象可以显式的指定一个目标component。如果这样的话,android会找到这个component(基于manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳component。它是通过将Intent对象和目标的intent filter相比较来完成这一工作的;一个component的intent filter告诉android该component能处理的intent。intent filter也是在manifest文件中声明的。 + + +### 8、ListView优化 + +**1、** convertView重用,利用好 convertView 来重用 View,切忌每次 getView() 都新建。ListView 的核心原理就是重用 View,如果重用 view 不改变宽高,重用View可以减少重新分配缓存造成的内存频繁分配/回收; + +**2、** ViewHolder优化,使用ViewHolder的原因是findViewById方法耗时较大,如果控件个数过多,会严重影响性能,而使用ViewHolder主要是为了可以省去这个时间。通过setTag,getTag直接获取View。 + +**3、** 减少Item View的布局层级,这是所有layout都必须遵循的,布局层级过深会直接导致View的测量与绘制浪费大量的时间。 + +**4、** adapter中的getView方法尽量少使用逻辑 + +**5、** 图片加载采用三级缓存,避免每次都要重新加载。 + +**6、** 尝试开启硬件加速来使ListView的滑动更加流畅。 + +**7、** 使用 RecycleView 代替。 + + +### 9、Android中touch事件的传递机制是怎样的? + +**1、** Touch事件传递的相关API有dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent + +**2、** Touch事件相关的类有View、ViewGroup、Activity + +**3、** Touch事件会被封装成MotionEvent对象,该对象封装了手势按下、移动、松开等动作 + +**4、** Touch事件通常从Activity#dispatchTouchEvent发出,只要没有被消费,会一直往下传递,到最底层的View。 + +**5、** 如果Touch事件传递到的每个View都不消费事件,那么Touch事件会反向向上传递,最终交由Activity#onTouchEvent处理、 + +**6、** onInterceptTouchEvent为ViewGroup特有,可以拦截事件、 + +**7、** Down事件到来时,如果一个View没有消费该事件,那么后续的MOVE/UP事件都不会再给它 + + +### 10、Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 + +DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。 + + +### 11、recyclerView嵌套卡顿解决如何解决 +### 12、jni 的调用过程? +### 13、Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作? +### 14、Android中的ANR +### 15、如何对 Android 应用进行性能分析 +### 16、SharedPreference跨进程使用会怎么样?如何保证跨进程使用安全? +### 17、什么情况会导致Force Close ?如何避免?能否捕获导致其的异常? +### 18、说下 Activity 跟 跟 window , view 之间的关系? +### 19、为什么Android引入广播机制? +### 20、如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态? +### 21、注册广播的几种方法? +### 22、andorid 应用第二次登录实现自动登录 +### 23、你一般在开发项目中都使用什么设计模式?如何来重构,优化你的代码? +### 24、AsyncTask使用在哪些场景?它的缺陷是什么?如何解决? +### 25、SQLite支持事务吗?添加删除如何提高性能? +### 26、android 中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和区别。 +### 27、嵌入式操作系统内存管理有哪几种, 各有何特性 +### 28、FragmentPagerAdapter 与 与 FragmentStatePagerAdapter 的区别与使用场景? +### 29、属性动画 + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Android/Android\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\357\274\2142021\345\271\264\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" "b/docs/Android/Android\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\357\274\2142021\345\271\264\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" new file mode 100644 index 0000000..b1d73a0 --- /dev/null +++ "b/docs/Android/Android\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\357\274\2142021\345\271\264\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" @@ -0,0 +1,163 @@ +# Android最新面试题,2021年面试题及答案汇总 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、Android中activity,context,application有什么不同。 + +Content与application都继承与contextWrapper,contextWrapper继承于Context类。 + +Context:表示当前上下文对象,保存的是上下文中的参数和变量,它可以让更加方便访问到一些资源。 + +Context通常与activity的生命周期是一样的,application表示整个应用程序的对象。 + +对于一些生命周期较长的,不要使用context,可以使用application。 + +在activity中,尽量使用静态内部类,不要使用内部类。内部里作为外部类的成员存在,不是独立于activity,如果内存中还有内存继续引用到context,activity如果被销毁,context还不会结束。 + + +### 2、系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。 + +通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性 + + +### 3、事件分发中的 onTouch 和 onTouchEvent 有什么区别,又该如何使用? + +这两个方法都是在 View 的 dispatchTouchEvent 中调用的,onTouch 优先于 onTouchEvent执行。如果在 onTouch 方法中通过返回 true 将事件消费掉,onTouchEvent 将不会再执行。 + +另外需要注意的是,onTouch 能够得到执行需要两个前提条件,第一 mOnTouchListener 的值不能为空,第二当前点击的控件必须是 enable 的。因此如果你有一个控件是非 enable 的,那么给它注册 onTouch 事件将永远得不到执行。对于这一类控件,如果我们想要监听它的 touch 事件,就必须通过在该控件中重写 onTouchEvent 方法来实现。 + + +### 4、Fragment 的 replace 和 add 方法的区别 + +Fragment 本身并没有 replace 和 add 方法,FragmentManager才有replace和add方法。我们经常使用的一个架构就是通过RadioGroup切换Fragment,每个 Fragment 就是一个功能模块。 + +Fragment 的容器一个 FrameLayout,add 的时候是把所有的 Fragment 一层一层的叠加到了。FrameLayout 上了,而 replace 的话首先将该容器中的其他 Fragment 去除掉然后将当前Fragment添加到容器中。 + +一个 Fragment 容器中只能添加一个 Fragment 种类,如果多次添加则会报异常,导致程序终止,而 replace 则无所谓,随便切换。因为通过 add 的方法添加的 Fragment,每个 Fragment 只能添加一次,因此如果要想达到切换效果需要通过 Fragment 的的 hide 和 show 方法结合者使用。将要显示的 show 出来,将其他 hide起来。这个过程 Fragment 的生命周期没有变化。 + +通过 replace 切换 Fragment,每次都会执行上一个 Fragment 的 onDestroyView,新 Fragment的 onCreateView、onStart、onResume 方法。基于以上不同的特点我们在使用的使用一定要结合着生命周期操作我们的视图和数据。 + + +### 5、子线程中能不能 new handler?为什么? + +不能,如果在子线程中直接 new Handler()会抛出异常 java.lang.RuntimeException: Can'tcreate handler inside thread that has not called + +在没有调用 Looper.prepare()的时候不能创建 Handler,因为在创建 Handler 的源码中做了如下操作 + +Handler 的构造方法中 + + +### 6、什么是aar?aar是jar有什么区别? + +“aar”包是 Android 的类库项目的二进制发行包。 + +文件扩展名是.aar,maven 项目类型应该也是aar,但文件本身是带有以下各项的 zip 文件: + +**1、** /AndroidManifest.xml (mandatory) + +**2、** /classes.jar (mandatory) + +**3、** /res/ (mandatory) + +**4、** /R.txt (mandatory) + +**5、** /assets/ (optional) + +**6、** /libs/*.jar (optional) + +**7、** /jni//*.so (optional) + +**8、** /proguard.txt (optional) + +**9、** /lint.jar (optional) + +这些条目是直接位于 zip 文件根目录的。 其中R.txt 文件是aapt带参数–output-text-symbols的输出结果。 + +jar打包不能包含资源文件,比如一些drawable文件、xml资源文件之类的,aar可以。 + + +### 7、java中如何引用本地语言 + +可以用JNI(java native interface  java 本地接口)接口 。 + + +### 8、ContentProvider与sqlite有什么不一样的? + +``` +ContentProvider会对外隐藏内部实现,只需要关注访问contentProvider的uri即可,contentProvider应用在应用间共享。 +Sqlite操作本应用程序的数据库。 +ContentProiver可以对本地文件进行增删改查操作 +``` + + +### 9、如何保存activity的状态? + +默认情况下activity的状态系统会自动保存,有些时候需要我们手动调用保存。 + +当activity处于onPause,onStop之后,activity处于未活动状态,但是activity对象却仍然存在。当内存不足,onPause,onStop之后的activity可能会被系统摧毁。 + +当通过返回退出activity时,activity状态并不会保存。 + +保存activity状态需要重写onSavedInstanceState()方法,在执行onPause,onStop之前调用onSavedInstanceState方法,onSavedInstanceState需要一个Bundle类型的参数,我们可以将数据保存到bundle中,通过实参传递给onSavedInstanceState方法。 + +Activity被销毁后,重新启动时,在onCreate方法中,接受保存的bundle参数,并将之前的数据取出。 + + +### 10、内存泄露如何查看和解决 + +概念:有些对象只有有限的生命周期,当他们的任务完成之后,它们将被垃圾回收,如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,着就会导致内存泄露。 + +解决方法:使用开源框架LeakCanary检测针对性解决 + +**常见的内存泄露有:** + +**1、** 单例造成的内存泄露,例如单例中的Context生命周期大于本身Context生命周期 + +**2、** 线程使用Hander造成的内存卸扣,当activity已经结束,线程依然在运行更新UI + +**3、** 非静态类使用静态变量导致无法回收释放造成泄露 + +**4、** WebView网页过多造成内存泄露 + +**5、** 资源未关闭造成泄露,例如数据库使用完之后关闭连接 + + +### 11、如何提升Service进程优先级 +### 12、如何退出Activity?如何安全退出已调用多个Activity的Application? +### 13、Android系统的架构 +### 14、怎样对 android 进行优化? +### 15、Android 中如何捕获未捕获的异常 +### 16、推送到达率如何提高 +### 17、View和SurfaceView的区别 +### 18、NDK +### 19、自定义view的基本流程 +### 20、View +### 21、SurfaceView +### 22、什么是ANR 如何避免它? +### 23、Fragment的生命周期 +### 24、在 service 的生命周期方法 onstartConmand()可不可以执行网络操作?如何在 service 中执行网络操作? +### 25、wait和 sleep 的区别 +### 26、如果有个100M大的文件,需要上传至服务器中,而服务器form表单最大只能上传2M,可以用什么方法。 +### 27、一条最长的短信息约占多少byte? +### 28、activity在屏幕旋转时的生命周期 +### 29、Android 中的动画有哪几类,它们的特点和区别是什么 + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Dubbo/Dubbo\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\345\244\247\346\261\207\346\200\273\357\274\214\351\231\204\347\255\224\346\241\210.md" "b/docs/Dubbo/Dubbo\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\345\244\247\346\261\207\346\200\273\357\274\214\351\231\204\347\255\224\346\241\210.md" new file mode 100644 index 0000000..4e540a1 --- /dev/null +++ "b/docs/Dubbo/Dubbo\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\345\244\247\346\261\207\346\200\273\357\274\214\351\231\204\347\255\224\346\241\210.md" @@ -0,0 +1,109 @@ +# Dubbo最新2021年面试题大汇总,附答案 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、RPC使用了哪些关键技术,服务调用 + +B机器进行本地调用(通过代理Proxy和反射调用)之后得到了返回值,此时还需要再把返回值发送回A机器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值之后,则再次进行反序列化操作,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理(一般是业务逻辑处理操作)。 + +通常,经过以上四个步骤之后,一次完整的RPC调用算是完成了,另外可能因为网络抖动等原因需要重试等。 + +### 2、Dubbo 集群的负载均衡有哪些策略? + +Dubbo 提供了常见的集群策略实现,并预扩展点予以自行实现。 + +**1、** Random LoadBalance: 随机选取提供者策略,有利于动态调整提供者权重。截面碰撞率高,调用次数越多,分布越均匀; + +**2、** RoundRobin LoadBalance: 轮循选取提供者策略,平均分布,但是存在请求累积的问题; + +**3、** LeastActive LoadBalance: 最少活跃调用策略,解决慢提供者接收更少的请求; + +**4、** ConstantHash LoadBalance: 一致性 Hash 策略,使相同参数请求总是发到同一提供者,一台机器宕机,可以基于虚拟节点,分摊至其他提供者,避免引起提供者的剧烈变动; + + +### 3、RPC使用了哪些关键技术,protobuf-rpc-pro + +是一个Java类库,提供了基于 Google 的 Protocol Buffers 协议的远程方法调用的框架。基于 Netty 底层的 NIO 技术。支持 TCP 重用/ keep-alive、SSL加密、RPC 调用取消操作、嵌入式日志等功能。 + + +### 4、dubbo推荐用什么协议? + +默认使用dubbo协议。 + + +### 5、RPC使用了哪些关键技术,Dubbo + +Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。 + + +### 6、RPC使用了哪些关键技术,NIO通信 + +出于并发性能的考虑,传统的阻塞式 IO 显然不太合适,因此我们需要异步的 IO,即 NIO。Java 提供了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持。可以选择Netty或者MINA来解决NIO数据传输的问题。 + + +### 7、在使用过程中都遇到了些什么问题? + +如序列化问题。 + + +### 8、服务调用超时问题怎么解决 + +dubbo在调用服务不成功时,默认是会重试两次的。这样在服务端的处理时间超过了设定的超时时间时,就会有重复请求,比如在发邮件时,可能就会发出多份重复邮件,执行注册请求时,就会插入多条重复的注册数据,那么怎么解决超时问题呢?如下 + +对于核心的服务中心,去除dubbo超时重试机制,并重新评估设置超时时间。 业务处理代码必须放在服务端,客户端只做参数验证和服务调用,不涉及业务流程处理 全局配置实例 + + + +当然Dubbo的重试机制其实是非常好的QOS保证,它的路由机制,是会帮你把超时的请求路由到其他机器上,而不是本机尝试,所以 dubbo的重试机器也能一定程度的保证服务的质量。但是请一定要综合线上的访问情况,给出综合的评估。 + + +### 9、服务提供者能实现失效踢出的是什么原理? + +服务失效踢出基于zookeeper的临时节点原理。 + + +### 10、Dubbo 必须依赖的包有哪些? + +Dubbo 必须依赖 JDK,其他为可选。 + + +### 11、Dubbo 支持哪些协议,它们的优缺点有哪些? +### 12、Dubbo 服务注册与发现的流程? +### 13、你还了解别的分布式框架吗? +### 14、dubbo 推荐用什么协议? +### 15、一般使用什么注册中心?还有别的选择吗? +### 16、Dubbo 服务降级,失败重试怎么做? +### 17、Dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,者和订阅者之间还能通信么? +### 18、Dubbo 支持服务降级吗? +### 19、集群容错怎么做? +### 20、默认使用的是什么通信框架,还有别的选择吗? +### 21、Dubbo 使用过程中都遇到了些什么问题? +### 22、Dubbo 使用的是什么通信框架? +### 23、dubbo 推荐用什么协议? +### 24、Dubbo 和 Spring Cloud 有什么关系? +### 25、服务调用超时会怎么样? +### 26、RPC的实现基础? +### 27、Dubbo 的主要应用场景? +### 28、RPC使用了哪些关键技术,Avro +### 29、为什么要用Dubbo? +### 30、Dubbo 核心组件有哪些? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Dubbo/Dubbo\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220\357\274\214\345\244\247\346\261\207\346\200\273.md" "b/docs/Dubbo/Dubbo\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220\357\274\214\345\244\247\346\261\207\346\200\273.md" new file mode 100644 index 0000000..a1ef041 --- /dev/null +++ "b/docs/Dubbo/Dubbo\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220\357\274\214\345\244\247\346\261\207\346\200\273.md" @@ -0,0 +1,135 @@ +# Dubbo最新2021年面试题附答案解析,大汇总 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、Dubbo的管理控制台能做什么? + +管理控制台主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能 + + +### 2、Dubbo 支持服务降级吗? + +以通过 dubbo:reference 中设置 mock=“return null”。mock 的值也可以修改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名规则是 “接口名称+Mock” 后缀。然后在 Mock 类里实现自己的降级逻辑 + + +### 3、Dubbo支持服务多协议吗? + +Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。 + + +### 4、为什么需要服务治理? + +**1、** 过多的服务 URL 配置困难 + +**2、** 负载均衡分配节点压力过大的情况下也需要部署集群 服务依赖混乱,启动顺序不清晰 + +**3、** 过多服务导致性能指标分析难度较大,需要监控 + + +### 5、Dubbo 默认采用注册中心? + +采用 Zookeeper + + +### 6、画一画服务注册与发现的流程图? + +![](http://dubbo.apache.org/img/architecture.png#alt=) + + +### 7、PRC架构组件 + +一个基本的RPC架构里面应该至少包含以下4个组件: + +**1、** 客户端(Client):服务调用方(服务消费者) + +**2、** 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端 + +**3、** 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理4、服务端(Server):服务的真正提供者 + +![](https://gitee.com/souyunkutech/souyunku-home/raw/master/images/souyunku-web/2020/5/2/026/54/80_4.png#alt=80%5C_4.png) + +- 具体调用过程: + +**1、** 服务消费者(client客户端)通过调用本地服务的方式调用需要消费的服务; + +**2、** 客户端存根(client stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体; + +**3、** 客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端; + +**4、** 服务端存根(server stub)收到消息后进行解码(反序列化操作); + +**5、** 服务端存根(server stub)根据解码结果调用本地的服务进行相关处理; + +**6、** 本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub); + +**7、** 服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方; + +**8、** 客户端存根(client stub)接收到消息,并进行解码(反序列化); + +**9、** 服务消费方得到最终结果; + +`而RPC框架的实现目标则是将上面的第2-10步完好地封装起来,也就是把调用、编码/解码的过程给封装起来,让用户感觉上像调用本地服务一样的调用远程服务。` + + +### 8、dubbo是什么 + +dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含: + +集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 + +远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 + +自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。 + + +### 9、Dubbo 支持哪些序列化方式? + +默认使用 Hessian 序列化,还有 Duddo、FastJson、Java 自带序列化。 + + +### 10、同一个服务多个注册的情况下可以直连某一个服务吗? + +可以点对点直连,修改配置即可,也可以通过telnet直连某个服务。 + + +### 11、Dubbo 配置文件是如何加载到Spring中的? +### 12、Dubbo 的架构设计 +### 13、Dubbo 在安全机制方面是如何解决? +### 14、Dubbo 如何优雅停机? +### 15、同一个服务多个注册的情况下可以直连某一个服务吗? +### 16、Dubbo 的集群容错方案有哪些? +### 17、Dubbo 在安全方面有哪些措施? +### 18、服务调用是阻塞的吗? +### 19、Dubbo 使用的是什么通信框架? +### 20、dubbo和dubbox之间的区别? +### 21、Dubbo 推荐用什么协议? +### 22、RPC使用了哪些关键技术,RPC的实现原理架构图 +### 23、默认使用什么序列化框架,你知道的还有哪些? +### 24、服务提供者能实现失效踢出是什么原理? +### 25、服务调用是阻塞的吗? +### 26、RPC使用了哪些关键技术,主流RPC框架有哪些 +### 27、在使用过程中都遇到了些什么问题? +### 28、默认使用什么序列化框架,你知道的还有哪些? +### 29、同一个服务多个注册的情况下可以直连某一个服务吗? +### 30、dubbo 服务集群配置(集群容错模式) +### 31、Dubbo 推荐什么协议? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Dubbo/Dubbo\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\357\274\214\351\253\230\347\272\247\351\235\242\350\257\225\351\242\230\345\217\212\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220.md" "b/docs/Dubbo/Dubbo\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\357\274\214\351\253\230\347\272\247\351\235\242\350\257\225\351\242\230\345\217\212\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220.md" new file mode 100644 index 0000000..1ccd2b2 --- /dev/null +++ "b/docs/Dubbo/Dubbo\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\357\274\214\351\253\230\347\272\247\351\235\242\350\257\225\351\242\230\345\217\212\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220.md" @@ -0,0 +1,159 @@ +# Dubbo最新2021年面试题,高级面试题及附答案解析 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、Dubbo 支持哪些协议,每种协议的应用场景,优缺点? + +**1、** dubbo:单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步, Hessian 序列化; + +**2、** rmi:采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。多个短连接, TCP 协议传输,同步传输,适用常规的远程服务调用和 rmi 互操作。在依赖低版本的 Common-Collections 包, java 序列化存在安全漏洞; + +**3、** http:基于 Http 表单提交的远程调用协议,使用 Spring 的 HttpInvoke 实现。多个短连接,传输协议 HTTP,传入参数大小混合,提供者个数多于消费者,需要给应用程序和浏览器 JS 调用; + +**4、** webservice:基于 WebService 的远程调用协议,集成 CXF 实现,提供和原生 WebService 的互操作。多个短连接,基于 HTTP 传输,同步传输,适用系统集成和跨语言调用; + +**5、** hessian:集成 Hessian 服务,基于 HTTP 通讯,采用 Servlet 暴露服务,Dubbo 内嵌 Jetty 作为服务器时默认实现,提供与 Hession 服务互操作。多个短连接,同步 HTTP 传输, Hessian 序列化,传入参数较大,提供者大于消费者,提供者压力较大,可传文件; + +**6、** Redis:基于 Redis 实现的 RPC 协议 + + +### 2、dubbo 连接注册中心和直连的区别 + +在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表,服务注册中心,动态的注册和发现服务,使服务的位置透明,并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover, 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 + +服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外,注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表注册中心和监控中心都是可选的,服务消费者可以直连服务提供者。 + + +### 3、Dubbo Monitor 实现原理? + +Consumer 端在发起调用之前会先走 filter 链;provider 端在接收到请求时也是先走 filter 链,然后才进行真正的业务逻辑处理。默认情况下,在 consumer 和 provider 的 filter 链中都会有 Monitorfilter。 + +**1、** MonitorFilter 向 DubboMonitor 发送数据 + +**2、** DubboMonitor 将数据进行聚合后(默认聚合 1min 中的统计数据)暂存到ConcurrentMap statisticsMap,然后使用一个含有 3 个线程(线程名字:DubboMonitorSendTimer)的线程池每隔 1min 钟,调用 SimpleMonitorService 遍历发送 statisticsMap 中的统计数据,每发送完毕一个,就重置当前的 Statistics 的 AtomicReference + +**3、** SimpleMonitorService 将这些聚合数据塞入 BlockingQueue queue 中(队列大写为 100000) + +**4、** SimpleMonitorService 使用一个后台线程(线程名为:DubboMonitorAsyncWriteLogThread)将 queue 中的数据写入文件(该线程以死循环的形式来写) + +**5、** SimpleMonitorService 还会使用一个含有 1 个线程(线程名字:DubboMonitorTimer)的线程池每隔 5min 钟,将文件中的统计数据画成图表 + + +### 4、Dubbo 集群的负载均衡有哪些策略 + +Dubbo 提供了常见的集群策略实现,并预扩展点予以自行实现。 + +Random LoadBalance: 随机选取提供者策略,有利于动态调整提供者权重。截面碰撞率高,调用次数越多,分布越均匀; + +RoundRobin LoadBalance: 轮循选取提供者策略,平均分布,但是存在请求累积的问题; + +LeastActive LoadBalance: 最少活跃调用策略,解决慢提供者接收更少的请求; ConstantHash LoadBalance: 一致性 Hash 策略,使相同参数请求总是发到同一提供者,一台机器宕机,可以基于虚拟节点,分摊至其他提供者,避免引起提供者的剧烈变动; + + +### 5、Dubbo 能集成 SpringBoot 吗? + +可以的 + + +### 6、服务读写推荐的容错策略是怎样的? + +读操作建议使用 Failover 失败自动切换,默认重试两次其他服务器。写操作建议使用 Failfast 快速失败,发一次调用失败就立即报错。 + + +### 7、为什么要有RPC + +**1、** http接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的http协议进行传输。但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。第三个来说就是安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑。 + +**2、** socket只是一个简单的网络通信方式,只是创建通信双方的通信通道,而要实现rpc的功能,还需要对其进行封装,以实现更多的功能。 + +**3、** RPC一般配合netty框架、spring自定义注解来编写轻量级框架,其实netty内部是封装了socket的,较新的jdk的IO一般是NIO,即非阻塞IO,在高并发网站中,RPC的优势会很明显 + + +### 8、Dubbo 超时时间怎样设置? + +Dubbo 超时时间设置有两种方式: + +服务提供者端设置超时时间,在 Dubbo 的用户文档中,推荐如果能在服务端多配置就尽量多配置,因为服务提供者比消费者更清楚自己提供的服务特性。 + +服务消费者端设置超时时间,如果在消费者端设置了超时时间,以消费者端为主,即优先级更高。因为服务调用方设置超时时间控制性更灵活。如果消费方超时,服务端线程不会定制,会产生警告。 + + +### 9、Dubbo 用到哪些设计模式? + +Dubbo框架在初始化和通信过程中使用了多种设计模式,可灵活控制类加载、权限控制等功能。 + +**工厂模式** + +Provider在export服务时,会调用ServiceConfig的export方法。ServiceConfig中有个字段: + +```java +private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension(); +``` + +Dubbo里有很多这种代码。这也是一种工厂模式,只是实现类的获取采用了JDK SPI的机制。这么实现的优点是可扩展性强,想要扩展实现,只需要在classpath下增加个文件就可以了,代码零侵入。另外,像上面的Adaptive实现,可以做到调用时动态决定调用哪个实现,但是由于这种实现采用了动态代理,会造成代码调试比较麻烦,需要分析出实际调用的实现类。 + +**装饰器模式** + +Dubbo在启动和调用阶段都大量使用了装饰器模式。以Provider提供的调用链为例,具体的调用链代码是在ProtocolFilterWrapper的buildInvokerChain完成的,具体是将注解中含有group=provider的Filter实现,按照order排序,最后的调用顺序是: + +```java +EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter -> ExecuteLimitFilter -> TraceFilter -> TimeoutFilter -> MonitorFilter -> ExceptionFilter +``` + +更确切地说,这里是装饰器和责任链模式的混合使用。例如,EchoFilter的作用是判断是否是回声测试请求,是的话直接返回内容,这是一种责任链的体现。而像ClassLoaderFilter则只是在主功能上添加了功能,更改当前线程的ClassLoader,这是典型的装饰器模式。 + +**观察者模式** + +Dubbo的Provider启动时,需要与注册中心交互,先注册自己的服务,再订阅自己的服务,订阅时,采用了观察者模式,开启一个listener。注册中心会每5秒定时检查是否有服务更新,如果有更新,向该服务的提供者发送一个notify消息,provider接受到notify消息后,即运行NotifyListener的notify方法,执行监听器方法。 + +**动态代理模式** + +Dubbo扩展JDK SPI的类ExtensionLoader的Adaptive实现是典型的动态代理实现。Dubbo需要灵活地控制实现类,即在调用阶段动态地根据参数决定调用哪个实现类,所以采用先生成代理类的方法,能够做到灵活的调用。生成代理类的代码是ExtensionLoader的createAdaptiveExtensionClassCode方法。代理类的主要逻辑是,获取URL参数中指定参数的值作为获取实现类的key。 + + +### 10、Dubbo可以对结果进行缓存吗? + +可以,Dubbo 提供了声明式缓存,用于加速热门数据的访问速度,以减少用户加缓存的工作量 + + +### 11、服务调用超时问题怎么解决? +### 12、Dubbo 有哪些注册中心? +### 13、同一个服务多个注册的情况下可以直连某一个服务吗? +### 14、Dubbo服务之间的调用是阻塞的吗? +### 15、默认使用的是什么通信框架,还有别的选择吗? +### 16、你还了解别的分布式框架吗? +### 17、Dubbo 核心组件有哪些? +### 18、dubbo能做什么 +### 19、Dubbo 支持哪些协议,每种协议的应用场景,优缺点? +### 20、说说核心的配置有哪些? +### 21、RPC和SOA、SOAP、REST的区别 +### 22、默认使用什么序列化框架,你知道的还有哪些? +### 23、默认使用什么序列化框架,你知道的还有哪些? +### 24、Dubbo 有些哪些注册中心? +### 25、dubbo 通信协议 dubbo 协议适用范围和适用场景 +### 26、Dubbo 可以对结果进行缓存吗? +### 27、Dubbo 是什么? +### 28、dubbo 通信协议 dubbo 协议为什么采用异步单一长连接 +### 29、Dubbo 有哪些注册中心? +### 30、Dubbo 与 Spring 的关系? +### 31、Dubbo 和 Spring Cloud 的区别? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Dubbo/Dubbo\346\234\200\346\226\260\351\235\242\350\257\225\351\242\2302021\345\271\264\357\274\214\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" "b/docs/Dubbo/Dubbo\346\234\200\346\226\260\351\235\242\350\257\225\351\242\2302021\345\271\264\357\274\214\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" new file mode 100644 index 0000000..3dc23c4 --- /dev/null +++ "b/docs/Dubbo/Dubbo\346\234\200\346\226\260\351\235\242\350\257\225\351\242\2302021\345\271\264\357\274\214\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" @@ -0,0 +1,190 @@ +# Dubbo最新面试题2021年,常见面试题及答案汇总 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、Dubbo 服务器注册与发现的流程? + +**1、** 服务容器Container负责启动,加载,运行服务提供者。 + +**2、** 服务提供者Provider在启动时,向注册中心注册自己提供的服务。 + +**3、** 服务消费者Consumer在启动时,向注册中心订阅自己所需的服务。 + +**4、** 注册中心Registry返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 + +**5、** 服务消费者Consumer,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 + +**6、** 服务消费者Consumer和提供者Provider,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心Monitor。 + + +### 2、Dubbo 的使用场景有哪些? + +**1、** 透明化的远程方法调用:就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 + +**2、** 软负载均衡及容错机制:可在内网替代 F5 等硬件负载均衡器,降低成本,减少单点。 + +**3、** 服务自动注册与发现:不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。 + + +### 3、在使用过程中都遇到了些什么问题? 如何解决的? + +**同时配置了 XML 和 properties 文件,则 properties 中的配置无效** + +只有 XML 没有配置时,properties 才生效。 + +**dubbo 缺省会在启动时检查依赖是否可用,不可用就抛出异常,阻止 spring 初始化完成,check 属性默认为 true。** + +测试时有些服务不关心或者出现了循环依赖,将 check 设置为 false + +**为了方便开发测试,线下有一个所有服务可用的注册中心,这时,如果有一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。** + +解决:让服务提供者开发方,只订阅服务,而不注册正在开发的服务,通过直连测试正在开发的服务。设置 dubbo:registry 标签的 register 属性为 false。 + +**spring 2.x 初始化死锁问题。** + +在 spring 解析到 dubbo:service 时,就已经向外暴露了服务,而 spring 还在接着初始化其他 bean,如果这时有请求进来,并且服务的实现类里有调用 applicationContext.getBean() 的用法。getBean 线程和 spring 初始化线程的锁的顺序不一样,导致了线程死锁,不能提供服务,启动不了。 + +解决:不要在服务的实现类中使用 applicationContext.getBean(); 如果不想依赖配置顺序,可以将 dubbo:provider 的 deplay 属性设置为 - 1,使 dubbo 在容器初始化完成后再暴露服务。 + +**服务注册不上** + +检查 dubbo 的 jar 包有没有在 classpath 中,以及有没有重复的 jar 包 + +检查暴露服务的 spring 配置有没有加载 + +在服务提供者机器上测试与注册中心的网络是否通 + +**出现 RpcException: No provider available for remote service 异常** + +表示没有可用的服务提供者, + +a、检查连接的注册中心是否正确 + +b、到注册中心查看相应的服务提供者是否存在 + +c、检查服务提供者是否正常运行 + +**出现” 消息发送失败” 异常** + +通常是接口方法的传入传出参数未实现 Serializable 接口。 + + +### 4、Dubbo 的整体架构设计有哪些分层? + +**接口服务层(Service)**:该层与业务逻辑相关,根据 provider 和 consumer 的业务设计对应的接口和实现 + +**配置层(Config)**:对外配置接口,以 ServiceConfig 和 ReferenceConfig 为中心 + +**服务代理层(Proxy)**:服务接口透明代理,生成服务的客户端 Stub 和 服务端的 Skeleton,以 ServiceProxy 为中心,扩展接口为 ProxyFactory + +**服务注册层(Registry)**:封装服务地址的注册和发现,以服务 URL 为中心,扩展接口为 RegistryFactory、Registry、RegistryService + +**路由层(Cluster)**:封装多个提供者的路由和负载均衡,并桥接注册中心,以Invoker 为中心,扩展接口为 Cluster、Directory、Router和LoadBlancce + +**监控层(Monitor)**:RPC调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory、Monitor和MonitorService + +**远程调用层(Protocal)**:封装 RPC 调用,以 Invocation 和 Result 为中心,扩展接口为 Protocal、Invoker和Exporter + +**信息交换层(Exchange**):封装请求响应模式,同步转异步。以 Request 和 Response 为中心,扩展接口为 Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer + +**网络传输层(Transport)**:抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为Channel、Transporter、Client、Server和Codec + +**数据序列化层(Serialize)**:可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool + + +### 5、服务上线怎么不影响旧版本? + +采用多版本开发,不影响旧版本。 + + +### 6、服务上线怎么不影响旧版本? + +采用多版本开发,不影响旧版本。在配置中添加version来作为版本区分 + + +### 7、RPC使用了哪些关键技术,RMI + +利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol) 和java的原生序列化。 + + +### 8、RPC使用了哪些关键技术,Hessian + +是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采用二进制编解码。 + + +### 9、dubbo 服务负载均衡策略? + +**Random LoadBalance** + +随机,按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。(权重可以在 dubbo 管控台配置) + +**RoundRobin LoadBalance** + +轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。 + +**LeastActive LoadBalance** + +最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。 + +**ConsistentHash LoadBalance** + +一致性 Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。缺省只对第一个参数 Hash,如果要修改,请配置 + +``` + +``` + +缺省用 160 份虚拟节点,如果要修改,请配置 + +``` + +``` + + +### 10、Dubbo 和 Spring Cloud 有什么哪些区别? + +Dubbo 底层是使用 Netty 这样的 NIO 框架,是基于 TCP 协议传输的,配合以 Hession 序列化完成 RPC 通信。 + +Spring Cloud 是基于 Http 协议 Rest 接口调用远程过程的通信,相对来说 Http 请求会有更大的报文,占的带宽也会更多。但是 REST 相比 RPC 更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更为合适,至于注重通信速度还是方便灵活性,具体情况具体考虑。 + + +### 11、Dubbo 服务器注册与发现的流程? +### 12、Dubbo 的整体架构设计有哪些分层? +### 13、一般使用什么注册中心?还有别的选择吗? +### 14、Dubbo 的注册中心集群挂掉,者和订阅者之间还能通信么? +### 15、Dubbo 的注册中心集群挂掉,发布者和订阅者之间还能通信么? +### 16、服务提供者能实现失效踢出是什么原理? +### 17、Dubbo 集群容错有几种方案? +### 18、Dubbo 和 Dubbox 之间的区别? +### 19、Dubbo 和 Dubbox 之间的区别? +### 20、RPC使用了哪些关键技术,服务寻址 +### 21、Dubbo 支持哪些序列化方式? +### 22、集群容错怎么做? +### 23、Dubbo服务降级,失败重试怎么做? +### 24、RPC使用了哪些关键技术,从调用者的角度看: +### 25、dubbo 在安全机制方面如何解决的? +### 26、RPC使用了哪些关键技术,序列化 +### 27、RPC使用了哪些关键技术,从服务提供者的角度看: +### 28、Dubbo 超时时间怎样设置? +### 29、你还了解别的分布式框架吗? +### 30、Dubbo的集群容错方案有哪些? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Dubbo/Dubbo\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\351\231\204\347\255\224\346\241\210\346\261\207\346\200\273.md" "b/docs/Dubbo/Dubbo\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\351\231\204\347\255\224\346\241\210\346\261\207\346\200\273.md" new file mode 100644 index 0000000..4a94293 --- /dev/null +++ "b/docs/Dubbo/Dubbo\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\351\231\204\347\255\224\346\241\210\346\261\207\346\200\273.md" @@ -0,0 +1,118 @@ +# Dubbo最新面试题及答案附答案汇总 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、Dubbo telnet 命令能做什么? + +dubbo 服务发布之后,我们可以利用 telnet 命令进行调试、管理。Dubbo2.0.5 以上版本服务提供端口支持 telnet 命令 + + +### 2、RPC使用了哪些关键技术,Thrift + +是一种可伸缩的跨语言服务的软件框架。它拥有功能强大的代码生成引擎,无缝地支持C + +,C#,Java,Python和PHP和Ruby。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。 + +最初由facebook开发用做系统内个语言之间的RPC通信,2007年由facebook贡献到apache基金 ,现在是apache下的opensource之一 。支持多种语言之间的RPC方式的通信:php语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务,跨越语言的C/S RPC调用。底层通讯基于SOCKET。 + + +### 3、dubbo 通信协议 dubbo 协议为什么不能传大包; + +因 dubbo 协议采用单一长连接,如果每次请求的数据包大小为 500KByte,假设网络为千兆网卡(1024Mbit=128MByte),每条连接最大 7MByte(不同的环境可能不一样,供参考),单个服务提供者的 TPS(每秒处理事务数)最大为:128MByte / 500KByte = 262。 + +单个消费者调用单个服务提供者的 TPS(每秒处理事务数)最大为:7MByte / 500KByte = 14。 + +如果能接受,可以考虑使用,否则网络将成为瓶颈。 + + +### 4、RPC使用了哪些关键技术,建立通信 + +首先要解决通讯的问题:即A机器想要调用B机器,首先得建立起通信连接。 + +主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。 + +通常这个连接可以是按需连接(需要调用的时候就先建立连接,调用结束后就立马断掉),也可以是长连接(客户端和服务器建立起连接之后保持长期持有,不管此时有无数据包的发送,可以配合心跳检测机制定期检测建立的连接是否存活有效),多个远程过程调用共享同一个连接。 + + +### 5、RPC使用了哪些关键技术,序列化和反序列化 + +在网络中,所有的数据都将会被转化为字节进行传送,所以为了能够使参数对象在网络中进行传输,需要对这些参数进行序列化和反序列化操作。 + +序列化:把对象转换为字节序列的过程称为对象的序列化,也就是编码的过程。反序列化:把字节序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。 目前比较高效的开源序列化框架:如Kryo、FastJson和Protobuf等。 + +反序列化:把字节序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。 目前比较高效的开源序列化框架:如Kryo、FastJson和Protobuf等。 + + +### 6、Dubbo 超时设置有哪些方式? + +**Dubbo 超时设置有两种方式:** + +服务提供者端设置超时时间,在Dubbo的用户文档中,推荐如果能在服务端多配置就尽量多配置,因为服务提供者比消费者更清楚自己提供的服务特性。 + +服务消费者端设置超时时间,如果在消费者端设置了超时时间,以消费者端为主,即优先级更高。因为服务调用方设置超时时间控制性更灵活。如果消费方超时,服务端线程不会定制,会产生警告。 + + +### 7、服务提供者能实现失效踢出是什么原理? + +服务失效踢出基于zookeeper的临时节点原理。 + + +### 8、Dubbo 支持分布式事务吗? + +目前暂时不支持,可与通过 tcc-transaction框架实现 + +介绍:tcc-transaction是开源的TCC补偿性分布式事务框架 + +Git地址:[https://github.com/changmingxie/tcc-transaction](https://github.com/changmingxie/tcc-transaction) + +TCC-Transaction 通过 Dubbo 隐式传参的功能,避免自己对业务代码的入侵。 + + +### 9、Dubbo 是什么? + +Dubbo 是一个分布式、高性能、透明化的 RPC 服务框架,提供服务自动注册、自动发现等高效服务治理方案, 可以和Spring 框架无缝集成 + + +### 10、服务调用是阻塞的吗? + +默认是阻塞的,可以异步调用,没有返回值的可以这么做。Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。 + + +### 11、说说核心的配置有哪些? +### 12、Dubbo 可以对结果进行缓存吗? +### 13、注册了多个同一样的服务,如果测试指定的某一个服务呢? +### 14、为什么要用 Dubbo? +### 15、如何解决服务调用链过长的问题? +### 16、Dubbo 类似的分布式框架还有哪些? +### 17、Dubbo集群提供了哪些负载均衡策略? +### 18、一般使用什么注册中心?还有别的选择吗? +### 19、dubbo 通信协议 dubbo 协议为什么要消费者比提供者个数多? +### 20、Dubbo 和 Spring Cloud 有什么哪些区别? +### 21、RPC使用了哪些关键技术,动态代理 +### 22、Dubbo 在安全机制方面是如何解决的 +### 23、Dubbo 支持哪些协议,它们的优缺点有哪些? +### 24、Dubbo 和 Spring Cloud 的区别? +### 25、服务上线怎么兼容旧版本? +### 26、Dubbo有哪几种集群容错方案,默认是哪种? +### 27、Dubbo 和 Spring Cloud 的关系? +### 28、Dubbo telnet 命令能做什么? +### 29、Dubbo 如何优雅停机? +### 30、同一个服务多个注册的情况下可以直连某一个服务吗? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Dubbo/Dubbo\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\357\274\2142021\345\271\264\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" "b/docs/Dubbo/Dubbo\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\357\274\2142021\345\271\264\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" new file mode 100644 index 0000000..731450f --- /dev/null +++ "b/docs/Dubbo/Dubbo\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\357\274\2142021\345\271\264\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" @@ -0,0 +1,106 @@ +# Dubbo最新面试题,2021年面试题及答案汇总 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、RPC使用了哪些关键技术,反序列化 + +当B机器接收到A机器的应用发来的请求之后,又需要对接收到的参数等信息进行反序列化操作(序列化的逆操作),即将二进制信息恢复为内存中的表达方式,然后再找到对应的方法(寻址的一部分)进行本地调用(一般是通过生成代理Proxy去调用, 通常会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),之后得到调用的返回值。 + + +### 2、你还了解别的分布式框架吗? + +别的还有spring的spring cloud,facebook的thrift,twitter的finagle等。 + + +### 3、你觉得用 Dubbo 好还是 Spring Cloud 好? + +扩展性的问题,没有好坏,只有适合不适合,不过我好像更倾向于使用 Dubbo, Spring Cloud 版本升级太快,组件更新替换太频繁,配置太繁琐,还有很多我觉得是没有 Dubbo 顺手的地方。 + + +### 4、什么是RPC + +RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。简言之,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源。比较关键的一些方面包括:通讯协议、序列化、资源(接口)描述、服务框架、性能、语言支持等。 + +![](https://gitee.com/souyunkutech/souyunku-home/raw/master/images/souyunku-web/2020/5/2/026/54/80_3.png#alt=80%5C_3.png) + +简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。 + + +### 5、dubbo 和 dubbox 之间的区别? + +dubbox 是当当网基于 dubbo 上做了一些扩展,如加了服务可 restful 调用,更新了开源组件等。推荐阅读:厉害了,Dubbo 正式毕业!建议看下它的发展史! + + +### 6、如何解决服务调用链过长的问题? + +Dubbo 可以使用 Pinpoint 和 Apache Skywalking(Incubator) 实现分布式服务追踪,当然还有其他很多方案。 + + +### 7、Dubbo 超时设置有哪些方式? + +Dubbo 超时设置有两种方式: + +**1、** 服务提供者端设置超时时间,在Dubbo的用户文档中,推荐如果能在服务端多配置就尽量多配置,因为服务提供者比消费者更清楚自己提供的服务特性。 + +**2、** 服务消费者端设置超时时间,如果在消费者端设置了超时时间,以消费者端为主,即优先级更高。因为服务调用方设置超时时间控制性更灵活。如果消费方超时,服务端线程不会定制,会产生警告。 + + +### 8、RPC使用了哪些关键技术,服务注册中心 + +可选:Redis、Zookeeper、Consul 、Etcd。一般使用ZooKeeper提供服务注册与发现功能,解决单点故障以及分布式部署的问题(注册中心)。 + + +### 9、Dubbo 支持分布式事务吗? + +**1、** 目前暂时不支持,可与通过 tcc-transaction 框架实现 + +**2、** 介绍:tcc-transaction 是开源的 TCC 补偿性分布式事务框架 + +**3、** TCC-Transaction 通过 Dubbo 隐式传参的功能,避免自己对业务代码的入侵。 + + +### 10、Dubbo 的默认集群容错方案? + +Failover Cluster + + +### 11、说说 Dubbo 服务暴露的过程。 +### 12、Dubbo Monitor 实现原理? +### 13、Dubbo 服务降级,失败重试怎么做? +### 14、如何解决服务调用链过长的问题? +### 15、说说核心的配置有哪些? +### 16、Dubbo 配置文件是如何加载到 Spring 中的? +### 17、Dubbo必须依赖的包有哪些? +### 18、RPC框架需要解决的问题? +### 19、Dubbo 用到哪些设计模式? +### 20、说说核心的配置有哪些? +### 21、Dubbo的集群容错方案有哪些? +### 22、Dubbo 集群提供了哪些负载均衡策略? +### 23、Dubbo集群提供了哪些负载均衡策略? +### 24、当一个服务接口有多种实现时怎么做? +### 25、Dubbo 核心功能有哪些? +### 26、Dubbo有哪几种负载均衡策略,默认是哪种? +### 27、Dubbo 支持哪些协议,每种协议的应用场景,优缺点? +### 28、Dubbo SPI 和 Java SPI 区别? +### 29、Dubbo SPI 和 Java SPI 区别? +### 30、Dubbo 使用过程中都遇到了些什么问题? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\345\244\247\346\261\207\346\200\273\357\274\214\351\231\204\347\255\224\346\241\210.md" "b/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\345\244\247\346\261\207\346\200\273\357\274\214\351\231\204\347\255\224\346\241\210.md" new file mode 100644 index 0000000..04dfe3c --- /dev/null +++ "b/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\345\244\247\346\261\207\346\200\273\357\274\214\351\231\204\347\255\224\346\241\210.md" @@ -0,0 +1,242 @@ +# Elasticsearch最新2021年面试题大汇总,附答案 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、你是如何做 ElasticSearch 写入调优的? + +1)写入前副本数设置为0; + +2)写入前关闭refresh_interval设置为-1,禁用刷新机制; + +3)写入过程中:采取bulk批量写入; + +4) 写入后恢复副本数和刷新间隔; + +5) 尽量使用自动生成的id。 + + +### 2、elasticsearch 数据的写入原理 + +es数据写入原理主要可以分为4个操作: + +**1、** refresh + +**2、** commit + +**3、** flush + +**4、** merge + +| 操作触发条件 | 操作过程 | +| --- | --- | +| **refresh** | 1\\、每隔1s进行一次refresh操作 +2\\、buffer已满,则进行一次refresh操作 | +| 2\\、清空buffer | | +| **commit** | 1\\、每隔30分钟执行一次translog +2\\、translog日志已满 | +| 2\\、生成一个 commit point 文件标识此次操作一件把buffer数据执行到了哪一个segment文件 +3\\、执行flush操作 | | +| **flush** | commit操作中 | +| **merge** | 后台检查 | + + +![](https://image-static.segmentfault.com/284/854/2848546943-5e5b563ad0f06_articlex#alt=3chLse.png) + + +### 3、elasticsearch 索引数据多了怎么办,如何调优,部署 + +`面试官`:想了解大数据量的运维能力。 + +索引数据的规划,应在前期做好规划,正所谓“设计先行,编码在后”,这样才能有效的避免突如其来的数据激增导致集群处理能力不足引发的线上客户检索或者其他业务受到影响。 + +如何调优,正如问题1所说,这里细化一下: + +**动态索引层面** + +基于`模板+时间+rollover api滚动`创建索引,举例:设计阶段定义:blog索引的模板格式为:blog_index_时间戳的形式,每天递增数据。 + +这样做的好处:不至于数据量激增导致单个索引数据量非常大,接近于上线2的32次幂-1,索引存储达到了TB+甚至更大。 + +一旦单个索引很大,存储等各种风险也随之而来,所以要提前考虑+及早避免。 + +**存储层面** + +`冷热数据分离存储`,热数据(比如最近3天或者一周的数据),其余为冷数据。 + +对于冷数据不会再写入新数据,可以考虑定期force_merge加shrink压缩操作,节省存储空间和检索效率。 + +**部署层面** + +一旦之前没有规划,这里就属于应急策略。 + +结合ES自身的支持动态扩展的特点,动态新增机器的方式可以缓解集群压力,注意:如果之前主节点等`规划合理`,不需要重启集群也能完成动态新增的。 + + +### 4、Elasticsearch的 文档是什么? + +文档是存储在 Elasticsearch 中的 JSON 文档。它等效于关系数据库表中的一行记录。 + + +### 5、详细描述一下Elasticsearch搜索的过程? + +`面试官`:想了解ES搜索的底层原理,不再只关注业务层面了。 + +搜索拆解为“query then fetch” 两个阶段。 + +**query阶段的目的**:定位到位置,但不取。 + +步骤拆解如下: + +**1、** 假设一个索引数据有5主+1副本 共10分片,一次请求会命中(主或者副本分片中)的一个。 + +**2、** 每个分片在本地进行查询,结果返回到本地有序的优先队列中。 + +**3、** 第2)步骤的结果发送到协调节点,协调节点产生一个全局的排序列表。 + +**fetch阶段的目的**:取数据。 + +路由节点获取所有文档,返回给客户端。 + + +### 6、我们可以在 Elasticsearch 中执行搜索的各种可能方式有哪些? + +核心方式如下: + +方式一:基于 DSL 检索(最常用) Elasticsearch提供基于JSON的完整查询DSL来定义查询。 + +``` +GET /shirts/_search +{ + "query": { + "bool": { + "filter": [ + { "term": { "color": "red" }}, + { "term": { "brand": "gucci" }} + ] + } + } +} +``` + +方式二:基于 URL 检索 + +``` +GET /my_index/_search?q=user:seina +``` + +方式三:类SQL 检索 + +``` +POST /_sql?format=txt +{ + "query": "SELECT * FROM uint-2020-08-17 ORDER BY itemid DESC LIMIT 5" +} +``` + +功能还不完备,不推荐使用。 + + +### 7、Elasticsearch中的属性 enabled, index 和 store 的功能是什么? + +enabled:false,启用的设置仅可应用于顶级映射定义和 Object 对象字段,导致 Elasticsearch 完全跳过对字段内容的解析。 + +仍然可以从_source字段中检索JSON,但是无法搜索或以其他任何方式存储JSON。 + +如果对非全局或者 Object 类型,设置 enable : false 会报错如下: + +``` + "type": "mapper_parsing_exception", + "reason": "Mapping definition for [user_id] has unsupported parameters: [enabled : false]" +``` + +index:false, 索引选项控制是否对字段值建立索引。它接受true或false,默认为true。未索引的字段不可查询。 + +如果非要检索,报错如下: + +``` + "type": "search_phase_execution_exception", + "reason": "Cannot search on field [user_id] since it is not indexed." +``` + +**store:** + +某些特殊场景下,如果你只想检索单个字段或几个字段的值,而不是整个_source的值,则可以使用源过滤来实现; + +这个时候, store 就派上用场了。 + + +### 8、什么是Elasticsearch Analyzer? + +分析器用于文本分析,它可以是内置分析器也可以是自定义分析器。 + + +### 9、是否了解字典树? + +**常用字典数据结构如下所示:** + +![70_8.png][70_8.png] + +**Trie 的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以** + +达到提高效率的目的。 + +**它有 3 个基本性质:** + +**1、** 根节点不包含字符,除根节点外每一个节点都只包含一个字符。 + +**2、** 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 + +**3、** 每个节点的所有子节点包含的字符都不相同。 + +![70_9.png][70_9.png] + +**1、** 可以看到,trie 树每一层的节点数是 26^i 级别的。所以为了节省空间,我们还可以用动态链表,或者用数组来模拟动态。而空间的花费,不会超过单词数×单词长度。 + +**2、实现:**对每个结点开一个字母集大小的数组,每个结点挂一个链表,使用左儿子右兄弟表示法记录这棵树; + +**3、** 对于中文的字典树,每个节点的子节点用一个哈希表存储,这样就不用浪费太大的空间,而且查询速度上可以保留哈希的复杂度 O(1)。 + + +### 10、在安装Elasticsearch时,请说明不同的软件包及其重要性? + +这个貌似没什么好说的,去官方文档下载对应操作系统安装包即可。 + +部分功能是收费的,如机器学习、高级别 kerberos 认证安全等选型要知悉。 + + +### 11、在Elasticsearch中 cat API的功能是什么? +### 12、详细描述一下Elasticsearch更新和删除文档的过程。 +### 13、Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法 +### 14、elasticsearch 全文检索 +### 15、Elasticsearch 支持哪些配置管理工具? +### 16、Kibana在Elasticsearch的哪些地方以及如何使用? +### 17、Elasticsearch对于大数据量(上亿量级)的聚合如何实现? +### 18、如何监控 Elasticsearch 集群状态? +### 19、安装 Elasticsearch 需要依赖什么组件吗? +### 20、定义副本、创建副本的好处是什么? +### 21、详细描述一下ElasticSearch更新和删除文档的过程 +### 22、在 Elasticsearch 中列出集群的所有索引的语法是什么? +### 23、elasticsearch 的倒排索引是什么 +### 24、Elasticsearch 中常用的 cat命令有哪些? +### 25、elasticsearch 的 document设计 +### 26、您能否列出 与 ELK日志分析相关的应用场景? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220\357\274\214\345\244\247\346\261\207\346\200\273.md" "b/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220\357\274\214\345\244\247\346\261\207\346\200\273.md" new file mode 100644 index 0000000..d40ff48 --- /dev/null +++ "b/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220\357\274\214\345\244\247\346\261\207\346\200\273.md" @@ -0,0 +1,213 @@ +# Elasticsearch最新2021年面试题附答案解析,大汇总 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、能列出 10 个使用 Elasticsearch 作为其搜索引擎或数据库的公司吗? + +这个问题,铭毅本来想删掉。但仔细一想,至少能看出求职者的视野够不够开阔。 + +参与过 Elastic中文社区活动或者经常关注社区动态的就知道,公司太多了,列举如下(排名不分先后): + +1、阿里 + +2、腾讯 + +3、百度 + +4、京东 + +5、美团 + +6、小米 + +7、滴滴 + +8、携程 + +**9、** 今日头条 + +**10、** 贝壳找房 + +**11、** 360 + +**12、** IBM + +**13、** 顺丰快递 + +几乎我们能想到的互联网公司都在使用 Elasticsearch。 + +关注 TOP 互联网公司的相关技术的动态和技术博客,也是一种非常好的学习方式。 + + +### 2、Elasticsearch Analyzer 中的字符过滤器如何利用? + +字符过滤器将原始文本作为字符流接收,并可以通过添加,删除或更改字符来转换字符流。 + +字符过滤分类如下: + +**HTML Strip Character Filter.** + +用途:删除HTML元素,如**,并解码HTML实体,如&amp 。** + +**Mapping Character Filter** + +用途:替换指定的字符。 + +**Pattern Replace Character Filter** + +用途:基于正则表达式替换指定的字符。 + + +### 3、请解释一下 Elasticsearch 中聚合? + +聚合有助于从搜索中使用的查询中收集数据,聚合为各种统计指标,便于统计信息或做其他分析。聚合可帮助回答以下问题: + +**1、** 我的网站平均加载时间是多少? + +**2、** 根据交易量,谁是我最有价值的客户? + +**3、** 什么会被视为我网络上的大文件? + +**4、** 每个产品类别中有多少个产品? + +**聚合的分三类:** + +主要查看7.10 的官方文档,早期是4个分类,别大意啊! + +**分桶 Bucket 聚合** + +根据字段值,范围或其他条件将文档分组为桶(也称为箱)。 + +**指标 Metric 聚合** + +从字段值计算指标(例如总和或平均值)的指标聚合。 + +**管道 Pipeline 聚合** + +子聚合,从其他聚合(而不是文档或字段)获取输入。 + + +### 4、客户端在和集群连接时,如何选择特定的节点执行请求的? + +TransportClient 利用 transport 模块远程连接一个 elasticsearch 集群。它并不加入到集群中,只是简单的获得一个或者多个初始化的 transport 地址,并以 轮询 的方式与这些地址进行通信。 + + +### 5、ElasticSearch是如何实现Master选举的? + +ElasticSearch的选举是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单播模块包含一个主机列表以控制哪些节点需要ping通)这两部分; + +对所有可以成为master的节点(node.master: true)根据nodeId字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。 + +如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己, 那这个节点就是master。否则重新选举一直到满足上述条件。 + + +### 6、如何使用 Elasticsearch Tokenizer? + +Tokenizer 接收字符流(如果包含了字符过滤,则接收过滤后的字符流;否则,接收原始字符流),将其分词。同时记录分词后的顺序或位置(position),以及开始值(start_offset)和偏移值(end_offset-start_offset)。 + + +### 7、ES在生产集群的部署架构是什么,每个索引有多大的数据量,每个索引有多少分片 + +**生产环境部署情况** + +**1、** es生产集群我们部署了5台机器,每台机器是6核64G的,集群总内存是320G + +**2、** 我们es集群的日增量数据大概是2000万条,每天日增量数据大概是500MB, + +**3、** 每月增量数据大概是6亿,15G。目前系统已经运行了几个月,现在es集群里数据总量大概是100G左右。 + +**4、** 目前线上有5个索引(这个结合你们自己业务来,看看自己有哪些数据可以放es的), + +**5、** 每个索引的数据量大概是20G,所以这个数据量之内,我们每个索引分配的是8个shard,比默认的5个shard多了3个shard。 + + + +### 8、Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法? + +**1、** 64 GB 内存的机器是非常理想的, 但是 32 GB 和 16 GB 机器也是很常见的。少于 8 GB 会适得其反。 + +**2、** 如果你要在更快的 CPUs 和更多的核心之间选择,选择更多的核心更好。多个内核提供的额外并发远胜过稍微快一点点的时钟频率。 + +**3、** 如果你负担得起 SSD,它将远远超出任何旋转介质。基于 SSD 的节点,查询和索引性能都有提升。如果你负担得起,SSD 是一个好的选择。 + +**4、** 即使数据中心们近在咫尺,也要避免集群跨越多个数据中心。绝对要避免集群跨越大的地理距离。 + +**5、** 请确保运行你应用程序的 JVM 和服务器的 JVM 是完全一样的。在Elasticsearch 的几个地方,使用 Java 的本地序列化。 + +**6、** 通过设置 gateway.recover_after_nodes、gateway.expected_nodes、gateway.recover_after_time 可以在集群重启的时候避免过多的分片交换,这可能会让数据恢复从数个小时缩短为几秒钟。 + +**7、** Elasticsearch 默认被配置为使用单播发现,以防止节点无意中加入集群。只有在同一台机器上运行的节点才会自动组成集群。最好使用单播代替组播。 + +**8、** 不要随意修改垃圾回收器(CMS)和各个线程池的大小。 + +**9、** 把你的内存的(少于)一半给 Lucene(但不要超过 32 GB!),通过ES_HEAP_SIZE 环境变量设置。 + +**10、** 内存交换到磁盘对服务器性能来说是致命的。如果内存交换到磁盘上,一个100 微秒的操作可能变成 10 毫秒。再想想那么多 10 微秒的操作时延累加起来。不难看出 swapping 对于性能是多么可怕。 + +**11、** Lucene 使用了_大量 的_文件。同时,Elasticsearch 在节点和 HTTP 客户端之间进行通信也使用了大量的套接字。所有这一切都需要足够的文件描述符。你应该增加你的文件描述符,设置一个很大的值,如 64,000。 + +补充:索引阶段性能提升方法. + +**1、** 使用批量请求并调整其大小:每次批量数据 5–15 MB 大是个不错的起始点。 + +**2、存储:**使用 SSD + +**3、段和合并:**Elasticsearch 默认值是 20 MB/s,对机械磁盘应该是个不错的设置。如果你用的是 SSD,可以考虑提高到 100–200 MB/s。如果你在做批量导入,完全不在意搜索,你可以彻底关掉合并限流。另外还可以增加index.translog.flush_threshold_size 设置,从默认的 512 MB 到更大一些的值,比如 1 GB,这可以在一次清空触发的时候在事务日志里积累出更大的段。 + +**4、** 如果你的搜索结果不需要近实时的准确度,考虑把每个索引的index.refresh_interval 改到 30s。 + +**5、** 如果你在做大批量导入,考虑通过设置 index.number_of_replicas: 0 关闭副本。 + + +### 9、Elasticsearch 对于大数据量(上亿量级)的聚合如何实现? + +Elasticsearch 提供的首个近似聚合是 cardinality 度量。它提供一个字段的基数,即该字段的 _distinct_ 或者 _unique_ 值的数目。它是基于 HLL 算法的。HLL 会先对我们的输入作哈希运算,然后根据哈希运算的结果中的 bits 做概率估算从而得到 + +基数。其特点是:可配置的精度,用来控制内存的使用(更精确 = 更多内存);小的数据集精度是非常高的;我们可以通过配置参数,来设置去重需要的固定内存使用量。无论数千还是数十亿的唯一值,内存使用量只与你配置的精确度相关。 + + +### 10、elasticsearch 的 filesystem + +es每次走fileSystem cache查询速度是最快的 + +所以将每个查询的数据50% 容量 + += fileSystem cache 容量。 + + +### 11、ElasticSearch中的倒排索引是什么? +### 12、ElasticSearch中的副本是什么? +### 13、elasticsearch 实际设计 +### 14、elasticsearch 分布式架构原理 +### 15、解释一下 Elasticsearch 的 分片? +### 16、elasticsearch 冷热分离 +### 17、Elasticsearch 支持哪些类型的查询? +### 18、详细说明ELK Stack及其内容? +### 19、Elasticsearch中的 Ingest 节点如何工作? +### 20、解释一下 Elasticsearch Node? +### 21、elasticsearch的倒排索引是什么 +### 22、Elasticsearch在部署时,对Linux的设置有哪些优化方法 +### 23、ElasticSearch中的分析器是什么? +### 24、是否了解字典树? +### 25、拼写纠错是如何实现的? +### 26、解释一下 Elasticsearch 集群中的 Type 的概念 ? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\357\274\214\351\253\230\347\272\247\351\235\242\350\257\225\351\242\230\345\217\212\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220.md" "b/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\357\274\214\351\253\230\347\272\247\351\235\242\350\257\225\351\242\230\345\217\212\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220.md" new file mode 100644 index 0000000..3776002 --- /dev/null +++ "b/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\357\274\214\351\253\230\347\272\247\351\235\242\350\257\225\351\242\230\345\217\212\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220.md" @@ -0,0 +1,228 @@ +# Elasticsearch最新2021年面试题,高级面试题及附答案解析 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、简要介绍一下Elasticsearch? + +Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。 + +ElasticSearch 是基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码,是当前流行的企业级搜索引擎。 + +**核心特点如下:** + +**1、** 分布式的实时文件存储,每个字段都被索引且可用于搜索。 + +**2、** 分布式的实时分析搜索引擎,海量数据下近实时秒级响应。 + +**3、** 简单的restful api,天生的兼容多语言开发。 + +**4、** 易扩展,处理PB级结构化或非结构化数据。 + + +### 2、ElasticSearch如何避免脑裂? + +可以通过设置最少投票通过数量(discovery.zen.minimum_master_nodes)超过所有候选节点一半以上,来解决脑裂问题。 + + +### 3、详细描述一下 Elasticsearch 索引文档的过程。 + +协调节点默认使用文档 ID 参与计算(也支持通过 routing),以便为路由提供合适的分片。 + +``` +shard = hash(document_id) % (num_of_primary_shards) +``` + +**1、** 当分片所在的节点接收到来自协调节点的请求后,会将请求写入到 MemoryBuffer,然后定时(默认是每隔 1 秒)写入到 Filesystem Cache,这个从MomeryBuffer 到 Filesystem Cache 的过程就叫做 refresh; + +**2、** 当然在某些情况下,存在 Momery Buffer 和 Filesystem Cache 的数据可能会丢失,ES 是通过 translog 的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写入到 translog 中,当 Filesystem cache 中的数据写入到磁盘中时,才会清除掉,这个过程叫做 flush; + +**3、** 在 flush 过程中,内存中的缓冲将被清除,内容被写入一个新段,段的 fsync将创建一个新的提交点,并将内容刷新到磁盘,旧的 translog 将被删除并开始一个新的 translog。 + +**4、** flush 触发的时机是定时触发(默认 30 分钟)或者 translog 变得太大(默认为 512M)时; + +**补充:关于 Lucene 的 Segement:** + +**1、** Lucene 索引是由多个段组成,段本身是一个功能齐全的倒排索引。 + +**2、** 段是不可变的,允许 Lucene 将新的文档增量地添加到索引中,而不用从头重建索引。 + +**3、** 对于每一个搜索请求而言,索引中的所有段都会被搜索,并且每个段会消耗CPU 的时钟周、文件句柄和内存。这意味着段的数量越多,搜索性能会越低。 + +**4、** 为了解决这个问题,Elasticsearch 会合并小段到一个较大的段,提交新的合并 + +段到磁盘,并删除那些旧的小段。 + + +### 4、详细描述一下 Elasticsearch 搜索的过程? + +面试官:想了解 ES 搜索的底层原理,不再只关注业务层面了。 + +解 + +搜索拆解为“query then fetch” 两个阶段。 + +query 阶段的目的:定位到位置,但不取。 + +**步骤拆解如下:** + +**1、** 假设一个索引数据有 5 主+1 副本 共 10 分片,一次请求会命中(主或者副本分片中)的一个。 + +**2、** 每个分片在本地进行查询,结果返回到本地有序的优先队列中。 + +**3、** 第 2)步骤的结果发送到协调节点,协调节点产生一个全局的排序列表。fetch 阶段的目的:取数据。路由节点获取所有文档,返回给客户端。 + + +### 5、你可以列出 Elasticsearch 各种类型的分析器吗? + +Elasticsearch Analyzer 的类型为内置分析器和自定义分析器。 + +**Standard Analyzer** + +标准分析器是默认分词器,如果未指定,则使用该分词器。 + +它基于Unicode文本分割算法,适用于大多数语言。 + +**Whitespace Analyzer** + +基于空格字符切词。 + +**Stop Analyzer** + +在simple Analyzer的基础上,移除停用词。 + +**Keyword Analyzer** + +不切词,将输入的整个串一起返回。 + +自定义分词器的模板 + +自定义分词器的在Mapping的Setting部分设置: + +``` +PUT my_custom_index +{ + "settings":{ + "analysis":{ + "char_filter":{}, + "tokenizer":{}, + "filter":{}, + "analyzer":{} + } + } +} +``` + +脑海中还是上面的三部分组成的图示。其中: + +“char_filter”:{},——对应字符过滤部分; + +“tokenizer”:{},——对应文本切分为分词部分; + +“filter”:{},——对应分词后再过滤部分; + +“analyzer”:{}——对应分词器组成部分,其中会包含:1. 2. 3。 + + +### 6、什么是ElasticSearch索引? + +索引(名词): 一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices或indexes。 + +索引(动词):「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像SQL中的INSERT关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。 + + +### 7、Elasticsearch是如何实现Master选举的? + +**1、** Elasticsearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单播模块包含一个主机列表以控制哪些节点需要ping通)这两部分; + +**2、** 对所有可以成为master的节点(**node.master: true**)根据nodeId字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。 + +**3、** 如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己,那这个节点就是master。否则重新选举一直到满足上述条件。 + +**4、** 补充:master节点的职责主要包括集群、节点和索引的管理,不负责文档级别的管理;data节点可以关闭http功能*。 + + +### 8、详细描述一下Elasticsearch索引文档的过程 + +`面试官`:想了解ES的底层原理,不再只关注业务层面了。 + +这里的索引文档应该理解为文档写入ES,创建索引的过程。 + +文档写入包含:单文档写入和批量bulk写入,这里只解释一下:单文档写入流程。 + +记住官方文档中的这个图。 + +![](https://gitee.com/souyunkutech/souyunku-home/raw/master/images/souyunku-web/2019/08/0814/01/img_3.png#alt=img%5C_3.png) + +第一步:客户写集群某节点写入数据,发送请求。(如果没有指定路由/协调节点,请求的节点扮演`路由节点`的角色。) + +第二步:节点1接受到请求后,使用文档_id来确定文档属于分片0。请求会被转到另外的节点,假定节点3。因此分片0的主分片分配到节点3上。 + +第三步:节点3在主分片上执行写操作,如果成功,则将请求并行转发到节点1和节点2的副本分片上,等待结果返回。所有的副本分片都报告成功,节点3将向协调节点(节点1)报告成功,节点1向请求客户端报告写入成功。 + +如果面试官再问:第二步中的文档获取分片的过程? + +回借助路由算法获取,路由算法就是根据路由和文档id计算目标的分片id的过程。 + +``` +1shard = hash(_routing) % (num_of_primary_shards) +``` + + +### 9、对于GC方面,在使用Elasticsearch时要注意什么? + +**1、** SEE:[https://elasticsearch.cn/article/32](https://elasticsearch.cn/article/32) + +**2、** 倒排词典的索引需要常驻内存,无法GC,需要监控data node上segment memory增长趋势。 + +**3、** 各类缓存,field cache, filter cache, indexing cache, bulk queue等等,要设置合理的大小,并且要应该根据最坏的情况来看heap是否够用,也就是各类缓存全部占满的时候,还有heap空间可以分配给其他任务吗?避免采用clear cache等“自欺欺人”的方式来释放内存。 + +**4、** 避免返回大量结果集的搜索与聚合。确实需要大量拉取数据的场景,可以采用scan & scroll api来实现。 + +**5、** cluster stats驻留内存并无法水平扩展,超大规模集群可以考虑分拆成多个集群通过tribe node连接。 + +**6、** 想知道heap够不够,必须结合实际应用场景,并对集群的heap使用情况做持续的监控。 + + +### 10、Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办? + +**1、** 当集群master候选数量不小于3个时,可以通过设置最少投票通过数量(**discovery.zen.minimum_master_nodes**)超过所有候选节点一半以上来解决脑裂问题; + +**2、** 当候选数量为两个时,只能修改为唯一的一个master候选,其他作为data节点,避免脑裂问题。 + + +### 11、ElasticSearch对于大数据量(上亿量级)的聚合如何实现? +### 12、ElasticSearch如何监控集群状态? +### 13、在Elasticsearch中 按 ID检索文档的语法是什么? +### 14、你能否在 Elasticsearch 中定义映射? +### 15、你能否列出与 Elasticsearch 有关的主要可用字段数据类型? +### 16、客户端在和集群连接时,是如何选择特定的节点执行请求的? +### 17、19、解释 Elasticsearch 中的相关性和得分? +### 18、您能解释一下X-Pack for Elasticsearch的功能和重要性吗? +### 19、Master 节点和 候选 Master节点有什么区别? +### 20、lucence 内部结构是什么? +### 21、对于 GC 方面,在使用 Elasticsearch 时要注意什么? +### 22、详细描述一下Elasticsearch索引文档的过程。 +### 23、精准匹配检索和全文检索匹配检索的不同? +### 24、在 Elasticsearch 中删除索引的语法是什么? +### 25、在索引中更新 Mapping 的语法? +### 26、客户端在和集群连接时,如何选择特定的节点执行请求的? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\260\351\235\242\350\257\225\351\242\2302021\345\271\264\357\274\214\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" "b/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\260\351\235\242\350\257\225\351\242\2302021\345\271\264\357\274\214\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" new file mode 100644 index 0000000..936d180 --- /dev/null +++ "b/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\260\351\235\242\350\257\225\351\242\2302021\345\271\264\357\274\214\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" @@ -0,0 +1,158 @@ +# Elasticsearch最新面试题2021年,常见面试题及答案汇总 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、如何使用 Elastic Reporting ? + +收费功能,只是了解,点到为止。 + +Reporting API有助于将检索结果生成 PD F格式,图像 PNG 格式以及电子表格 CSV 格式的数据,并可根据需要进行共享或保存。 + + +### 2、如何监控Elasticsearch集群状态? + +Marvel 让你可以很简单的通过 Kibana 监控 Elasticsearch。你可以实时查看你的集群健康状态和性能,也可以分析过去的集群、索引和节点指标。 + + +### 3、什么是ElasticSearch脑裂? + +一个正常es集群中只有一个主节点,主节点负责管理整个集群,集群的所有节点都会选择同一个节点作 为主节点所以无论访问那个节点都可以查看集群的状态信息。而脑裂问题的出现就是因为从节点在选择 主节点上出现分歧导致一个集群出现多个主节点从而使集群分裂,使得集群处于异常状态。 + + +### 4、介绍一下你们的个性化搜索方案? + +SEE [基于word2vec和Elasticsearch实现个性化搜索](http://ginobefunny.com/post/personalized_search_implemention_based_word2vec_and_elasticsearch/) + + +### 5、请解释在 Elasticsearch 集群中添加或创建索引的过程? + +要添加新索引,应使用创建索引 API 选项。创建索引所需的参数是索引的配置Settings,索引中的字段 Mapping 以及索引别名 Alias。 + +也可以通过模板 Template 创建索引。 + + +### 6、你之前公司的ElasticSearch集群,一个Node一般会分配几个分片? + +我们遵循官方建议,一个Node最好不要多于三个shards. + + +### 7、拼写纠错是如何实现的? + +**1、** 拼写纠错是基于编辑距离来实现;编辑距离是一种标准的方法,它用来表示经过插入、删除和替换操作从一个字符串转换到另外一个字符串的最小操作步数; + +**2、** 编辑距离的计算过程:比如要计算batyu和beauty的编辑距离,先创建一个7×8的表(batyu长度为5,coffee长度为6,各加2),接着,在如下位置填入黑色数字。其他格的计算过程是取以下三个值的最小值: + +如果最上方的字符等于最左方的字符,则为左上方的数字。否则为左上方的数字+1。(对于3,3来说为0) + +左方数字+1(对于3,3格来说为2) + +上方数字+1(对于3,3格来说为2) + +最终取右下角的值即为编辑距离的值3。 + +![](https://gitee.com/souyunkutech/souyunku-home/raw/master/images/souyunku-web/2019/08/0820/02/img_6.png#alt=img%5C_6.png) + +对于拼写纠错,我们考虑构造一个度量空间(Metric Space),该空间内任何关系满足以下三条基本条件: + +d(x,y) = 0 -- 假如x与y的距离为0,则x=y + +d(x,y) = d(y,x)  -- x到y的距离等同于y到x的距离 + +d(x,y) + d(y,z) >= d(x,z) -- 三角不等式 + +**1、** 根据三角不等式,则满足与query距离在n范围内的另一个字符转B,其与A的距离最大为d+n,最小为d-n。 + +**2、** BK树的构造就过程如下:每个节点有任意个子节点,每条边有个值表示编辑距离。所有子节点到父节点的边上标注n表示编辑距离恰好为n。比如,我们有棵树父节点是”book”和两个子节点”cake”和”books”,”book”到”books”的边标号1,”book”到”cake”的边上标号4。从字典里构造好树后,无论何时你想插入新单词时,计算该单词与根节点的编辑距离,并且查找数值为d(neweord, root)的边。递归得与各子节点进行比较,直到没有子节点,你就可以创建新的子节点并将新单词保存在那。比如,插入”boo”到刚才上述例子的树中,我们先检查根节点,查找d(“book”, “boo”) = 1的边,然后检查标号为1的边的子节点,得到单词”books”。我们再计算距离d(“books”, “boo”)=2,则将新单词插在”books”之后,边标号为2。 + +**3、** 查询相似词如下:计算单词与根节点的编辑距离d,然后递归查找每个子节点标号为d-n到d+n(包含)的边。假如被检查的节点与搜索单词的距离d小于n,则返回该节点并继续查询。比如输入cape且最大容忍距离为1,则先计算和根的编辑距离d(“book”, “cape”)=4,然后接着找和根节点之间编辑距离为3到5的,这个就找到了cake这个节点,计算d(“cake”, “cape”)=1,满足条件所以返回**cake**,然后再找和cake节点编辑距离是0到2的,分别找到cape和cart节点,这样就得到**cape**这个满足条件的结果。 + +![](https://gitee.com/souyunkutech/souyunku-home/raw/master/images/souyunku-web/2019/08/0820/02/img_7.png#alt=img%5C_7.png) + + +### 8、您能解释一下 Elasticsearch 中的 Explore API 吗? + +没有用过,这是 Graph (收费功能)相关的API。 + +点到为止即可,类似问题实际开发现用现查,类似问题没有什么意义。 + +[https://www.elastic.co/guide/en/elasticsearch/reference/current/graph-explore-api.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/graph-explore-api.html) + + +### 9、elasticsearch是如何实现master选举的 + +`面试官`:想了解ES集群的底层原理,不再只关注业务层面了。 + +**前置前提:** + +**1、** 只有候选主节点(master:true)的节点才能成为主节点。 + +**2、** 最小主节点数(min_master_nodes)的目的是防止脑裂。 + +这个我看了各种网上分析的版本和源码分析的书籍,云里雾里。 + +核对了一下代码,核心入口为findMaster,选择主节点成功返回对应Master,否则返回null。选举流程大致描述如下: + +第一步:确认候选主节点数达标,elasticsearch.yml设置的值discovery.zen.minimum_master_nodes; + +第二步:比较:先判定是否具备master资格,具备候选主节点资格的优先返回;若两节点都为候选主节点,则id小的值会主节点。注意这里的id为string类型。 + +题外话:获取节点id的方法。 + +``` + 1GET /_cat/nodes?v&h=ip,port,heapPercent,heapMax,id,name +2ip port heapPercent heapMax id name +``` + + +### 10、详细描述一下Elasticsearch搜索的过程。 + +**1、** 搜索被执行成一个两阶段过程,我们称之为 Query Then Fetch; + +**2、** 在初始**查询阶段**时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。 每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的优先队列。 + +PS:在搜索的时候是会查询Filesystem Cache的,但是有部分数据还在Memory Buffer,所以搜索是近实时的。 + +**3、** 每个分片返回各自优先队列中 **所有文档的 ID 和排序值** 给协调节点,它合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。 + +**4、** 接下来就是 **取回阶段**,协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。每个分片加载并 _丰富_ 文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。 + +**5、** 补充:Query Then Fetch的搜索类型在文档相关性打分的时候参考的是本分片的数据,这样在文档数量较少的时候可能不够准确,DFS Query Then Fetch增加了一个预查询的处理,询问Term和Document frequency,这个评分更准确,但是性能会变差。* + +![](https://gitee.com/souyunkutech/souyunku-home/raw/master/images/souyunku-web/2019/08/0820/02/img_2.png#alt=img%5C_2.png) + + +### 11、token filter 过滤器 在 Elasticsearch 中如何工作? +### 12、Elasticsearch 是如何实现 Master 选举的? +### 13、elasticsearch 读取数据 +### 14、您能否分步介绍如何启动 Elasticsearch 服务器? +### 15、能列举过你使用的 X-Pack 命令吗? +### 16、详细描述一下 Elasticsearch 更新和删除文档的过程。 +### 17、介绍下你们电商搜索的整体技术架构。 +### 18、可以列出X-Pack API 吗? +### 19、lucence内部结构是什么? +### 20、logstash 如何与 Elasticsearch 结合使用? +### 21、REST API在 Elasticsearch 方面有哪些优势? +### 22、Elasticsearch在部署时,对Linux的设置有哪些优化方法? +### 23、elasticsearch 数据预热 +### 24、在并发情况下,Elasticsearch如果保证读写一致? +### 25、解释一下 Elasticsearch集群中的 索引的概念 ? + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\357\274\2142021\345\271\264\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" "b/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\357\274\2142021\345\271\264\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" new file mode 100644 index 0000000..fe7df8e --- /dev/null +++ "b/docs/Elasticsearch/Elasticsearch\346\234\200\346\226\260\351\235\242\350\257\225\351\242\230\357\274\2142021\345\271\264\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\346\261\207\346\200\273.md" @@ -0,0 +1,156 @@ +# Elasticsearch最新面试题,2021年面试题及答案汇总 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、详细描述一下 Elasticsearch 搜索的过程。 + +**1、** 搜索被执行成一个两阶段过程,我们称之为 Query Then Fetch; + +**2、** 在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的优先队列。 + +PS:在搜索的时候是会查询 Filesystem Cache 的,但是有部分数据还在 Memory Buffer,所以搜索是近实时的。 + +**3、** 每个分片返回各自优先队列中 所有文档的 ID 和排序值 给协调节点,它合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。 + +**4、** 接下来就是 取回阶段,协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。每个分片加载并 _丰富_ 文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。 + +**5、** 补充:Query Then Fetch 的搜索类型在文档相关性打分的时候参考的是本分片的数据,这样在文档数量较少的时候可能不够准确,DFS Query Then Fetch 增加了一个预查询的处理,询问 Term 和 Document frequency,这个评分更准确,但是性能会变差。 + +![70_6.png][70_6.png] + + +### 2、ES更新数据的执行流程? + +(1) 将原来的doc标识为deleted状态,然后新写入一条数据。 + +(2) buffer每refresh一次,就会产生一个segmentfile,所以默认情况下是1s一个segmentfile,segmentfile会越来越多,此时会定期执行merge。 + +(3) 每次merge时,会将多个segmentfile合并成一个,同时这里会将标识为deleted的doc给物理删除掉,然后将新的segmentfile写入磁盘,这里会写一个commitpoint,标识所有新的segmentfile,然后打开segmentfile供搜索使用,同时删除旧的segmentfile。 + + +### 3、介绍一下你们的个性化搜索方案? + +SEE 基于 word2vec 和 Elasticsearch 实现个性化搜索 + + +### 4、解释一下Elasticsearch Cluster? + +Elasticsearch 集群是一组连接在一起的一个或多个 Elasticsearch 节点实例。 + +Elasticsearch 集群的功能在于在集群中的所有节点之间分配任务,进行搜索和建立索引。 + + +### 5、介绍下你们电商搜索的整体技术架构 + +![70_7.png][70_7.png] + + +### 6、请解释有关 Elasticsearch的 NRT? + +从文档索引(写入)到可搜索到之间的延迟默认一秒钟,因此Elasticsearch是近实时(NRT)搜索平台。 + +也就是说:文档写入,最快一秒钟被索引到,不能再快了。 + +写入调优的时候,我们通常会动态调整:refresh_interval = 30s 或者更达值,以使得写入数据更晚一点时间被搜索到。 + + +### 7、在并发情况下,Elasticsearch 如果保证读写一致? + +**1、** 可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,**由应用** + +**层来处理具体的冲突;** + +**2、** 另外对于写操作,一致性级别支持 quorum/one/all,默认为 quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点 + +上重建。 + +**3、** 对于读操作,可以设置 replication 为 sync(默认),这使得操作在主分片和副本分片都完成后才会返回;如果设置 replication 为 async 时,也可以通过设置搜索请求参数_preference 为 primary 来查询主分片,确保文档是最新版本。 + + +### 8、ElasticSearch主分片数量可以在后期更改吗?为什么? + +不可以,因为根据路由算法shard = hash(document_id) % (num_of_primary_shards),当主分片数量变化时会影响数据被路由到哪个分片上。 + + +### 9、elasticsearch 是如何实现 master 选举的 + +面试官:想了解 ES 集群的底层原理,不再只关注业务层面了。 + +解 + +**前置前提:** + +**1、** 只有候选主节点(master:true)的节点才能成为主节点。 + +**2、** 最小主节点数(min_master_nodes)的目的是防止脑裂。 + +这个我看了各种网上分析的版本和源码分析的书籍,云里雾里。核对了一下代码,核心入口为 findMaster,选择主节点成功返回对应 Master,否则返回 null。 + +**选举流程大致描述如下:** + +第一步:确认候选主节点数达标,elasticsearch.yml 设置的值 + +``` +discovery.zen.minimum_master_nodes; +``` + +第二步:比较:先判定是否具备 master 资格,具备候选主节点资格的优先返回; + +若两节点都为候选主节点,则 id 小的值会主节点。 + +注意这里的 id 为 string 类型。 + +题外话:获取节点 id 的方法。 + +``` +1GET /_cat/nodes?v&h=ip,port,heapPercent,heapMax,id,name +2ip +port heapPercent heapMax id +name +``` + + +### 10、迁移 Migration API 如何用作 Elasticsearch? + +迁移 API简化了X-Pack索引从一个版本到另一个版本的升级。 + +点到为止即可,类似问题实际开发现用现查,类似问题没有什么意义。 + +[https://www.elastic.co/guide/en/elasticsearch/reference/current/migration-api.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/migration-api.html) + + +### 11、Elasticsearch 对于大数据量(上亿量级)的聚合如何实现? +### 12、如何在 Elasticsearch中 搜索数据? +### 13、详细描述一下 Elasticsearch 索引文档的过程。 +### 14、elasticsearch了解多少,说说你们公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段 。 +### 15、在 Elasticsearch 中,是怎么根据一个词找到对应的倒排索引的? +### 16、Elasticsearch 中的节点(比如共 20 个),其中的 10 个选了一个master,另外 10 个选了另一个 master,怎么办? +### 17、elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段 。 +### 18、您能否说明当前可下载的稳定Elasticsearch版本? +### 19、elasticsearch 数据的写入过程 +### 20、你能告诉我 Elasticsearch 中的数据存储功能吗? +### 21、elasticsearch 索引数据多了怎么办,如何调优,部署 +### 22、Elasticsearch是如何实现master选举的? +### 23、详细描述一下Elasticsearch搜索的过程? +### 24、Beats 如何与 Elasticsearch 结合使用? +### 25、详细描述一下 Elasticsearch 索引文档的过程 + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/HTML/HTML\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\345\244\247\346\261\207\346\200\273\357\274\214\351\231\204\347\255\224\346\241\210.md" "b/docs/HTML/HTML\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\345\244\247\346\261\207\346\200\273\357\274\214\351\231\204\347\255\224\346\241\210.md" new file mode 100644 index 0000000..307f0f1 --- /dev/null +++ "b/docs/HTML/HTML\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\345\244\247\346\261\207\346\200\273\357\274\214\351\231\204\347\255\224\346\241\210.md" @@ -0,0 +1,223 @@ +# HTML最新2021年面试题大汇总,附答案 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、渲染过程中遇到 JS 文件怎么处理?(浏览器解析过程) + +JavaScript 的加载、解析与执行会阻塞文档的解析,也就是说,在构建 DOM 时,HTML 解析器若遇到了 JavaScript,那么 + +它会暂停文档的解析,将控制权移交给 JavaScript 引擎,等 JavaScript 引擎运行完毕,浏览器再从中断的地方恢复继续解 + +析文档。 + +也就是说,如果你想首屏渲染的越快,就越不应该在首屏就加载 JS 文件,这也是都建议将 script 标签放在 body 标签底部的 + +原因。当然在当下,并不是说 script 标签必须放在底部,因为你可以给 script 标签添加 defer 或者 async 属性。 + + +### 2、DOMContentLoaded 事件和 Load 事件的区别? + +当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像和 + +子框架的加载完成。 + +Load 事件是当所有资源加载完成后触发的。 + + +### 3、HTML全局属性(global attribute)有哪些 + +**1、** `class`:为元素设置类标识 + +**2、** `data-*`: 为元素增加自定义属性 + +**3、** `draggable`: 设置元素是否可拖拽 + +**4、** `id`: 元素`id`,文档内唯一 + +**5、** `lang`: 元素内容的的语言 + +**6、** `style`: 行内`css`样式 + +**7、** `title`: 元素相关的建议信息 + + +### 4、HTML5有哪些新特性,移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分HTML和HTML5** + +新增加了图像、位置、存储、多任务等功能。 + +**新增元素:** + +**1、** canvas + +**2、** 用于媒介回放的video和audio元素 + +**3、** 本地离线存储。localStorage长期存储数据,浏览器关闭后数据不丢失;sessionStorage的数据在浏览器关闭后自动删除 + +**4、** 语意化更好的内容元素,比如 article footer header nav section + +**5、** 位置API:Geolocation + +**6、** 表单控件,calendar date time email url search + +**7、** 新的技术:web worker(web worker是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行) web socket + + +### 5、box-sizing、transition、translate分别是什么? + +Box-sizing: 用来指定盒模型的大小的计算方式。主要分为boreder-box(从边框固定盒子大小)、content-box(从内容固定盒子大小)两种计算方式。 + +transition: 当前元素只要有“属性”发生变化时,可以平滑的进行过渡。通过 transtion-propety 设置过渡属性; + +transtion-duration 设置过渡时间; + +trantion-timing-function 设置过渡速度; + +trantion-delay 设置过渡延时 + +translate:通过移动改变元素的位置;有 x、y、z 三个属性 + + +### 6、如何进行网站性能优化 + +`content`方面 + +**1、** 减少`HTTP`请求:合并文件、`CSS`精灵、`inline Image` + +**2、** 减少`DNS`查询:`DNS`缓存、将资源分布到恰当数量的主机名 + +**3、** 减少`DOM`元素数量 + +`Server`方面 + +**1、** 使用`CDN` + +**2、** 配置`ETag` + +**3、** 对组件使用`Gzip`压缩 + +`Cookie`方面 + +**1、** 减小`cookie`大小 + +`css`方面 + +**1、** 将样式表放到页面顶部 + +**2、** 不使用`CSS`表达式 + +**3、** 使用``不使用`@import` + +`Javascript`方面 + +**1、** 将脚本放到页面底部 + +**2、** 将`javascript`和`css`从外部引入 + +**3、** 压缩`javascript`和`css` + +**4、** 删除不需要的脚本 + +**5、** 减少`DOM`访问 + +图片方面 + +**1、** 优化图片:根据实际颜色需要选择色深、压缩 + +**2、** 优化`css`精灵 + +**3、** 不要在`HTML`中拉伸图片 + + +### 7、Canvas 和 SVG 有什么区别? + +Canvas 是一种通过 JavaScript 来绘制 2D 图形的方法。Canvas 是逐像素来进行渲染的,因此当我们对 Canvas 进行缩放时,会出现锯齿或者失真的情况。 + +SVG 是一种使用 XML 描述 2D 图形的语言。SVG 基于 XML,这意味着 SVG DOM 中的每个元素都是可用的。我们可以为某个元素附加 JavaScript 事件监听函数。并且 SVG 保存的是图形的绘制方法,因此当 SVG 图形缩放时并不会失真。 + + +### 8、从浏览器地址栏输入url到显示页面的步骤 + +浏览器根据请求的`URL`交给`DNS`域名解析,找到真实`IP`,向服务器发起请求; + +服务器交给后台处理完成后返回数据,浏览器接收文件(`HTML、JS、CSS`、图象等); + +浏览器对加载到的资源(`HTML、JS、CSS`等)进行语法解析,建立相应的内部数据结构(如`HTML`的`DOM`); + +载入解析到的资源文件,渲染页面,完成。 + + +### 9、如何实现浏览器内多个标签页之间的通信? + +**相关资料:** + +**1、** 使用 WebSocket,通信的标签页连接同一个服务器,发送消息到服务器后,服务器推送消息给所有连接的客户端。 + +**2、** 使用 SharedWorker (只在 chrome 浏览器实现了),两个页面共享同一个线程,通过向线程发送数据和接收数据来实现标签页之间的双向通行。 + +**3、** 可以调用 localStorage、cookies 等本地存储方式,localStorge 另一个浏览上下文里被添加、修改或删除时,它都会触发一个 storage 事件,我们通过监听 storage 事件,控制它的值来进行页面信息通信; + +**4、** 如果我们能够获得对应标签页的引用,通过 postMessage 方法也是可以实现多个标签页通信的。 + +**回** + +实现多个标签页之间的通信,本质上都是通过中介者模式来实现的。因为标签页之间没有办法直接通信,因此我们可以找一个中介者,让标签页和中介者进行通信,然后让这个中介者来进行消息的转发。 + +第一种实现的方式是使用 websocket 协议,因为 websocket 协议可以实现服务器推送,所以服务器就可以用来当做这个中介者。标签页通过向服务器发送数据,然后由服务器向其他标签页推送转发。 + +第二种是使用 ShareWorker 的方式,shareWorker 会在页面存在的生命周期内创建一个唯一的线程,并且开启多个页面也只会使用同一个线程。这个时候共享线程就可以充当中介者的角色。标签页间通过共享一个线程,然后通过这个共享的线程来实现数据的交换。 + +第三种方式是使用 localStorage 的方式,我们可以在一个标签页对 localStorage 的变化事件进行监听,然后当另一个标签页修改数据的时候,我们就可以通过这个监听事件来获取到数据。这个时候 localStorage 对象就是充当的中介者的角色。 + +还有一种方式是使用 postMessage 方法,如果我们能够获得对应标签页的引用,我们就可以使用 postMessage 方法,进行通信。 + + +### 10、attribute 和 property 的区别是什么? + +**1、** attribute 是 dom 元素在文档中作为 html 标签拥有的属性; + +**2、** property 就是 dom 元素在 js 中作为对象拥有的属性。 + +对于 html 的标准属性来说,attribute 和 property 是同步的,是会自动更新的,但是对于自定义的属性来说,他们是不同步的。 + + +### 11、DTD 介绍 +### 12、什么是文档的预解析?(浏览器解析过程) +### 13、元素的alt和title有什么异同 +### 14、如何减少回流?(浏览器绘制过程) +### 15、实现不使用 border 画出1px高的线,在不同浏览器的Quirks mode和CSS Compat模式下都能保持同一效果** +### 16、`` 的 title 和 alt 有什么区别? +### 17、HTML5 元素的分类 +### 18、DOCTYPE 的作用是什么? +### 19、display:none;与 visibility: hidden 的区别是什么? +### 20、常见的浏览器内核有哪些 +### 21、简述一下你对HTML语义化的理解 +### 22、语义化的理解 +### 23、你对浏览器的理解? +### 24、页面导入样式时,使用 link 和 [@import ](/import ) 有什么区别? +### 25、HTML5的文件离线储存怎么使用,工作原理是什么 +### 26、浏览器是怎么对`HTML5`的离线储存资源进行管理和加载的呢 +### 27、webSocket 如何兼容低版本浏览器? +### 28、HTML5 为什么只需要写 ``,而不需要引入 DTD? +### 29、实现不使用 border 画出 1 px 高的线,在不同浏览器的标准模式与怪异模式下都能保持一致的效果。 +### 30、行内元素有哪些?块级元素有哪些?CSS的盒模型? +### 31、渐进增强和优雅降级的定义 + + + + +## 全部答案,整理好了,直接下载吧 + +### 下载链接:[全部答案,整理好了](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin-2.png) + + + + +## 最新,高清PDF:172份,7701页,最新整理 + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/mst.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") + +[![大厂面试题](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏")](https://www.souyunku.com/wp-content/uploads/weixin/githup-weixin.png "架构师专栏") diff --git "a/docs/HTML/HTML\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220\357\274\214\345\244\247\346\261\207\346\200\273.md" "b/docs/HTML/HTML\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220\357\274\214\345\244\247\346\261\207\346\200\273.md" new file mode 100644 index 0000000..9c72ce0 --- /dev/null +++ "b/docs/HTML/HTML\346\234\200\346\226\2602021\345\271\264\351\235\242\350\257\225\351\242\230\351\231\204\347\255\224\346\241\210\350\247\243\346\236\220\357\274\214\345\244\247\346\261\207\346\200\273.md" @@ -0,0 +1,185 @@ +# HTML最新2021年面试题附答案解析,大汇总 + +### 其实,博主还整理了,更多大厂面试题,直接下载吧 + +### 下载链接:[高清172份,累计 7701 页大厂面试题 PDF](https://github.com/souyunku/DevBooks/blob/master/docs/index.md) + + + +### 1、简述对Web 语义化的理解? + +就是让浏览器更好的读懂你写的代码,在进行 HTML 结构、表现、行为设计时,尽量使用语义化的标签,使程序代码简介明了,易于进行Web 操作和网站 SEO,方便团队协作的一种标准,以图实现一种“无障碍”的  Web 开发。 + + +### 2、前端需要注意哪些SEO + +**1、** 合理的`title`、`description`、`keywords`:搜索对着三项的权重逐个减小,title值强调重点即可,重要关键词出现不要超过2次,而且要靠前,不同页面`title`要有所不同;`description`把页面内容高度概括,长度合适,不可过分堆砌关键词,不同页面`description`有所不同;`keywords`列举出重要关键词即可 + +**2、** 语义化的`HTML`代码,符合W3C规范:语义化代码让搜索引擎容易理解网页 + +**3、** 重要内容`HTML`代码放在最前:搜索引擎抓取`HTML`顺序是从上到下,有的搜索引擎对抓取长度有限制,保证重要内容一定会被抓取 + +**4、** 重要内容不要用`js`输出:爬虫不会执行js获取内容 + +**5、** 少用`iframe`:搜索引擎不会抓取`iframe`中的内容 + +**6、** 非装饰性图片必须加`alt` + +**7、** 提高网站速度:网站速度是搜索引擎排序的一个重要指标 + + +### 3、px,em,rem的区别? + +**1、** px 像素(Pixel)。绝对单位。像素 px 是相对于显示器屏幕分辨率而言的,是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果 px 要换算成物理长度,需要指定精度 DPI。 + +**2、** em 是相对长度单位,相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。它会继承父级元素的字体大小,因此并不是一个固定的值。 + +**3、** rem是[CSS3](https://links.jianshu.com/go?to=http%3A%2F%2Fwww.html5cn.org%2Fportal.php%3Fmod%3Dlist%26catid%3D16)新增的一个相对单位(rootem,根 em),使用 rem 为元素设定字体大小时,仍然是相对大小,但相对的只是 HTML 根元素。 + +**4、** 区别:IE 无法调整那些使用 px 作为单位的字体大小,而 em 和 rem 可以缩放,rem 相对的只是 HTML 根元素。这个单位可谓集相对大小和绝对大小的优点于一身,通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应。目前,除了 IE8 及更早版本外,所有浏览器均已支持 rem。 + + +### 4、HTML元素的显示优先级? + +帧元素(frame)>HTML元素优先,表单元素总>非表单元素优先 + +常见的非表单元素包括:链接标记(A),DIV标记,SPAN标记,TABLE标记等等。表单元素覆盖样式元素的根本原因在于HTML元素默认的显示优先级规则。 + +所有这样HTML元素又可以根据其显示要求分成两类,即有窗口的HTML元素(Windowed Element),无窗口的HTML元素(Windowless Element)。 + +有窗口的元素包括:SELECT元素,OBJECT元素,插件,IE5.01以主更早版本中的IFRAME元素。 + +无窗口的元素包括:大多数的普通HTML元素,如链接和TABLE标记,除了SELECT元素之外的大多数表单元素。 + + +### 5、页面导入样式时,使用link和@import有什么区别 + +相同的地方,都是外部引用CSS方式,区别: + +**1、** link是xhtml标签,除了加载css外,还可以定义RSS等其他事务;@import属于CSS范畴,只能加载CSS + +**2、** link引用CSS时候,页面载入时同时加载;@import需要在页面完全加载以后加载,而且@import被引用的CSS会等到引用它的CSS文件被加载完才加载 + +**3、** link是xhtml标签,无兼容问题;@import是在css2.1提出来的,低版本的浏览器不支持 + +**4、** link支持使用javascript控制去改变样式,而@import不支持 + +**5、** link方式的样式的权重高于@import的权重 + +**6、** import在html使用时候需要`",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[n],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},t,{cN:"meta",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},n]}]}}),hljs.registerLanguage("javascript",function(e){return{aliases:["js"],k:{keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{b:/\s*[);\]]/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:[e.CLCM,e.CBCM]}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+e.IR,r:0},{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}}),hljs.registerLanguage("css",function(e){var r="[a-zA-Z-][a-zA-Z0-9_-]*",t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\s*\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:r,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}}); \ No newline at end of file diff --git a/spring-boot-swagger/src/main/resources/static/swagger/lib/highlight.9.1.0.pack_extended.js b/spring-boot-swagger/src/main/resources/static/swagger/lib/highlight.9.1.0.pack_extended.js deleted file mode 100644 index 162a224..0000000 --- a/spring-boot-swagger/src/main/resources/static/swagger/lib/highlight.9.1.0.pack_extended.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";!function(){var h,l;h=hljs.configure,hljs.configure=function(l){var i=l.highlightSizeThreshold;hljs.highlightSizeThreshold=i===+i?i:null,h.call(this,l)},l=hljs.highlightBlock,hljs.highlightBlock=function(h){var i=h.innerHTML,g=hljs.highlightSizeThreshold;(null==g||g>i.length)&&l.call(hljs,h)}}(); \ No newline at end of file diff --git a/spring-boot-swagger/src/main/resources/static/swagger/lib/jquery-1.8.0.min.js b/spring-boot-swagger/src/main/resources/static/swagger/lib/jquery-1.8.0.min.js deleted file mode 100644 index e2e2b7f..0000000 --- a/spring-boot-swagger/src/main/resources/static/swagger/lib/jquery-1.8.0.min.js +++ /dev/null @@ -1,3 +0,0 @@ -!function(e,t){function n(e){var t=he[e]={};return K.each(e.split(te),function(e,n){t[n]=!0}),t}function r(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(me,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r||"false"!==r&&("null"===r?null:+r+""===r?+r:ge.test(r)?K.parseJSON(r):r)}catch(o){}K.data(e,n,r)}else r=t}return r}function i(e){var t;for(t in e)if(("data"!==t||!K.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function o(){return!1}function a(){return!0}function s(e){return!e||!e.parentNode||11===e.parentNode.nodeType}function l(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function u(e,t,n){if(t=t||0,K.isFunction(t))return K.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return K.grep(e,function(e,r){return e===t===n});if("string"==typeof t){var r=K.grep(e,function(e){return 1===e.nodeType});if(_e.test(t))return K.filter(t,r,!n);t=K.filter(t,r)}return K.grep(e,function(e,r){return K.inArray(e,t)>=0===n})}function c(e){var t=We.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function f(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function p(e,t){if(1===t.nodeType&&K.hasData(e)){var n,r,i,o=K._data(e),a=K._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r").appendTo(R.body),n=t.css("display");return t.remove(),"none"!==n&&""!==n||(rt=R.body.appendChild(rt||K.extend(R.createElement("iframe"),{frameBorder:0,width:0,height:0})),it&&rt.createElement||(it=(rt.contentWindow||rt.contentDocument).document,it.write(""),it.close()),t=it.body.appendChild(it.createElement(e)),n=nt(t,"display"),R.body.removeChild(rt)),pt[e]=n,n}function N(e,t,n,r){var i;if(K.isArray(t))K.each(t,function(t,i){n||bt.test(e)?r(e,i):N(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==K.type(t))r(e,t);else for(i in t)N(e+"["+i+"]",t[i],n,r)}function C(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i,o,a=t.toLowerCase().split(te),s=0,l=a.length;if(K.isFunction(n))for(;s)[^>]*$|#([\w\-]*)$)/,ie=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,oe=/^[\],:{}\s]*$/,ae=/(?:^|:|,)(?:\s*\[)+/g,se=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,le=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,ue=/^-ms-/,ce=/-([\da-z])/gi,fe=function(e,t){return(t+"").toUpperCase()},pe=function(){R.addEventListener?(R.removeEventListener("DOMContentLoaded",pe,!1),K.ready()):"complete"===R.readyState&&(R.detachEvent("onreadystatechange",pe),K.ready())},de={};K.fn=K.prototype={constructor:K,init:function(e,n,r){var i,o,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:re.exec(e),i&&(i[1]||!n)){if(i[1])return n=n instanceof K?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:R,e=K.parseHTML(i[1],a,!0),ie.test(i[1])&&K.isPlainObject(n)&&this.attr.call(e,n,!0),K.merge(this,e);if(o=R.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=R,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return K.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),K.makeArray(e,this))},selector:"",jquery:"1.8.0",length:0,size:function(){return this.length},toArray:function(){return Y.call(this)},get:function(e){return null==e?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=K.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,"find"===t?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return K.each(this,e,t)},ready:function(e){return K.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(Y.apply(this,arguments),"slice",Y.call(arguments).join(","))},map:function(e){return this.pushStack(K.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:U,sort:[].sort,splice:[].splice},K.fn.init.prototype=K.fn,K.extend=K.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"!=typeof s&&!K.isFunction(s)&&(s={}),u===l&&(s=this,--l);l0||(P.resolveWith(R,[K]),K.fn.trigger&&K(R).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===K.type(e)},isArray:Array.isArray||function(e){return"array"===K.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?String(e):de[V.call(e)]||"object"},isPlainObject:function(e){if(!e||"object"!==K.type(e)||e.nodeType||K.isWindow(e))return!1;try{if(e.constructor&&!G.call(e,"constructor")&&!G.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||G.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return e&&"string"==typeof e?("boolean"==typeof t&&(n=t,t=0),t=t||R,(r=ie.exec(e))?[t.createElement(r[1])]:(r=K.buildFragment([e],t,n?null:[]),K.merge([],(r.cacheable?K.clone(r.fragment):r.fragment).childNodes))):null},parseJSON:function(t){return t&&"string"==typeof t?(t=K.trim(t),e.JSON&&e.JSON.parse?e.JSON.parse(t):oe.test(t.replace(se,"@").replace(le,"]").replace(ae,""))?new Function("return "+t)():void K.error("Invalid JSON: "+t)):null},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&K.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&ee.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ue,"ms-").replace(ce,fe)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toUpperCase()===t.toUpperCase()},each:function(e,n,r){var i,o=0,a=e.length,s=a===t||K.isFunction(e);if(r)if(s){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;o0&&e[0]&&e[l-1]||0===l||K.isArray(e));if(u)for(;s-1;)u.splice(n,1),o&&(n<=s&&s--,n<=l&&l--)}),this},has:function(e){return K.inArray(e,u)>-1},empty:function(){return u=[],this},disable:function(){return u=c=r=t,this},disabled:function(){return!u},lock:function(){return c=t,r||p.disable(),this},locked:function(){return!c},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],u&&(!i||c)&&(o?c.push(t):f(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},K.extend({Deferred:function(e){var t=[["resolve","done",K.Callbacks("once memory"),"resolved"],["reject","fail",K.Callbacks("once memory"),"rejected"],["notify","progress",K.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return K.Deferred(function(n){K.each(t,function(t,r){var o=r[0],a=e[t];i[r[1]](K.isFunction(a)?function(){var e=a.apply(this,arguments);e&&K.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[o+"With"](this===i?n:this,[e])}:n[o])}),e=null}).promise()},promise:function(e){return"object"==typeof e?K.extend(e,r):r}},i={};return r.pipe=r.then,K.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=a.fire,i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=Y.call(arguments),a=o.length,s=1!==a||e&&K.isFunction(e.promise)?a:0,l=1===s?e:K.Deferred(),u=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?Y.call(arguments):i,r===t?l.notifyWith(n,r):--s||l.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i
a",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0],r.style.cssText="top:1px;float:left;opacity:.5",!n||!n.length||!r)return{};i=R.createElement("select"),o=i.appendChild(R.createElement("option")),a=p.getElementsByTagName("input")[0],t={leadingWhitespace:3===p.firstChild.nodeType,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:"on"===a.value,optSelected:o.selected,getSetAttribute:"t"!==p.className,enctype:!!R.createElement("form").enctype,html5Clone:"<:nav>"!==R.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===R.compatMode,submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,i.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}if(!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",f=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",f)),a=R.createElement("input"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","checked"),a.setAttribute("name","t"),p.appendChild(a),s=R.createDocumentFragment(),s.appendChild(p.lastChild),t.checkClone=s.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=a.checked,s.removeChild(a),s.appendChild(p),p.attachEvent)for(u in{submit:!0,change:!0,focusin:!0})l="on"+u,c=l in p,c||(p.setAttribute(l,"return;"),c="function"==typeof p[l]),t[u+"Bubbles"]=c;return K(function(){var n,r,i,o,a="padding:0;margin:0;border:0;display:block;overflow:hidden;",s=R.getElementsByTagName("body")[0];s&&(n=R.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",s.insertBefore(n,s.firstChild),r=R.createElement("div"),n.appendChild(r),r.innerHTML="
t
",i=r.getElementsByTagName("td"),i[0].style.cssText="padding:0;margin:0;border:0;display:none",c=0===i[0].offsetHeight,i[0].style.display="",i[1].style.display="none",t.reliableHiddenOffsets=c&&0===i[0].offsetHeight,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===r.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==s.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(r,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(r,null)||{width:"4px"}).width,o=R.createElement("div"),o.style.cssText=r.style.cssText=a,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),"undefined"!=typeof r.style.zoom&&(r.innerHTML="",r.style.cssText=a+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===r.offsetWidth,r.style.display="block",r.style.overflow="visible",r.innerHTML="
",r.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==r.offsetWidth,n.style.zoom=1),s.removeChild(n),n=r=i=o=null)}),s.removeChild(p),n=r=i=o=a=s=p=null,t}();var ge=/^(?:\{.*\}|\[.*\])$/,me=/([A-Z])/g;K.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(K.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?K.cache[e[K.expando]]:e[K.expando],!!e&&!i(e)},data:function(e,n,r,i){if(K.acceptData(e)){var o,a,s=K.expando,l="string"==typeof n,u=e.nodeType,c=u?K.cache:e,f=u?e[s]:e[s]&&s;if(f&&c[f]&&(i||c[f].data)||!l||r!==t)return f||(u?e[s]=f=K.deletedIds.pop()||++K.uuid:f=s),c[f]||(c[f]={},u||(c[f].toJSON=K.noop)),"object"!=typeof n&&"function"!=typeof n||(i?c[f]=K.extend(c[f],n):c[f].data=K.extend(c[f].data,n)),o=c[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[K.camelCase(n)]=r),l?(a=o[n],null==a&&(a=o[K.camelCase(n)])):a=o,a}},removeData:function(e,t,n){if(K.acceptData(e)){var r,o,a,s=e.nodeType,l=s?K.cache:e,u=s?e[K.expando]:K.expando;if(l[u]){if(t&&(r=n?l[u]:l[u].data)){K.isArray(t)||(t in r?t=[t]:(t=K.camelCase(t),t=t in r?[t]:t.split(" ")));for(o=0,a=t.length;o1,null,!1))},removeData:function(e){return this.each(function(){K.removeData(this,e)})}}),K.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=K._data(e,t),n&&(!r||K.isArray(n)?r=K._data(e,t,K.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=K.queue(e,t),r=n.shift(),i=K._queueHooks(e,t),o=function(){K.dequeue(e,t)};"inprogress"===r&&(r=n.shift()),r&&("fx"===t&&n.unshift("inprogress"),delete i.stop,r.call(e,o,i)),!n.length&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return K._data(e,n)||K._data(e,n,{empty:K.Callbacks("once memory").add(function(){K.removeData(e,t+"queue",!0),K.removeData(e,n,!0)})})}}),K.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),arguments.length1)},removeAttr:function(e){return this.each(function(){K.removeAttr(this,e)})},prop:function(e,t){return K.access(this,K.prop,e,t,arguments.length>1)},removeProp:function(e){return e=K.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a,s;if(K.isFunction(e))return this.each(function(t){K(this).addClass(e.call(this,t,this.className))});if(e&&"string"==typeof e)for(t=e.split(te),n=0,r=this.length;n-1;)r=r.replace(" "+n[o]+" "," ");i.className=e?K.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return K.isFunction(e)?this.each(function(n){K(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n)for(var i,o=0,a=K(this),s=t,l=e.split(te);i=l[o++];)s=r?s:!a.hasClass(i),a[s?"addClass":"removeClass"](i);else"undefined"!==n&&"boolean"!==n||(this.className&&K._data(this,"__className__",this.className),this.className=this.className||e===!1?"":K._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,r=this.length;n-1)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=K.isFunction(e),this.each(function(r){var o,a=K(this);1===this.nodeType&&(o=i?e.call(this,r,a.val()):e,null==o?o="":"number"==typeof o?o+="":K.isArray(o)&&(o=K.map(o,function(e){return null==e?"":e+""})),n=K.valHooks[this.type]||K.valHooks[this.nodeName.toLowerCase()],n&&"set"in n&&n.set(this,o,"value")!==t||(this.value=o))});if(o)return n=K.valHooks[o.type]||K.valHooks[o.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(o,"value"))!==t?r:(r=o.value,"string"==typeof r?r.replace(we,""):null==r?"":r)}}}),K.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r,i,o=e.selectedIndex,a=[],s=e.options,l="select-one"===e.type;if(o<0)return null;for(n=l?o:0,r=l?o+1:s.length;n=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var o,a,s,l=e.nodeType;if(e&&3!==l&&8!==l&&2!==l)return i&&K.isFunction(K.fn[n])?K(e)[n](r):"undefined"==typeof e.getAttribute?K.prop(e,n,r):(s=1!==l||!K.isXMLDoc(e),s&&(n=n.toLowerCase(),a=K.attrHooks[n]||(Ee.test(n)?ve:ye)),r!==t?null===r?void K.removeAttr(e,n):a&&"set"in a&&s&&(o=a.set(e,r,n))!==t?o:(e.setAttribute(n,""+r),r):a&&"get"in a&&s&&null!==(o=a.get(e,n))?o:(o=e.getAttribute(n),null===o?t:o))},removeAttr:function(e,t){var n,r,i,o,a=0;if(t&&1===e.nodeType)for(r=t.split(te);a=0}})});var Se=/^(?:textarea|input|select)$/i,Ae=/^([^\.]*|)(?:\.(.+)|)$/,je=/(?:^|\s)hover(\.\S+|)\b/,De=/^key/,Le=/^(?:mouse|contextmenu)|click/,He=/^(?:focusinfocus|focusoutblur)$/,Fe=function(e){return K.event.special.hover?e:e.replace(je,"mouseenter$1 mouseleave$1")};K.event={add:function(e,n,r,i,o){var a,s,l,u,c,f,p,d,h,g,m;if(3!==e.nodeType&&8!==e.nodeType&&n&&r&&(a=K._data(e))){for(r.handler&&(h=r,r=h.handler,o=h.selector),r.guid||(r.guid=K.guid++),l=a.events,l||(a.events=l={}),s=a.handle,s||(a.handle=s=function(e){return"undefined"==typeof K||e&&K.event.triggered===e.type?t:K.event.dispatch.apply(s.elem,arguments)},s.elem=e),n=K.trim(Fe(n)).split(" "),u=0;u=0&&(m=m.slice(0,-1),s=!0),m.indexOf(".")>=0&&(y=m.split("."),m=y.shift(),y.sort()),(!i||K.event.customEvent[m])&&!K.event.global[m])return;if(n="object"==typeof n?n[K.expando]?n:new K.Event(m,n):new K.Event(m),n.type=m,n.isTrigger=!0,n.exclusive=s,n.namespace=y.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+y.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,f=m.indexOf(":")<0?"on"+m:"",!i){a=K.cache;for(l in a)a[l].events&&a[l].events[m]&&K.event.trigger(n,r,a[l].handle.elem,!0);return}if(n.result=t,n.target||(n.target=i),r=null!=r?K.makeArray(r):[],r.unshift(n),p=K.event.special[m]||{},p.trigger&&p.trigger.apply(i,r)===!1)return;if(h=[[i,p.bindType||m]],!o&&!p.noBubble&&!K.isWindow(i)){for(g=p.delegateType||m,u=He.test(g+m)?i:i.parentNode,c=i;u;u=u.parentNode)h.push([u,g]),c=u;c===(i.ownerDocument||R)&&h.push([c.defaultView||c.parentWindow||e,g])}for(l=0;lh&&v.push({elem:this,matches:d.slice(h)}),r=0;r0?this.on(t,null,e,n):this.trigger(t)},De.test(t)&&(K.event.fixHooks[t]=K.event.keyHooks),Le.test(t)&&(K.event.fixHooks[t]=K.event.mouseHooks)}),function(e,t){function n(e,t,n,r){for(var i=0,o=t.length;i0?l(s,r,a):[]}function i(e,i,o,a,s){for(var l,u,c,f,p,d,h,g,m=0,y=s.length,v=z.POS,b=new RegExp("^"+v.source+"(?!"+C+")","i"),x=function(){for(var e=1,n=arguments.length-2;ec&&(h=e.slice(c,l.index),c=g,d=[i],M.test(h)&&(p&&(d=p),p=a),(u=P.test(h))&&(h=h.slice(0,-5).replace(M,"$&*")),l.length>1&&l[0].replace(b,x),p=r(h,l[1],l[2],d,p,u));p?(f=f.concat(p),(h=e.slice(c))&&")"!==h?M.test(h)?n(h,f,o,a):oe(h,i,o,a?a.concat(p):p):T.apply(o,f)):oe(e,i,o,a)}return 1===y?o:oe.uniqueSort(o)}function o(e,t,n){for(var r,i,o,a=[],s=0,l=_.exec(e),u=!l.pop()&&!l.pop(),c=u&&e.match(O)||[""],f=ae.preFilter,p=ae.filter,d=!n&&t!==g;null!=(i=c[s])&&u;s++)for(a.push(r=[]),d&&(i=" "+i);i;){u=!1,(l=M.exec(i))&&(i=i.slice(l[0].length),u=r.push({part:l.pop().replace(F," "),captures:l}));for(o in p)(l=z[o].exec(i))&&(!f[o]||(l=f[o](l,t,n)))&&(i=i.slice(l.shift().length),u=r.push({part:o,captures:l}));if(!u)break}return u||oe.error(e),a}function a(e,t,n){var r=t.dir,i=x++;return e||(e=function(e){return e===n}),t.first?function(t,n){for(;t=t[r];)if(1===t.nodeType)return e(t,n)&&t}:function(t,n){for(var o,a=i+"."+f,s=a+"."+c;t=t[r];)if(1===t.nodeType){if((o=t[N])===s)return t.sizset;if("string"==typeof o&&0===o.indexOf(a)){if(t.sizset)return t}else{if(t[N]=s,e(t,n))return t.sizset=!0,t;t.sizset=!1}}}}function s(e,t){return e?function(n,r){var i=t(n,r);return i&&e(i===!0?n:i,r)}:t}function l(e,t,n){for(var r,i,o=0;r=e[o];o++)ae.relative[r.part]?i=a(i,ae.relative[r.part],t):(r.captures.push(t,n),i=s(i,ae.filter[r.part].apply(null,r.captures)));return i}function u(e){return function(t,n){for(var r,i=0;r=e[i];i++)if(r(t,n))return!0;return!1}}var c,f,p,d,h,g=e.document,m=g.documentElement,y="undefined",v=!1,b=!0,x=0,w=[].slice,T=[].push,N=("sizcache"+Math.random()).replace(".",""),C="[\\x20\\t\\r\\n\\f]",E="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",k=E.replace("w","w#"),S="([*^$|!~]?=)",A="\\["+C+"*("+E+")"+C+"*(?:"+S+C+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+k+")|)|)"+C+"*\\]",j=":("+E+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",D=":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",L=C+"*([\\x20\\t\\r\\n\\f>+~])"+C+"*",H="(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|"+A+"|"+j.replace(2,7)+"|[^\\\\(),])+",F=new RegExp("^"+C+"+|((?:^|[^\\\\])(?:\\\\.)*)"+C+"+$","g"),M=new RegExp("^"+L),O=new RegExp(H+"?(?="+C+"*,|$)","g"),_=new RegExp("^(?:(?!,)(?:(?:^|,)"+C+"*"+H+")*?|"+C+"*(.*?))(\\)|$)"),q=new RegExp(H.slice(19,-6)+"\\x20\\t\\r\\n\\f>+~])+|"+L,"g"),B=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,W=/[\x20\t\r\n\f]*[+~]/,P=/:not\($/,R=/h\d/i,$=/input|select|textarea|button/i,I=/\\(?!\\)/g,z={ID:new RegExp("^#("+E+")"),CLASS:new RegExp("^\\.("+E+")"),NAME:new RegExp("^\\[name=['\"]?("+E+")['\"]?\\]"),TAG:new RegExp("^("+E.replace("[-","[-\\*")+")"),ATTR:new RegExp("^"+A),PSEUDO:new RegExp("^"+j),CHILD:new RegExp("^:(only|nth|last|first)-child(?:\\("+C+"*(even|odd|(([+-]|)(\\d*)n|)"+C+"*(?:([+-]|)"+C+"*(\\d+)|))"+C+"*\\)|)","i"),POS:new RegExp(D,"ig"),needsContext:new RegExp("^"+C+"*[>+~]|"+D,"i")},X={},U=[],Y={},J=[],V=function(e){return e.sizzleFilter=!0,e},G=function(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}},Q=function(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}},Z=function(e){var t=!1,n=g.createElement("div");try{t=e(n)}catch(r){}return n=null,t},ee=Z(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),te=Z(function(e){e.id=N+0,e.innerHTML="
",m.insertBefore(e,m.firstChild);var t=g.getElementsByName&&g.getElementsByName(N).length===2+g.getElementsByName(N+0).length;return h=!g.getElementById(N),m.removeChild(e),t}),ne=Z(function(e){return e.appendChild(g.createComment("")),0===e.getElementsByTagName("*").length}),re=Z(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==y&&"#"===e.firstChild.getAttribute("href")}),ie=Z(function(e){return e.innerHTML="",!(!e.getElementsByClassName||0===e.getElementsByClassName("e").length)&&(e.lastChild.className="e",1!==e.getElementsByClassName("e").length)}),oe=function(e,t,n,r){n=n||[],t=t||g;var i,o,a,s,l=t.nodeType;if(1!==l&&9!==l)return[];if(!e||"string"!=typeof e)return n;if(a=le(t),!a&&!r&&(i=B.exec(e)))if(s=i[1]){if(9===l){if(o=t.getElementById(s),!o||!o.parentNode)return n;if(o.id===s)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(s))&&ue(t,o)&&o.id===s)return n.push(o),n}else{if(i[2])return T.apply(n,w.call(t.getElementsByTagName(e),0)),n;if((s=i[3])&&ie&&t.getElementsByClassName)return T.apply(n,w.call(t.getElementsByClassName(s),0)),n}return pe(e,t,n,r,a)},ae=oe.selectors={cacheLength:50,match:z,order:["ID","TAG"],attrHandle:{},createPseudo:V,find:{ID:h?function(e,t,n){if(typeof t.getElementById!==y&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==y&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==y&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:ne?function(e,t){if(typeof t.getElementsByTagName!==y)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if("*"===e){for(var r,i=[],o=0;r=n[o];o++)1===r.nodeType&&i.push(r);return i}return n}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(I,""),e[3]=(e[4]||e[5]||"").replace(I,""),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1]?(e[2]||oe.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*("even"===e[2]||"odd"===e[2])),e[4]=+(e[6]+e[7]||"odd"===e[2])):e[2]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=e[4];return z.CHILD.test(e[0])?null:(n&&(t=_.exec(n))&&t.pop()&&(e[0]=e[0].slice(0,t[0].length-n.length-1),n=t[0].slice(0,-1)),e.splice(2,3,n||e[3]),e)}},filter:{ID:h?function(e){return e=e.replace(I,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace(I,""),function(t){var n=typeof t.getAttributeNode!==y&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(I,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=X[e];return t||(t=X[e]=new RegExp("(^|"+C+")"+e+"("+C+"|$)"),U.push(e),U.length>ae.cacheLength&&delete X[U.shift()]),function(e){return t.test(e.className||typeof e.getAttribute!==y&&e.getAttribute("class")||"")}},ATTR:function(e,t,n){return t?function(r){var i=oe.attr(r,e),o=i+"";if(null==i)return"!="===t;switch(t){case"=":return o===n;case"!=":return o!==n;case"^=":return n&&0===o.indexOf(n);case"*=":return n&&o.indexOf(n)>-1;case"$=":return n&&o.substr(o.length-n.length)===n;case"~=":return(" "+o+" ").indexOf(n)>-1;case"|=":return o===n||o.substr(0,n.length+1)===n+"-"}}:function(t){return null!=oe.attr(t,e)}},CHILD:function(e,t,n,r){if("nth"===e){var i=x++;return function(e){var t,o,a=0,s=e;if(1===n&&0===r)return!0;if(t=e.parentNode,t&&(t[N]!==i||!e.sizset)){for(s=t.firstChild;s&&(1!==s.nodeType||(s.sizset=++a,s!==e));s=s.nextSibling);t[N]=i}return o=e.sizset-r,0===n?0===o:o%n===0&&o/n>=0}}return function(t){var n=t;switch(e){case"only":case"first":for(;n=n.previousSibling;)if(1===n.nodeType)return!1;if("first"===e)return!0;n=t;case"last":for(;n=n.nextSibling;)if(1===n.nodeType)return!1;return!0}}},PSEUDO:function(e,t,n,r){var i=ae.pseudos[e]||ae.pseudos[e.toLowerCase()];return i||oe.error("unsupported pseudo: "+e),i.sizzleFilter?i(t,n,r):i}},pseudos:{not:V(function(e,t,n){var r=fe(e.replace(F,"$1"),t,n);return function(e){return!r(e)}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!ae.pseudos.empty(e)},empty:function(e){var t;for(e=e.firstChild;e;){if(e.nodeName>"@"||3===(t=e.nodeType)||4===t)return!1;e=e.nextSibling}return!0},contains:V(function(e){return function(t){return(t.textContent||t.innerText||ce(t)).indexOf(e)>-1}}),has:V(function(e){return function(t){return oe(e,t).length>0}}),header:function(e){return R.test(e.nodeName)},text:function(e){var t,n;return"input"===e.nodeName.toLowerCase()&&"text"===(t=e.type)&&(null==(n=e.getAttribute("type"))||n.toLowerCase()===t)},radio:G("radio"),checkbox:G("checkbox"),file:G("file"),password:G("password"),image:G("image"),submit:Q("submit"),reset:Q("reset"),button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},input:function(e){return $.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&(!!e.type||!!e.href)},active:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(e,t,n){return n?e.slice(1):[e[0]]},last:function(e,t,n){var r=e.pop();return n?e:[r]},even:function(e,t,n){for(var r=[],i=n?1:0,o=e.length;iae.cacheLength&&delete Y[J.shift()],s};oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){return oe(t,null,null,[e]).length>0};var pe=function(e,t,n,r,o){e=e.replace(F,"$1");var a,s,l,u,p,d,h,g,m,y=e.match(O),v=e.match(q),b=t.nodeType;if(z.POS.test(e))return i(e,t,n,r,y);if(r)a=w.call(r,0);else if(y&&1===y.length){if(v.length>1&&9===b&&!o&&(y=z.ID.exec(v[0]))){if(t=ae.find.ID(y[1],t,o)[0],!t)return n;e=e.slice(v.shift().length)}for(g=(y=W.exec(v[0]))&&!y.index&&t.parentNode||t,m=v.pop(),d=m.split(":not")[0],l=0,u=ae.order.length;l",e.querySelectorAll("[selected]").length||i.push("\\["+C+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),Z(function(e){e.innerHTML="

",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+C+"*(?:\"\"|'')"),e.innerHTML="",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=i.length&&new RegExp(i.join("|")),pe=function(e,r,o,a,s){if(!(a||s||i&&i.test(e)))if(9===r.nodeType)try{return T.apply(o,w.call(r.querySelectorAll(e),0)),o}catch(l){}else if(1===r.nodeType&&"object"!==r.nodeName.toLowerCase()){var u=r.getAttribute("id"),c=u||N,f=W.test(e)&&r.parentNode||r;u?c=c.replace(n,"\\$&"):r.setAttribute("id",c);try{return T.apply(o,w.call(f.querySelectorAll(e.replace(O,"[id='"+c+"'] $&")),0)),o}catch(l){}finally{u||r.removeAttribute("id")}}return t(e,r,o,a,s)},a&&(Z(function(t){e=a.call(t,"div");try{a.call(t,"[test!='']:sizzle"),o.push(ae.match.PSEUDO)}catch(n){}}),o=new RegExp(o.join("|")),oe.matchesSelector=function(t,n){if(n=n.replace(r,"='$1']"),!(le(t)||o.test(n)||i&&i.test(n)))try{var s=a.call(t,n);if(s||e||t.document&&11!==t.document.nodeType)return s}catch(l){}return oe(n,null,null,[t]).length>0})}(),oe.attr=K.attr,K.find=oe,K.expr=oe.selectors,K.expr[":"]=K.expr.pseudos,K.unique=oe.uniqueSort,K.text=oe.getText,K.isXMLDoc=oe.isXML,K.contains=oe.contains}(e);var Me=/Until$/,Oe=/^(?:parents|prev(?:Until|All))/,_e=/^.[^:#\[\.,]*$/,qe=K.expr.match.needsContext,Be={children:!0,contents:!0,next:!0,prev:!0};K.fn.extend({find:function(e){var t,n,r,i,o,a,s=this;if("string"!=typeof e)return K(e).filter(function(){for(t=0,n=s.length;t0)for(i=r;i=0:K.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=qe.test(e)||"string"!=typeof e?K(e,t||this.context):0;r-1:K.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}return o=o.length>1?K.unique(o):o,this.pushStack(o,"closest",e)},index:function(e){return e?"string"==typeof e?K.inArray(this[0],K(e)):K.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n="string"==typeof e?K(e,t):K.makeArray(e&&e.nodeType?[e]:e),r=K.merge(this.get(),n);return this.pushStack(s(n[0])||s(r[0])?r:K.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),K.fn.andSelf=K.fn.addBack,K.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return K.dir(e,"parentNode")},parentsUntil:function(e,t,n){return K.dir(e,"parentNode",n)},next:function(e){return l(e,"nextSibling")},prev:function(e){return l(e,"previousSibling")},nextAll:function(e){return K.dir(e,"nextSibling")},prevAll:function(e){return K.dir(e,"previousSibling")},nextUntil:function(e,t,n){return K.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return K.dir(e,"previousSibling",n)},siblings:function(e){return K.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return K.sibling(e.firstChild)},contents:function(e){return K.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:K.merge([],e.childNodes)}},function(e,t){K.fn[e]=function(n,r){var i=K.map(this,t,n);return Me.test(e)||(r=n),r&&"string"==typeof r&&(i=K.filter(r,i)),i=this.length>1&&!Be[e]?K.unique(i):i,this.length>1&&Oe.test(e)&&(i=i.reverse()),this.pushStack(i,e,Y.call(arguments).join(","))}}),K.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?K.find.matchesSelector(t[0],e)?[t[0]]:[]:K.find.matches(e,t)},dir:function(e,n,r){for(var i=[],o=e[n];o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!K(o).is(r));)1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});var We="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",Pe=/ jQuery\d+="(?:null|\d+)"/g,Re=/^\s+/,$e=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Ie=/<([\w:]+)/,ze=/]","i"),Ve=/^(?:checkbox|radio)$/,Ge=/checked\s*(?:[^=]|=\s*.checked.)/i,Qe=/\/(java|ecma)script/i,Ke=/^\s*\s*$/g,Ze={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},et=c(R),tt=et.appendChild(R.createElement("div")); -Ze.optgroup=Ze.option,Ze.tbody=Ze.tfoot=Ze.colgroup=Ze.caption=Ze.thead,Ze.th=Ze.td,K.support.htmlSerialize||(Ze._default=[1,"X
","
"]),K.fn.extend({text:function(e){return K.access(this,function(e){return e===t?K.text(this):this.empty().append((this[0]&&this[0].ownerDocument||R).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(K.isFunction(e))return this.each(function(t){K(this).wrapAll(e.call(this,t))});if(this[0]){var t=K(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return K.isFunction(e)?this.each(function(t){K(this).wrapInner(e.call(this,t))}):this.each(function(){var t=K(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=K.isFunction(e);return this.each(function(n){K(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){K.nodeName(this,"body")||K(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!s(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=K.clean(arguments);return this.pushStack(K.merge(e,this),"before",this.selector)}},after:function(){if(!s(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=K.clean(arguments);return this.pushStack(K.merge(this,e),"after",this.selector)}},remove:function(e,t){for(var n,r=0;null!=(n=this[r]);r++)e&&!K.filter(e,[n]).length||(!t&&1===n.nodeType&&(K.cleanData(n.getElementsByTagName("*")),K.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)for(1===e.nodeType&&K.cleanData(e.getElementsByTagName("*"));e.firstChild;)e.removeChild(e.firstChild);return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return K.clone(this,e,t)})},html:function(e){return K.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(Pe,""):t;if("string"==typeof e&&!Ue.test(e)&&(K.support.htmlSerialize||!Je.test(e))&&(K.support.leadingWhitespace||!Re.test(e))&&!Ze[(Ie.exec(e)||["",""])[1].toLowerCase()]){e=e.replace($e,"<$1>");try{for(;r1&&"string"==typeof u&&Ge.test(u))return this.each(function(){K(this).domManip(e,n,r)});if(K.isFunction(u))return this.each(function(i){var o=K(this);e[0]=u.call(this,i,n?o.html():t),o.domManip(e,n,r)});if(this[0]){if(i=K.buildFragment(e,this,c),a=i.fragment,o=a.firstChild,1===a.childNodes.length&&(a=o),o)for(n=n&&K.nodeName(o,"tr"),s=i.cacheable||p-1;l0?this.clone(!0):this).get(),K(a[i])[t](r),o=o.concat(r);return this.pushStack(o,e,a.selector)}}),K.extend({clone:function(e,t,n){var r,i,o,a;if(K.support.html5Clone||K.isXMLDoc(e)||!Je.test("<"+e.nodeName+">")?a=e.cloneNode(!0):(tt.innerHTML=e.outerHTML,tt.removeChild(a=tt.firstChild)),!(K.support.noCloneEvent&&K.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||K.isXMLDoc(e)))for(d(e,a),r=h(e),i=h(a),o=0;r[o];++o)i[o]&&d(r[o],i[o]);if(t&&(p(e,a),n))for(r=h(e),i=h(a),o=0;r[o];++o)p(r[o],i[o]);return r=i=null,a},clean:function(e,t,n,r){var i,o,a,s,l,u,f,p,d,h,m,y=0,v=[];for(t&&"undefined"!=typeof t.createDocumentFragment||(t=R),o=t===R&&et;null!=(a=e[y]);y++)if("number"==typeof a&&(a+=""),a){if("string"==typeof a)if(Xe.test(a)){for(o=o||c(t),f=f||o.appendChild(t.createElement("div")),a=a.replace($e,"<$1>"),s=(Ie.exec(a)||["",""])[1].toLowerCase(),l=Ze[s]||Ze._default,u=l[0],f.innerHTML=l[1]+a+l[2];u--;)f=f.lastChild;if(!K.support.tbody)for(p=ze.test(a),d="table"!==s||p?""!==l[1]||p?[]:f.childNodes:f.firstChild&&f.firstChild.childNodes,i=d.length-1;i>=0;--i)K.nodeName(d[i],"tbody")&&!d[i].childNodes.length&&d[i].parentNode.removeChild(d[i]);!K.support.leadingWhitespace&&Re.test(a)&&f.insertBefore(t.createTextNode(Re.exec(a)[0]),f.firstChild),a=f.childNodes,f=o.lastChild}else a=t.createTextNode(a);a.nodeType?v.push(a):v=K.merge(v,a)}if(f&&(o.removeChild(f),a=f=o=null),!K.support.appendChecked)for(y=0;null!=(a=v[y]);y++)K.nodeName(a,"input")?g(a):"undefined"!=typeof a.getElementsByTagName&&K.grep(a.getElementsByTagName("input"),g);if(n)for(h=function(e){if(!e.type||Qe.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)},y=0;null!=(a=v[y]);y++)K.nodeName(a,"script")&&h(a)||(n.appendChild(a),"undefined"!=typeof a.getElementsByTagName&&(m=K.grep(K.merge([],a.getElementsByTagName("script")),h),v.splice.apply(v,[y+1,0].concat(m)),y+=m.length));return v},cleanData:function(e,t){for(var n,r,i,o,a=0,s=K.expando,l=K.cache,u=K.support.deleteExpando,c=K.event.special;null!=(i=e[a]);a++)if((t||K.acceptData(i))&&(r=i[s],n=r&&l[r])){if(n.events)for(o in n.events)c[o]?K.event.remove(i,o):K.removeEvent(i,o,n.handle);l[r]&&(delete l[r],u?delete i[s]:i.removeAttribute?i.removeAttribute(s):i[s]=null,K.deletedIds.push(r))}}}),function(){var e,t;K.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=K.uaMatch(I.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.webkit&&(t.safari=!0),K.browser=t,K.sub=function(){function e(t,n){return new e.fn.init(t,n)}K.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function n(n,r){return r&&r instanceof K&&!(r instanceof e)&&(r=e(r)),K.fn.init.call(this,n,r,t)},e.fn.init.prototype=e.fn;var t=e(R);return e}}();var nt,rt,it,ot=/alpha\([^)]*\)/i,at=/opacity=([^)]*)/,st=/^(top|right|bottom|left)$/,lt=/^margin/,ut=new RegExp("^("+Z+")(.*)$","i"),ct=new RegExp("^("+Z+")(?!px)[a-z%]+$","i"),ft=new RegExp("^([-+])=("+Z+")","i"),pt={},dt={position:"absolute",visibility:"hidden",display:"block"},ht={letterSpacing:0,fontWeight:400,lineHeight:1},gt=["Top","Right","Bottom","Left"],mt=["Webkit","O","Moz","ms"],yt=K.fn.toggle;K.fn.extend({css:function(e,n){return K.access(this,function(e,n,r){return r!==t?K.style(e,n,r):K.css(e,n)},e,n,arguments.length>1)},show:function(){return v(this,!0)},hide:function(){return v(this)},toggle:function(e,t){var n="boolean"==typeof e;return K.isFunction(e)&&K.isFunction(t)?yt.apply(this,arguments):this.each(function(){(n?e:y(this))?K(this).show():K(this).hide()})}}),K.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=nt(e,"opacity");return""===n?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":K.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=K.camelCase(n),u=e.style;if(n=K.cssProps[l]||(K.cssProps[l]=m(u,l)),s=K.cssHooks[n]||K.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=ft.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(K.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"===a&&!K.cssNumber[l]&&(r+="px"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=K.camelCase(n);return n=K.cssProps[l]||(K.cssProps[l]=m(e.style,l)),s=K.cssHooks[n]||K.cssHooks[l],s&&"get"in s&&(o=s.get(e,!0,i)),o===t&&(o=nt(e,n)),"normal"===o&&n in ht&&(o=ht[n]),r||i!==t?(a=parseFloat(o),r||K.isNumeric(a)?a||0:o):o},swap:function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=o[i];return r}}),e.getComputedStyle?nt=function(e,t){var n,r,i,o,a=getComputedStyle(e,null),s=e.style;return a&&(n=a[t],""===n&&!K.contains(e.ownerDocument.documentElement,e)&&(n=K.style(e,t)),ct.test(n)&<.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=n,n=a.width,s.width=r,s.minWidth=i,s.maxWidth=o)),n}:R.documentElement.currentStyle&&(nt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],o=e.style;return null==i&&o&&o[t]&&(i=o[t]),ct.test(i)&&!st.test(t)&&(n=o.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),o.left="fontSize"===t?"1em":i,i=o.pixelLeft+"px",o.left=n,r&&(e.runtimeStyle.left=r)),""===i?"auto":i}),K.each(["height","width"],function(e,t){K.cssHooks[t]={get:function(e,n,r){if(n)return 0!==e.offsetWidth||"none"!==nt(e,"display")?w(e,t,r):K.swap(e,dt,function(){return w(e,t,r)})},set:function(e,n,r){return b(e,n,r?x(e,t,r,K.support.boxSizing&&"border-box"===K.css(e,"boxSizing")):0)}}}),K.support.opacity||(K.cssHooks.opacity={get:function(e,t){return at.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=K.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,t>=1&&""===K.trim(o.replace(ot,""))&&n.removeAttribute&&(n.removeAttribute("filter"),r&&!r.filter)||(n.filter=ot.test(o)?o.replace(ot,i):o+" "+i)}}),K(function(){K.support.reliableMarginRight||(K.cssHooks.marginRight={get:function(e,t){return K.swap(e,{display:"inline-block"},function(){if(t)return nt(e,"marginRight")})}}),!K.support.pixelPosition&&K.fn.position&&K.each(["top","left"],function(e,t){K.cssHooks[t]={get:function(e,n){if(n){var r=nt(e,t);return ct.test(r)?K(e).position()[t]+"px":r}}}})}),K.expr&&K.expr.filters&&(K.expr.filters.hidden=function(e){return 0===e.offsetWidth&&0===e.offsetHeight||!K.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||nt(e,"display"))},K.expr.filters.visible=function(e){return!K.expr.filters.hidden(e)}),K.each({margin:"",padding:"",border:"Width"},function(e,t){K.cssHooks[e+t]={expand:function(n){var r,i="string"==typeof n?n.split(" "):[n],o={};for(r=0;r<4;r++)o[e+gt[r]+t]=i[r]||i[r-2]||i[0];return o}},lt.test(e)||(K.cssHooks[e+t].set=b)});var vt=/%20/g,bt=/\[\]$/,xt=/\r?\n/g,wt=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,Tt=/^(?:select|textarea)/i;K.fn.extend({serialize:function(){return K.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?K.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||Tt.test(this.nodeName)||wt.test(this.type))}).map(function(e,t){var n=K(this).val();return null==n?null:K.isArray(n)?K.map(n,function(e,n){return{name:t.name,value:e.replace(xt,"\r\n")}}):{name:t.name,value:n.replace(xt,"\r\n")}}).get()}}),K.param=function(e,n){var r,i=[],o=function(e,t){t=K.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=K.ajaxSettings&&K.ajaxSettings.traditional),K.isArray(e)||e.jquery&&!K.isPlainObject(e))K.each(e,function(){o(this.name,this.value)});else for(r in e)N(r,e[r],n,o);return i.join("&").replace(vt,"+")};var Nt,Ct,Et=/#.*$/,kt=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,St=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,At=/^(?:GET|HEAD)$/,jt=/^\/\//,Dt=/\?/,Lt=/)<[^<]*)*<\/script>/gi,Ht=/([?&])_=[^&]*/,Ft=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Mt=K.fn.load,Ot={},_t={},qt=["*/"]+["*"];try{Nt=$.href}catch(Bt){Nt=R.createElement("a"),Nt.href="",Nt=Nt.href}Ct=Ft.exec(Nt.toLowerCase())||[],K.fn.load=function(e,n,r){if("string"!=typeof e&&Mt)return Mt.apply(this,arguments);if(!this.length)return this;var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),K.isFunction(n)?(r=n,n=t):"object"==typeof n&&(o="POST"),K.ajax({url:e,type:o,dataType:"html",data:n,complete:function(e,t){r&&s.each(r,a||[e.responseText,t,e])}}).done(function(e){a=arguments,s.html(i?K("
").append(e.replace(Lt,"")).find(i):e)}),this},K.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){K.fn[t]=function(e){return this.on(t,e)}}),K.each(["get","post"],function(e,n){K[n]=function(e,r,i,o){return K.isFunction(r)&&(o=o||i,i=r,r=t),K.ajax({type:n,url:e,data:r,success:i,dataType:o})}}),K.extend({getScript:function(e,n){return K.get(e,t,n,"script")},getJSON:function(e,t,n){return K.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?k(e,K.ajaxSettings):(t=e,e=K.ajaxSettings),k(e,t),e},ajaxSettings:{url:Nt,isLocal:St.test(Ct[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":qt},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":K.parseJSON,"text xml":K.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:C(Ot),ajaxTransport:C(_t),ajax:function(e,n){function r(e,n,r,a){var u,f,v,b,w,N=n;2!==x&&(x=2,l&&clearTimeout(l),s=t,o=a||"",T.readyState=e>0?4:0,r&&(b=S(p,T,r)),e>=200&&e<300||304===e?(p.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(K.lastModified[i]=w),w=T.getResponseHeader("Etag"),w&&(K.etag[i]=w)),304===e?(N="notmodified",u=!0):(u=A(p,b),N=u.state,f=u.data,v=u.error,u=!v)):(v=N,N&&!e||(N="error",e<0&&(e=0))),T.status=e,T.statusText=""+(n||N),u?g.resolveWith(d,[f,N,T]):g.rejectWith(d,[T,N,v]),T.statusCode(y),y=t,c&&h.trigger("ajax"+(u?"Success":"Error"),[T,p,u?f:v]),m.fireWith(d,[T,N]),c&&(h.trigger("ajaxComplete",[T,p]),--K.active||K.event.trigger("ajaxStop")))}"object"==typeof e&&(n=e,e=t),n=n||{};var i,o,a,s,l,u,c,f,p=K.ajaxSetup({},n),d=p.context||p,h=d!==p&&(d.nodeType||d instanceof K)?K(d):K.event,g=K.Deferred(),m=K.Callbacks("once memory"),y=p.statusCode||{},v={},b={},x=0,w="canceled",T={readyState:0,setRequestHeader:function(e,t){if(!x){var n=e.toLowerCase();e=b[n]=b[n]||e,v[e]=t}return this},getAllResponseHeaders:function(){return 2===x?o:null},getResponseHeader:function(e){var n;if(2===x){if(!a)for(a={};n=kt.exec(o);)a[n[1].toLowerCase()]=n[2];n=a[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return x||(p.mimeType=e),this},abort:function(e){return e=e||w,s&&s.abort(e),r(0,e),this}};if(g.promise(T),T.success=T.done,T.error=T.fail,T.complete=m.add,T.statusCode=function(e){if(e){var t;if(x<2)for(t in e)y[t]=[y[t],e[t]];else t=e[T.status],T.always(t)}return this},p.url=((e||p.url)+"").replace(Et,"").replace(jt,Ct[1]+"//"),p.dataTypes=K.trim(p.dataType||"*").toLowerCase().split(te),null==p.crossDomain&&(u=Ft.exec(p.url.toLowerCase()),p.crossDomain=!(!u||u[1]==Ct[1]&&u[2]==Ct[2]&&(u[3]||("http:"===u[1]?80:443))==(Ct[3]||("http:"===Ct[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=K.param(p.data,p.traditional)),E(Ot,p,n,T),2===x)return T;if(c=p.global,p.type=p.type.toUpperCase(),p.hasContent=!At.test(p.type),c&&0===K.active++&&K.event.trigger("ajaxStart"),!p.hasContent&&(p.data&&(p.url+=(Dt.test(p.url)?"&":"?")+p.data,delete p.data),i=p.url,p.cache===!1)){var N=K.now(),C=p.url.replace(Ht,"$1_="+N);p.url=C+(C===p.url?(Dt.test(p.url)?"&":"?")+"_="+N:"")}(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",p.contentType),p.ifModified&&(i=i||p.url,K.lastModified[i]&&T.setRequestHeader("If-Modified-Since",K.lastModified[i]),K.etag[i]&&T.setRequestHeader("If-None-Match",K.etag[i])),T.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+qt+"; q=0.01":""):p.accepts["*"]);for(f in p.headers)T.setRequestHeader(f,p.headers[f]);if(!p.beforeSend||p.beforeSend.call(d,T,p)!==!1&&2!==x){w="abort";for(f in{success:1,error:1,complete:1})T[f](p[f]);if(s=E(_t,p,n,T)){T.readyState=1,c&&h.trigger("ajaxSend",[T,p]),p.async&&p.timeout>0&&(l=setTimeout(function(){T.abort("timeout")},p.timeout));try{x=1,s.send(v,r)}catch(k){if(!(x<2))throw k;r(-1,k)}}else r(-1,"No Transport");return T}return T.abort()},active:0,lastModified:{},etag:{}});var Wt=[],Pt=/\?/,Rt=/(=)\?(?=&|$)|\?\?/,$t=K.now();K.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Wt.pop()||K.expando+"_"+$t++;return this[e]=!0,e}}),K.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.data,u=n.url,c=n.jsonp!==!1,f=c&&Rt.test(u),p=c&&!f&&"string"==typeof l&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rt.test(l);if("jsonp"===n.dataTypes[0]||f||p)return o=n.jsonpCallback=K.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,a=e[o],f?n.url=u.replace(Rt,"$1"+o):p?n.data=l.replace(Rt,"$1"+o):c&&(n.url+=(Pt.test(u)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||K.error(o+" was not called"),s[0]},n.dataTypes[0]="json",e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Wt.push(o)),s&&K.isFunction(a)&&a(s[0]),s=a=t}),"script"}),K.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return K.globalEval(e),e}}}),K.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),K.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=R.head||R.getElementsByTagName("head")[0]||R.documentElement;return{send:function(i,o){n=R.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){(i||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var It,zt=!!e.ActiveXObject&&function(){for(var e in It)It[e](0,1)},Xt=0;K.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&j()||D()}:j,function(e){K.extend(K.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(K.ajaxSettings.xhr()),K.support.ajax&&K.ajaxTransport(function(n){if(!n.crossDomain||K.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,f,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=K.noop,zt&&delete It[a]),i)4!==l.readyState&&l.abort();else{s=l.status,c=l.getAllResponseHeaders(),f={},p=l.responseXML,p&&p.documentElement&&(f.xml=p);try{f.text=l.responseText}catch(e){}try{u=l.statusText}catch(d){u=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=f.text?200:404}}catch(h){i||o(-1,h)}f&&o(s,u,f,c)},n.async?4===l.readyState?setTimeout(r,0):(a=++Xt,zt&&(It||(It={},K(e).unload(zt)),It[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var Ut,Yt,Jt=/^(?:toggle|show|hide)$/,Vt=new RegExp("^(?:([-+])=|)("+Z+")([a-z%]*)$","i"),Gt=/queueHooks$/,Qt=[O],Kt={"*":[function(e,t){var n,r,i,o=this.createTween(e,t),a=Vt.exec(t),s=o.cur(),l=+s||0,u=1;if(a){if(n=+a[2],r=a[3]||(K.cssNumber[e]?"":"px"),"px"!==r&&l){l=K.css(o.elem,e,!0)||n||1;do i=u=u||".5",l/=u,K.style(o.elem,e,l+r),u=o.cur()/s;while(1!==u&&u!==i)}o.unit=r,o.start=l,o.end=a[1]?l+(a[1]+1)*n:n}return o}]};K.Animation=K.extend(F,{tweener:function(e,t){K.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,r=0,i=e.length;r-1,f={},p={};c?(p=a.position(),i=p.top,o=p.left):(i=parseFloat(l)||0,o=parseFloat(u)||0),K.isFunction(t)&&(t=t.call(e,n,s)),null!=t.top&&(f.top=t.top-s.top+i),null!=t.left&&(f.left=t.left-s.left+o),"using"in t?t.using.call(e,f):a.css(f)}},K.fn.extend({position:function(){if(this[0]){var e=this[0],t=this.offsetParent(),n=this.offset(),r=Zt.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(K.css(e,"marginTop"))||0,n.left-=parseFloat(K.css(e,"marginLeft"))||0,r.top+=parseFloat(K.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(K.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||R.body;e&&!Zt.test(e.nodeName)&&"static"===K.css(e,"position");)e=e.offsetParent;return e||R.body})}}),K.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);K.fn[e]=function(i){return K.access(this,function(e,i,o){var a=B(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:void(a?a.scrollTo(r?K(a).scrollLeft():o,r?o:K(a).scrollTop()):e[i]=o)},e,i,arguments.length,null)}}),K.each({Height:"height",Width:"width"},function(e,n){K.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){K.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return K.access(this,function(n,r,i){var o;return K.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?K.css(n,r,i,s):K.style(n,r,i,s)},n,a?i:t,a)}})}),e.jQuery=e.$=K,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return K})}(window); \ No newline at end of file diff --git a/spring-boot-swagger/src/main/resources/static/swagger/lib/jquery.ba-bbq.min.js b/spring-boot-swagger/src/main/resources/static/swagger/lib/jquery.ba-bbq.min.js deleted file mode 100644 index 78d1ff5..0000000 --- a/spring-boot-swagger/src/main/resources/static/swagger/lib/jquery.ba-bbq.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){function n(e){return"string"==typeof e}function r(e){var t=g.call(arguments,1);return function(){return e.apply(this,t.concat(g.call(arguments)))}}function o(e){return e.replace(/^[^#]*#?(.*)$/,"$1")}function a(e){return e.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function i(r,o,a,i,c){var u,s,p,h,d;return i!==f?(p=a.match(r?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/),d=p[3]||"",2===c&&n(i)?s=i.replace(r?R:E,""):(h=l(p[2]),i=n(i)?l[r?A:w](i):i,s=2===c?i:1===c?e.extend({},i,h):e.extend({},h,i),s=b(s),r&&(s=s.replace(m,y))),u=p[1]+(r?"#":s||!p[1]?"?":"")+s+d):u=o(a!==f?a:t[S][q]),u}function c(e,t,r){return t===f||"boolean"==typeof t?(r=t,t=b[e?A:w]()):t=n(t)?t.replace(e?R:E,""):t,l(t,r)}function u(t,r,o,a){return n(o)||"object"==typeof o||(a=o,o=r,r=f),this.each(function(){var n=e(this),i=r||v()[(this.nodeName||"").toLowerCase()]||"",c=i&&n.attr(i)||"";n.attr(i,b[t](c,o,a))})}var f,s,l,p,h,d,v,m,g=Array.prototype.slice,y=decodeURIComponent,b=e.param,$=e.bbq=e.bbq||{},x=e.event.special,j="hashchange",w="querystring",A="fragment",N="elemUrlAttr",S="location",q="href",C="src",E=/^.*\?|#.*$/g,R=/^.*\#/,U={};b[w]=r(i,0,a),b[A]=s=r(i,1,o),s.noEscape=function(t){t=t||"";var n=e.map(t.split(""),encodeURIComponent);m=new RegExp(n.join("|"),"g")},s.noEscape(",/"),e.deparam=l=function(t,n){var r={},o={"true":!0,"false":!1,"null":null};return e.each(t.replace(/\+/g," ").split("&"),function(t,a){var i,c=a.split("="),u=y(c[0]),s=r,l=0,p=u.split("]["),h=p.length-1;if(/\[/.test(p[0])&&/\]$/.test(p[h])?(p[h]=p[h].replace(/\]$/,""),p=p.shift().split("[").concat(p),h=p.length-1):h=0,2===c.length)if(i=y(c[1]),n&&(i=i&&!isNaN(i)?+i:"undefined"===i?f:o[i]!==f?o[i]:i),h)for(;l<=h;l++)u=""===p[l]?s.length:p[l],s=s[u]=l').hide().insertAfter("body")[0].contentWindow,s=function(){return r(a.document[i][u])},(f=function(e,t){if(e!==t){var n=a.document;n.open().close(),n[i].hash="#"+e}})(r()))}var o,a,f,s,p={};return p.start=function(){if(!o){var a=r();f||n(),function l(){var n=r(),p=s(a);n!==a?(f(a=n,p),e(t).trigger(c)):p!==a&&(t[i][u]=t[i][u].replace(/#.*/,"")+"#"+p),o=setTimeout(l,e[c+"Delay"])}()}},p.stop=function(){a||(o&&clearTimeout(o),o=0)},p}()}(jQuery,this); \ No newline at end of file diff --git a/spring-boot-swagger/src/main/resources/static/swagger/lib/jquery.slideto.min.js b/spring-boot-swagger/src/main/resources/static/swagger/lib/jquery.slideto.min.js deleted file mode 100644 index b15997b..0000000 --- a/spring-boot-swagger/src/main/resources/static/swagger/lib/jquery.slideto.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(i){i.fn.slideto=function(o){return o=i.extend({slide_duration:"slow",highlight_duration:3e3,highlight:!0,highlight_color:"#FFFF99"},o),this.each(function(){obj=i(this),i("body").animate({scrollTop:obj.offset().top},o.slide_duration,function(){o.highlight&&i.ui.version&&obj.effect("highlight",{color:o.highlight_color},o.highlight_duration)})})}}(jQuery); \ No newline at end of file diff --git a/spring-boot-swagger/src/main/resources/static/swagger/lib/jquery.wiggle.min.js b/spring-boot-swagger/src/main/resources/static/swagger/lib/jquery.wiggle.min.js deleted file mode 100644 index 6b4e261..0000000 --- a/spring-boot-swagger/src/main/resources/static/swagger/lib/jquery.wiggle.min.js +++ /dev/null @@ -1 +0,0 @@ -jQuery.fn.wiggle=function(e){var a={speed:50,wiggles:3,travel:5,callback:null},e=jQuery.extend(a,e);return this.each(function(){var a=this,l=(jQuery(this).wrap('
').css("position","relative"),0);for(i=1;i<=e.wiggles;i++)jQuery(this).animate({left:"-="+e.travel},e.speed).animate({left:"+="+2*e.travel},2*e.speed).animate({left:"-="+e.travel},e.speed,function(){l++,jQuery(a).parent().hasClass("wiggle-wrap")&&jQuery(a).parent().replaceWith(a),l==e.wiggles&&jQuery.isFunction(e.callback)&&e.callback()})})}; \ No newline at end of file diff --git a/spring-boot-swagger/src/main/resources/static/swagger/lib/js-yaml.min.js b/spring-boot-swagger/src/main/resources/static/swagger/lib/js-yaml.min.js deleted file mode 100644 index 2514a41..0000000 --- a/spring-boot-swagger/src/main/resources/static/swagger/lib/js-yaml.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.jsyaml=t()}}(function(){var t;return function e(t,n,i){function r(a,s){if(!n[a]){if(!t[a]){var c="function"==typeof require&&require;if(!s&&c)return c(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var l=n[a]={exports:{}};t[a][0].call(l.exports,function(e){var n=t[a][1][e];return r(n?n:e)},l,l.exports,e,t,n,i)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;an;n+=1)r=o[n],t[r]=e[r];return t}function s(t,e){var n,i="";for(n=0;e>n;n+=1)i+=t;return i}function c(t){return 0===t&&Number.NEGATIVE_INFINITY===1/t}e.exports.isNothing=i,e.exports.isObject=r,e.exports.toArray=o,e.exports.repeat=s,e.exports.isNegativeZero=c,e.exports.extend=a},{}],3:[function(t,e,n){"use strict";function i(t,e){var n,i,r,o,a,s,c;if(null===e)return{};for(n={},i=Object.keys(e),r=0,o=i.length;o>r;r+=1)a=i[r],s=String(e[a]),"!!"===a.slice(0,2)&&(a="tag:yaml.org,2002:"+a.slice(2)),c=t.compiledTypeMap[a],c&&E.call(c.styleAliases,s)&&(s=c.styleAliases[s]),n[a]=s;return n}function r(t){var e,n,i;if(e=t.toString(16).toUpperCase(),255>=t)n="x",i=2;else if(65535>=t)n="u",i=4;else{if(!(4294967295>=t))throw new O("code point within a string may not be greater than 0xFFFFFFFF");n="U",i=8}return"\\"+n+j.repeat("0",i-e.length)+e}function o(t){this.schema=t.schema||S,this.indent=Math.max(1,t.indent||2),this.skipInvalid=t.skipInvalid||!1,this.flowLevel=j.isNothing(t.flowLevel)?-1:t.flowLevel,this.styleMap=i(this.schema,t.styles||null),this.sortKeys=t.sortKeys||!1,this.lineWidth=t.lineWidth||80,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function a(t,e){for(var n,i=j.repeat(" ",e),r=0,o=-1,a="",s=t.length;s>r;)o=t.indexOf("\n",r),-1===o?(n=t.slice(r),r=s):(n=t.slice(r,o+1),r=o+1),n.length&&"\n"!==n&&(a+=i),a+=n;return a}function s(t,e){return"\n"+j.repeat(" ",t.indent*e)}function c(t,e){var n,i,r;for(n=0,i=t.implicitTypes.length;i>n;n+=1)if(r=t.implicitTypes[n],r.resolve(e))return!0;return!1}function u(t){this.source=t,this.result="",this.checkpoint=0}function l(t,e,n,i){var r,o,s,l,f,m,y,g,v,x,A,b,w,k,C,j,O,S,_,I,E;if(0===e.length)return void(t.dump="''");if(-1!==et.indexOf(e))return void(t.dump="'"+e+"'");for(r=!0,o=e.length?e.charCodeAt(0):0,s=M===o||M===e.charCodeAt(e.length-1),(K===o||W===o||G===o||z===o)&&(r=!1),s?(r=!1,l=!1,f=!1):(l=!i,f=!i),m=!0,y=new u(e),g=!1,v=0,x=0,A=t.indent*n,b=t.lineWidth,-1===b&&(b=9007199254740991),40>A?b-=A:b=40,k=0;k0&&(O=e.charCodeAt(k-1),O===M&&(f=!1,l=!1)),l&&(S=k-v,v=k,S>x&&(x=S))),w!==D&&(m=!1),y.takeUpTo(k),y.escapeChar())}if(r&&c(t,e)&&(r=!1),_="",(l||f)&&(I=0,e.charCodeAt(e.length-1)===N&&(I+=1,e.charCodeAt(e.length-2)===N&&(I+=1)),0===I?_="-":2===I&&(_="+")),f&&b>x&&(l=!1),g||(f=!1),r)t.dump=e;else if(m)t.dump="'"+e+"'";else if(l)E=p(e,b),t.dump=">"+_+"\n"+a(E,A);else if(f)_||(e=e.replace(/\n$/,"")),t.dump="|"+_+"\n"+a(e,A);else{if(!y)throw new Error("Failed to dump scalar value");y.finish(),t.dump='"'+y.result+'"'}}function p(t,e){var n,i="",r=0,o=t.length,a=/\n+$/.exec(t);for(a&&(o=a.index+1);o>r;)n=t.indexOf("\n",r),n>o||-1===n?(i&&(i+="\n\n"),i+=f(t.slice(r,o),e),r=o):(i&&(i+="\n\n"),i+=f(t.slice(r,n),e),r=n+1);return a&&"\n"!==a[0]&&(i+=a[0]),i}function f(t,e){if(""===t)return t;for(var n,i,r,o=/[^\s] [^\s]/g,a="",s=0,c=0,u=o.exec(t);u;)n=u.index,n-c>e&&(i=s!==c?s:n,a&&(a+="\n"),r=t.slice(c,i),a+=r,c=i+1),s=n+1,u=o.exec(t);return a&&(a+="\n"),a+=c!==s&&t.length-c>e?t.slice(c,s)+"\n"+t.slice(s+1):t.slice(c)}function h(t){return F!==t&&N!==t&&T!==t&&$!==t&&V!==t&&Z!==t&&J!==t&&X!==t&&U!==t&&Y!==t&&B!==t&&L!==t&&Q!==t&&R!==t&&P!==t&&D!==t&&q!==t&&H!==t&&!tt[t]&&!d(t)}function d(t){return!(t>=32&&126>=t||133===t||t>=160&&55295>=t||t>=57344&&65533>=t||t>=65536&&1114111>=t)}function m(t,e,n){var i,r,o="",a=t.tag;for(i=0,r=n.length;r>i;i+=1)A(t,e,n[i],!1,!1)&&(0!==i&&(o+=", "),o+=t.dump);t.tag=a,t.dump="["+o+"]"}function y(t,e,n,i){var r,o,a="",c=t.tag;for(r=0,o=n.length;o>r;r+=1)A(t,e+1,n[r],!0,!0)&&(i&&0===r||(a+=s(t,e)),a+="- "+t.dump);t.tag=c,t.dump=a||"[]"}function g(t,e,n){var i,r,o,a,s,c="",u=t.tag,l=Object.keys(n);for(i=0,r=l.length;r>i;i+=1)s="",0!==i&&(s+=", "),o=l[i],a=n[o],A(t,e,o,!1,!1)&&(t.dump.length>1024&&(s+="? "),s+=t.dump+": ",A(t,e,a,!1,!1)&&(s+=t.dump,c+=s));t.tag=u,t.dump="{"+c+"}"}function v(t,e,n,i){var r,o,a,c,u,l,p="",f=t.tag,h=Object.keys(n);if(t.sortKeys===!0)h.sort();else if("function"==typeof t.sortKeys)h.sort(t.sortKeys);else if(t.sortKeys)throw new O("sortKeys must be a boolean or a function");for(r=0,o=h.length;o>r;r+=1)l="",i&&0===r||(l+=s(t,e)),a=h[r],c=n[a],A(t,e+1,a,!0,!0,!0)&&(u=null!==t.tag&&"?"!==t.tag||t.dump&&t.dump.length>1024,u&&(l+=t.dump&&N===t.dump.charCodeAt(0)?"?":"? "),l+=t.dump,u&&(l+=s(t,e)),A(t,e+1,c,!0,u)&&(l+=t.dump&&N===t.dump.charCodeAt(0)?":":": ",l+=t.dump,p+=l));t.tag=f,t.dump=p||"{}"}function x(t,e,n){var i,r,o,a,s,c;for(r=n?t.explicitTypes:t.implicitTypes,o=0,a=r.length;a>o;o+=1)if(s=r[o],(s.instanceOf||s.predicate)&&(!s.instanceOf||"object"==typeof e&&e instanceof s.instanceOf)&&(!s.predicate||s.predicate(e))){if(t.tag=n?s.tag:"?",s.represent){if(c=t.styleMap[s.tag]||s.defaultStyle,"[object Function]"===I.call(s.represent))i=s.represent(e,c);else{if(!E.call(s.represent,c))throw new O("!<"+s.tag+'> tag resolver accepts not "'+c+'" style');i=s.represent[c](e,c)}t.dump=i}return!0}return!1}function A(t,e,n,i,r,o){t.tag=null,t.dump=n,x(t,n,!1)||x(t,n,!0);var a=I.call(t.dump);i&&(i=0>t.flowLevel||t.flowLevel>e);var s,c,u="[object Object]"===a||"[object Array]"===a;if(u&&(s=t.duplicates.indexOf(n),c=-1!==s),(null!==t.tag&&"?"!==t.tag||c||2!==t.indent&&e>0)&&(r=!1),c&&t.usedDuplicates[s])t.dump="*ref_"+s;else{if(u&&c&&!t.usedDuplicates[s]&&(t.usedDuplicates[s]=!0),"[object Object]"===a)i&&0!==Object.keys(t.dump).length?(v(t,e,t.dump,r),c&&(t.dump="&ref_"+s+t.dump)):(g(t,e,t.dump),c&&(t.dump="&ref_"+s+" "+t.dump));else if("[object Array]"===a)i&&0!==t.dump.length?(y(t,e,t.dump,r),c&&(t.dump="&ref_"+s+t.dump)):(m(t,e,t.dump),c&&(t.dump="&ref_"+s+" "+t.dump));else{if("[object String]"!==a){if(t.skipInvalid)return!1;throw new O("unacceptable kind of an object to dump "+a)}"?"!==t.tag&&l(t,t.dump,e,o)}null!==t.tag&&"?"!==t.tag&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function b(t,e){var n,i,r=[],o=[];for(w(t,r,o),n=0,i=o.length;i>n;n+=1)e.duplicates.push(r[o[n]]);e.usedDuplicates=new Array(i)}function w(t,e,n){var i,r,o;if(null!==t&&"object"==typeof t)if(r=e.indexOf(t),-1!==r)-1===n.indexOf(r)&&n.push(r);else if(e.push(t),Array.isArray(t))for(r=0,o=t.length;o>r;r+=1)w(t[r],e,n);else for(i=Object.keys(t),r=0,o=i.length;o>r;r+=1)w(t[i[r]],e,n)}function k(t,e){e=e||{};var n=new o(e);return b(t,n),A(n,0,t,!0,!0)?n.dump+"\n":""}function C(t,e){return k(t,j.extend({schema:_},e))}var j=t("./common"),O=t("./exception"),S=t("./schema/default_full"),_=t("./schema/default_safe"),I=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=9,N=10,T=13,M=32,L=33,D=34,U=35,q=37,Y=38,P=39,B=42,$=44,K=45,H=58,R=62,W=63,G=64,V=91,Z=93,z=96,J=123,Q=124,X=125,tt={};tt[0]="\\0",tt[7]="\\a",tt[8]="\\b",tt[9]="\\t",tt[10]="\\n",tt[11]="\\v",tt[12]="\\f",tt[13]="\\r",tt[27]="\\e",tt[34]='\\"',tt[92]="\\\\",tt[133]="\\N",tt[160]="\\_",tt[8232]="\\L",tt[8233]="\\P";var et=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];u.prototype.takeUpTo=function(t){var e;if(t checkpoint"),e.position=t,e.checkpoint=this.checkpoint,e;return this.result+=this.source.slice(this.checkpoint,t),this.checkpoint=t,this},u.prototype.escapeChar=function(){var t,e;return t=this.source.charCodeAt(this.checkpoint),e=tt[t]||r(t),this.result+=e,this.checkpoint+=1,this},u.prototype.finish=function(){this.source.length>this.checkpoint&&this.takeUpTo(this.source.length)},e.exports.dump=k,e.exports.safeDump=C},{"./common":2,"./exception":4,"./schema/default_full":9,"./schema/default_safe":10}],4:[function(t,e,n){"use strict";function i(t,e){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||"",this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():"")}var r=t("inherit");r(i,Error),i.prototype.toString=function(t){var e=this.name+": ";return e+=this.reason||"(unknown reason)",!t&&this.mark&&(e+=" "+this.mark.toString()),e},e.exports=i},{inherit:31}],5:[function(t,e,n){"use strict";function i(t){return 10===t||13===t}function r(t){return 9===t||32===t}function o(t){return 9===t||32===t||10===t||13===t}function a(t){return 44===t||91===t||93===t||123===t||125===t}function s(t){var e;return t>=48&&57>=t?t-48:(e=32|t,e>=97&&102>=e?e-97+10:-1)}function c(t){return 120===t?2:117===t?4:85===t?8:0}function u(t){return t>=48&&57>=t?t-48:-1}function l(t){return 48===t?"\0":97===t?"":98===t?"\b":116===t?"\t":9===t?"\t":110===t?"\n":118===t?"\x0B":102===t?"\f":114===t?"\r":101===t?"":32===t?" ":34===t?'"':47===t?"/":92===t?"\\":78===t?"…":95===t?" ":76===t?"\u2028":80===t?"\u2029":""}function p(t){return 65535>=t?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}function f(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||H,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function h(t,e){return new B(e,new $(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function d(t,e){throw h(t,e)}function m(t,e){t.onWarning&&t.onWarning.call(null,h(t,e))}function y(t,e,n,i){var r,o,a,s;if(n>e){if(s=t.input.slice(e,n),i)for(r=0,o=s.length;o>r;r+=1)a=s.charCodeAt(r),9===a||a>=32&&1114111>=a||d(t,"expected valid JSON character");else X.test(s)&&d(t,"the stream contains non-printable characters");t.result+=s}}function g(t,e,n){var i,r,o,a;for(P.isObject(n)||d(t,"cannot merge mappings; the provided source object is unacceptable"),i=Object.keys(n),o=0,a=i.length;a>o;o+=1)r=i[o],R.call(e,r)||(e[r]=n[r])}function v(t,e,n,i,r){var o,a;if(i=String(i),null===e&&(e={}),"tag:yaml.org,2002:merge"===n)if(Array.isArray(r))for(o=0,a=r.length;a>o;o+=1)g(t,e,r[o]);else g(t,e,r);else e[i]=r;return e}function x(t){var e;e=t.input.charCodeAt(t.position),10===e?t.position++:13===e?(t.position++,10===t.input.charCodeAt(t.position)&&t.position++):d(t,"a line break is expected"),t.line+=1,t.lineStart=t.position}function A(t,e,n){for(var o=0,a=t.input.charCodeAt(t.position);0!==a;){for(;r(a);)a=t.input.charCodeAt(++t.position);if(e&&35===a)do a=t.input.charCodeAt(++t.position);while(10!==a&&13!==a&&0!==a);if(!i(a))break;for(x(t),a=t.input.charCodeAt(t.position),o++,t.lineIndent=0;32===a;)t.lineIndent++,a=t.input.charCodeAt(++t.position)}return-1!==n&&0!==o&&t.lineIndent1&&(t.result+=P.repeat("\n",e-1))}function k(t,e,n){var s,c,u,l,p,f,h,d,m,g=t.kind,v=t.result;if(m=t.input.charCodeAt(t.position),o(m)||a(m)||35===m||38===m||42===m||33===m||124===m||62===m||39===m||34===m||37===m||64===m||96===m)return!1;if((63===m||45===m)&&(c=t.input.charCodeAt(t.position+1),o(c)||n&&a(c)))return!1;for(t.kind="scalar",t.result="",u=l=t.position,p=!1;0!==m;){if(58===m){if(c=t.input.charCodeAt(t.position+1),o(c)||n&&a(c))break}else if(35===m){if(s=t.input.charCodeAt(t.position-1),o(s))break}else{if(t.position===t.lineStart&&b(t)||n&&a(m))break;if(i(m)){if(f=t.line,h=t.lineStart,d=t.lineIndent,A(t,!1,-1),t.lineIndent>=e){p=!0,m=t.input.charCodeAt(t.position);continue}t.position=l,t.line=f,t.lineStart=h,t.lineIndent=d;break}}p&&(y(t,u,l,!1),w(t,t.line-f),u=l=t.position,p=!1),r(m)||(l=t.position+1),m=t.input.charCodeAt(++t.position)}return y(t,u,l,!1),!!t.result||(t.kind=g,t.result=v,!1)}function C(t,e){var n,r,o;if(n=t.input.charCodeAt(t.position),39!==n)return!1;for(t.kind="scalar",t.result="",t.position++,r=o=t.position;0!==(n=t.input.charCodeAt(t.position));)if(39===n){if(y(t,r,t.position,!0),n=t.input.charCodeAt(++t.position),39!==n)return!0;r=o=t.position,t.position++}else i(n)?(y(t,r,o,!0),w(t,A(t,!1,e)),r=o=t.position):t.position===t.lineStart&&b(t)?d(t,"unexpected end of the document within a single quoted scalar"):(t.position++,o=t.position);d(t,"unexpected end of the stream within a single quoted scalar")}function j(t,e){var n,r,o,a,u,l;if(l=t.input.charCodeAt(t.position),34!==l)return!1;for(t.kind="scalar",t.result="",t.position++,n=r=t.position;0!==(l=t.input.charCodeAt(t.position));){if(34===l)return y(t,n,t.position,!0),t.position++,!0;if(92===l){if(y(t,n,t.position,!0),l=t.input.charCodeAt(++t.position),i(l))A(t,!1,e);else if(256>l&&rt[l])t.result+=ot[l],t.position++;else if((u=c(l))>0){for(o=u,a=0;o>0;o--)l=t.input.charCodeAt(++t.position),(u=s(l))>=0?a=(a<<4)+u:d(t,"expected hexadecimal character");t.result+=p(a),t.position++}else d(t,"unknown escape sequence");n=r=t.position}else i(l)?(y(t,n,r,!0),w(t,A(t,!1,e)),n=r=t.position):t.position===t.lineStart&&b(t)?d(t,"unexpected end of the document within a double quoted scalar"):(t.position++,r=t.position)}d(t,"unexpected end of the stream within a double quoted scalar")}function O(t,e){var n,i,r,a,s,c,u,l,p,f,h,m=!0,y=t.tag,g=t.anchor;if(h=t.input.charCodeAt(t.position),91===h)a=93,u=!1,i=[];else{if(123!==h)return!1;a=125,u=!0,i={}}for(null!==t.anchor&&(t.anchorMap[t.anchor]=i),h=t.input.charCodeAt(++t.position);0!==h;){if(A(t,!0,e),h=t.input.charCodeAt(t.position),h===a)return t.position++,t.tag=y,t.anchor=g,t.kind=u?"mapping":"sequence",t.result=i,!0;m||d(t,"missed comma between flow collection entries"),p=l=f=null,s=c=!1,63===h&&(r=t.input.charCodeAt(t.position+1),o(r)&&(s=c=!0,t.position++,A(t,!0,e))),n=t.line,T(t,e,W,!1,!0),p=t.tag,l=t.result,A(t,!0,e),h=t.input.charCodeAt(t.position),!c&&t.line!==n||58!==h||(s=!0,h=t.input.charCodeAt(++t.position),A(t,!0,e),T(t,e,W,!1,!0),f=t.result),u?v(t,i,p,l,f):i.push(s?v(t,null,p,l,f):l),A(t,!0,e),h=t.input.charCodeAt(t.position),44===h?(m=!0,h=t.input.charCodeAt(++t.position)):m=!1}d(t,"unexpected end of the stream within a flow collection")}function S(t,e){var n,o,a,s,c=z,l=!1,p=e,f=0,h=!1;if(s=t.input.charCodeAt(t.position),124===s)o=!1;else{if(62!==s)return!1;o=!0}for(t.kind="scalar",t.result="";0!==s;)if(s=t.input.charCodeAt(++t.position),43===s||45===s)z===c?c=43===s?Q:J:d(t,"repeat of a chomping mode identifier");else{if(!((a=u(s))>=0))break;0===a?d(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):l?d(t,"repeat of an indentation width identifier"):(p=e+a-1,l=!0)}if(r(s)){do s=t.input.charCodeAt(++t.position);while(r(s));if(35===s)do s=t.input.charCodeAt(++t.position);while(!i(s)&&0!==s)}for(;0!==s;){for(x(t),t.lineIndent=0,s=t.input.charCodeAt(t.position);(!l||t.lineIndentp&&(p=t.lineIndent),i(s))f++;else{if(t.lineIndente)&&0!==r)d(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(T(t,e,Z,!0,a)&&(y?h=t.result:m=t.result),y||(v(t,p,f,h,m),f=h=m=null),A(t,!0,-1),c=t.input.charCodeAt(t.position)),t.lineIndent>e&&0!==c)d(t,"bad indentation of a mapping entry");else if(t.lineIndente?h=1:t.lineIndent===e?h=0:t.lineIndente?h=1:t.lineIndent===e?h=0:t.lineIndentc;c+=1)if(l=t.implicitTypes[c],l.resolve(t.result)){t.result=l.construct(t.result),t.tag=l.tag,null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);break}}else R.call(t.typeMap,t.tag)?(l=t.typeMap[t.tag],null!==t.result&&l.kind!==t.kind&&d(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+l.kind+'", not "'+t.kind+'"'),l.resolve(t.result)?(t.result=l.construct(t.result),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):d(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):d(t,"unknown tag !<"+t.tag+">");return null!==t.tag||null!==t.anchor||y}function M(t){var e,n,a,s,c=t.position,u=!1;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};0!==(s=t.input.charCodeAt(t.position))&&(A(t,!0,-1),s=t.input.charCodeAt(t.position),!(t.lineIndent>0||37!==s));){for(u=!0,s=t.input.charCodeAt(++t.position),e=t.position;0!==s&&!o(s);)s=t.input.charCodeAt(++t.position);for(n=t.input.slice(e,t.position),a=[],n.length<1&&d(t,"directive name must not be less than one character in length");0!==s;){for(;r(s);)s=t.input.charCodeAt(++t.position);if(35===s){do s=t.input.charCodeAt(++t.position);while(0!==s&&!i(s));break}if(i(s))break;for(e=t.position;0!==s&&!o(s);)s=t.input.charCodeAt(++t.position);a.push(t.input.slice(e,t.position))}0!==s&&x(t),R.call(st,n)?st[n](t,n,a):m(t,'unknown document directive "'+n+'"')}return A(t,!0,-1),0===t.lineIndent&&45===t.input.charCodeAt(t.position)&&45===t.input.charCodeAt(t.position+1)&&45===t.input.charCodeAt(t.position+2)?(t.position+=3,A(t,!0,-1)):u&&d(t,"directives end mark is expected"),T(t,t.lineIndent-1,Z,!1,!0),A(t,!0,-1),t.checkLineBreaks&&tt.test(t.input.slice(c,t.position))&&m(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&b(t)?void(46===t.input.charCodeAt(t.position)&&(t.position+=3,A(t,!0,-1))):void(t.positioni;i+=1)e(o[i])}function U(t,e){var n=L(t,e);if(0!==n.length){if(1===n.length)return n[0];throw new B("expected a single document in the stream, but found more")}}function q(t,e,n){D(t,e,P.extend({schema:K},n))}function Y(t,e){return U(t,P.extend({schema:K},e))}for(var P=t("./common"),B=t("./exception"),$=t("./mark"),K=t("./schema/default_safe"),H=t("./schema/default_full"),R=Object.prototype.hasOwnProperty,W=1,G=2,V=3,Z=4,z=1,J=2,Q=3,X=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,tt=/[\x85\u2028\u2029]/,et=/[,\[\]\{\}]/,nt=/^(?:!|!!|![a-z\-]+!)$/i,it=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i,rt=new Array(256),ot=new Array(256),at=0;256>at;at++)rt[at]=l(at)?1:0,ot[at]=l(at);var st={YAML:function(t,e,n){var i,r,o;null!==t.version&&d(t,"duplication of %YAML directive"),1!==n.length&&d(t,"YAML directive accepts exactly one argument"),i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),null===i&&d(t,"ill-formed argument of the YAML directive"),r=parseInt(i[1],10),o=parseInt(i[2],10),1!==r&&d(t,"unacceptable YAML version of the document"),t.version=n[0],t.checkLineBreaks=2>o,1!==o&&2!==o&&m(t,"unsupported YAML version of the document")},TAG:function(t,e,n){var i,r;2!==n.length&&d(t,"TAG directive accepts exactly two arguments"),i=n[0],r=n[1],nt.test(i)||d(t,"ill-formed tag handle (first argument) of the TAG directive"),R.call(t.tagMap,i)&&d(t,'there is a previously declared suffix for "'+i+'" tag handle'),it.test(r)||d(t,"ill-formed tag prefix (second argument) of the TAG directive"),t.tagMap[i]=r}};e.exports.loadAll=D,e.exports.load=U,e.exports.safeLoadAll=q,e.exports.safeLoad=Y},{"./common":2,"./exception":4,"./mark":6,"./schema/default_full":9,"./schema/default_safe":10}],6:[function(t,e,n){"use strict";function i(t,e,n,i,r){this.name=t,this.buffer=e,this.position=n,this.line=i,this.column=r}var r=t("./common");i.prototype.getSnippet=function(t,e){var n,i,o,a,s;if(!this.buffer)return null;for(t=t||4,e=e||75,n="",i=this.position;i>0&&-1==="\0\r\n…\u2028\u2029".indexOf(this.buffer.charAt(i-1));)if(i-=1,this.position-i>e/2-1){n=" ... ",i+=5;break}for(o="",a=this.position;ae/2-1){o=" ... ",a-=5;break}return s=this.buffer.slice(i,a),r.repeat(" ",t)+n+s+o+"\n"+r.repeat(" ",t+this.position-i+n.length)+"^"},i.prototype.toString=function(t){var e,n="";return this.name&&(n+='in "'+this.name+'" '),n+="at line "+(this.line+1)+", column "+(this.column+1),t||(e=this.getSnippet(),e&&(n+=":\n"+e)),n},e.exports=i},{"./common":2}],7:[function(t,e,n){"use strict";function i(t,e,n){var r=[];return t.include.forEach(function(t){n=i(t,e,n)}),t[e].forEach(function(t){n.forEach(function(e,n){e.tag===t.tag&&r.push(n)}),n.push(t)}),n.filter(function(t,e){return-1===r.indexOf(e)})}function r(){function t(t){i[t.tag]=t}var e,n,i={};for(e=0,n=arguments.length;n>e;e+=1)arguments[e].forEach(t);return i}function o(t){this.include=t.include||[],this.implicit=t.implicit||[],this.explicit=t.explicit||[],this.implicit.forEach(function(t){if(t.loadKind&&"scalar"!==t.loadKind)throw new s("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")}),this.compiledImplicit=i(this,"implicit",[]),this.compiledExplicit=i(this,"explicit",[]),this.compiledTypeMap=r(this.compiledImplicit,this.compiledExplicit)}var a=t("./common"),s=t("./exception"),c=t("./type");o.DEFAULT=null,o.create=function(){var t,e;switch(arguments.length){case 1:t=o.DEFAULT,e=arguments[0];break;case 2:t=arguments[0],e=arguments[1];break;default:throw new s("Wrong number of arguments for Schema.create function")}if(t=a.toArray(t),e=a.toArray(e),!t.every(function(t){return t instanceof o}))throw new s("Specified list of super schemas (or a single Schema object) contains a non-Schema object.");if(!e.every(function(t){return t instanceof c}))throw new s("Specified list of YAML types (or a single Type object) contains a non-Type object.");return new o({include:t,explicit:e})},e.exports=o},{"./common":2,"./exception":4,"./type":13}],8:[function(t,e,n){"use strict";var i=t("../schema");e.exports=new i({include:[t("./json")]})},{"../schema":7,"./json":12}],9:[function(t,e,n){"use strict";var i=t("../schema");e.exports=i.DEFAULT=new i({include:[t("./default_safe")],explicit:[t("../type/js/undefined"),t("../type/js/regexp"),t("../type/js/function")]})},{"../schema":7,"../type/js/function":18,"../type/js/regexp":19,"../type/js/undefined":20,"./default_safe":10}],10:[function(t,e,n){"use strict";var i=t("../schema");e.exports=new i({include:[t("./core")],implicit:[t("../type/timestamp"),t("../type/merge")],explicit:[t("../type/binary"),t("../type/omap"),t("../type/pairs"),t("../type/set")]})},{"../schema":7,"../type/binary":14,"../type/merge":22,"../type/omap":24,"../type/pairs":25,"../type/set":27,"../type/timestamp":29,"./core":8}],11:[function(t,e,n){"use strict";var i=t("../schema");e.exports=new i({explicit:[t("../type/str"),t("../type/seq"),t("../type/map")]})},{"../schema":7,"../type/map":21,"../type/seq":26,"../type/str":28}],12:[function(t,e,n){"use strict";var i=t("../schema");e.exports=new i({include:[t("./failsafe")],implicit:[t("../type/null"),t("../type/bool"),t("../type/int"),t("../type/float")]})},{"../schema":7,"../type/bool":15,"../type/float":16,"../type/int":17,"../type/null":23,"./failsafe":11}],13:[function(t,e,n){"use strict";function i(t){var e={};return null!==t&&Object.keys(t).forEach(function(n){t[n].forEach(function(t){e[String(t)]=n})}),e}function r(t,e){if(e=e||{},Object.keys(e).forEach(function(e){if(-1===a.indexOf(e))throw new o('Unknown option "'+e+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=i(e.styleAliases||null),-1===s.indexOf(this.kind))throw new o('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}var o=t("./exception"),a=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],s=["scalar","sequence","mapping"];e.exports=r},{"./exception":4}],14:[function(t,e,n){"use strict";function i(t){if(null===t)return!1;var e,n,i=0,r=t.length,o=u;for(n=0;r>n;n++)if(e=o.indexOf(t.charAt(n)),!(e>64)){if(0>e)return!1;i+=6}return i%8===0}function r(t){var e,n,i=t.replace(/[\r\n=]/g,""),r=i.length,o=u,a=0,c=[];for(e=0;r>e;e++)e%4===0&&e&&(c.push(a>>16&255),c.push(a>>8&255),c.push(255&a)),a=a<<6|o.indexOf(i.charAt(e));return n=r%4*6,0===n?(c.push(a>>16&255),c.push(a>>8&255),c.push(255&a)):18===n?(c.push(a>>10&255),c.push(a>>2&255)):12===n&&c.push(a>>4&255),s?new s(c):c}function o(t){var e,n,i="",r=0,o=t.length,a=u;for(e=0;o>e;e++)e%3===0&&e&&(i+=a[r>>18&63],i+=a[r>>12&63],i+=a[r>>6&63],i+=a[63&r]),r=(r<<8)+t[e];return n=o%3,0===n?(i+=a[r>>18&63],i+=a[r>>12&63],i+=a[r>>6&63],i+=a[63&r]):2===n?(i+=a[r>>10&63],i+=a[r>>4&63],i+=a[r<<2&63],i+=a[64]):1===n&&(i+=a[r>>2&63],i+=a[r<<4&63],i+=a[64],i+=a[64]),i}function a(t){return s&&s.isBuffer(t)}var s=t("buffer").Buffer,c=t("../type"),u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";e.exports=new c("tag:yaml.org,2002:binary",{kind:"scalar",resolve:i,construct:r, -predicate:a,represent:o})},{"../type":13,buffer:30}],15:[function(t,e,n){"use strict";function i(t){if(null===t)return!1;var e=t.length;return 4===e&&("true"===t||"True"===t||"TRUE"===t)||5===e&&("false"===t||"False"===t||"FALSE"===t)}function r(t){return"true"===t||"True"===t||"TRUE"===t}function o(t){return"[object Boolean]"===Object.prototype.toString.call(t)}var a=t("../type");e.exports=new a("tag:yaml.org,2002:bool",{kind:"scalar",resolve:i,construct:r,predicate:o,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})},{"../type":13}],16:[function(t,e,n){"use strict";function i(t){return null!==t&&!!u.test(t)}function r(t){var e,n,i,r;return e=t.replace(/_/g,"").toLowerCase(),n="-"===e[0]?-1:1,r=[],0<="+-".indexOf(e[0])&&(e=e.slice(1)),".inf"===e?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===e?NaN:0<=e.indexOf(":")?(e.split(":").forEach(function(t){r.unshift(parseFloat(t,10))}),e=0,i=1,r.forEach(function(t){e+=t*i,i*=60}),n*e):n*parseFloat(e,10)}function o(t,e){var n;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(s.isNegativeZero(t))return"-0.0";return n=t.toString(10),l.test(n)?n.replace("e",".e"):n}function a(t){return"[object Number]"===Object.prototype.toString.call(t)&&(0!==t%1||s.isNegativeZero(t))}var s=t("../common"),c=t("../type"),u=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?|\\.[0-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),l=/^[-+]?[0-9]+e/;e.exports=new c("tag:yaml.org,2002:float",{kind:"scalar",resolve:i,construct:r,predicate:a,represent:o,defaultStyle:"lowercase"})},{"../common":2,"../type":13}],17:[function(t,e,n){"use strict";function i(t){return t>=48&&57>=t||t>=65&&70>=t||t>=97&&102>=t}function r(t){return t>=48&&55>=t}function o(t){return t>=48&&57>=t}function a(t){if(null===t)return!1;var e,n=t.length,a=0,s=!1;if(!n)return!1;if(e=t[a],("-"===e||"+"===e)&&(e=t[++a]),"0"===e){if(a+1===n)return!0;if(e=t[++a],"b"===e){for(a++;n>a;a++)if(e=t[a],"_"!==e){if("0"!==e&&"1"!==e)return!1;s=!0}return s}if("x"===e){for(a++;n>a;a++)if(e=t[a],"_"!==e){if(!i(t.charCodeAt(a)))return!1;s=!0}return s}for(;n>a;a++)if(e=t[a],"_"!==e){if(!r(t.charCodeAt(a)))return!1;s=!0}return s}for(;n>a;a++)if(e=t[a],"_"!==e){if(":"===e)break;if(!o(t.charCodeAt(a)))return!1;s=!0}return!!s&&(":"!==e||/^(:[0-5]?[0-9])+$/.test(t.slice(a)))}function s(t){var e,n,i=t,r=1,o=[];return-1!==i.indexOf("_")&&(i=i.replace(/_/g,"")),e=i[0],("-"===e||"+"===e)&&("-"===e&&(r=-1),i=i.slice(1),e=i[0]),"0"===i?0:"0"===e?"b"===i[1]?r*parseInt(i.slice(2),2):"x"===i[1]?r*parseInt(i,16):r*parseInt(i,8):-1!==i.indexOf(":")?(i.split(":").forEach(function(t){o.unshift(parseInt(t,10))}),i=0,n=1,o.forEach(function(t){i+=t*n,n*=60}),r*i):r*parseInt(i,10)}function c(t){return"[object Number]"===Object.prototype.toString.call(t)&&0===t%1&&!u.isNegativeZero(t)}var u=t("../common"),l=t("../type");e.exports=new l("tag:yaml.org,2002:int",{kind:"scalar",resolve:a,construct:s,predicate:c,represent:{binary:function(t){return"0b"+t.toString(2)},octal:function(t){return"0"+t.toString(8)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return"0x"+t.toString(16).toUpperCase()}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},{"../common":2,"../type":13}],18:[function(t,e,n){"use strict";function i(t){if(null===t)return!1;try{var e="("+t+")",n=s.parse(e,{range:!0});return"Program"===n.type&&1===n.body.length&&"ExpressionStatement"===n.body[0].type&&"FunctionExpression"===n.body[0].expression.type}catch(i){return!1}}function r(t){var e,n="("+t+")",i=s.parse(n,{range:!0}),r=[];if("Program"!==i.type||1!==i.body.length||"ExpressionStatement"!==i.body[0].type||"FunctionExpression"!==i.body[0].expression.type)throw new Error("Failed to resolve function");return i.body[0].expression.params.forEach(function(t){r.push(t.name)}),e=i.body[0].expression.body.range,new Function(r,n.slice(e[0]+1,e[1]-1))}function o(t){return t.toString()}function a(t){return"[object Function]"===Object.prototype.toString.call(t)}var s;try{s=t("esprima")}catch(c){"undefined"!=typeof window&&(s=window.esprima)}var u=t("../../type");e.exports=new u("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:i,construct:r,predicate:a,represent:o})},{"../../type":13,esprima:"esprima"}],19:[function(t,e,n){"use strict";function i(t){if(null===t)return!1;if(0===t.length)return!1;var e=t,n=/\/([gim]*)$/.exec(t),i="";if("/"===e[0]){if(n&&(i=n[1]),i.length>3)return!1;if("/"!==e[e.length-i.length-1])return!1;e=e.slice(1,e.length-i.length-1)}try{return!0}catch(r){return!1}}function r(t){var e=t,n=/\/([gim]*)$/.exec(t),i="";return"/"===e[0]&&(n&&(i=n[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function o(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function a(t){return"[object RegExp]"===Object.prototype.toString.call(t)}var s=t("../../type");e.exports=new s("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:i,construct:r,predicate:a,represent:o})},{"../../type":13}],20:[function(t,e,n){"use strict";function i(){return!0}function r(){}function o(){return""}function a(t){return"undefined"==typeof t}var s=t("../../type");e.exports=new s("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:i,construct:r,predicate:a,represent:o})},{"../../type":13}],21:[function(t,e,n){"use strict";var i=t("../type");e.exports=new i("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return null!==t?t:{}}})},{"../type":13}],22:[function(t,e,n){"use strict";function i(t){return"<<"===t||null===t}var r=t("../type");e.exports=new r("tag:yaml.org,2002:merge",{kind:"scalar",resolve:i})},{"../type":13}],23:[function(t,e,n){"use strict";function i(t){if(null===t)return!0;var e=t.length;return 1===e&&"~"===t||4===e&&("null"===t||"Null"===t||"NULL"===t)}function r(){return null}function o(t){return null===t}var a=t("../type");e.exports=new a("tag:yaml.org,2002:null",{kind:"scalar",resolve:i,construct:r,predicate:o,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})},{"../type":13}],24:[function(t,e,n){"use strict";function i(t){if(null===t)return!0;var e,n,i,r,o,c=[],u=t;for(e=0,n=u.length;n>e;e+=1){if(i=u[e],o=!1,"[object Object]"!==s.call(i))return!1;for(r in i)if(a.call(i,r)){if(o)return!1;o=!0}if(!o)return!1;if(-1!==c.indexOf(r))return!1;c.push(r)}return!0}function r(t){return null!==t?t:[]}var o=t("../type"),a=Object.prototype.hasOwnProperty,s=Object.prototype.toString;e.exports=new o("tag:yaml.org,2002:omap",{kind:"sequence",resolve:i,construct:r})},{"../type":13}],25:[function(t,e,n){"use strict";function i(t){if(null===t)return!0;var e,n,i,r,o,s=t;for(o=new Array(s.length),e=0,n=s.length;n>e;e+=1){if(i=s[e],"[object Object]"!==a.call(i))return!1;if(r=Object.keys(i),1!==r.length)return!1;o[e]=[r[0],i[r[0]]]}return!0}function r(t){if(null===t)return[];var e,n,i,r,o,a=t;for(o=new Array(a.length),e=0,n=a.length;n>e;e+=1)i=a[e],r=Object.keys(i),o[e]=[r[0],i[r[0]]];return o}var o=t("../type"),a=Object.prototype.toString;e.exports=new o("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:i,construct:r})},{"../type":13}],26:[function(t,e,n){"use strict";var i=t("../type");e.exports=new i("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return null!==t?t:[]}})},{"../type":13}],27:[function(t,e,n){"use strict";function i(t){if(null===t)return!0;var e,n=t;for(e in n)if(a.call(n,e)&&null!==n[e])return!1;return!0}function r(t){return null!==t?t:{}}var o=t("../type"),a=Object.prototype.hasOwnProperty;e.exports=new o("tag:yaml.org,2002:set",{kind:"mapping",resolve:i,construct:r})},{"../type":13}],28:[function(t,e,n){"use strict";var i=t("../type");e.exports=new i("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return null!==t?t:""}})},{"../type":13}],29:[function(t,e,n){"use strict";function i(t){return null!==t&&null!==s.exec(t)}function r(t){var e,n,i,r,o,a,c,u,l,p,f=0,h=null;if(e=s.exec(t),null===e)throw new Error("Date resolve error");if(n=+e[1],i=+e[2]-1,r=+e[3],!e[4])return new Date(Date.UTC(n,i,r));if(o=+e[4],a=+e[5],c=+e[6],e[7]){for(f=e[7].slice(0,3);f.length<3;)f+="0";f=+f}return e[9]&&(u=+e[10],l=+(e[11]||0),h=6e4*(60*u+l),"-"===e[9]&&(h=-h)),p=new Date(Date.UTC(n,i,r,o,a,c,f)),h&&p.setTime(p.getTime()-h),p}function o(t){return t.toISOString()}var a=t("../type"),s=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?)?$");e.exports=new a("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:i,construct:r,instanceOf:Date,represent:o})},{"../type":13}],30:[function(t,e,n){},{}],31:[function(t,e,n){e.exports=t("./lib/inherit")},{"./lib/inherit":32}],32:[function(e,n,i){!function(e){function r(t){var e=f(t);if(v)for(var n,i=0;n=b[i++];)t.hasOwnProperty(n)&&e.push(n);return e}function o(t,e,n){for(var i,o,a=r(n),s=0,u=a.length;u>s;)"__self"!==(i=a[s++])&&(o=n[i],y(o)&&(!c||o.toString().indexOf(".__base")>-1)?e[i]=function(n,i){var r=t[n]?t[n]:"__constructor"===n?e.__self.__parent:g;return function(){var t=this.__base;this.__base=r;var e=i.apply(this,arguments);return this.__base=t,e}}(i,o):e[i]=o)}function a(t,e){for(var n,i=1;n=t[i++];)e?y(n)?s.self(e,n.prototype,n):s.self(e,n):e=y(n)?s(t[0],n.prototype,n):s(t[0],n);return e||t[0]}function s(){var t=arguments,e=m(t[0]),n=e||y(t[0]),i=n?e?a(t[0]):t[0]:u,r=t[n?1:0]||{},s=t[n?2:1],c=r.__constructor||n&&i.prototype.__constructor?function(){return this.__constructor.apply(this,arguments)}:n?function(){return i.apply(this,arguments)}:function(){};if(!n)return c.prototype=r,c.prototype.__self=c.prototype.constructor=c,h(c,s);h(c,i),c.__parent=i;var l=i.prototype,f=c.prototype=p(l);return f.__self=f.constructor=c,r&&o(l,f,r),s&&o(i,c,s),c}var c=function(){}.toString().indexOf("_")>-1,u=function(){},l=Object.prototype.hasOwnProperty,p=Object.create||function(t){var e=function(){};return e.prototype=t,new e},f=Object.keys||function(t){var e=[];for(var n in t)l.call(t,n)&&e.push(n);return e},h=function(t,e){for(var n in e)l.call(e,n)&&(t[n]=e[n]);return t},d=Object.prototype.toString,m=Array.isArray||function(t){return"[object Array]"===d.call(t)},y=function(t){return"[object Function]"===d.call(t)},g=function(){},v=!0,x={toString:""};for(var A in x)x.hasOwnProperty(A)&&(v=!1);var b=v?["toString","valueOf"]:null;s.self=function(){var t=arguments,e=m(t[0]),n=e?a(t[0],t[0][0]):t[0],i=t[1],r=t[2],s=n.prototype;return i&&o(s,s,i),r&&o(n,n,r),n};var w=!0;"object"==typeof i&&(n.exports=s,w=!1),"object"==typeof modules&&(modules.define("inherit",function(t){t(s)}),w=!1),"function"==typeof t&&(t(function(t,e,n){n.exports=s}),w=!1),w&&(e.inherit=s)}(this)},{}],"/":[function(t,e,n){"use strict";var i=t("./lib/js-yaml.js");e.exports=i},{"./lib/js-yaml.js":1}]},{},[])("/")}); \ No newline at end of file diff --git a/spring-boot-swagger/src/main/resources/static/swagger/lib/jsoneditor.min.js b/spring-boot-swagger/src/main/resources/static/swagger/lib/jsoneditor.min.js deleted file mode 100644 index 21db1ab..0000000 --- a/spring-boot-swagger/src/main/resources/static/swagger/lib/jsoneditor.min.js +++ /dev/null @@ -1,5 +0,0 @@ -!function(){var t;!function(){var e=!1,i=/xyz/.test(function(){window.postMessage("xyz")})?/\b_super\b/:/.*/;return t=function(){},t.extend=function(t){function s(){!e&&this.init&&this.init.apply(this,arguments)}var r=this.prototype;e=!0;var n=new this;e=!1;for(var o in t)n[o]="function"==typeof t[o]&&"function"==typeof r[o]&&i.test(t[o])?function(t,e){return function(){var i=this._super;this._super=r[t];var s=e.apply(this,arguments);return this._super=i,s}}(o,t[o]):t[o];return s.prototype=n,s.prototype.constructor=s,s.extend=arguments.callee,s},t}(),function(){function t(t,e){e=e||{bubbles:!1,cancelable:!1,detail:void 0};var i=document.createEvent("CustomEvent");return i.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),i}t.prototype=window.Event.prototype,window.CustomEvent=t}(),function(){for(var t=0,e=["ms","moz","webkit","o"],i=0;i0&&t.length-1 in t){for(i=0;i=o&&!a&&(a=!0,e())})}},s.send()}}),o||e()},expandRefs:function(t){for(t=i({},t);t.$ref;){var e=t.$ref;delete t.$ref,this.refs[e]||(e=decodeURIComponent(e)),t=this.extendSchemas(t,this.refs[e])}return t},expandSchema:function(t){var e,r=this,n=i({},t);if("object"==typeof t.type&&(Array.isArray(t.type)?s(t.type,function(e,i){"object"==typeof i&&(t.type[e]=r.expandSchema(i))}):t.type=r.expandSchema(t.type)),"object"==typeof t.disallow&&(Array.isArray(t.disallow)?s(t.disallow,function(e,i){"object"==typeof i&&(t.disallow[e]=r.expandSchema(i))}):t.disallow=r.expandSchema(t.disallow)),t.anyOf&&s(t.anyOf,function(e,i){t.anyOf[e]=r.expandSchema(i)}),t.dependencies&&s(t.dependencies,function(e,i){"object"!=typeof i||Array.isArray(i)||(t.dependencies[e]=r.expandSchema(i))}),t.not&&(t.not=this.expandSchema(t.not)),t.allOf){for(e=0;e=t.maximum?d.push({path:r,property:"maximum",message:this.translate("error_maximum_excl",[t.maximum])}):!t.exclusiveMaximum&&e>t.maximum&&d.push({path:r,property:"maximum",message:this.translate("error_maximum_incl",[t.maximum])})),t.hasOwnProperty("minimum")&&(t.exclusiveMinimum&&e<=t.minimum?d.push({path:r,property:"minimum",message:this.translate("error_minimum_excl",[t.minimum])}):!t.exclusiveMinimum&&et.maxLength&&d.push({path:r,property:"maxLength",message:this.translate("error_maxLength",[t.maxLength])}),t.minLength&&(e+"").lengtht.maxItems&&d.push({path:r,property:"maxItems",message:this.translate("error_maxItems",[t.maxItems])}),t.minItems&&e.lengtht.maxProperties&&d.push({path:r,property:"maxProperties",message:this.translate("error_maxProperties",[t.maxProperties])})}if(t.minProperties){o=0;for(a in e)e.hasOwnProperty(a)&&o++;o=0){e=this.theme.getBlockLinkHolder(),i=this.theme.getBlockLink(),i.setAttribute("target","_blank");var a=document.createElement(r);a.setAttribute("controls","controls"),this.theme.createMediaLink(e,i,a),this.link_watchers.push(function(e){var s=n(e);i.setAttribute("href",s),i.textContent=t.rel||s,a.setAttribute("src",s)})}else e=this.theme.getBlockLink(),e.setAttribute("target","_blank"),e.textContent=t.rel,this.link_watchers.push(function(i){var s=n(i);e.setAttribute("href",s),e.textContent=t.rel||s});return e},refreshWatchedFieldValues:function(){if(this.watched_values){var t={},e=!1,i=this;if(this.watched){var s,r;for(var n in this.watched)this.watched.hasOwnProperty(n)&&(r=i.jsoneditor.getEditor(this.watched[n]),s=r?r.getValue():null,i.watched_values[n]!==s&&(e=!0),t[n]=s)}return t.self=this.getValue(),this.watched_values.self!==t.self&&(e=!0),this.watched_values=t,e}},getWatchedFieldValues:function(){return this.watched_values},updateHeaderText:function(){if(this.header)if(this.header.children.length){for(var t=0;t-1:!!this.jsoneditor.options.required_by_default},getDisplayText:function(t){var e=[],i={};s(t,function(t,e){e.title&&(i[e.title]=i[e.title]||0,i[e.title]++),e.description&&(i[e.description]=i[e.description]||0,i[e.description]++),e.format&&(i[e.format]=i[e.format]||0,i[e.format]++),e.type&&(i[e.type]=i[e.type]||0,i[e.type]++)}),s(t,function(t,s){var r;r="string"==typeof s?s:s.title&&i[s.title]<=1?s.title:s.format&&i[s.format]<=1?s.format:s.type&&i[s.type]<=1?s.type:s.description&&i[s.description]<=1?s.descripton:s.title?s.title:s.format?s.format:s.type?s.type:s.description?s.description:JSON.stringify(s).length<50?JSON.stringify(s):"type",e.push(r)});var r={};return s(e,function(t,s){r[s]=r[s]||0,r[s]++,i[s]>1&&(e[t]=s+" "+r[s])}),e},getOption:function(t){try{throw"getOption is deprecated"}catch(e){window.console.error(e)}return this.options[t]},showValidationErrors:function(t){}}),n.defaults.editors["null"]=n.AbstractEditor.extend({getValue:function(){return null},setValue:function(){this.onChange()},getNumColumns:function(){return 2}}),n.defaults.editors.string=n.AbstractEditor.extend({register:function(){this._super(),this.input&&this.input.setAttribute("name",this.formname)},unregister:function(){this._super(),this.input&&this.input.removeAttribute("name")},setValue:function(t,e,i){if((!this.template||i)&&(null===t||"undefined"==typeof t?t="":"object"==typeof t?t=JSON.stringify(t):"string"!=typeof t&&(t=""+t),t!==this.serialized)){var s=this.sanitize(t);if(this.input.value!==s){this.input.value=s,this.sceditor_instance?this.sceditor_instance.val(s):this.epiceditor?this.epiceditor.importFile(null,s):this.ace_editor&&this.ace_editor.setValue(s);var r=i||this.getValue()!==t;this.refreshValue(),e?this.is_dirty=!1:"change"===this.jsoneditor.options.show_errors&&(this.is_dirty=!0),this.adjust_height&&this.adjust_height(this.input),this.onChange(r)}}},getNumColumns:function(){var t,e=Math.ceil(Math.max(this.getTitle().length,this.schema.maxLength||0,this.schema.minLength||0)/5);return t="textarea"===this.input_type?6:["text","email"].indexOf(this.input_type)>=0?4:2,Math.min(12,Math.max(e,t))},build:function(){var t=this;if(this.options.compact||(this.header=this.label=this.theme.getFormInputLabel(this.getTitle(),this.isRequired())),this.schema.description&&(this.description=this.theme.getFormInputDescription(this.schema.description)),this.format=this.schema.format,!this.format&&this.schema.media&&this.schema.media.type&&(this.format=this.schema.media.type.replace(/(^(application|text)\/(x-)?(script\.)?)|(-source$)/g,"")),!this.format&&this.options.default_format&&(this.format=this.options.default_format),this.options.format&&(this.format=this.options.format),this.format)if("textarea"===this.format)this.input_type="textarea",this.input=this.theme.getTextareaInput();else if("range"===this.format){this.input_type="range";var e=this.schema.minimum||0,i=this.schema.maximum||Math.max(100,e+1),s=1;this.schema.multipleOf&&(e%this.schema.multipleOf&&(e=Math.ceil(e/this.schema.multipleOf)*this.schema.multipleOf),i%this.schema.multipleOf&&(i=Math.floor(i/this.schema.multipleOf)*this.schema.multipleOf),s=this.schema.multipleOf),this.input=this.theme.getRangeInput(e,i,s)}else["actionscript","batchfile","bbcode","c","c++","cpp","coffee","csharp","css","dart","django","ejs","erlang","golang","handlebars","haskell","haxe","html","ini","jade","java","javascript","json","less","lisp","lua","makefile","markdown","matlab","mysql","objectivec","pascal","perl","pgsql","php","python","r","ruby","sass","scala","scss","smarty","sql","stylus","svg","twig","vbscript","xml","yaml"].indexOf(this.format)>=0?(this.input_type=this.format,this.source_code=!0,this.input=this.theme.getTextareaInput()):(this.input_type=this.format,this.input=this.theme.getFormInputField(this.input_type));else this.input_type="text",this.input=this.theme.getFormInputField(this.input_type);"undefined"!=typeof this.schema.maxLength&&this.input.setAttribute("maxlength",this.schema.maxLength),"undefined"!=typeof this.schema.pattern?this.input.setAttribute("pattern",this.schema.pattern):"undefined"!=typeof this.schema.minLength&&this.input.setAttribute("pattern",".{"+this.schema.minLength+",}"),this.options.compact?this.container.className+=" compact":this.options.input_width&&(this.input.style.width=this.options.input_width),(this.schema.readOnly||this.schema.readonly||this.schema.template)&&(this.always_disabled=!0,this.input.disabled=!0),this.input.addEventListener("change",function(e){if(e.preventDefault(),e.stopPropagation(),t.schema.template)return void(this.value=t.value);var i=this.value,s=t.sanitize(i);i!==s&&(this.value=s),t.is_dirty=!0,t.refreshValue(),t.onChange(!0)}),this.options.input_height&&(this.input.style.height=this.options.input_height),this.options.expand_height&&(this.adjust_height=function(t){if(t){var e,i=t.offsetHeight;if(t.offsetHeight100);)e++,i++,t.style.height=i+"px";else{for(e=0;t.offsetHeight>=t.scrollHeight+3&&!(e>100);)e++,i--,t.style.height=i+"px";t.style.height=i+1+"px"}}},this.input.addEventListener("keyup",function(e){t.adjust_height(this)}),this.input.addEventListener("change",function(e){t.adjust_height(this)}),this.adjust_height()),this.format&&this.input.setAttribute("data-schemaformat",this.format),this.control=this.theme.getFormControl(this.label,this.input,this.description),this.container.appendChild(this.control),window.requestAnimationFrame(function(){t.input.parentNode&&t.afterInputReady(),t.adjust_height&&t.adjust_height(t.input)}),this.schema.template?(this.template=this.jsoneditor.compileTemplate(this.schema.template,this.template_engine),this.refreshValue()):this.refreshValue()},enable:function(){this.always_disabled||(this.input.disabled=!1),this._super()},disable:function(){this.input.disabled=!0,this._super()},afterInputReady:function(){var t,e=this;if(this.source_code)if(this.options.wysiwyg&&["html","bbcode"].indexOf(this.input_type)>=0&&window.jQuery&&window.jQuery.fn&&window.jQuery.fn.sceditor)t=i({},{plugins:"html"===e.input_type?"xhtml":"bbcode",emoticonsEnabled:!1,width:"100%",height:300},n.plugins.sceditor,e.options.sceditor_options||{}),window.jQuery(e.input).sceditor(t),e.sceditor_instance=window.jQuery(e.input).sceditor("instance"),e.sceditor_instance.blur(function(){var t=window.jQuery("
"+e.sceditor_instance.val()+"
");window.jQuery("#sceditor-start-marker,#sceditor-end-marker,.sceditor-nlf",t).remove(),e.input.value=t.html(),e.value=e.input.value,e.is_dirty=!0,e.onChange(!0)});else if("markdown"===this.input_type&&window.EpicEditor)this.epiceditor_container=document.createElement("div"),this.input.parentNode.insertBefore(this.epiceditor_container,this.input),this.input.style.display="none",t=i({},n.plugins.epiceditor,{container:this.epiceditor_container,clientSideStorage:!1}),this.epiceditor=new window.EpicEditor(t).load(),this.epiceditor.importFile(null,this.getValue()),this.epiceditor.on("update",function(){var t=e.epiceditor.exportFile();e.input.value=t,e.value=t,e.is_dirty=!0,e.onChange(!0)});else if(window.ace){ -var s=this.input_type;("cpp"===s||"c++"===s||"c"===s)&&(s="c_cpp"),this.ace_container=document.createElement("div"),this.ace_container.style.width="100%",this.ace_container.style.position="relative",this.ace_container.style.height="400px",this.input.parentNode.insertBefore(this.ace_container,this.input),this.input.style.display="none",this.ace_editor=window.ace.edit(this.ace_container),this.ace_editor.setValue(this.getValue()),n.plugins.ace.theme&&this.ace_editor.setTheme("ace/theme/"+n.plugins.ace.theme),s=window.ace.require("ace/mode/"+s),s&&this.ace_editor.getSession().setMode(new s.Mode),this.ace_editor.on("change",function(){var t=e.ace_editor.getValue();e.input.value=t,e.refreshValue(),e.is_dirty=!0,e.onChange(!0)})}e.theme.afterInputReady(e.input)},refreshValue:function(){this.value=this.input.value,"string"!=typeof this.value&&(this.value=""),this.serialized=this.value},destroy:function(){this.sceditor_instance?this.sceditor_instance.destroy():this.epiceditor?this.epiceditor.unload():this.ace_editor&&this.ace_editor.destroy(),this.template=null,this.input&&this.input.parentNode&&this.input.parentNode.removeChild(this.input),this.label&&this.label.parentNode&&this.label.parentNode.removeChild(this.label),this.description&&this.description.parentNode&&this.description.parentNode.removeChild(this.description),this._super()},sanitize:function(t){return t},onWatchedFieldChange:function(){var t;this.template&&(t=this.getWatchedFieldValues(),this.setValue(this.template(t),!1,!0)),this._super()},showValidationErrors:function(t){var e=this;if("always"===this.jsoneditor.options.show_errors);else if(!this.is_dirty&&this.previous_error_setting===this.jsoneditor.options.show_errors)return;this.previous_error_setting=this.jsoneditor.options.show_errors;var i=[];s(t,function(t,s){s.path===e.path&&i.push(s.message)}),i.length?this.theme.addInputError(this.input,i.join(". ")+"."):this.theme.removeInputError(this.input)}}),n.defaults.editors.number=n.defaults.editors.string.extend({sanitize:function(t){return(t+"").replace(/[^0-9\.\-eE]/g,"")},getNumColumns:function(){return 2},getValue:function(){return 1*this.value}}),n.defaults.editors.integer=n.defaults.editors.number.extend({sanitize:function(t){return t+="",t.replace(/[^0-9\-]/g,"")},getNumColumns:function(){return 2}}),n.defaults.editors.object=n.AbstractEditor.extend({getDefault:function(){return i({},this.schema["default"]||{})},getChildEditors:function(){return this.editors},register:function(){if(this._super(),this.editors)for(var t in this.editors)this.editors.hasOwnProperty(t)&&this.editors[t].register()},unregister:function(){if(this._super(),this.editors)for(var t in this.editors)this.editors.hasOwnProperty(t)&&this.editors[t].unregister()},getNumColumns:function(){return Math.max(Math.min(12,this.maxwidth),3)},enable:function(){if(this.editjson_button&&(this.editjson_button.disabled=!1),this.addproperty_button&&(this.addproperty_button.disabled=!1),this._super(),this.editors)for(var t in this.editors)this.editors.hasOwnProperty(t)&&this.editors[t].enable()},disable:function(){if(this.editjson_button&&(this.editjson_button.disabled=!0),this.addproperty_button&&(this.addproperty_button.disabled=!0),this.hideEditJSON(),this._super(),this.editors)for(var t in this.editors)this.editors.hasOwnProperty(t)&&this.editors[t].disable()},layoutEditors:function(){var t,e,i=this;if(this.row_container){this.property_order=Object.keys(this.editors),this.property_order=this.property_order.sort(function(t,e){var s=i.editors[t].schema.propertyOrder,r=i.editors[e].schema.propertyOrder;return"number"!=typeof s&&(s=1e3),"number"!=typeof r&&(r=1e3),s-r});var r;if("grid"===this.format){var n=[];for(s(this.property_order,function(t,e){var s=i.editors[e];if(!s.property_removed){for(var r=!1,o=s.options.hidden?0:s.options.grid_columns||s.getNumColumns(),a=s.options.hidden?0:s.container.offsetHeight,h=0;ha)&&(r=h);r===!1&&(n.push({width:0,minh:999999,maxh:0,editors:[]}),r=n.length-1),n[r].editors.push({key:e,width:o,height:a}),n[r].width+=o,n[r].minh=Math.min(n[r].minh,a),n[r].maxh=Math.max(n[r].maxh,a)}}),t=0;tn[t].editors[o].width&&(o=e),n[t].editors[e].width*=12/n[t].width,n[t].editors[e].width=Math.floor(n[t].editors[e].width),a+=n[t].editors[e].width;12>a&&(n[t].editors[o].width+=12-a),n[t].width=12}if(this.layout===JSON.stringify(n))return!1;for(this.layout=JSON.stringify(n),r=document.createElement("div"),t=0;t=this.schema.maxProperties),this.addproperty_checkboxes&&(this.addproperty_list.innerHTML=""),this.addproperty_checkboxes={};for(t in this.cached_editors)this.cached_editors.hasOwnProperty(t)&&(this.addPropertyCheckbox(t),this.isRequired(this.cached_editors[t])&&t in this.editors&&(this.addproperty_checkboxes[t].disabled=!0),"undefined"!=typeof this.schema.minProperties&&s<=this.schema.minProperties?(this.addproperty_checkboxes[t].disabled=this.addproperty_checkboxes[t].checked,this.addproperty_checkboxes[t].checked||(r=!0)):t in this.editors?(r=!0,i=!0):e||this.schema.properties.hasOwnProperty(t)?(this.addproperty_checkboxes[t].disabled=!1,r=!0):this.addproperty_checkboxes[t].disabled=!0);this.canHaveAdditionalProperties()&&(r=!0);for(t in this.schema.properties)this.schema.properties.hasOwnProperty(t)&&(this.cached_editors[t]||(r=!0,this.addPropertyCheckbox(t)));r?this.canHaveAdditionalProperties()?e?this.addproperty_add.disabled=!1:this.addproperty_add.disabled=!0:(this.addproperty_add.style.display="none",this.addproperty_input.style.display="none"):(this.hideAddProperty(),this.addproperty_controls.style.display="none")},isRequired:function(t){return"boolean"==typeof t.schema.required?t.schema.required:Array.isArray(this.schema.required)?this.schema.required.indexOf(t.key)>-1:!!this.jsoneditor.options.required_by_default},setValue:function(t,e){var i=this;t=t||{},("object"!=typeof t||Array.isArray(t))&&(t={}),s(this.cached_editors,function(s,r){"undefined"!=typeof t[s]?(i.addObjectProperty(s),r.setValue(t[s],e)):e||i.isRequired(r)?r.setValue(r.getDefault(),e):i.removeObjectProperty(s)}),s(t,function(t,s){i.cached_editors[t]||(i.addObjectProperty(t),i.editors[t]&&i.editors[t].setValue(s,e))}),this.refreshValue(),this.layoutEditors(),this.onChange()},showValidationErrors:function(t){var e=this,i=[],r=[];s(t,function(t,s){s.path===e.path?i.push(s):r.push(s)}),this.error_holder&&(i.length?(this.error_holder.innerHTML="",this.error_holder.style.display="",s(i,function(t,i){e.error_holder.appendChild(e.theme.getErrorMessage(i.message))})):this.error_holder.style.display="none"),this.options.table_row&&(i.length?this.theme.addTableRowError(this.container):this.theme.removeTableRowError(this.container)),s(this.editors,function(t,e){e.showValidationErrors(r)})}}),n.defaults.editors.array=n.AbstractEditor.extend({getDefault:function(){return this.schema["default"]||[]},register:function(){if(this._super(),this.rows)for(var t=0;t=this.schema.items.length?this.schema.additionalItems===!0?{}:this.schema.additionalItems?i({},this.schema.additionalItems):void 0:i({},this.schema.items[t]):this.schema.items?i({},this.schema.items):{}},getItemInfo:function(t){var e=this.getItemSchema(t);this.item_info=this.item_info||{};var i=JSON.stringify(e);return"undefined"!=typeof this.item_info[i]?this.item_info[i]:(e=this.jsoneditor.expandRefs(e),this.item_info[i]={title:e.title||"item","default":e["default"],width:12,child_editors:e.properties||e.items},this.item_info[i])},getElementEditor:function(t){var e=this.getItemInfo(t),i=this.getItemSchema(t);i=this.jsoneditor.expandRefs(i),i.title=e.title+" "+(t+1);var s,r=this.jsoneditor.getEditorClass(i);s=this.tabs_holder?this.theme.getTabContent():e.child_editors?this.theme.getChildEditorHolder():this.theme.getIndentedPanel(),this.row_holder.appendChild(s);var n=this.jsoneditor.createEditor(r,{jsoneditor:this.jsoneditor,schema:i,container:s,path:this.path+"."+t,parent:this,required:!0});return n.preBuild(),n.build(),n.postBuild(),n.title_controls||(n.array_controls=this.theme.getButtonHolder(),s.appendChild(n.array_controls)),n},destroy:function(){this.empty(!0),this.title&&this.title.parentNode&&this.title.parentNode.removeChild(this.title),this.description&&this.description.parentNode&&this.description.parentNode.removeChild(this.description),this.row_holder&&this.row_holder.parentNode&&this.row_holder.parentNode.removeChild(this.row_holder),this.controls&&this.controls.parentNode&&this.controls.parentNode.removeChild(this.controls),this.panel&&this.panel.parentNode&&this.panel.parentNode.removeChild(this.panel),this.rows=this.row_cache=this.title=this.description=this.row_holder=this.panel=this.controls=null,this._super()},empty:function(t){if(this.rows){var e=this;s(this.rows,function(i,s){t&&(s.tab&&s.tab.parentNode&&s.tab.parentNode.removeChild(s.tab),e.destroyRow(s,!0),e.row_cache[i]=null),e.rows[i]=null}),e.rows=[],t&&(e.row_cache=[])}},destroyRow:function(t,e){var i=t.container;e?(t.destroy(),i.parentNode&&i.parentNode.removeChild(i),t.tab&&t.tab.parentNode&&t.tab.parentNode.removeChild(t.tab)):(t.tab&&(t.tab.style.display="none"),i.style.display="none",t.unregister())},getMax:function(){return Array.isArray(this.schema.items)&&this.schema.additionalItems===!1?Math.min(this.schema.items.length,this.schema.maxItems||1/0):this.schema.maxItems||1/0},refreshTabs:function(t){var e=this;s(this.rows,function(i,s){s.tab&&(t?s.tab_text.textContent=s.getHeaderText():s.tab===e.active_tab?(e.theme.markTabActive(s.tab),s.container.style.display=""):(e.theme.markTabInactive(s.tab),s.container.style.display="none"))})},setValue:function(t,e){t=t||[],Array.isArray(t)||(t=[t]);var i=JSON.stringify(t);if(i!==this.serialized){if(this.schema.minItems)for(;t.lengththis.getMax()&&(t=t.slice(0,this.getMax()));var r=this;s(t,function(t,i){r.rows[t]?r.rows[t].setValue(i,e):r.row_cache[t]?(r.rows[t]=r.row_cache[t],r.rows[t].setValue(i,e),r.rows[t].container.style.display="",r.rows[t].tab&&(r.rows[t].tab.style.display=""),r.rows[t].register()):r.addRow(i,e)});for(var n=t.length;n=this.rows.length;s(this.rows,function(t,i){i.movedown_button&&(t===e.rows.length-1?i.movedown_button.style.display="none":i.movedown_button.style.display=""),i.delete_button&&(r?i.delete_button.style.display="none":i.delete_button.style.display=""),e.value[t]=i.getValue()});var n=!1;this.value.length?1===this.value.length?(this.remove_all_rows_button.style.display="none",r||this.hide_delete_buttons?this.delete_last_row_button.style.display="none":(this.delete_last_row_button.style.display="",n=!0)):r||this.hide_delete_buttons?(this.delete_last_row_button.style.display="none",this.remove_all_rows_button.style.display="none"):(this.delete_last_row_button.style.display="",this.remove_all_rows_button.style.display="",n=!0):(this.delete_last_row_button.style.display="none",this.remove_all_rows_button.style.display="none"),this.getMax()&&this.getMax()<=this.rows.length||this.hide_add_button?this.add_row_button.style.display="none":(this.add_row_button.style.display="",n=!0),!this.collapsed&&n?this.controls.style.display="inline-block":this.controls.style.display="none"}},addRow:function(t,e){var i=this,r=this.rows.length;i.rows[r]=this.getElementEditor(r),i.row_cache[r]=i.rows[r],i.tabs_holder&&(i.rows[r].tab_text=document.createElement("span"),i.rows[r].tab_text.textContent=i.rows[r].getHeaderText(),i.rows[r].tab=i.theme.getTab(i.rows[r].tab_text),i.rows[r].tab.addEventListener("click",function(t){i.active_tab=i.rows[r].tab,i.refreshTabs(),t.preventDefault(),t.stopPropagation()}),i.theme.addTab(i.tabs_holder,i.rows[r].tab));var n=i.rows[r].title_controls||i.rows[r].array_controls;i.hide_delete_buttons||(i.rows[r].delete_button=this.getButton(i.getItemTitle(),"delete","Delete "+i.getItemTitle()),i.rows[r].delete_button.className+=" delete",i.rows[r].delete_button.setAttribute("data-i",r),i.rows[r].delete_button.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation();var e=1*this.getAttribute("data-i"),r=i.getValue(),n=[],o=null;s(r,function(t,s){return t===e?void(i.rows[t].tab===i.active_tab&&(i.rows[t+1]?o=i.rows[t].tab:t&&(o=i.rows[t-1].tab))):void n.push(s)}),i.setValue(n),o&&(i.active_tab=o,i.refreshTabs()),i.onChange(!0)}),n&&n.appendChild(i.rows[r].delete_button)),r&&!i.hide_move_buttons&&(i.rows[r].moveup_button=this.getButton("","moveup","Move up"),i.rows[r].moveup_button.className+=" moveup",i.rows[r].moveup_button.setAttribute("data-i",r),i.rows[r].moveup_button.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation();var e=1*this.getAttribute("data-i");if(!(0>=e)){var s=i.getValue(),r=s[e-1];s[e-1]=s[e],s[e]=r,i.setValue(s),i.active_tab=i.rows[e-1].tab,i.refreshTabs(),i.onChange(!0)}}),n&&n.appendChild(i.rows[r].moveup_button)),i.hide_move_buttons||(i.rows[r].movedown_button=this.getButton("","movedown","Move down"),i.rows[r].movedown_button.className+=" movedown",i.rows[r].movedown_button.setAttribute("data-i",r),i.rows[r].movedown_button.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation();var e=1*this.getAttribute("data-i"),s=i.getValue();if(!(e>=s.length-1)){var r=s[e+1];s[e+1]=s[e],s[e]=r,i.setValue(s),i.active_tab=i.rows[e+1].tab,i.refreshTabs(),i.onChange(!0)}}),n&&n.appendChild(i.rows[r].movedown_button)),t&&i.rows[r].setValue(t,e),i.refreshTabs()},addControls:function(){var t=this;this.collapsed=!1,this.toggle_button=this.getButton("","collapse","Collapse"),this.title_controls.appendChild(this.toggle_button);var e=t.row_holder.style.display,i=t.controls.style.display;this.toggle_button.addEventListener("click",function(s){s.preventDefault(),s.stopPropagation(),t.collapsed?(t.collapsed=!1,t.panel&&(t.panel.style.display=""),t.row_holder.style.display=e,t.tabs_holder&&(t.tabs_holder.style.display=""),t.controls.style.display=i,t.setButtonText(this,"","collapse","Collapse")):(t.collapsed=!0,t.row_holder.style.display="none",t.tabs_holder&&(t.tabs_holder.style.display="none"),t.controls.style.display="none",t.panel&&(t.panel.style.display="none"),t.setButtonText(this,"","expand","Expand"))}),this.options.collapsed&&r(this.toggle_button,"click"),this.schema.options&&"undefined"!=typeof this.schema.options.disable_collapse?this.schema.options.disable_collapse&&(this.toggle_button.style.display="none"):this.jsoneditor.options.disable_collapse&&(this.toggle_button.style.display="none"),this.add_row_button=this.getButton(this.getItemTitle(),"add","Add "+this.getItemTitle()),this.add_row_button.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation();var i=t.rows.length;t.row_cache[i]?(t.rows[i]=t.row_cache[i],t.rows[i].setValue(t.rows[i].getDefault()),t.rows[i].container.style.display="",t.rows[i].tab&&(t.rows[i].tab.style.display=""),t.rows[i].register()):t.addRow(),t.active_tab=t.rows[i].tab,t.refreshTabs(),t.refreshValue(),t.onChange(!0)}),t.controls.appendChild(this.add_row_button),this.delete_last_row_button=this.getButton("Last "+this.getItemTitle(),"delete","Delete Last "+this.getItemTitle()), -this.delete_last_row_button.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation();var i=t.getValue(),s=null;t.rows.length>1&&t.rows[t.rows.length-1].tab===t.active_tab&&(s=t.rows[t.rows.length-2].tab),i.pop(),t.setValue(i),s&&(t.active_tab=s,t.refreshTabs()),t.onChange(!0)}),t.controls.appendChild(this.delete_last_row_button),this.remove_all_rows_button=this.getButton("All","delete","Delete All"),this.remove_all_rows_button.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation(),t.setValue([]),t.onChange(!0)}),t.controls.appendChild(this.remove_all_rows_button),t.tabs&&(this.add_row_button.style.width="100%",this.add_row_button.style.textAlign="left",this.add_row_button.style.marginBottom="3px",this.delete_last_row_button.style.width="100%",this.delete_last_row_button.style.textAlign="left",this.delete_last_row_button.style.marginBottom="3px",this.remove_all_rows_button.style.width="100%",this.remove_all_rows_button.style.textAlign="left",this.remove_all_rows_button.style.marginBottom="3px")},showValidationErrors:function(t){var e=this,i=[],r=[];s(t,function(t,s){s.path===e.path?i.push(s):r.push(s)}),this.error_holder&&(i.length?(this.error_holder.innerHTML="",this.error_holder.style.display="",s(i,function(t,i){e.error_holder.appendChild(e.theme.getErrorMessage(i.message))})):this.error_holder.style.display="none"),s(this.rows,function(t,e){e.showValidationErrors(r)})}}),n.defaults.editors.table=n.defaults.editors.array.extend({register:function(){if(this._super(),this.rows)for(var t=0;tthis.schema.maxItems&&(t=t.slice(0,this.schema.maxItems));var i=JSON.stringify(t);if(i!==this.serialized){var r=!1,n=this;s(t,function(t,e){n.rows[t]?n.rows[t].setValue(e):(n.addRow(e),r=!0)});for(var o=t.length;o=this.rows.length,i=!1;s(this.rows,function(s,r){r.movedown_button&&(s===t.rows.length-1?r.movedown_button.style.display="none":(i=!0,r.movedown_button.style.display="")),r.delete_button&&(e?r.delete_button.style.display="none":(i=!0,r.delete_button.style.display="")),r.moveup_button&&(i=!0)}),s(this.rows,function(t,e){i?e.controls_cell.style.display="":e.controls_cell.style.display="none"}),i?this.controls_header_cell.style.display="":this.controls_header_cell.style.display="none";var r=!1;this.value.length?1===this.value.length||this.hide_delete_buttons?(this.table.style.display="",this.remove_all_rows_button.style.display="none",e||this.hide_delete_buttons?this.delete_last_row_button.style.display="none":(this.delete_last_row_button.style.display="",r=!0)):(this.table.style.display="",e||this.hide_delete_buttons?(this.delete_last_row_button.style.display="none",this.remove_all_rows_button.style.display="none"):(this.delete_last_row_button.style.display="",this.remove_all_rows_button.style.display="",r=!0)):(this.delete_last_row_button.style.display="none",this.remove_all_rows_button.style.display="none",this.table.style.display="none"),this.schema.maxItems&&this.schema.maxItems<=this.rows.length||this.hide_add_button?this.add_row_button.style.display="none":(this.add_row_button.style.display="",r=!0),r?this.controls.style.display="":this.controls.style.display="none"},refreshValue:function(){var t=this;this.value=[],s(this.rows,function(e,i){t.value[e]=i.getValue()}),this.serialized=JSON.stringify(this.value)},addRow:function(t){var e=this,i=this.rows.length;e.rows[i]=this.getElementEditor(i);var r=e.rows[i].table_controls;this.hide_delete_buttons||(e.rows[i].delete_button=this.getButton("","delete","Delete"),e.rows[i].delete_button.className+=" delete",e.rows[i].delete_button.setAttribute("data-i",i),e.rows[i].delete_button.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation();var i=1*this.getAttribute("data-i"),r=e.getValue(),n=[];s(r,function(t,e){t!==i&&n.push(e)}),e.setValue(n),e.onChange(!0)}),r.appendChild(e.rows[i].delete_button)),i&&!this.hide_move_buttons&&(e.rows[i].moveup_button=this.getButton("","moveup","Move up"),e.rows[i].moveup_button.className+=" moveup",e.rows[i].moveup_button.setAttribute("data-i",i),e.rows[i].moveup_button.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation();var i=1*this.getAttribute("data-i");if(!(0>=i)){var s=e.getValue(),r=s[i-1];s[i-1]=s[i],s[i]=r,e.setValue(s),e.onChange(!0)}}),r.appendChild(e.rows[i].moveup_button)),this.hide_move_buttons||(e.rows[i].movedown_button=this.getButton("","movedown","Move down"),e.rows[i].movedown_button.className+=" movedown",e.rows[i].movedown_button.setAttribute("data-i",i),e.rows[i].movedown_button.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation();var i=1*this.getAttribute("data-i"),s=e.getValue();if(!(i>=s.length-1)){var r=s[i+1];s[i+1]=s[i],s[i]=r,e.setValue(s),e.onChange(!0)}}),r.appendChild(e.rows[i].movedown_button)),t&&e.rows[i].setValue(t)},addControls:function(){var t=this;this.collapsed=!1,this.toggle_button=this.getButton("","collapse","Collapse"),this.title_controls&&(this.title_controls.appendChild(this.toggle_button),this.toggle_button.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation(),t.collapsed?(t.collapsed=!1,t.panel.style.display="",t.setButtonText(this,"","collapse","Collapse")):(t.collapsed=!0,t.panel.style.display="none",t.setButtonText(this,"","expand","Expand"))}),this.options.collapsed&&r(this.toggle_button,"click"),this.schema.options&&"undefined"!=typeof this.schema.options.disable_collapse?this.schema.options.disable_collapse&&(this.toggle_button.style.display="none"):this.jsoneditor.options.disable_collapse&&(this.toggle_button.style.display="none")),this.add_row_button=this.getButton(this.getItemTitle(),"add","Add "+this.getItemTitle()),this.add_row_button.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation(),t.addRow(),t.refreshValue(),t.refreshRowButtons(),t.onChange(!0)}),t.controls.appendChild(this.add_row_button),this.delete_last_row_button=this.getButton("Last "+this.getItemTitle(),"delete","Delete Last "+this.getItemTitle()),this.delete_last_row_button.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation();var i=t.getValue();i.pop(),t.setValue(i),t.onChange(!0)}),t.controls.appendChild(this.delete_last_row_button),this.remove_all_rows_button=this.getButton("All","delete","Delete All"),this.remove_all_rows_button.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation(),t.setValue([]),t.onChange(!0)}),t.controls.appendChild(this.remove_all_rows_button)}}),n.defaults.editors.multiple=n.AbstractEditor.extend({register:function(){if(this.editors){for(var t=0;tnull";if("object"==typeof t){var i="";return s(t,function(s,r){var n=e.getHTML(r);Array.isArray(t)||(n="
"+s+": "+n+"
"),i+="
  • "+n+"
  • "}),i=Array.isArray(t)?"
      "+i+"
    ":"
      "+i+"
    "}return"boolean"==typeof t?t?"true":"false":"string"==typeof t?t.replace(/&/g,"&").replace(//g,">"):t},setValue:function(t){this.value!==t&&(this.value=t,this.refreshValue(),this.onChange())},destroy:function(){this.display_area&&this.display_area.parentNode&&this.display_area.parentNode.removeChild(this.display_area),this.title&&this.title.parentNode&&this.title.parentNode.removeChild(this.title),this.switcher&&this.switcher.parentNode&&this.switcher.parentNode.removeChild(this.switcher),this._super()}}),n.defaults.editors.select=n.AbstractEditor.extend({setValue:function(t,e){t=this.typecast(t||"");var i=t;this.enum_values.indexOf(i)<0&&(i=this.enum_values[0]),this.value!==i&&(this.input.value=this.enum_options[this.enum_values.indexOf(i)],this.select2&&this.select2.select2("val",this.input.value),this.value=i,this.onChange())},register:function(){this._super(),this.input&&this.input.setAttribute("name",this.formname)},unregister:function(){this._super(),this.input&&this.input.removeAttribute("name")},getNumColumns:function(){if(!this.enum_options)return 3;for(var t=this.getTitle().length,e=0;e2||this.enum_options.length&&this.enumSource)){var t=i({},n.plugins.select2);this.schema.options&&this.schema.options.select2_options&&(t=i(t,this.schema.options.select2_options)),this.select2=window.jQuery(this.input).select2(t);var e=this;this.select2.on("select2-blur",function(){e.input.value=e.select2.select2("val"),e.onInputChange()})}else this.select2=null},postBuild:function(){this._super(),this.theme.afterInputReady(this.input),this.setupSelect2()},onWatchedFieldChange:function(){var t,e;if(this.enumSource){t=this.getWatchedFieldValues();for(var i=[],s=[],r=0;rType: "+t+", Size: "+Math.floor((this.value.length-this.value.split(",")[0].length-1)/1.33333)+" bytes","image"===t.substr(0,5)){this.preview.innerHTML+="
    ";var e=document.createElement("img");e.style.maxWidth="100%",e.style.maxHeight="100px",e.src=this.value,this.preview.appendChild(e)}}else this.preview.innerHTML="Invalid data URI"}},enable:function(){this.uploader&&(this.uploader.disabled=!1),this._super()},disable:function(){this.uploader&&(this.uploader.disabled=!0),this._super()},setValue:function(t){this.value!==t&&(this.value=t,this.input.value=this.value,this.refreshPreview(),this.onChange())},destroy:function(){this.preview&&this.preview.parentNode&&this.preview.parentNode.removeChild(this.preview),this.title&&this.title.parentNode&&this.title.parentNode.removeChild(this.title),this.input&&this.input.parentNode&&this.input.parentNode.removeChild(this.input),this.uploader&&this.uploader.parentNode&&this.uploader.parentNode.removeChild(this.uploader),this._super()}}),n.defaults.editors.upload=n.AbstractEditor.extend({getNumColumns:function(){return 4},build:function(){var t=this;if(this.title=this.header=this.label=this.theme.getFormInputLabel(this.getTitle(),this.isRequired()),this.input=this.theme.getFormInputField("hidden"),this.container.appendChild(this.input),!this.schema.readOnly&&!this.schema.readonly){if(!this.jsoneditor.options.upload)throw"Upload handler required for upload editor";this.uploader=this.theme.getFormInputField("file"),this.uploader.addEventListener("change",function(e){if(e.preventDefault(),e.stopPropagation(),this.files&&this.files.length){var i=new FileReader;i.onload=function(e){t.preview_value=e.target.result,t.refreshPreview(),t.onChange(!0),i=null},i.readAsDataURL(this.files[0])}})}var e=this.schema.description;e||(e=""),this.preview=this.theme.getFormInputDescription(e),this.container.appendChild(this.preview),this.control=this.theme.getFormControl(this.label,this.uploader||this.input,this.preview),this.container.appendChild(this.control)},refreshPreview:function(){if(this.last_preview!==this.preview_value&&(this.last_preview=this.preview_value,this.preview.innerHTML="",this.preview_value)){var t=this,e=this.preview_value.match(/^data:([^;,]+)[;,]/);e&&(e=e[1]),e||(e="unknown");var i=this.uploader.files[0];if(this.preview.innerHTML="Type: "+e+", Size: "+i.size+" bytes","image"===e.substr(0,5)){this.preview.innerHTML+="
    ";var s=document.createElement("img");s.style.maxWidth="100%",s.style.maxHeight="100px",s.src=this.preview_value, -this.preview.appendChild(s)}this.preview.innerHTML+="
    ";var r=this.getButton("Upload","upload","Upload");this.preview.appendChild(r),r.addEventListener("click",function(e){e.preventDefault(),r.setAttribute("disabled","disabled"),t.theme.removeInputError(t.uploader),t.theme.getProgressBar&&(t.progressBar=t.theme.getProgressBar(),t.preview.appendChild(t.progressBar)),t.jsoneditor.options.upload(t.path,i,{success:function(e){t.setValue(e),t.parent?t.parent.onChildEditorChange(t):t.jsoneditor.onChange(),t.progressBar&&t.preview.removeChild(t.progressBar),r.removeAttribute("disabled")},failure:function(e){t.theme.addInputError(t.uploader,e),t.progressBar&&t.preview.removeChild(t.progressBar),r.removeAttribute("disabled")},updateProgress:function(e){t.progressBar&&(e?t.theme.updateProgressBar(t.progressBar,e):t.theme.updateProgressBarUnknown(t.progressBar))}})})}},enable:function(){this.uploader&&(this.uploader.disabled=!1),this._super()},disable:function(){this.uploader&&(this.uploader.disabled=!0),this._super()},setValue:function(t){this.value!==t&&(this.value=t,this.input.value=this.value,this.onChange())},destroy:function(){this.preview&&this.preview.parentNode&&this.preview.parentNode.removeChild(this.preview),this.title&&this.title.parentNode&&this.title.parentNode.removeChild(this.title),this.input&&this.input.parentNode&&this.input.parentNode.removeChild(this.input),this.uploader&&this.uploader.parentNode&&this.uploader.parentNode.removeChild(this.uploader),this._super()}}),n.defaults.editors.checkbox=n.AbstractEditor.extend({setValue:function(t,e){this.value=!!t,this.input.checked=this.value,this.onChange()},register:function(){this._super(),this.input&&this.input.setAttribute("name",this.formname)},unregister:function(){this._super(),this.input&&this.input.removeAttribute("name")},getNumColumns:function(){return Math.min(12,Math.max(this.getTitle().length/7,2))},build:function(){var t=this;this.options.compact||(this.label=this.header=this.theme.getCheckboxLabel(this.getTitle())),this.schema.description&&(this.description=this.theme.getFormInputDescription(this.schema.description)),this.options.compact&&(this.container.className+=" compact"),this.input=this.theme.getCheckbox(),this.control=this.theme.getFormControl(this.label,this.input,this.description),(this.schema.readOnly||this.schema.readonly)&&(this.always_disabled=!0,this.input.disabled=!0),this.input.addEventListener("change",function(e){e.preventDefault(),e.stopPropagation(),t.value=this.checked,t.onChange(!0)}),this.container.appendChild(this.control)},enable:function(){this.always_disabled||(this.input.disabled=!1),this._super()},disable:function(){this.input.disabled=!0,this._super()},destroy:function(){this.label&&this.label.parentNode&&this.label.parentNode.removeChild(this.label),this.description&&this.description.parentNode&&this.description.parentNode.removeChild(this.description),this.input&&this.input.parentNode&&this.input.parentNode.removeChild(this.input),this._super()}});var o=function(){var t=document.documentElement;return t.matches?"matches":t.webkitMatchesSelector?"webkitMatchesSelector":t.mozMatchesSelector?"mozMatchesSelector":t.msMatchesSelector?"msMatchesSelector":t.oMatchesSelector?"oMatchesSelector":void 0}();n.AbstractTheme=t.extend({getContainer:function(){return document.createElement("div")},getFloatRightLinkHolder:function(){var t=document.createElement("div");return t.style=t.style||{},t.style.cssFloat="right",t.style.marginLeft="10px",t},getModal:function(){var t=document.createElement("div");return t.style.backgroundColor="white",t.style.border="1px solid black",t.style.boxShadow="3px 3px black",t.style.position="absolute",t.style.zIndex="10",t.style.display="none",t},getGridContainer:function(){var t=document.createElement("div");return t},getGridRow:function(){var t=document.createElement("div");return t.className="row",t},getGridColumn:function(){var t=document.createElement("div");return t},setGridColumnSize:function(t,e){},getLink:function(t){var e=document.createElement("a");return e.setAttribute("href","#"),e.appendChild(document.createTextNode(t)),e},disableHeader:function(t){t.style.color="#ccc"},disableLabel:function(t){t.style.color="#ccc"},enableHeader:function(t){t.style.color=""},enableLabel:function(t){t.style.color=""},getFormInputLabel:function(t){var e=document.createElement("label");return e.appendChild(document.createTextNode(t)),e},getCheckboxLabel:function(t){var e=this.getFormInputLabel(t);return e.style.fontWeight="normal",e},getHeader:function(t,e){var i=document.createElement("h3");return"string"==typeof t?i.textContent=t:i.appendChild(t),e&&(i.className+=" required"),i},getCheckbox:function(){var t=this.getFormInputField("checkbox");return t.style.display="inline-block",t.style.width="auto",t},getMultiCheckboxHolder:function(t,e,i){var s=document.createElement("div");e&&(e.style.display="block",s.appendChild(e));for(var r in t)t.hasOwnProperty(r)&&(t[r].style.display="inline-block",t[r].style.marginRight="20px",s.appendChild(t[r]));return i&&s.appendChild(i),s},getSelectInput:function(t){var e=document.createElement("select");return t&&this.setSelectOptions(e,t),e},getSwitcher:function(t){var e=this.getSelectInput(t);return e.style.backgroundColor="transparent",e.style.display="inline-block",e.style.fontStyle="italic",e.style.fontWeight="normal",e.style.height="auto",e.style.marginBottom=0,e.style.marginLeft="5px",e.style.padding="0 0 0 3px",e.style.width="auto",e},getSwitcherOptions:function(t){return t.getElementsByTagName("option")},setSwitcherOptions:function(t,e,i){this.setSelectOptions(t,e,i)},setSelectOptions:function(t,e,i){i=i||[],t.innerHTML="";for(var s=0;s'),t.errmsg=t.parentNode.getElementsByClassName("error")[0]),t.errmsg.textContent=e)},removeInputError:function(t){t.errmsg&&(t.group.className=t.group.className.replace(/ error/g,""),t.errmsg.style.display="none")},getProgressBar:function(){var t=document.createElement("div");t.className="progress";var e=document.createElement("span");return e.className="meter",e.style.width="0%",t.appendChild(e),t},updateProgressBar:function(t,e){t&&(t.firstChild.style.width=e+"%")},updateProgressBarUnknown:function(t){t&&(t.firstChild.style.width="100%")}}),n.defaults.themes.foundation3=n.defaults.themes.foundation.extend({getHeaderButtonHolder:function(){var t=this._super();return t.style.fontSize=".6em",t},getFormInputLabel:function(t,e){var i=this._super(t);return i.style.fontWeight="bold",e&&(i.className+=" required"),i},getTabHolder:function(){var t=document.createElement("div");return t.className="row",t.innerHTML="
    ",t},setGridColumnSize:function(t,e){var i=["zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve"];t.className="columns "+i[e]},getTab:function(t){var e=document.createElement("dd"),i=document.createElement("a");return i.setAttribute("href","#"),i.appendChild(t),e.appendChild(i),e},getTabContentHolder:function(t){return t.children[1]},getTabContent:function(){var t=document.createElement("div");return t.className="content active",t.style.paddingLeft="5px",t},markTabActive:function(t){t.className+=" active"},markTabInactive:function(t){t.className=t.className.replace(/\s*active/g,"")},addTab:function(t,e){t.children[0].appendChild(e)}}),n.defaults.themes.foundation4=n.defaults.themes.foundation.extend({getHeaderButtonHolder:function(){var t=this._super();return t.style.fontSize=".6em",t},setGridColumnSize:function(t,e){t.className="columns large-"+e},getFormInputDescription:function(t){var e=this._super(t);return e.style.fontSize=".8rem",e},getFormInputLabel:function(t,e){var i=this._super(t);return i.style.fontWeight="bold",e&&(i.className+=" required"),i}}),n.defaults.themes.foundation5=n.defaults.themes.foundation.extend({getFormInputDescription:function(t){var e=this._super(t);return e.style.fontSize=".8rem",e},setGridColumnSize:function(t,e){t.className="columns medium-"+e},getButton:function(t,e,i){var s=this._super(t,e,i);return s.className=s.className.replace(/\s*small/g,"")+" tiny",s},getTabHolder:function(){var t=document.createElement("div");return t.innerHTML="
    ",t},getTab:function(t){var e=document.createElement("dd"),i=document.createElement("a");return i.setAttribute("href","#"),i.appendChild(t),e.appendChild(i),e},getTabContentHolder:function(t){return t.children[1]},getTabContent:function(){var t=document.createElement("div");return t.className="content active",t.style.paddingLeft="5px",t},markTabActive:function(t){t.className+=" active"},markTabInactive:function(t){t.className=t.className.replace(/\s*active/g,"")},addTab:function(t,e){t.children[0].appendChild(e)}}),n.defaults.themes.html=n.AbstractTheme.extend({getFormInputLabel:function(t,e){var i=this._super(t);return i.style.display="block",i.style.marginBottom="3px",i.style.fontWeight="bold",e&&(i.className+=" required"),i},getFormInputDescription:function(t){var e=this._super(t);return e.style.fontSize=".8em",e.style.margin=0,e.style.display="inline-block",e.style.fontStyle="italic",e},getIndentedPanel:function(){var t=this._super();return t.style.border="1px solid #ddd",t.style.padding="5px",t.style.margin="5px",t.style.borderRadius="3px",t},getChildEditorHolder:function(){var t=this._super();return t.style.marginBottom="8px",t},getHeaderButtonHolder:function(){var t=this.getButtonHolder();return t.style.display="inline-block",t.style.marginLeft="10px",t.style.fontSize=".8em",t.style.verticalAlign="middle",t},getTable:function(){var t=this._super();return t.style.borderBottom="1px solid #ccc",t.style.marginBottom="5px",t},addInputError:function(t,e){if(t.style.borderColor="red",t.errmsg)t.errmsg.style.display="block";else{var i=this.closest(t,".form-control");t.errmsg=document.createElement("div"),t.errmsg.setAttribute("class","errmsg"),t.errmsg.style=t.errmsg.style||{},t.errmsg.style.color="red",i.appendChild(t.errmsg)}t.errmsg.innerHTML="",t.errmsg.appendChild(document.createTextNode(e))},removeInputError:function(t){t.style.borderColor="",t.errmsg&&(t.errmsg.style.display="none")},getProgressBar:function(){var t=100,e=0,i=document.createElement("progress");return i.setAttribute("max",t),i.setAttribute("value",e),i},updateProgressBar:function(t,e){t&&t.setAttribute("value",e)},updateProgressBarUnknown:function(t){t&&t.removeAttribute("value")}}),n.defaults.themes.jqueryui=n.AbstractTheme.extend({getTable:function(){var t=this._super();return t.setAttribute("cellpadding",5),t.setAttribute("cellspacing",0),t},getTableHeaderCell:function(t){var e=this._super(t);return e.className="ui-state-active",e.style.fontWeight="bold",e},getTableCell:function(){var t=this._super();return t.className="ui-widget-content",t},getHeaderButtonHolder:function(){var t=this.getButtonHolder();return t.style.marginLeft="10px",t.style.fontSize=".6em",t.style.display="inline-block",t},getFormInputDescription:function(t){var e=this.getDescription(t);return e.style.marginLeft="10px",e.style.display="inline-block",e},getFormControl:function(t,e,i){var s=this._super(t,e,i);return"checkbox"===e.type?(s.style.lineHeight="25px",s.style.padding="3px 0"):s.style.padding="4px 0 8px 0",s},getDescription:function(t){var e=document.createElement("span");return e.style.fontSize=".8em",e.style.fontStyle="italic",e.textContent=t,e},getButtonHolder:function(){var t=document.createElement("div");return t.className="ui-buttonset",t.style.fontSize=".7em",t},getFormInputLabel:function(t,e){var i=document.createElement("label");return i.style.fontWeight="bold",i.style.display="block",e&&(i.className+=" required"),i.textContent=t,i},getButton:function(t,e,i){var s=document.createElement("button");s.className="ui-button ui-widget ui-state-default ui-corner-all",e&&!t?(s.className+=" ui-button-icon-only",e.className+=" ui-button-icon-primary ui-icon-primary",s.appendChild(e)):e?(s.className+=" ui-button-text-icon-primary",e.className+=" ui-button-icon-primary ui-icon-primary",s.appendChild(e)):s.className+=" ui-button-text-only";var r=document.createElement("span");return r.className="ui-button-text",r.textContent=t||i||".",s.appendChild(r),s.setAttribute("title",i),s},setButtonText:function(t,e,i,s){t.innerHTML="",t.className="ui-button ui-widget ui-state-default ui-corner-all",i&&!e?(t.className+=" ui-button-icon-only",i.className+=" ui-button-icon-primary ui-icon-primary",t.appendChild(i)):i?(t.className+=" ui-button-text-icon-primary",i.className+=" ui-button-icon-primary ui-icon-primary",t.appendChild(i)):t.className+=" ui-button-text-only";var r=document.createElement("span");r.className="ui-button-text",r.textContent=e||s||".",t.appendChild(r),t.setAttribute("title",s)},getIndentedPanel:function(){var t=document.createElement("div");return t.className="ui-widget-content ui-corner-all",t.style.padding="1em 1.4em",t.style.marginBottom="20px",t},afterInputReady:function(t){t.controls||(t.controls=this.closest(t,".form-control"))},addInputError:function(t,e){t.controls&&(t.errmsg?t.errmsg.style.display="":(t.errmsg=document.createElement("div"),t.errmsg.className="ui-state-error",t.controls.appendChild(t.errmsg)),t.errmsg.textContent=e)},removeInputError:function(t){t.errmsg&&(t.errmsg.style.display="none")},markTabActive:function(t){t.className=t.className.replace(/\s*ui-widget-header/g,"")+" ui-state-active"},markTabInactive:function(t){t.className=t.className.replace(/\s*ui-state-active/g,"")+" ui-widget-header"}}),n.AbstractIconLib=t.extend({mapping:{collapse:"",expand:"","delete":"",edit:"",add:"",cancel:"",save:"",moveup:"",movedown:""},icon_prefix:"",getIconClass:function(t){return this.mapping[t]?this.icon_prefix+this.mapping[t]:null},getIcon:function(t){var e=this.getIconClass(t);if(!e)return null;var i=document.createElement("i");return i.className=e,i}}),n.defaults.iconlibs.bootstrap2=n.AbstractIconLib.extend({mapping:{collapse:"chevron-down",expand:"chevron-up","delete":"trash",edit:"pencil",add:"plus",cancel:"ban-circle",save:"ok",moveup:"arrow-up",movedown:"arrow-down"},icon_prefix:"icon-"}),n.defaults.iconlibs.bootstrap3=n.AbstractIconLib.extend({mapping:{collapse:"chevron-down",expand:"chevron-right","delete":"remove",edit:"pencil",add:"plus",cancel:"floppy-remove",save:"floppy-saved",moveup:"arrow-up",movedown:"arrow-down"},icon_prefix:"glyphicon glyphicon-"}),n.defaults.iconlibs.fontawesome3=n.AbstractIconLib.extend({mapping:{collapse:"chevron-down",expand:"chevron-right","delete":"remove",edit:"pencil",add:"plus",cancel:"ban-circle",save:"save",moveup:"arrow-up",movedown:"arrow-down"},icon_prefix:"icon-"}),n.defaults.iconlibs.fontawesome4=n.AbstractIconLib.extend({mapping:{collapse:"caret-square-o-down",expand:"caret-square-o-right","delete":"times",edit:"pencil",add:"plus",cancel:"ban",save:"save",moveup:"arrow-up",movedown:"arrow-down"},icon_prefix:"fa fa-"}),n.defaults.iconlibs.foundation2=n.AbstractIconLib.extend({mapping:{collapse:"minus",expand:"plus","delete":"remove",edit:"edit",add:"add-doc",cancel:"error",save:"checkmark",moveup:"up-arrow",movedown:"down-arrow"},icon_prefix:"foundicon-"}),n.defaults.iconlibs.foundation3=n.AbstractIconLib.extend({mapping:{collapse:"minus",expand:"plus","delete":"x",edit:"pencil",add:"page-add",cancel:"x-circle",save:"save",moveup:"arrow-up",movedown:"arrow-down"},icon_prefix:"fi-"}),n.defaults.iconlibs.jqueryui=n.AbstractIconLib.extend({mapping:{collapse:"triangle-1-s",expand:"triangle-1-e","delete":"trash",edit:"pencil",add:"plusthick",cancel:"closethick",save:"disk",moveup:"arrowthick-1-n",movedown:"arrowthick-1-s"},icon_prefix:"ui-icon ui-icon-"}),n.defaults.templates["default"]=function(){return{compile:function(t){var e=t.match(/{{\s*([a-zA-Z0-9\-_ \.]+)\s*}}/g),i=e&&e.length;if(!i)return function(){return t};for(var s=[],r=function(t){var i,r=e[t].replace(/[{}]+/g,"").trim().split("."),n=r.length;if(n>1){var o;i=function(e){for(o=e,t=0;n>t&&(o=o[r[t]]);t++);return o}}else r=r[0],i=function(t){return t[r]};s.push({s:e[t],r:i})},n=0;i>n;n++)r(n);return function(e){var r,o=t+"";for(n=0;i>n;n++)r=s[n],o=o.replace(r.s,r.r(e));return o}}}},n.defaults.templates.ejs=function(){return!!window.EJS&&{compile:function(t){var e=new window.EJS({text:t});return function(t){return e.render(t)}}}},n.defaults.templates.handlebars=function(){return window.Handlebars},n.defaults.templates.hogan=function(){return!!window.Hogan&&{compile:function(t){var e=window.Hogan.compile(t);return function(t){return e.render(t)}}}},n.defaults.templates.markup=function(){return!(!window.Mark||!window.Mark.up)&&{compile:function(t){return function(e){return window.Mark.up(t,e)}}}},n.defaults.templates.mustache=function(){return!!window.Mustache&&{compile:function(t){return function(e){return window.Mustache.render(t,e)}}}},n.defaults.templates.swig=function(){return window.swig},n.defaults.templates.underscore=function(){return!!window._&&{compile:function(t){return function(e){return window._.template(t,e)}}}},n.defaults.theme="html",n.defaults.template="default",n.defaults.options={},n.defaults.translate=function(t,e){var i=n.defaults.languages[n.defaults.language];if(!i)throw"Unknown language "+n.defaults.language;var s=i[t]||n.defaults.languages[n.defaults.default_language][t];if("undefined"==typeof s)throw"Unknown translate string "+t;if(e)for(var r=0;r=0?"multiselect":void 0}),n.defaults.resolvers.unshift(function(t){return t.oneOf?"multiple":void 0}),function(){if(window.jQuery||window.Zepto){var t=window.jQuery||window.Zepto;t.jsoneditor=n.defaults,t.fn.jsoneditor=function(t){var e=this,i=this.data("jsoneditor");if("value"===t){if(!i)throw"Must initialize jsoneditor before getting/setting the value";if(!(arguments.length>1))return i.getValue();i.setValue(arguments[1])}else{if("validate"===t){if(!i)throw"Must initialize jsoneditor before validating";return arguments.length>1?i.validate(arguments[1]):i.validate()}"destroy"===t?i&&(i.destroy(),this.data("jsoneditor",null)):(i&&i.destroy(),i=new n(this.get(0),t),this.data("jsoneditor",i),i.on("change",function(){e.trigger("change")}),i.on("ready",function(){e.trigger("ready")}))}return this}}}(),window.JSONEditor=n}(); \ No newline at end of file diff --git a/spring-boot-swagger/src/main/resources/static/swagger/lib/lodash.min.js b/spring-boot-swagger/src/main/resources/static/swagger/lib/lodash.min.js deleted file mode 100644 index 3625da8..0000000 --- a/spring-boot-swagger/src/main/resources/static/swagger/lib/lodash.min.js +++ /dev/null @@ -1,2 +0,0 @@ -(function(){function n(n,t){if(n!==t){var r=null===n,e=n===x,u=n===n,o=null===t,i=t===x,f=t===t;if(n>t&&!o||!u||r&&!i&&f||e&&f)return 1;if(n=n&&9<=n&&13>=n||32==n||160==n||5760==n||6158==n||8192<=n&&(8202>=n||8232==n||8233==n||8239==n||8287==n||12288==n||65279==n)}function v(n,t){for(var r=-1,e=n.length,u=-1,o=[];++r=F&&wu&&hu?new Dn(t):null,a=t.length;c&&(i=Mn,f=!1,t=c);n:for(;++oi(t,c,0)&&u.push(c);return u}function lt(n,t){var r=!0;return zu(n,function(n,e,u){return r=!!t(n,e,u)}),r}function st(n,t,r,e){var u=e,o=u;return zu(n,function(n,i,f){i=+t(n,i,f),(r(i,u)||i===e&&i===o)&&(u=i,o=n)}),o}function pt(n,t){var r=[];return zu(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function ht(n,t,r,e){var u;return r(n,function(n,r,o){return t(n,r,o)?(u=e?r:n,!1):void 0}),u}function _t(n,t,r,e){e||(e=[]);for(var u=-1,o=n.length;++ut&&(t=-t>u?0:u+t),r=r===x||r>u?u:+r||0,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=De(u);++e=a)break n;o=e[o],u*="asc"===o||!0===o?1:-1;break n}u=t.b-r.b}return u})}function Ft(n,t){var r=0;return zu(n,function(n,e,u){r+=+t(n,e,u)||0}),r}function Lt(n,t){var e=-1,u=jr(),o=n.length,i=u===r,f=i&&o>=F,c=f&&wu&&hu?new Dn((void 0)):null,a=[];c?(u=Mn,i=!1):(f=!1,c=t?[]:a);n:for(;++eu(c,s,0)&&((t||f)&&c.push(s),a.push(l))}return a}function Nt(n,t){for(var r=-1,e=t.length,u=De(e);++r>>1,i=n[o];(r?i<=t:iu?x:o,u=1);++e=F)return t.plant(e).value();for(var u=0,n=r?o[u].apply(this,n):e;++uarguments.length;return"function"==typeof e&&o===x&&Wo(r)?n(r,e,u,i):Ct(r,mr(e,o,4),u,i,t)}}function hr(n,t,r,e,u,o,i,f,c,a){function l(){for(var w=arguments.length,b=w,j=De(w);b--;)j[b]=arguments[b];if(e&&(j=qt(j,e,u)),o&&(j=Kt(j,o,i)),_||y){var b=l.placeholder,k=v(j,b),w=w-k.length;if(wt?0:t)):[]}function Vr(n,t,r){var e=n?n.length:0;return e?((r?$r(n,t,r):null==t)&&(t=1),t=e-(+t||0),St(n,0,0>t?0:t)):[]}function Zr(n){return n?n[0]:x}function Yr(n,t,e){var u=n?n.length:0;if(!u)return-1;if("number"==typeof e)e=0>e?ju(u+e,0):e;else if(e)return e=zt(n,t),er?ju(u+r,0):r||0,"string"==typeof n||!Wo(n)&&Ae(n)?r<=u&&-1t?0:+t||0,e);++r=n&&(t=x),r}}function le(n,t,r){function e(t,r){r&&au(r),c=p=h=x,t&&(_=xo(),a=n.apply(s,f),p||c||(f=s=x))}function u(){var n=t-(xo()-l);0>=n||n>t?e(h,c):p=_u(u,n)}function o(){e(g,p)}function i(){if(f=arguments,l=xo(),s=this,h=g&&(p||!y),!1===v)var r=y&&!p;else{c||y||(_=l);var e=v-(l-_),i=0>=e||e>v;i?(c&&(c=au(c)),_=l,a=n.apply(s,f)):c||(c=_u(o,e))}return i&&p?p=au(p):p||t===v||(p=_u(u,t)),r&&(i=!0,a=n.apply(s,f)),!i||p||c||(f=s=x),a}var f,c,a,l,s,p,h,_=0,v=!1,g=!0;if("function"!=typeof n)throw new Xe(T);if(t=0>t?0:+t||0,!0===r)var y=!0,g=!1;else de(r)&&(y=!!r.leading,v="maxWait"in r&&ju(+r.maxWait||0,t),g="trailing"in r?!!r.trailing:g);return i.cancel=function(){p&&au(p),c&&au(c),_=0,c=p=h=x},i}function se(n,t){if("function"!=typeof n||t&&"function"!=typeof t)throw new Xe(T);var r=function(){var e=arguments,u=t?t.apply(this,e):e[0],o=r.cache;return o.has(u)?o.get(u):(e=n.apply(this,e),r.cache=o.set(u,e),e)};return r.cache=new se.Cache,r}function pe(n,t){if("function"!=typeof n)throw new Xe(T);return t=ju(t===x?n.length-1:+t||0,0),function(){for(var r=arguments,e=-1,u=ju(r.length-t,0),o=De(u);++et}function _e(n){return h(n)&&Sr(n)&&eu.call(n,"callee")&&!pu.call(n,"callee")}function ve(n,t,r,e){return e=(r="function"==typeof r?Dt(r,e,3):x)?r(n,t):x,e===x?xt(n,t,r):!!e}function ge(n){return h(n)&&"string"==typeof n.message&&ou.call(n)==q}function ye(n){return de(n)&&ou.call(n)==K}function de(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function we(n){return null!=n&&(ye(n)?fu.test(ru.call(n)):h(n)&&(Gn(n)?fu:In).test(n))}function xe(n){return"number"==typeof n||h(n)&&ou.call(n)==V}function be(n){var t;if(!h(n)||ou.call(n)!=Z||Gn(n)||_e(n)||!(eu.call(n,"constructor")||(t=n.constructor,"function"!=typeof t||t instanceof t)))return!1;var r;return Nn.support.ownLast?(vt(n,function(n,t,e){return r=eu.call(e,t),!1}),!1!==r):(vt(n,function(n,t){r=t}),r===x||eu.call(n,r))}function me(n){return de(n)&&ou.call(n)==Y}function Ae(n){return"string"==typeof n||h(n)&&ou.call(n)==G}function je(n){return h(n)&&Lr(n.length)&&!!Fn[ou.call(n)]}function ke(n,t){return nt||!n||!mu(t))return r;do t%2&&(r+=n),t=xu(t/2),n+=n;while(t);return r}function We(n,t,r){var e=n;return(n=u(n))?(r?$r(e,t,r):null==t)?n.slice(g(n),y(n)+1):(t+="",n.slice(o(n,t),i(n,t)+1)):n}function Fe(n,t,r){return r&&$r(n,t,r)&&(t=x),n=u(n),n.match(t||Un)||[]}function Le(n,t,r){return r&&$r(n,t,r)&&(t=x),h(n)?Te(n):it(n,t)}function Ne(n){return n}function Te(n){return At(ft(n,!0))}function Pe(n,t,r){if(null==r){var e=de(t),u=e?Ko(t):x;((u=u&&u.length?dt(t,u):x)?u.length:e)||(u=!1,r=t,t=n,n=this)}u||(u=dt(t,Ko(t)));var o=!0,e=-1,i=ye(n),f=u.length;!1===r?o=!1:de(r)&&"chain"in r&&(o=r.chain);for(;++e=$)return r}else n=0;return qu(r,e)}}(),Yu=pe(function(n,t){return h(n)&&Sr(n)?at(n,_t(t,!1,!0)):[]}),Gu=er(),Ju=er(!0),Xu=pe(function(n){for(var t=n.length,e=t,u=De(l),o=jr(),i=o===r,f=[];e--;){var c=n[e]=Sr(c=n[e])?c:[];u[e]=i&&120<=c.length&&wu&&hu?new Dn(e&&c):null}var i=n[0],a=-1,l=i?i.length:0,s=u[0];n:for(;++a(s?Mn(s,c):o(f,c,0))){for(e=t;--e;){var p=u[e];if(0>(p?Mn(p,c):o(n[e],c,0)))continue n}s&&s.push(c),f.push(c)}return f}),Hu=pe(function(t,r){r=_t(r);var e=ut(t,r);return Rt(t,r.sort(n)),e}),Qu=yr(),no=yr(!0),to=pe(function(n){return Lt(_t(n,!1,!0))}),ro=pe(function(n,t){return Sr(n)?at(n,t):[]}),eo=pe(Hr),uo=pe(function(n){var t=n.length,r=2--n?t.apply(this,arguments):void 0}},Nn.ary=function(n,t,r){return r&&$r(n,t,r)&&(t=x),t=n&&null==t?n.length:ju(+t||0,0),dr(n,E,x,x,x,x,t)},Nn.assign=Lo,Nn.at=io,Nn.before=ae,Nn.bind=bo,Nn.bindAll=mo, -Nn.bindKey=Ao,Nn.callback=Le,Nn.chain=te,Nn.chunk=function(n,t,r){t=(r?$r(n,t,r):null==t)?1:ju(xu(t)||1,1),r=0;for(var e=n?n.length:0,u=-1,o=De(du(e/t));rr&&(r=-r>u?0:u+r),e=e===x||e>u?u:+e||0,0>e&&(e+=u),u=r>e?0:e>>>0,r>>>=0;rt?0:t)):[]},Nn.takeRight=function(n,t,r){var e=n?n.length:0;return e?((r?$r(n,t,r):null==t)&&(t=1),t=e-(+t||0),St(n,0>t?0:t)):[]},Nn.takeRightWhile=function(n,t,r){return n&&n.length?Tt(n,mr(t,r,3),!1,!0):[]},Nn.takeWhile=function(n,t,r){return n&&n.length?Tt(n,mr(t,r,3)):[]},Nn.tap=function(n,t,r){return t.call(r,n),n},Nn.throttle=function(n,t,r){var e=!0,u=!0;if("function"!=typeof n)throw new Xe(T);return!1===r?e=!1:de(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),le(n,t,{leading:e,maxWait:+t,trailing:u})},Nn.thru=re,Nn.times=function(n,t,r){if(n=xu(n),1>n||!mu(n))return[];var e=-1,u=De(ku(n,4294967295));for(t=Dt(t,r,1);++ee?u[e]=t(e):t(e);return u},Nn.toArray=Oe,Nn.toPlainObject=Ie,Nn.transform=function(n,t,r,e){var u=Wo(n)||je(n);return t=mr(t,e,4),null==r&&(u||de(n)?(e=n.constructor,r=u?Wo(n)?new e:[]:Pu(ye(e)?e.prototype:x)):r={}),(u?Kn:gt)(n,function(n,e,u){return t(r,n,e,u)}),r},Nn.union=to,Nn.uniq=Xr,Nn.unzip=Hr,Nn.unzipWith=Qr,Nn.values=Se,Nn.valuesIn=function(n){return Nt(n,Ee(n))},Nn.where=function(n,t){return ue(n,At(t))},Nn.without=ro,Nn.wrap=function(n,t){return t=null==t?Ne:t,dr(t,I,x,[n],[])},Nn.xor=function(){for(var n=-1,t=arguments.length;++nr?0:+r||0,e),r-=t.length,0<=r&&n.indexOf(t,r)==r},Nn.escape=function(n){return(n=u(n))&&hn.test(n)?n.replace(sn,a):n},Nn.escapeRegExp=function(n){return(n=u(n))&&bn.test(n)?n.replace(xn,l):n||"(?:)"},Nn.every=ee,Nn.find=co,Nn.findIndex=Gu,Nn.findKey=Po,Nn.findLast=ao,Nn.findLastIndex=Ju,Nn.findLastKey=zo,Nn.findWhere=function(n,t){return co(n,At(t))},Nn.first=Zr,Nn.floor=ii,Nn.get=function(n,t,r){return n=null==n?x:wt(n,Mr(t),t+""),n===x?r:n},Nn.gt=he,Nn.gte=function(n,t){return n>=t},Nn.has=function(n,t){if(null==n)return!1;var r=eu.call(n,t);if(!r&&!Wr(t)){if(t=Mr(t),n=1==t.length?n:wt(n,St(t,0,-1)),null==n)return!1;t=Gr(t),r=eu.call(n,t)}return r||Lr(n.length)&&Ur(t,n.length)&&(Wo(n)||_e(n)||Ae(n))},Nn.identity=Ne,Nn.includes=oe,Nn.indexOf=Yr,Nn.inRange=function(n,t,r){return t=+t||0,r===x?(r=t,t=0):r=+r||0,n>=ku(t,r)&&nr?ju(e+r,0):ku(r||0,e-1))+1;else if(r)return u=zt(n,t,!0)-1,n=n[u],(t===t?t===n:n!==n)?u:-1;if(t!==t)return p(n,u,!0);for(;u--;)if(n[u]===t)return u;return-1},Nn.lt=ke,Nn.lte=function(n,t){return n<=t},Nn.max=fi,Nn.min=ci,Nn.noConflict=function(){return Yn._=iu,this},Nn.noop=ze,Nn.now=xo,Nn.pad=function(n,t,r){n=u(n),t=+t;var e=n.length;return er?0:+r||0,n.length),n.lastIndexOf(t,r)==r},Nn.sum=function(n,t,r){if(r&&$r(n,t,r)&&(t=x),t=mr(t,r,3),1==t.length){n=Wo(n)?n:Br(n),r=n.length;for(var e=0;r--;)e+=+t(n[r])||0;n=e}else n=Ft(n,t);return n},Nn.template=function(n,t,r){var e=Nn.templateSettings;r&&$r(n,t,r)&&(t=r=x),n=u(n),t=rt(et({},r||t),e,tt),r=rt(et({},t.imports),e.imports,tt);var o,i,f=Ko(r),c=Nt(r,f),a=0;r=t.interpolate||Cn;var l="__p+='";r=Ge((t.escape||Cn).source+"|"+r.source+"|"+(r===gn?jn:Cn).source+"|"+(t.evaluate||Cn).source+"|$","g");var p="sourceURL"in t?"//# sourceURL="+t.sourceURL+"\n":"";if(n.replace(r,function(t,r,e,u,f,c){return e||(e=u),l+=n.slice(a,c).replace(Sn,s),r&&(o=!0,l+="'+__e("+r+")+'"),f&&(i=!0,l+="';"+f+";\n__p+='"),e&&(l+="'+((__t=("+e+"))==null?'':__t)+'"),a=c+t.length,t}),l+="';",(t=t.variable)||(l="with(obj){"+l+"}"),l=(i?l.replace(fn,""):l).replace(cn,"$1").replace(an,"$1;"),l="function("+(t||"obj")+"){"+(t?"":"obj||(obj={});")+"var __t,__p=''"+(o?",__e=_.escape":"")+(i?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+l+"return __p}",t=ri(function(){return Ke(f,p+"return "+l).apply(x,c)}),t.source=l,ge(t))throw t;return t},Nn.trim=We,Nn.trimLeft=function(n,t,r){var e=n;return(n=u(n))?n.slice((r?$r(e,t,r):null==t)?g(n):o(n,t+"")):n},Nn.trimRight=function(n,t,r){var e=n;return(n=u(n))?(r?$r(e,t,r):null==t)?n.slice(0,y(n)+1):n.slice(0,i(n,t+"")+1):n},Nn.trunc=function(n,t,r){r&&$r(n,t,r)&&(t=x);var e=S;if(r=U,null!=t)if(de(t)){var o="separator"in t?t.separator:o,e="length"in t?+t.length||0:e;r="omission"in t?u(t.omission):r}else e=+t||0;if(n=u(n),e>=n.length)return n;if(e-=r.length,1>e)return r;if(t=n.slice(0,e),null==o)return t+r;if(me(o)){if(n.slice(e).search(o)){var i,f=n.slice(0,e);for(o.global||(o=Ge(o.source,(kn.exec(o)||"")+"g")),o.lastIndex=0;n=o.exec(f);)i=n.index;t=t.slice(0,null==i?e:i)}}else n.indexOf(o,e)!=e&&(o=t.lastIndexOf(o),-1u.__dir__?"Right":"")}),u},zn.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),Kn(["filter","map","takeWhile"],function(n,t){var r=t+1,e=r!=N;zn.prototype[n]=function(n,t){var u=this.clone();return u.__iteratees__.push({iteratee:mr(n,t,1),type:r}),u.__filtered__=u.__filtered__||e,u}}),Kn(["first","last"],function(n,t){var r="take"+(t?"Right":"");zn.prototype[n]=function(){return this[r](1).value()[0]}}),Kn(["initial","rest"],function(n,t){var r="drop"+(t?"":"Right");zn.prototype[n]=function(){return this.__filtered__?new zn(this):this[r](1)}}),Kn(["pluck","where"],function(n,t){var r=t?"filter":"map",e=t?At:Be;zn.prototype[n]=function(n){return this[r](e(n))}}),zn.prototype.compact=function(){return this.filter(Ne)},zn.prototype.reject=function(n,t){return n=mr(n,t,1),this.filter(function(t){return!n(t)})},zn.prototype.slice=function(n,t){n=null==n?0:+n||0;var r=this;return r.__filtered__&&(0t)?new zn(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==x&&(t=+t||0,r=0>t?r.dropRight(-t):r.take(t-n)),r)},zn.prototype.takeRightWhile=function(n,t){return this.reverse().takeWhile(n,t).reverse()},zn.prototype.toArray=function(){return this.take(Cu)},gt(zn.prototype,function(n,t){var r=/^(?:filter|map|reject)|While$/.test(t),e=/^(?:first|last)$/.test(t),u=Nn[e?"take"+("last"==t?"Right":""):t];u&&(Nn.prototype[t]=function(){var t=e?[1]:arguments,o=this.__chain__,i=this.__wrapped__,f=!!this.__actions__.length,c=i instanceof zn,a=t[0],l=c||Wo(i);l&&r&&"function"==typeof a&&1!=a.length&&(c=l=!1);var s=function(n){return e&&o?u(n,1)[0]:u.apply(x,Hn([n],t))},a={func:re,args:[s],thisArg:x},f=c&&!f;return e&&!o?f?(i=i.clone(),i.__actions__.push(a),n.call(i)):u.call(x,this.value())[0]:!e&&l?(i=f?i:new zn(this),i=n.apply(i,t),i.__actions__.push(a),new Pn(i,o)):this.thru(s)})}),Kn("join pop push replace shift sort splice split unshift".split(" "),function(n){var t=(/^(?:replace|split)$/.test(n)?tu:He)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=!Tu.spliceObjects&&/^(?:pop|shift|splice)$/.test(n),u=/^(?:join|pop|replace|shift)$/.test(n),o=e?function(){var n=t.apply(this,arguments);return 0===this.length&&delete this[0],n}:t;Nn.prototype[n]=function(){var n=arguments;return u&&!this.__chain__?o.apply(this.value(),n):this[r](function(t){return o.apply(t,n)})}}),gt(zn.prototype,function(n,t){var r=Nn[t];if(r){var e=r.name+"";(Fu[e]||(Fu[e]=[])).push({name:t,func:r})}}),Fu[hr(x,A).name]=[{name:"wrapper",func:x}],zn.prototype.clone=function(){var n=new zn(this.__wrapped__);return n.__actions__=qn(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=qn(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=qn(this.__views__),n},zn.prototype.reverse=function(){if(this.__filtered__){var n=new zn(this);n.__dir__=-1,n.__filtered__=!0}else n=this.clone(),n.__dir__*=-1;return n},zn.prototype.value=function(){var n,t=this.__wrapped__.value(),r=this.__dir__,e=Wo(t),u=0>r,o=e?t.length:0;n=0;for(var i=o,f=this.__views__,c=-1,a=f.length;++c"'`]/g,pn=RegExp(ln.source),hn=RegExp(sn.source),_n=/<%-([\s\S]+?)%>/g,vn=/<%([\s\S]+?)%>/g,gn=/<%=([\s\S]+?)%>/g,yn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,dn=/^\w*$/,wn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g,xn=/^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g,bn=RegExp(xn.source),mn=/[\u0300-\u036f\ufe20-\ufe23]/g,An=/\\(\\)?/g,jn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,kn=/\w*$/,On=/^0[xX]/,In=/^\[object .+?Constructor\]$/,Rn=/^\d+$/,En=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,Cn=/($^)/,Sn=/['\n\r\u2028\u2029\\]/g,Un=RegExp("[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?=[A-Z\\xc0-\\xd6\\xd8-\\xde][a-z\\xdf-\\xf6\\xf8-\\xff]+)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+|[A-Z\\xc0-\\xd6\\xd8-\\xde]+|[0-9]+","g"),$n="Array ArrayBuffer Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Math Number Object RegExp Set String _ clearTimeout isFinite parseFloat parseInt setTimeout TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap".split(" "),Wn="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),Fn={};Fn[X]=Fn[H]=Fn[Q]=Fn[nn]=Fn[tn]=Fn[rn]=Fn[en]=Fn[un]=Fn[on]=!0,Fn[z]=Fn[B]=Fn[J]=Fn[D]=Fn[M]=Fn[q]=Fn[K]=Fn["[object Map]"]=Fn[V]=Fn[Z]=Fn[Y]=Fn["[object Set]"]=Fn[G]=Fn["[object WeakMap]"]=!1;var Ln={};Ln[z]=Ln[B]=Ln[J]=Ln[D]=Ln[M]=Ln[X]=Ln[H]=Ln[Q]=Ln[nn]=Ln[tn]=Ln[V]=Ln[Z]=Ln[Y]=Ln[G]=Ln[rn]=Ln[en]=Ln[un]=Ln[on]=!0,Ln[q]=Ln[K]=Ln["[object Map]"]=Ln["[object Set]"]=Ln["[object WeakMap]"]=!1;var Nn={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss"},Tn={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},Pn={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},zn={"function":!0,object:!0},Bn={0:"x30",1:"x31",2:"x32",3:"x33",4:"x34",5:"x35",6:"x36",7:"x37",8:"x38",9:"x39",A:"x41",B:"x42",C:"x43",D:"x44",E:"x45",F:"x46",a:"x61",b:"x62",c:"x63",d:"x64",e:"x65",f:"x66",n:"x6e",r:"x72",t:"x74",u:"x75",v:"x76",x:"x78"},Dn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Mn=zn[typeof exports]&&exports&&!exports.nodeType&&exports,qn=zn[typeof module]&&module&&!module.nodeType&&module,Kn=zn[typeof self]&&self&&self.Object&&self,Vn=zn[typeof window]&&window&&window.Object&&window,Zn=qn&&qn.exports===Mn&&Mn,Yn=Mn&&qn&&"object"==typeof global&&global&&global.Object&&global||Vn!==(this&&this.window)&&Vn||Kn||this,Gn=function(){try{Object({toString:0}+"")}catch(n){return function(){return!1}}return function(n){return"function"!=typeof n.toString&&"string"==typeof(n+"")}}(),Jn=w();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(Yn._=Jn,define(function(){return Jn})):Mn&&qn?Zn?(qn.exports=Jn)._=Jn:Mn._=Jn:Yn._=Jn}).call(this); \ No newline at end of file diff --git a/spring-boot-swagger/src/main/resources/static/swagger/lib/marked.js b/spring-boot-swagger/src/main/resources/static/swagger/lib/marked.js deleted file mode 100644 index c334bff..0000000 --- a/spring-boot-swagger/src/main/resources/static/swagger/lib/marked.js +++ /dev/null @@ -1 +0,0 @@ -(function(){function e(e){this.tokens=[],this.tokens.links={},this.options=e||a.defaults,this.rules=p.normal,this.options.gfm&&(this.options.tables?this.rules=p.tables:this.rules=p.gfm)}function t(e,t){if(this.options=t||a.defaults,this.links=e,this.rules=u.normal,this.renderer=this.options.renderer||new n,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.gfm?this.options.breaks?this.rules=u.breaks:this.rules=u.gfm:this.options.pedantic&&(this.rules=u.pedantic)}function n(e){this.options=e||{}}function r(e){this.tokens=[],this.token=null,this.options=e||a.defaults,this.options.renderer=this.options.renderer||new n,this.renderer=this.options.renderer,this.renderer.options=this.options}function s(e,t){return e.replace(t?/&/g:/&(?!#?\w+;)/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function i(e){return e.replace(/&([#\w]+);/g,function(e,t){return t=t.toLowerCase(),"colon"===t?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function l(e,t){return e=e.source,t=t||"",function n(r,s){return r?(s=s.source||s,s=s.replace(/(^|[^\[])\^/g,"$1"),e=e.replace(r,s),n):new RegExp(e,t)}}function o(){}function h(e){for(var t,n,r=1;rAn error occured:

    "+s(c.message+"",!0)+"
    ";throw c}}var p={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:o,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:o,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:o,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};p.bullet=/(?:[*+-]|\d+\.)/,p.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,p.item=l(p.item,"gm")(/bull/g,p.bullet)(),p.list=l(p.list)(/bull/g,p.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+p.def.source+")")(),p.blockquote=l(p.blockquote)("def",p.def)(),p._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b",p.html=l(p.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,p._tag)(),p.paragraph=l(p.paragraph)("hr",p.hr)("heading",p.heading)("lheading",p.lheading)("blockquote",p.blockquote)("tag","<"+p._tag)("def",p.def)(),p.normal=h({},p),p.gfm=h({},p.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/}),p.gfm.paragraph=l(p.paragraph)("(?!","(?!"+p.gfm.fences.source.replace("\\1","\\2")+"|"+p.list.source.replace("\\1","\\3")+"|")(),p.tables=h({},p.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/}),e.rules=p,e.lex=function(t,n){var r=new e(n);return r.lex(t)},e.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},e.prototype.token=function(e,t,n){for(var r,s,i,l,o,h,a,u,c,e=e.replace(/^ +$/gm,"");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:i.replace(/\n+$/,"")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2],text:i[3]});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(t&&(i=this.rules.nptable.exec(e))){for(e=e.substring(i[0].length),h={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/\n$/,"").split("\n")},u=0;u ?/gm,""),this.token(i,t,!0),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),l=i[2],this.tokens.push({type:"list_start",ordered:l.length>1}),i=i[0].match(this.rules.item),r=!1,c=i.length,u=0;u1&&o.length>1||(e=i.slice(u+1).join("\n")+e,u=c-1)),s=r||/\n\n(?!\s*$)/.test(h),u!==c-1&&(r="\n"===h.charAt(h.length-1),s||(s=r)),this.tokens.push({type:s?"loose_item_start":"list_item_start"}),this.token(h,!1,n),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:"pre"===i[1]||"script"===i[1]||"style"===i[1],text:i[0]});else if(!n&&t&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),this.tokens.links[i[1].toLowerCase()]={href:i[2],title:i[3]};else if(t&&(i=this.rules.table.exec(e))){for(e=e.substring(i[0].length),h={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/(?: *\| *)?\n$/,"").split("\n")},u=0;u])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:o,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:o,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/,u.link=l(u.link)("inside",u._inside)("href",u._href)(),u.reflink=l(u.reflink)("inside",u._inside)(),u.normal=h({},u),u.pedantic=h({},u.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/}),u.gfm=h({},u.normal,{escape:l(u.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:l(u.text)("]|","~]|")("|","|https?://|")()}),u.breaks=h({},u.gfm,{br:l(u.br)("{2,}","*")(),text:l(u.gfm.text)("{2,}","*")()}),t.rules=u,t.output=function(e,n,r){var s=new t(n,r);return s.output(e)},t.prototype.output=function(e){for(var t,n,r,i,l="";e;)if(i=this.rules.escape.exec(e))e=e.substring(i[0].length),l+=i[1];else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),"@"===i[2]?(n=":"===i[1].charAt(6)?this.mangle(i[1].substring(7)):this.mangle(i[1]),r=this.mangle("mailto:")+n):(n=s(i[1]),r=n),l+=this.renderer.link(r,null,n);else if(this.inLink||!(i=this.rules.url.exec(e))){if(i=this.rules.tag.exec(e))!this.inLink&&/^/i.test(i[0])&&(this.inLink=!1),e=e.substring(i[0].length),l+=this.options.sanitize?s(i[0]):i[0];else if(i=this.rules.link.exec(e))e=e.substring(i[0].length),this.inLink=!0,l+=this.outputLink(i,{href:i[2],title:i[3]}),this.inLink=!1;else if((i=this.rules.reflink.exec(e))||(i=this.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\s+/g," "),t=this.links[t.toLowerCase()],!t||!t.href){l+=i[0].charAt(0),e=i[0].substring(1)+e;continue}this.inLink=!0,l+=this.outputLink(i,t),this.inLink=!1}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),l+=this.renderer.strong(this.output(i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),l+=this.renderer.em(this.output(i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),l+=this.renderer.codespan(s(i[2],!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),l+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),l+=this.renderer.del(this.output(i[1]));else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),l+=s(this.smartypants(i[0]));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else e=e.substring(i[0].length),n=s(i[1]),r=n,l+=this.renderer.link(r,null,n);return l},t.prototype.outputLink=function(e,t){var n=s(t.href),r=t.title?s(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,s(e[1]))},t.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/--/g,"—").replace(/(^|[-\u2014\/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014\/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},t.prototype.mangle=function(e){for(var t,n="",r=e.length,s=0;s.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n},n.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?'
    '+(n?e:s(e,!0))+"\n
    \n":"
    "+(n?e:s(e,!0))+"\n
    "},n.prototype.blockquote=function(e){return"
    \n"+e+"
    \n"},n.prototype.html=function(e){return e},n.prototype.heading=function(e,t,n){return"'+e+"\n"},n.prototype.hr=function(){return this.options.xhtml?"
    \n":"
    \n"},n.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+"\n"},n.prototype.listitem=function(e){return"
  • "+e+"
  • \n"},n.prototype.paragraph=function(e){return"

    "+e+"

    \n"},n.prototype.table=function(e,t){return"
    \n\n"+e+"\n\n"+t+"\n
    \n"},n.prototype.tablerow=function(e){return"\n"+e+"\n"},n.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">";return r+e+"\n"},n.prototype.strong=function(e){return""+e+""},n.prototype.em=function(e){return""+e+""},n.prototype.codespan=function(e){return""+e+""},n.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},n.prototype.del=function(e){return""+e+""},n.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(i(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(s){return""}if(0===r.indexOf("javascript:"))return""}var l='
    "},n.prototype.image=function(e,t,n){var r=''+n+'":">"},r.parse=function(e,t,n){var s=new r(t,n);return s.parse(e)},r.prototype.parse=function(e){this.inline=new t(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var n="";this.next();)n+=this.tok();return n},r.prototype.next=function(){return this.token=this.tokens.pop()},r.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},r.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},r.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,s,i="",l="";for(n="",e=0;e/g,">").replace(/\"/g,""")}function f(t,r){r=r.replace(/[\x00-\x20]+/g,""),r=r.replace(/<\!\-\-.*?\-\-\>/g,"");var n=r.match(/^([a-zA-Z]+)\:/);if(!n)return!1;var s=n[1].toLowerCase();return i(e.allowedSchemesByTag,t)?e.allowedSchemesByTag[t].indexOf(s)===-1:!e.allowedSchemes||e.allowedSchemes.indexOf(s)===-1}function p(t,e){return e?(t=t.split(/\s+/),t.filter(function(t){return e.indexOf(t)!==-1}).join(" ")):t}var d="";e?(e=a(s.defaults,e),e.parser?e.parser=a(u,e.parser):e.parser=u):(e=s.defaults,e.parser=u);var g,_,m=e.nonTextTags||["script","style","textarea"];e.allowedAttributes&&(g={},_={},n(e.allowedAttributes,function(t,e){g[e]=[];var r=[];t.forEach(function(t){t.indexOf("*")>=0?r.push(c(t).replace(/\\\*/g,".*")):g[e].push(t)}),_[e]=new RegExp("^("+r.join("|")+")$")}));var b={};n(e.allowedClasses,function(t,e){g&&(i(g,e)||(g[e]=[]),g[e].push("class")),b[e]=t});var y,v={};n(e.transformTags,function(t,e){var r;"function"==typeof t?r=t:"string"==typeof t&&(r=s.simpleTransform(t)),"*"===e?y=r:v[e]=r});var w=0,x=[],S={},E={},T=!1,A=0,k=new o.Parser({onopentag:function(t,r){if(T)return void A++;var s=new h(t,r);x.push(s);var o,a=!1,c=!!s.text;i(v,t)&&(o=v[t](t,r),s.attribs=r=o.attribs,void 0!==o.text&&(s.innerText=o.text),t!==o.tagName&&(s.name=t=o.tagName,E[w]=o.tagName)),y&&(o=y(t,r),s.attribs=r=o.attribs,t!==o.tagName&&(s.name=t=o.tagName,E[w]=o.tagName)),e.allowedTags&&e.allowedTags.indexOf(t)===-1&&(a=!0,m.indexOf(t)!==-1&&(T=!0,A=1),S[w]=!0),w++,a||(d+="<"+t,(!g||i(g,t)||g["*"])&&n(r,function(e,r){if(!g||i(g,t)&&g[t].indexOf(r)!==-1||g["*"]&&g["*"].indexOf(r)!==-1||i(_,t)&&_[t].test(r)||_["*"]&&_["*"].test(r)){if(("href"===r||"src"===r)&&f(t,e))return void delete s.attribs[r];if("class"===r&&(e=p(e,b[t]),!e.length))return void delete s.attribs[r];d+=" "+r,e.length&&(d+='="'+l(e)+'"')}else delete s.attribs[r]}),e.selfClosing.indexOf(t)!==-1?d+=" />":(d+=">",!s.innerText||c||e.textFilter||(d+=s.innerText)))},ontext:function(t){if(!T){var r,n=x[x.length-1];if(n&&(r=n.tag,t=void 0!==n.innerText?n.innerText:t),"script"===r||"style"===r)d+=t;else{var i=l(t);d+=e.textFilter?e.textFilter(i):i}if(x.length){var s=x[x.length-1];s.text+=t}}},onclosetag:function(t){if(T){if(A--,A)return;T=!1}var r=x.pop();if(r){if(T=!1,w--,S[w])return delete S[w],void r.updateParentNodeText();if(E[w]&&(t=E[w],delete E[w]),e.exclusiveFilter&&e.exclusiveFilter(r))return void(d=d.substr(0,r.tagPosition));r.updateParentNodeText(),e.selfClosing.indexOf(t)===-1&&(d+="")}}},e.parser);return k.write(t),k.end(),d}var o=t("htmlparser2"),a=t("xtend"),c=t("regexp-quote");e.exports=s;var u={decodeEntities:!0};s.defaults={allowedTags:["h3","h4","h5","h6","blockquote","p","a","ul","ol","nl","li","b","i","strong","em","strike","code","hr","br","div","table","thead","caption","tbody","tr","th","td","pre"],allowedAttributes:{a:["href","name","target"],img:["src"]},selfClosing:["img","br","hr","area","base","basefont","input","link","meta"],allowedSchemes:["http","https","ftp","mailto"],allowedSchemesByTag:{}},s.simpleTransform=function(t,e,r){return r=void 0===r||r,e=e||{},function(n,i){var s;if(r)for(s in e)i[s]=e[s];else i=e;return{tagName:t,attribs:i}}}},{htmlparser2:36,"regexp-quote":54,xtend:58}],2:[function(t,e,r){"use strict";function n(){for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e=0,r=t.length;e0)throw new Error("Invalid string. Length must be a multiple of 4");s="="===t[a-2]?2:"="===t[a-1]?1:0,o=new h(3*a/4-s),n=s>0?a-4:a;var c=0;for(e=0,r=0;e>16&255,o[c++]=i>>8&255,o[c++]=255&i;return 2===s?(i=u[t.charCodeAt(e)]<<2|u[t.charCodeAt(e+1)]>>4,o[c++]=255&i):1===s&&(i=u[t.charCodeAt(e)]<<10|u[t.charCodeAt(e+1)]<<4|u[t.charCodeAt(e+2)]>>2,o[c++]=i>>8&255,o[c++]=255&i),o}function s(t){return c[t>>18&63]+c[t>>12&63]+c[t>>6&63]+c[63&t]}function o(t,e,r){for(var n,i=[],o=e;oh?h:u+a));return 1===n?(e=t[r-1],i+=c[e>>2],i+=c[e<<4&63],i+="=="):2===n&&(e=(t[r-2]<<8)+t[r-1],i+=c[e>>10],i+=c[e>>4&63],i+=c[e<<2&63],i+="="),s.push(i),s.join("")}r.toByteArray=i,r.fromByteArray=a;var c=[],u=[],h="undefined"!=typeof Uint8Array?Uint8Array:Array;n()},{}],3:[function(t,e,r){},{}],4:[function(t,e,r){(function(e){"use strict";var n=t("buffer"),i=n.Buffer,s=n.SlowBuffer,o=n.kMaxLength||2147483647;r.alloc=function(t,e,r){if("function"==typeof i.alloc)return i.alloc(t,e,r);if("number"==typeof r)throw new TypeError("encoding must not be number");if("number"!=typeof t)throw new TypeError("size must be a number");if(t>o)throw new RangeError("size is too large");var n=r,s=e;void 0===s&&(n=void 0,s=0);var a=new i(t);if("string"==typeof s)for(var c=new i(s,n),u=c.length,h=-1;++ho)throw new RangeError("size is too large");return new i(t)},r.from=function(t,r,n){if("function"==typeof i.from&&(!e.Uint8Array||Uint8Array.from!==i.from))return i.from(t,r,n);if("number"==typeof t)throw new TypeError('"value" argument must not be a number');if("string"==typeof t)return new i(t,r);if("undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer){var s=r;if(1===arguments.length)return new i(t);"undefined"==typeof s&&(s=0);var o=n;if("undefined"==typeof o&&(o=t.byteLength-s),s>=t.byteLength)throw new RangeError("'offset' is out of bounds");if(o>t.byteLength-s)throw new RangeError("'length' is out of bounds");return new i(t.slice(s,s+o))}if(i.isBuffer(t)){var a=new i(t.length);return t.copy(a,0,0,t.length),a}if(t){if(Array.isArray(t)||"undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return new i(t);if("Buffer"===t.type&&Array.isArray(t.data))return new i(t.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")},r.allocUnsafeSlow=function(t){if("function"==typeof i.allocUnsafeSlow)return i.allocUnsafeSlow(t);if("number"!=typeof t)throw new TypeError("size must be a number");if(t>=o)throw new RangeError("size is too large");return new s(t)}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{buffer:5}],5:[function(t,e,r){(function(e){"use strict";function n(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()&&"function"==typeof t.subarray&&0===t.subarray(1,1).byteLength}catch(e){return!1}}function i(){return o.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(t,e){if(i()=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|t}function _(t){return+t!=t&&(t=0),o.alloc(+t)}function m(t,e){if(o.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return F(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return X(t).length;default:if(n)return F(t).length;e=(""+e).toLowerCase(),n=!0}}function b(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if(r>>>=0,e>>>=0,r<=e)return"";for(t||(t="utf8");;)switch(t){case"hex":return D(this,e,r);case"utf8":case"utf-8":return q(this,e,r);case"ascii":return C(this,e,r);case"latin1":case"binary":return B(this,e,r);case"base64":return L(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return j(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function y(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function v(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=o.from(e,n)),o.isBuffer(e))return 0===e.length?-1:w(t,e,r,n,i);if("number"==typeof e)return e=255&e,o.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):w(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function w(t,e,r,n,i){function s(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}var o=1,a=t.length,c=e.length;if(void 0!==n&&(n=String(n).toLowerCase(),"ucs2"===n||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;o=2,a/=2,c/=2,r/=2}var u;if(i){var h=-1;for(u=r;ua&&(r=a-c),u=r;u>=0;u--){for(var l=!0,f=0;fi&&(n=i)):n=i;var s=e.length;if(s%2!==0)throw new TypeError("Invalid hex string");n>s/2&&(n=s/2);for(var o=0;o239?4:s>223?3:s>191?2:1;if(i+a<=r){var c,u,h,l;switch(a){case 1:s<128&&(o=s);break;case 2:c=t[i+1],128===(192&c)&&(l=(31&s)<<6|63&c,l>127&&(o=l));break;case 3:c=t[i+1],u=t[i+2],128===(192&c)&&128===(192&u)&&(l=(15&s)<<12|(63&c)<<6|63&u,l>2047&&(l<55296||l>57343)&&(o=l));break;case 4:c=t[i+1],u=t[i+2],h=t[i+3],128===(192&c)&&128===(192&u)&&128===(192&h)&&(l=(15&s)<<18|(63&c)<<12|(63&u)<<6|63&h,l>65535&&l<1114112&&(o=l))}}null===o?(o=65533,a=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=a}return R(n)}function R(t){var e=t.length;if(e<=tt)return String.fromCharCode.apply(String,t);for(var r="",n=0;nn)&&(r=n);for(var i="",s=e;sr)throw new RangeError("Trying to access beyond buffer length")}function O(t,e,r,n,i,s){if(!o.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function M(t,e,r,n){e<0&&(e=65535+e+1);for(var i=0,s=Math.min(t.length-r,2);i>>8*(n?i:1-i)}function I(t,e,r,n){e<0&&(e=4294967295+e+1);for(var i=0,s=Math.min(t.length-r,4);i>>8*(n?i:3-i)&255}function P(t,e,r,n,i,s){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function U(t,e,r,n,i){return i||P(t,e,r,4,3.4028234663852886e38,-3.4028234663852886e38),K.write(t,e,r,n,23,4),r+4}function H(t,e,r,n,i){return i||P(t,e,r,8,1.7976931348623157e308,-1.7976931348623157e308),K.write(t,e,r,n,52,8),r+8}function V(t){if(t=z(t).replace(et,""),t.length<2)return"";for(;t.length%4!==0;)t+="=";return t}function z(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function Y(t){return t<16?"0"+t.toString(16):t.toString(16)}function F(t,e){e=e||1/0;for(var r,n=t.length,i=null,s=[],o=0;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&s.push(239,191,189);continue}if(o+1===n){(e-=3)>-1&&s.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&s.push(239,191,189),i=r;continue}r=(i-55296<<10|r-56320)+65536}else i&&(e-=3)>-1&&s.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;s.push(r)}else if(r<2048){if((e-=2)<0)break;s.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;s.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;s.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return s}function G(t){for(var e=[],r=0;r>8,i=r%256,s.push(i),s.push(n);return s}function X(t){return Z.toByteArray(V(t))}function Q(t,e,r,n){for(var i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function J(t){return t!==t}var Z=t("base64-js"),K=t("ieee754"),$=t("isarray");r.Buffer=o,r.SlowBuffer=_,r.INSPECT_MAX_BYTES=50,o.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:n(),r.kMaxLength=i(),o.poolSize=8192,o._augment=function(t){return t.__proto__=o.prototype,t},o.from=function(t,e,r){return a(null,t,e,r)},o.TYPED_ARRAY_SUPPORT&&(o.prototype.__proto__=Uint8Array.prototype,o.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&o[Symbol.species]===o&&Object.defineProperty(o,Symbol.species,{value:null,configurable:!0})),o.alloc=function(t,e,r){return u(null,t,e,r)},o.allocUnsafe=function(t){return h(null,t)},o.allocUnsafeSlow=function(t){return h(null,t)},o.isBuffer=function(t){return!(null==t||!t._isBuffer)},o.compare=function(t,e){if(!o.isBuffer(t)||!o.isBuffer(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var r=t.length,n=e.length,i=0,s=Math.min(r,n);i0&&(t=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(t+=" ... ")),""},o.prototype.compare=function(t,e,r,n,i){if(!o.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(e>>>=0,r>>>=0,n>>>=0,i>>>=0,this===t)return 0;for(var s=i-n,a=r-e,c=Math.min(s,a),u=this.slice(n,i),h=t.slice(e,r),l=0;li)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var s=!1;;)switch(n){case"hex":return x(this,t,e,r);case"utf8":case"utf-8":return S(this,t,e,r);case"ascii":return E(this,t,e,r);case"latin1":case"binary":return T(this,t,e,r);case"base64":return A(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return k(this,t,e,r);default:if(s)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),s=!0}},o.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var tt=4096;o.prototype.slice=function(t,e){var r=this.length;t=~~t,e=void 0===e?r:~~e,t<0?(t+=r,t<0&&(t=0)):t>r&&(t=r),e<0?(e+=r,e<0&&(e=0)):e>r&&(e=r),e0&&(i*=256);)n+=this[t+--e]*i;return n},o.prototype.readUInt8=function(t,e){return e||N(t,1,this.length),this[t]},o.prototype.readUInt16LE=function(t,e){return e||N(t,2,this.length),this[t]|this[t+1]<<8},o.prototype.readUInt16BE=function(t,e){return e||N(t,2,this.length),this[t]<<8|this[t+1]},o.prototype.readUInt32LE=function(t,e){return e||N(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},o.prototype.readUInt32BE=function(t,e){return e||N(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},o.prototype.readIntLE=function(t,e,r){t=0|t,e=0|e,r||N(t,e,this.length);for(var n=this[t],i=1,s=0;++s=i&&(n-=Math.pow(2,8*e)),n},o.prototype.readIntBE=function(t,e,r){t=0|t,e=0|e,r||N(t,e,this.length);for(var n=e,i=1,s=this[t+--n];n>0&&(i*=256);)s+=this[t+--n]*i;return i*=128,s>=i&&(s-=Math.pow(2,8*e)),s},o.prototype.readInt8=function(t,e){return e||N(t,1,this.length),128&this[t]?(255-this[t]+1)*-1:this[t]},o.prototype.readInt16LE=function(t,e){e||N(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},o.prototype.readInt16BE=function(t,e){e||N(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},o.prototype.readInt32LE=function(t,e){return e||N(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},o.prototype.readInt32BE=function(t,e){return e||N(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},o.prototype.readFloatLE=function(t,e){return e||N(t,4,this.length),K.read(this,t,!0,23,4)},o.prototype.readFloatBE=function(t,e){return e||N(t,4,this.length),K.read(this,t,!1,23,4)},o.prototype.readDoubleLE=function(t,e){return e||N(t,8,this.length),K.read(this,t,!0,52,8)},o.prototype.readDoubleBE=function(t,e){return e||N(t,8,this.length),K.read(this,t,!1,52,8)},o.prototype.writeUIntLE=function(t,e,r,n){if(t=+t,e=0|e,r=0|r,!n){var i=Math.pow(2,8*r)-1;O(this,t,e,r,i,0)}var s=1,o=0;for(this[e]=255&t;++o=0&&(o*=256);)this[e+s]=t/o&255;return e+r},o.prototype.writeUInt8=function(t,e,r){return t=+t,e=0|e,r||O(this,t,e,1,255,0),o.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},o.prototype.writeUInt16LE=function(t,e,r){return t=+t,e=0|e,r||O(this,t,e,2,65535,0),o.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):M(this,t,e,!0),e+2},o.prototype.writeUInt16BE=function(t,e,r){return t=+t,e=0|e,r||O(this,t,e,2,65535,0),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):M(this,t,e,!1),e+2},o.prototype.writeUInt32LE=function(t,e,r){return t=+t,e=0|e,r||O(this,t,e,4,4294967295,0),o.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):I(this,t,e,!0),e+4},o.prototype.writeUInt32BE=function(t,e,r){return t=+t,e=0|e,r||O(this,t,e,4,4294967295,0),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):I(this,t,e,!1),e+4},o.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e=0|e,!n){var i=Math.pow(2,8*r-1);O(this,t,e,r,i-1,-i)}var s=0,o=1,a=0;for(this[e]=255&t;++s>0)-a&255;return e+r},o.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e=0|e,!n){var i=Math.pow(2,8*r-1);O(this,t,e,r,i-1,-i)}var s=r-1,o=1,a=0;for(this[e+s]=255&t;--s>=0&&(o*=256);)t<0&&0===a&&0!==this[e+s+1]&&(a=1),this[e+s]=(t/o>>0)-a&255;return e+r},o.prototype.writeInt8=function(t,e,r){return t=+t,e=0|e,r||O(this,t,e,1,127,-128),o.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},o.prototype.writeInt16LE=function(t,e,r){return t=+t,e=0|e,r||O(this,t,e,2,32767,-32768),o.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):M(this,t,e,!0),e+2},o.prototype.writeInt16BE=function(t,e,r){return t=+t,e=0|e,r||O(this,t,e,2,32767,-32768),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):M(this,t,e,!1),e+2},o.prototype.writeInt32LE=function(t,e,r){return t=+t,e=0|e,r||O(this,t,e,4,2147483647,-2147483648),o.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):I(this,t,e,!0),e+4},o.prototype.writeInt32BE=function(t,e,r){return t=+t,e=0|e,r||O(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):I(this,t,e,!1),e+4},o.prototype.writeFloatLE=function(t,e,r){return U(this,t,e,!0,r)},o.prototype.writeFloatBE=function(t,e,r){return U(this,t,e,!1,r)},o.prototype.writeDoubleLE=function(t,e,r){return H(this,t,e,!0,r)},o.prototype.writeDoubleBE=function(t,e,r){return H(this,t,e,!1,r)},o.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e=0;--i)t[i+e]=this[i+r];else if(s<1e3||!o.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,t||(t=0);var s;if("number"==typeof t)for(s=e;s",t.children&&(r+=d(t.children,e)),p[t.name]&&!e.xmlMode||(r+="")):r+="/>",r}function s(t){return"<"+t.data+">"}function o(t,e){var r=t.data||"";return!e.decodeEntities||t.parent&&t.parent.name in f||(r=h.encodeXML(r)),r}function a(t){return""}function c(t){return""}var u=t("domelementtype"),h=t("entities"),l={__proto__:null,allowfullscreen:!0,async:!0,autofocus:!0,autoplay:!0,checked:!0,controls:!0,"default":!0,defer:!0,disabled:!0,hidden:!0,ismap:!0,loop:!0,multiple:!0,muted:!0,open:!0,readonly:!0,required:!0,reversed:!0,scoped:!0,seamless:!0,selected:!0,typemustmatch:!0},f={__proto__:null,style:!0,script:!0,xmp:!0,iframe:!0,noembed:!0,noframes:!0,plaintext:!0,noscript:!0},p={__proto__:null,area:!0,base:!0,basefont:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,isindex:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},d=e.exports=function(t,e){Array.isArray(t)||t.cheerio||(t=[t]),e=e||{};for(var r="",n=0;n-1;){for(e=r=t[i],t[i]=null,n=!0;r;){if(t.indexOf(r)>-1){n=!1,t.splice(i,1);break}r=r.parent}n&&(t[i]=e)}return t};var n={DISCONNECTED:1,PRECEDING:2,FOLLOWING:4,CONTAINS:8,CONTAINED_BY:16},i=r.compareDocumentPosition=function(t,e){var r,i,s,o,a,c,u=[],h=[];if(t===e)return 0;for(r=t;r;)u.unshift(r),r=r.parent;for(r=e;r;)h.unshift(r),r=r.parent;for(c=0;u[c]===h[c];)c++;return 0===c?n.DISCONNECTED:(i=u[c-1],s=i.children,o=u[c],a=h[c],s.indexOf(o)>s.indexOf(a)?i===e?n.FOLLOWING|n.CONTAINED_BY:n.FOLLOWING:i===t?n.PRECEDING|n.CONTAINS:n.PRECEDING)};r.uniqueSort=function(t){var e,r,s=t.length;for(t=t.slice();--s>-1;)e=t[s],r=t.indexOf(e),r>-1&&r0&&(s=i(t,s,r,n),o=o.concat(s),n-=s.length,n<=0)));a++);return o}function s(t,e){for(var r=0,n=e.length;r0&&(r=o(t,e[n].children)));return r}function a(t,e){for(var r=0,n=e.length;r0&&a(t,e[r].children)))return!0;return!1}function c(t,e){for(var r=[],n=0,i=e.length;n0&&(r=r.concat(c(t,e[n].children))));return r}var u=t("domelementtype").isTag;e.exports={filter:n,find:i,findOneChild:s,findOne:o,existsOne:a,findAll:c}},{domelementtype:9}],18:[function(t,e,r){function n(t,e){return t.children?t.children.map(function(t){return o(t,e)}).join(""):""}function i(t){return Array.isArray(t)?t.map(i).join(""):a(t)||t.type===s.CDATA?i(t.children):t.type===s.Text?t.data:""}var s=t("domelementtype"),o=t("dom-serializer"),a=s.isTag;e.exports={getInnerHTML:n,getOuterHTML:o,getText:i}},{"dom-serializer":7,domelementtype:9}],19:[function(t,e,r){var n=r.getChildren=function(t){return t.children},i=r.getParent=function(t){return t.parent};r.getSiblings=function(t){var e=i(t);return e?n(e):[t]},r.getAttributeValue=function(t,e){return t.attribs&&t.attribs[e]},r.hasAttrib=function(t,e){return!!t.attribs&&hasOwnProperty.call(t.attribs,e)},r.getName=function(t){return t.name}},{}],20:[function(t,e,r){var n=t("./lib/encode.js"),i=t("./lib/decode.js");r.decode=function(t,e){return(!e||e<=0?i.XML:i.HTML)(t)},r.decodeStrict=function(t,e){return(!e||e<=0?i.XML:i.HTMLStrict)(t)},r.encode=function(t,e){return(!e||e<=0?n.XML:n.HTML)(t)},r.encodeXML=n.XML,r.encodeHTML4=r.encodeHTML5=r.encodeHTML=n.HTML,r.decodeXML=r.decodeXMLStrict=i.XML,r.decodeHTML4=r.decodeHTML5=r.decodeHTML=i.HTML,r.decodeHTML4Strict=r.decodeHTML5Strict=r.decodeHTMLStrict=i.HTMLStrict,r.escape=n.escape},{"./lib/decode.js":21,"./lib/encode.js":23}],21:[function(t,e,r){function n(t){var e=Object.keys(t).join("|"),r=s(t);e+="|#[xX][\\da-fA-F]+|#\\d+";var n=new RegExp("&(?:"+e+");","g");return function(t){return String(t).replace(n,r)}}function i(t,e){return t=55296&&t<=57343||t>1114111)return"�";t in i&&(t=i[t]);var e="";return t>65535&&(t-=65536,e+=String.fromCharCode(t>>>10&1023|55296),t=56320|1023&t),e+=String.fromCharCode(t)}var i=t("../maps/decode.json");e.exports=n},{"../maps/decode.json":24}],23:[function(t,e,r){function n(t){return Object.keys(t).sort().reduce(function(e,r){return e[t[r]]="&"+r+";",e},{})}function i(t){var e=[],r=[];return Object.keys(t).forEach(function(t){1===t.length?e.push("\\"+t):r.push(t)}),r.unshift("["+e.join("")+"]"),new RegExp(r.join("|"),"g")}function s(t){return"&#x"+t.charCodeAt(0).toString(16).toUpperCase()+";"}function o(t){var e=t.charCodeAt(0),r=t.charCodeAt(1),n=1024*(e-55296)+r-56320+65536;return"&#x"+n.toString(16).toUpperCase()+";"}function a(t,e){function r(e){return t[e]}return function(t){return t.replace(e,r).replace(d,o).replace(p,s)}}function c(t){return t.replace(g,s).replace(d,o).replace(p,s)}var u=n(t("../maps/xml.json")),h=i(u);r.XML=a(u,h);var l=n(t("../maps/entities.json")),f=i(l);r.HTML=a(l,f);var p=/[^\0-\x7F]/g,d=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,g=i(u);r.escape=c},{"../maps/entities.json":25,"../maps/xml.json":27}],24:[function(t,e,r){e.exports={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}},{}],25:[function(t,e,r){e.exports={Aacute:"Á",aacute:"á",Abreve:"Ă",abreve:"ă",ac:"∾",acd:"∿",acE:"∾̳",Acirc:"Â",acirc:"â",acute:"´",Acy:"А",acy:"а",AElig:"Æ",aelig:"æ",af:"⁡",Afr:"𝔄",afr:"𝔞",Agrave:"À",agrave:"à",alefsym:"ℵ",aleph:"ℵ",Alpha:"Α",alpha:"α",Amacr:"Ā",amacr:"ā",amalg:"⨿",amp:"&",AMP:"&",andand:"⩕",And:"⩓",and:"∧",andd:"⩜",andslope:"⩘",andv:"⩚",ang:"∠",ange:"⦤",angle:"∠",angmsdaa:"⦨",angmsdab:"⦩",angmsdac:"⦪",angmsdad:"⦫",angmsdae:"⦬",angmsdaf:"⦭",angmsdag:"⦮",angmsdah:"⦯",angmsd:"∡",angrt:"∟",angrtvb:"⊾",angrtvbd:"⦝",angsph:"∢",angst:"Å",angzarr:"⍼",Aogon:"Ą",aogon:"ą",Aopf:"𝔸",aopf:"𝕒",apacir:"⩯",ap:"≈",apE:"⩰",ape:"≊",apid:"≋",apos:"'",ApplyFunction:"⁡",approx:"≈",approxeq:"≊",Aring:"Å",aring:"å",Ascr:"𝒜",ascr:"𝒶",Assign:"≔",ast:"*",asymp:"≈",asympeq:"≍",Atilde:"Ã",atilde:"ã",Auml:"Ä",auml:"ä",awconint:"∳",awint:"⨑",backcong:"≌",backepsilon:"϶",backprime:"‵",backsim:"∽",backsimeq:"⋍",Backslash:"∖",Barv:"⫧",barvee:"⊽",barwed:"⌅",Barwed:"⌆",barwedge:"⌅",bbrk:"⎵",bbrktbrk:"⎶",bcong:"≌",Bcy:"Б",bcy:"б",bdquo:"„",becaus:"∵",because:"∵",Because:"∵",bemptyv:"⦰",bepsi:"϶",bernou:"ℬ",Bernoullis:"ℬ",Beta:"Β",beta:"β",beth:"ℶ",between:"≬",Bfr:"𝔅",bfr:"𝔟",bigcap:"⋂",bigcirc:"◯",bigcup:"⋃",bigodot:"⨀",bigoplus:"⨁",bigotimes:"⨂",bigsqcup:"⨆",bigstar:"★",bigtriangledown:"▽",bigtriangleup:"△",biguplus:"⨄",bigvee:"⋁",bigwedge:"⋀",bkarow:"⤍",blacklozenge:"⧫",blacksquare:"▪",blacktriangle:"▴",blacktriangledown:"▾",blacktriangleleft:"◂",blacktriangleright:"▸",blank:"␣",blk12:"▒",blk14:"░",blk34:"▓",block:"█",bne:"=⃥",bnequiv:"≡⃥",bNot:"⫭",bnot:"⌐",Bopf:"𝔹",bopf:"𝕓",bot:"⊥",bottom:"⊥",bowtie:"⋈",boxbox:"⧉",boxdl:"┐",boxdL:"╕",boxDl:"╖",boxDL:"╗",boxdr:"┌",boxdR:"╒",boxDr:"╓",boxDR:"╔",boxh:"─",boxH:"═",boxhd:"┬",boxHd:"╤",boxhD:"╥",boxHD:"╦",boxhu:"┴",boxHu:"╧",boxhU:"╨",boxHU:"╩",boxminus:"⊟",boxplus:"⊞",boxtimes:"⊠",boxul:"┘",boxuL:"╛",boxUl:"╜",boxUL:"╝",boxur:"└",boxuR:"╘",boxUr:"╙",boxUR:"╚",boxv:"│",boxV:"║",boxvh:"┼",boxvH:"╪",boxVh:"╫",boxVH:"╬",boxvl:"┤",boxvL:"╡",boxVl:"╢",boxVL:"╣",boxvr:"├",boxvR:"╞",boxVr:"╟",boxVR:"╠",bprime:"‵",breve:"˘",Breve:"˘",brvbar:"¦",bscr:"𝒷",Bscr:"ℬ",bsemi:"⁏",bsim:"∽",bsime:"⋍",bsolb:"⧅",bsol:"\\",bsolhsub:"⟈",bull:"•",bullet:"•",bump:"≎",bumpE:"⪮",bumpe:"≏",Bumpeq:"≎",bumpeq:"≏",Cacute:"Ć",cacute:"ć",capand:"⩄",capbrcup:"⩉",capcap:"⩋",cap:"∩",Cap:"⋒",capcup:"⩇",capdot:"⩀",CapitalDifferentialD:"ⅅ",caps:"∩︀",caret:"⁁",caron:"ˇ",Cayleys:"ℭ",ccaps:"⩍",Ccaron:"Č",ccaron:"č",Ccedil:"Ç",ccedil:"ç",Ccirc:"Ĉ",ccirc:"ĉ",Cconint:"∰",ccups:"⩌",ccupssm:"⩐",Cdot:"Ċ",cdot:"ċ",cedil:"¸",Cedilla:"¸",cemptyv:"⦲",cent:"¢",centerdot:"·",CenterDot:"·",cfr:"𝔠",Cfr:"ℭ",CHcy:"Ч",chcy:"ч",check:"✓",checkmark:"✓",Chi:"Χ",chi:"χ",circ:"ˆ",circeq:"≗",circlearrowleft:"↺",circlearrowright:"↻",circledast:"⊛",circledcirc:"⊚",circleddash:"⊝",CircleDot:"⊙",circledR:"®",circledS:"Ⓢ",CircleMinus:"⊖",CirclePlus:"⊕",CircleTimes:"⊗",cir:"○",cirE:"⧃",cire:"≗",cirfnint:"⨐",cirmid:"⫯",cirscir:"⧂",ClockwiseContourIntegral:"∲",CloseCurlyDoubleQuote:"”",CloseCurlyQuote:"’",clubs:"♣",clubsuit:"♣",colon:":",Colon:"∷",Colone:"⩴",colone:"≔",coloneq:"≔",comma:",",commat:"@",comp:"∁",compfn:"∘",complement:"∁",complexes:"ℂ",cong:"≅",congdot:"⩭",Congruent:"≡",conint:"∮",Conint:"∯",ContourIntegral:"∮",copf:"𝕔",Copf:"ℂ",coprod:"∐",Coproduct:"∐",copy:"©",COPY:"©",copysr:"℗",CounterClockwiseContourIntegral:"∳",crarr:"↵",cross:"✗",Cross:"⨯",Cscr:"𝒞",cscr:"𝒸",csub:"⫏",csube:"⫑",csup:"⫐",csupe:"⫒",ctdot:"⋯",cudarrl:"⤸",cudarrr:"⤵",cuepr:"⋞",cuesc:"⋟",cularr:"↶",cularrp:"⤽",cupbrcap:"⩈",cupcap:"⩆",CupCap:"≍",cup:"∪",Cup:"⋓",cupcup:"⩊",cupdot:"⊍",cupor:"⩅",cups:"∪︀",curarr:"↷",curarrm:"⤼",curlyeqprec:"⋞",curlyeqsucc:"⋟",curlyvee:"⋎",curlywedge:"⋏",curren:"¤",curvearrowleft:"↶",curvearrowright:"↷",cuvee:"⋎",cuwed:"⋏",cwconint:"∲",cwint:"∱",cylcty:"⌭",dagger:"†",Dagger:"‡",daleth:"ℸ",darr:"↓",Darr:"↡",dArr:"⇓",dash:"‐",Dashv:"⫤",dashv:"⊣",dbkarow:"⤏",dblac:"˝",Dcaron:"Ď",dcaron:"ď",Dcy:"Д",dcy:"д",ddagger:"‡",ddarr:"⇊",DD:"ⅅ",dd:"ⅆ",DDotrahd:"⤑",ddotseq:"⩷",deg:"°",Del:"∇",Delta:"Δ",delta:"δ",demptyv:"⦱",dfisht:"⥿",Dfr:"𝔇",dfr:"𝔡",dHar:"⥥",dharl:"⇃",dharr:"⇂",DiacriticalAcute:"´",DiacriticalDot:"˙",DiacriticalDoubleAcute:"˝",DiacriticalGrave:"`",DiacriticalTilde:"˜",diam:"⋄",diamond:"⋄",Diamond:"⋄",diamondsuit:"♦",diams:"♦",die:"¨",DifferentialD:"ⅆ",digamma:"ϝ",disin:"⋲",div:"÷",divide:"÷",divideontimes:"⋇",divonx:"⋇",DJcy:"Ђ",djcy:"ђ",dlcorn:"⌞",dlcrop:"⌍",dollar:"$",Dopf:"𝔻",dopf:"𝕕",Dot:"¨",dot:"˙",DotDot:"⃜",doteq:"≐",doteqdot:"≑",DotEqual:"≐",dotminus:"∸",dotplus:"∔",dotsquare:"⊡",doublebarwedge:"⌆",DoubleContourIntegral:"∯",DoubleDot:"¨",DoubleDownArrow:"⇓",DoubleLeftArrow:"⇐",DoubleLeftRightArrow:"⇔",DoubleLeftTee:"⫤",DoubleLongLeftArrow:"⟸",DoubleLongLeftRightArrow:"⟺",DoubleLongRightArrow:"⟹",DoubleRightArrow:"⇒",DoubleRightTee:"⊨",DoubleUpArrow:"⇑",DoubleUpDownArrow:"⇕",DoubleVerticalBar:"∥",DownArrowBar:"⤓",downarrow:"↓",DownArrow:"↓",Downarrow:"⇓",DownArrowUpArrow:"⇵",DownBreve:"̑",downdownarrows:"⇊",downharpoonleft:"⇃",downharpoonright:"⇂",DownLeftRightVector:"⥐",DownLeftTeeVector:"⥞",DownLeftVectorBar:"⥖",DownLeftVector:"↽",DownRightTeeVector:"⥟",DownRightVectorBar:"⥗",DownRightVector:"⇁",DownTeeArrow:"↧",DownTee:"⊤",drbkarow:"⤐",drcorn:"⌟",drcrop:"⌌",Dscr:"𝒟",dscr:"𝒹",DScy:"Ѕ",dscy:"ѕ",dsol:"⧶",Dstrok:"Đ",dstrok:"đ",dtdot:"⋱",dtri:"▿",dtrif:"▾",duarr:"⇵",duhar:"⥯",dwangle:"⦦",DZcy:"Џ",dzcy:"џ",dzigrarr:"⟿",Eacute:"É",eacute:"é",easter:"⩮",Ecaron:"Ě",ecaron:"ě",Ecirc:"Ê",ecirc:"ê",ecir:"≖",ecolon:"≕",Ecy:"Э",ecy:"э",eDDot:"⩷",Edot:"Ė",edot:"ė",eDot:"≑",ee:"ⅇ",efDot:"≒",Efr:"𝔈",efr:"𝔢",eg:"⪚",Egrave:"È",egrave:"è",egs:"⪖",egsdot:"⪘",el:"⪙",Element:"∈",elinters:"⏧",ell:"ℓ",els:"⪕",elsdot:"⪗",Emacr:"Ē",emacr:"ē",empty:"∅",emptyset:"∅",EmptySmallSquare:"◻",emptyv:"∅",EmptyVerySmallSquare:"▫",emsp13:" ",emsp14:" ",emsp:" ",ENG:"Ŋ",eng:"ŋ",ensp:" ",Eogon:"Ę",eogon:"ę",Eopf:"𝔼",eopf:"𝕖",epar:"⋕",eparsl:"⧣",eplus:"⩱",epsi:"ε",Epsilon:"Ε",epsilon:"ε",epsiv:"ϵ",eqcirc:"≖",eqcolon:"≕",eqsim:"≂",eqslantgtr:"⪖",eqslantless:"⪕",Equal:"⩵",equals:"=",EqualTilde:"≂",equest:"≟",Equilibrium:"⇌",equiv:"≡",equivDD:"⩸",eqvparsl:"⧥",erarr:"⥱",erDot:"≓",escr:"ℯ",Escr:"ℰ",esdot:"≐",Esim:"⩳",esim:"≂",Eta:"Η",eta:"η",ETH:"Ð",eth:"ð",Euml:"Ë",euml:"ë",euro:"€",excl:"!",exist:"∃",Exists:"∃",expectation:"ℰ",exponentiale:"ⅇ",ExponentialE:"ⅇ",fallingdotseq:"≒",Fcy:"Ф",fcy:"ф",female:"♀",ffilig:"ffi",fflig:"ff",ffllig:"ffl",Ffr:"𝔉",ffr:"𝔣",filig:"fi",FilledSmallSquare:"◼",FilledVerySmallSquare:"▪",fjlig:"fj",flat:"♭",fllig:"fl",fltns:"▱",fnof:"ƒ",Fopf:"𝔽",fopf:"𝕗",forall:"∀",ForAll:"∀",fork:"⋔",forkv:"⫙",Fouriertrf:"ℱ",fpartint:"⨍",frac12:"½",frac13:"⅓",frac14:"¼",frac15:"⅕",frac16:"⅙",frac18:"⅛",frac23:"⅔",frac25:"⅖",frac34:"¾",frac35:"⅗",frac38:"⅜",frac45:"⅘",frac56:"⅚",frac58:"⅝",frac78:"⅞",frasl:"⁄",frown:"⌢",fscr:"𝒻",Fscr:"ℱ",gacute:"ǵ",Gamma:"Γ",gamma:"γ",Gammad:"Ϝ",gammad:"ϝ",gap:"⪆",Gbreve:"Ğ",gbreve:"ğ",Gcedil:"Ģ",Gcirc:"Ĝ",gcirc:"ĝ",Gcy:"Г",gcy:"г",Gdot:"Ġ",gdot:"ġ",ge:"≥",gE:"≧",gEl:"⪌",gel:"⋛",geq:"≥",geqq:"≧",geqslant:"⩾",gescc:"⪩",ges:"⩾",gesdot:"⪀",gesdoto:"⪂",gesdotol:"⪄",gesl:"⋛︀",gesles:"⪔",Gfr:"𝔊",gfr:"𝔤",gg:"≫",Gg:"⋙",ggg:"⋙",gimel:"ℷ",GJcy:"Ѓ",gjcy:"ѓ",gla:"⪥",gl:"≷",glE:"⪒",glj:"⪤",gnap:"⪊",gnapprox:"⪊",gne:"⪈",gnE:"≩",gneq:"⪈",gneqq:"≩",gnsim:"⋧",Gopf:"𝔾",gopf:"𝕘",grave:"`",GreaterEqual:"≥",GreaterEqualLess:"⋛",GreaterFullEqual:"≧",GreaterGreater:"⪢",GreaterLess:"≷",GreaterSlantEqual:"⩾",GreaterTilde:"≳",Gscr:"𝒢",gscr:"ℊ",gsim:"≳",gsime:"⪎",gsiml:"⪐",gtcc:"⪧",gtcir:"⩺",gt:">",GT:">",Gt:"≫",gtdot:"⋗",gtlPar:"⦕",gtquest:"⩼",gtrapprox:"⪆",gtrarr:"⥸",gtrdot:"⋗",gtreqless:"⋛",gtreqqless:"⪌",gtrless:"≷",gtrsim:"≳",gvertneqq:"≩︀",gvnE:"≩︀",Hacek:"ˇ",hairsp:" ",half:"½",hamilt:"ℋ",HARDcy:"Ъ",hardcy:"ъ",harrcir:"⥈",harr:"↔",hArr:"⇔",harrw:"↭",Hat:"^",hbar:"ℏ",Hcirc:"Ĥ",hcirc:"ĥ",hearts:"♥",heartsuit:"♥",hellip:"…",hercon:"⊹",hfr:"𝔥",Hfr:"ℌ",HilbertSpace:"ℋ",hksearow:"⤥",hkswarow:"⤦",hoarr:"⇿",homtht:"∻",hookleftarrow:"↩",hookrightarrow:"↪",hopf:"𝕙",Hopf:"ℍ",horbar:"―",HorizontalLine:"─",hscr:"𝒽",Hscr:"ℋ",hslash:"ℏ",Hstrok:"Ħ",hstrok:"ħ",HumpDownHump:"≎",HumpEqual:"≏",hybull:"⁃",hyphen:"‐",Iacute:"Í",iacute:"í",ic:"⁣",Icirc:"Î",icirc:"î",Icy:"И",icy:"и",Idot:"İ",IEcy:"Е",iecy:"е",iexcl:"¡",iff:"⇔",ifr:"𝔦",Ifr:"ℑ",Igrave:"Ì",igrave:"ì",ii:"ⅈ",iiiint:"⨌",iiint:"∭",iinfin:"⧜",iiota:"℩",IJlig:"IJ",ijlig:"ij",Imacr:"Ī",imacr:"ī",image:"ℑ",ImaginaryI:"ⅈ",imagline:"ℐ",imagpart:"ℑ",imath:"ı",Im:"ℑ",imof:"⊷",imped:"Ƶ",Implies:"⇒",incare:"℅","in":"∈",infin:"∞",infintie:"⧝",inodot:"ı",intcal:"⊺","int":"∫",Int:"∬",integers:"ℤ",Integral:"∫",intercal:"⊺",Intersection:"⋂",intlarhk:"⨗",intprod:"⨼",InvisibleComma:"⁣",InvisibleTimes:"⁢",IOcy:"Ё",iocy:"ё",Iogon:"Į",iogon:"į",Iopf:"𝕀",iopf:"𝕚",Iota:"Ι",iota:"ι",iprod:"⨼",iquest:"¿",iscr:"𝒾",Iscr:"ℐ",isin:"∈",isindot:"⋵",isinE:"⋹",isins:"⋴",isinsv:"⋳",isinv:"∈",it:"⁢",Itilde:"Ĩ",itilde:"ĩ",Iukcy:"І",iukcy:"і",Iuml:"Ï",iuml:"ï",Jcirc:"Ĵ",jcirc:"ĵ",Jcy:"Й",jcy:"й",Jfr:"𝔍",jfr:"𝔧",jmath:"ȷ",Jopf:"𝕁",jopf:"𝕛",Jscr:"𝒥",jscr:"𝒿",Jsercy:"Ј",jsercy:"ј",Jukcy:"Є",jukcy:"є",Kappa:"Κ",kappa:"κ",kappav:"ϰ",Kcedil:"Ķ",kcedil:"ķ",Kcy:"К",kcy:"к",Kfr:"𝔎",kfr:"𝔨",kgreen:"ĸ",KHcy:"Х",khcy:"х",KJcy:"Ќ",kjcy:"ќ",Kopf:"𝕂",kopf:"𝕜",Kscr:"𝒦",kscr:"𝓀",lAarr:"⇚",Lacute:"Ĺ",lacute:"ĺ",laemptyv:"⦴",lagran:"ℒ",Lambda:"Λ",lambda:"λ",lang:"⟨",Lang:"⟪",langd:"⦑",langle:"⟨",lap:"⪅",Laplacetrf:"ℒ",laquo:"«",larrb:"⇤",larrbfs:"⤟",larr:"←",Larr:"↞",lArr:"⇐",larrfs:"⤝",larrhk:"↩",larrlp:"↫",larrpl:"⤹",larrsim:"⥳",larrtl:"↢",latail:"⤙",lAtail:"⤛",lat:"⪫",late:"⪭",lates:"⪭︀",lbarr:"⤌",lBarr:"⤎",lbbrk:"❲",lbrace:"{",lbrack:"[",lbrke:"⦋",lbrksld:"⦏",lbrkslu:"⦍",Lcaron:"Ľ",lcaron:"ľ",Lcedil:"Ļ",lcedil:"ļ",lceil:"⌈",lcub:"{",Lcy:"Л",lcy:"л",ldca:"⤶",ldquo:"“",ldquor:"„",ldrdhar:"⥧",ldrushar:"⥋",ldsh:"↲",le:"≤",lE:"≦",LeftAngleBracket:"⟨",LeftArrowBar:"⇤",leftarrow:"←",LeftArrow:"←",Leftarrow:"⇐",LeftArrowRightArrow:"⇆",leftarrowtail:"↢",LeftCeiling:"⌈",LeftDoubleBracket:"⟦",LeftDownTeeVector:"⥡",LeftDownVectorBar:"⥙",LeftDownVector:"⇃",LeftFloor:"⌊",leftharpoondown:"↽",leftharpoonup:"↼",leftleftarrows:"⇇",leftrightarrow:"↔",LeftRightArrow:"↔",Leftrightarrow:"⇔",leftrightarrows:"⇆",leftrightharpoons:"⇋",leftrightsquigarrow:"↭",LeftRightVector:"⥎",LeftTeeArrow:"↤",LeftTee:"⊣",LeftTeeVector:"⥚",leftthreetimes:"⋋",LeftTriangleBar:"⧏",LeftTriangle:"⊲",LeftTriangleEqual:"⊴",LeftUpDownVector:"⥑",LeftUpTeeVector:"⥠",LeftUpVectorBar:"⥘",LeftUpVector:"↿",LeftVectorBar:"⥒",LeftVector:"↼",lEg:"⪋",leg:"⋚",leq:"≤",leqq:"≦",leqslant:"⩽",lescc:"⪨",les:"⩽",lesdot:"⩿",lesdoto:"⪁",lesdotor:"⪃",lesg:"⋚︀",lesges:"⪓",lessapprox:"⪅",lessdot:"⋖",lesseqgtr:"⋚",lesseqqgtr:"⪋",LessEqualGreater:"⋚",LessFullEqual:"≦",LessGreater:"≶",lessgtr:"≶",LessLess:"⪡",lesssim:"≲",LessSlantEqual:"⩽",LessTilde:"≲",lfisht:"⥼",lfloor:"⌊",Lfr:"𝔏",lfr:"𝔩",lg:"≶",lgE:"⪑",lHar:"⥢",lhard:"↽",lharu:"↼",lharul:"⥪",lhblk:"▄",LJcy:"Љ",ljcy:"љ",llarr:"⇇",ll:"≪",Ll:"⋘",llcorner:"⌞",Lleftarrow:"⇚",llhard:"⥫",lltri:"◺",Lmidot:"Ŀ",lmidot:"ŀ",lmoustache:"⎰",lmoust:"⎰",lnap:"⪉",lnapprox:"⪉",lne:"⪇",lnE:"≨",lneq:"⪇",lneqq:"≨",lnsim:"⋦",loang:"⟬",loarr:"⇽",lobrk:"⟦",longleftarrow:"⟵",LongLeftArrow:"⟵",Longleftarrow:"⟸",longleftrightarrow:"⟷",LongLeftRightArrow:"⟷",Longleftrightarrow:"⟺",longmapsto:"⟼",longrightarrow:"⟶",LongRightArrow:"⟶",Longrightarrow:"⟹",looparrowleft:"↫",looparrowright:"↬",lopar:"⦅",Lopf:"𝕃",lopf:"𝕝",loplus:"⨭",lotimes:"⨴",lowast:"∗",lowbar:"_",LowerLeftArrow:"↙",LowerRightArrow:"↘",loz:"◊",lozenge:"◊",lozf:"⧫",lpar:"(",lparlt:"⦓",lrarr:"⇆",lrcorner:"⌟",lrhar:"⇋",lrhard:"⥭",lrm:"‎",lrtri:"⊿",lsaquo:"‹",lscr:"𝓁",Lscr:"ℒ",lsh:"↰",Lsh:"↰",lsim:"≲",lsime:"⪍",lsimg:"⪏",lsqb:"[",lsquo:"‘",lsquor:"‚",Lstrok:"Ł",lstrok:"ł",ltcc:"⪦",ltcir:"⩹",lt:"<",LT:"<",Lt:"≪",ltdot:"⋖",lthree:"⋋",ltimes:"⋉",ltlarr:"⥶",ltquest:"⩻",ltri:"◃",ltrie:"⊴",ltrif:"◂",ltrPar:"⦖",lurdshar:"⥊",luruhar:"⥦",lvertneqq:"≨︀",lvnE:"≨︀",macr:"¯",male:"♂",malt:"✠",maltese:"✠",Map:"⤅",map:"↦",mapsto:"↦",mapstodown:"↧",mapstoleft:"↤",mapstoup:"↥",marker:"▮",mcomma:"⨩",Mcy:"М",mcy:"м",mdash:"—",mDDot:"∺",measuredangle:"∡",MediumSpace:" ",Mellintrf:"ℳ",Mfr:"𝔐",mfr:"𝔪",mho:"℧",micro:"µ",midast:"*",midcir:"⫰",mid:"∣",middot:"·",minusb:"⊟",minus:"−",minusd:"∸",minusdu:"⨪",MinusPlus:"∓",mlcp:"⫛",mldr:"…",mnplus:"∓",models:"⊧",Mopf:"𝕄",mopf:"𝕞",mp:"∓",mscr:"𝓂",Mscr:"ℳ",mstpos:"∾",Mu:"Μ",mu:"μ",multimap:"⊸",mumap:"⊸",nabla:"∇",Nacute:"Ń",nacute:"ń",nang:"∠⃒",nap:"≉",napE:"⩰̸",napid:"≋̸",napos:"ʼn",napprox:"≉",natural:"♮",naturals:"ℕ",natur:"♮",nbsp:" ",nbump:"≎̸",nbumpe:"≏̸",ncap:"⩃",Ncaron:"Ň",ncaron:"ň",Ncedil:"Ņ",ncedil:"ņ",ncong:"≇",ncongdot:"⩭̸",ncup:"⩂",Ncy:"Н",ncy:"н",ndash:"–",nearhk:"⤤",nearr:"↗",neArr:"⇗",nearrow:"↗",ne:"≠",nedot:"≐̸",NegativeMediumSpace:"​",NegativeThickSpace:"​",NegativeThinSpace:"​",NegativeVeryThinSpace:"​",nequiv:"≢",nesear:"⤨",nesim:"≂̸",NestedGreaterGreater:"≫",NestedLessLess:"≪",NewLine:"\n",nexist:"∄",nexists:"∄",Nfr:"𝔑",nfr:"𝔫",ngE:"≧̸",nge:"≱",ngeq:"≱",ngeqq:"≧̸",ngeqslant:"⩾̸",nges:"⩾̸",nGg:"⋙̸",ngsim:"≵",nGt:"≫⃒",ngt:"≯",ngtr:"≯",nGtv:"≫̸",nharr:"↮",nhArr:"⇎",nhpar:"⫲",ni:"∋",nis:"⋼",nisd:"⋺",niv:"∋",NJcy:"Њ",njcy:"њ",nlarr:"↚",nlArr:"⇍",nldr:"‥",nlE:"≦̸",nle:"≰",nleftarrow:"↚",nLeftarrow:"⇍",nleftrightarrow:"↮",nLeftrightarrow:"⇎",nleq:"≰",nleqq:"≦̸",nleqslant:"⩽̸",nles:"⩽̸",nless:"≮",nLl:"⋘̸",nlsim:"≴",nLt:"≪⃒",nlt:"≮",nltri:"⋪",nltrie:"⋬",nLtv:"≪̸",nmid:"∤",NoBreak:"⁠",NonBreakingSpace:" ",nopf:"𝕟",Nopf:"ℕ",Not:"⫬",not:"¬",NotCongruent:"≢",NotCupCap:"≭",NotDoubleVerticalBar:"∦",NotElement:"∉",NotEqual:"≠",NotEqualTilde:"≂̸",NotExists:"∄",NotGreater:"≯",NotGreaterEqual:"≱",NotGreaterFullEqual:"≧̸",NotGreaterGreater:"≫̸",NotGreaterLess:"≹",NotGreaterSlantEqual:"⩾̸",NotGreaterTilde:"≵",NotHumpDownHump:"≎̸",NotHumpEqual:"≏̸",notin:"∉",notindot:"⋵̸",notinE:"⋹̸",notinva:"∉",notinvb:"⋷",notinvc:"⋶",NotLeftTriangleBar:"⧏̸",NotLeftTriangle:"⋪",NotLeftTriangleEqual:"⋬",NotLess:"≮",NotLessEqual:"≰",NotLessGreater:"≸",NotLessLess:"≪̸",NotLessSlantEqual:"⩽̸",NotLessTilde:"≴",NotNestedGreaterGreater:"⪢̸",NotNestedLessLess:"⪡̸",notni:"∌",notniva:"∌",notnivb:"⋾",notnivc:"⋽",NotPrecedes:"⊀",NotPrecedesEqual:"⪯̸",NotPrecedesSlantEqual:"⋠",NotReverseElement:"∌",NotRightTriangleBar:"⧐̸",NotRightTriangle:"⋫",NotRightTriangleEqual:"⋭",NotSquareSubset:"⊏̸",NotSquareSubsetEqual:"⋢",NotSquareSuperset:"⊐̸",NotSquareSupersetEqual:"⋣",NotSubset:"⊂⃒",NotSubsetEqual:"⊈",NotSucceeds:"⊁",NotSucceedsEqual:"⪰̸",NotSucceedsSlantEqual:"⋡",NotSucceedsTilde:"≿̸",NotSuperset:"⊃⃒",NotSupersetEqual:"⊉",NotTilde:"≁",NotTildeEqual:"≄",NotTildeFullEqual:"≇",NotTildeTilde:"≉",NotVerticalBar:"∤",nparallel:"∦",npar:"∦",nparsl:"⫽⃥",npart:"∂̸",npolint:"⨔",npr:"⊀",nprcue:"⋠",nprec:"⊀",npreceq:"⪯̸",npre:"⪯̸",nrarrc:"⤳̸",nrarr:"↛",nrArr:"⇏",nrarrw:"↝̸",nrightarrow:"↛",nRightarrow:"⇏",nrtri:"⋫",nrtrie:"⋭",nsc:"⊁",nsccue:"⋡",nsce:"⪰̸",Nscr:"𝒩",nscr:"𝓃",nshortmid:"∤",nshortparallel:"∦",nsim:"≁",nsime:"≄",nsimeq:"≄",nsmid:"∤",nspar:"∦",nsqsube:"⋢",nsqsupe:"⋣",nsub:"⊄",nsubE:"⫅̸",nsube:"⊈",nsubset:"⊂⃒",nsubseteq:"⊈",nsubseteqq:"⫅̸",nsucc:"⊁",nsucceq:"⪰̸",nsup:"⊅",nsupE:"⫆̸",nsupe:"⊉",nsupset:"⊃⃒",nsupseteq:"⊉",nsupseteqq:"⫆̸",ntgl:"≹",Ntilde:"Ñ",ntilde:"ñ",ntlg:"≸",ntriangleleft:"⋪",ntrianglelefteq:"⋬",ntriangleright:"⋫",ntrianglerighteq:"⋭",Nu:"Ν",nu:"ν",num:"#",numero:"№",numsp:" ",nvap:"≍⃒",nvdash:"⊬",nvDash:"⊭",nVdash:"⊮",nVDash:"⊯",nvge:"≥⃒",nvgt:">⃒",nvHarr:"⤄",nvinfin:"⧞",nvlArr:"⤂",nvle:"≤⃒",nvlt:"<⃒",nvltrie:"⊴⃒",nvrArr:"⤃",nvrtrie:"⊵⃒",nvsim:"∼⃒",nwarhk:"⤣",nwarr:"↖",nwArr:"⇖",nwarrow:"↖",nwnear:"⤧",Oacute:"Ó",oacute:"ó",oast:"⊛",Ocirc:"Ô",ocirc:"ô",ocir:"⊚",Ocy:"О",ocy:"о",odash:"⊝",Odblac:"Ő",odblac:"ő",odiv:"⨸",odot:"⊙",odsold:"⦼",OElig:"Œ",oelig:"œ",ofcir:"⦿",Ofr:"𝔒",ofr:"𝔬",ogon:"˛",Ograve:"Ò",ograve:"ò",ogt:"⧁",ohbar:"⦵",ohm:"Ω",oint:"∮",olarr:"↺",olcir:"⦾",olcross:"⦻",oline:"‾",olt:"⧀",Omacr:"Ō",omacr:"ō",Omega:"Ω",omega:"ω",Omicron:"Ο",omicron:"ο",omid:"⦶",ominus:"⊖",Oopf:"𝕆",oopf:"𝕠",opar:"⦷",OpenCurlyDoubleQuote:"“",OpenCurlyQuote:"‘",operp:"⦹",oplus:"⊕",orarr:"↻",Or:"⩔",or:"∨",ord:"⩝",order:"ℴ",orderof:"ℴ",ordf:"ª",ordm:"º",origof:"⊶",oror:"⩖",orslope:"⩗",orv:"⩛",oS:"Ⓢ",Oscr:"𝒪",oscr:"ℴ",Oslash:"Ø",oslash:"ø",osol:"⊘",Otilde:"Õ",otilde:"õ",otimesas:"⨶",Otimes:"⨷",otimes:"⊗",Ouml:"Ö",ouml:"ö",ovbar:"⌽",OverBar:"‾",OverBrace:"⏞",OverBracket:"⎴",OverParenthesis:"⏜",para:"¶",parallel:"∥",par:"∥",parsim:"⫳",parsl:"⫽",part:"∂",PartialD:"∂",Pcy:"П",pcy:"п",percnt:"%",period:".",permil:"‰",perp:"⊥",pertenk:"‱",Pfr:"𝔓",pfr:"𝔭",Phi:"Φ",phi:"φ",phiv:"ϕ",phmmat:"ℳ",phone:"☎",Pi:"Π",pi:"π",pitchfork:"⋔",piv:"ϖ",planck:"ℏ",planckh:"ℎ",plankv:"ℏ",plusacir:"⨣",plusb:"⊞",pluscir:"⨢",plus:"+",plusdo:"∔",plusdu:"⨥",pluse:"⩲",PlusMinus:"±",plusmn:"±",plussim:"⨦",plustwo:"⨧",pm:"±",Poincareplane:"ℌ",pointint:"⨕",popf:"𝕡",Popf:"ℙ",pound:"£",prap:"⪷",Pr:"⪻",pr:"≺",prcue:"≼",precapprox:"⪷",prec:"≺",preccurlyeq:"≼",Precedes:"≺",PrecedesEqual:"⪯",PrecedesSlantEqual:"≼",PrecedesTilde:"≾",preceq:"⪯",precnapprox:"⪹",precneqq:"⪵",precnsim:"⋨",pre:"⪯",prE:"⪳",precsim:"≾",prime:"′",Prime:"″",primes:"ℙ",prnap:"⪹",prnE:"⪵",prnsim:"⋨",prod:"∏",Product:"∏",profalar:"⌮",profline:"⌒",profsurf:"⌓",prop:"∝",Proportional:"∝",Proportion:"∷",propto:"∝",prsim:"≾",prurel:"⊰",Pscr:"𝒫",pscr:"𝓅",Psi:"Ψ",psi:"ψ",puncsp:" ",Qfr:"𝔔",qfr:"𝔮",qint:"⨌",qopf:"𝕢",Qopf:"ℚ",qprime:"⁗",Qscr:"𝒬",qscr:"𝓆",quaternions:"ℍ",quatint:"⨖",quest:"?",questeq:"≟",quot:'"',QUOT:'"',rAarr:"⇛",race:"∽̱",Racute:"Ŕ",racute:"ŕ",radic:"√",raemptyv:"⦳",rang:"⟩",Rang:"⟫",rangd:"⦒",range:"⦥",rangle:"⟩",raquo:"»",rarrap:"⥵",rarrb:"⇥",rarrbfs:"⤠",rarrc:"⤳",rarr:"→",Rarr:"↠",rArr:"⇒",rarrfs:"⤞",rarrhk:"↪",rarrlp:"↬",rarrpl:"⥅",rarrsim:"⥴",Rarrtl:"⤖",rarrtl:"↣",rarrw:"↝",ratail:"⤚",rAtail:"⤜",ratio:"∶",rationals:"ℚ",rbarr:"⤍",rBarr:"⤏",RBarr:"⤐",rbbrk:"❳",rbrace:"}",rbrack:"]",rbrke:"⦌",rbrksld:"⦎",rbrkslu:"⦐",Rcaron:"Ř",rcaron:"ř",Rcedil:"Ŗ",rcedil:"ŗ",rceil:"⌉",rcub:"}",Rcy:"Р",rcy:"р",rdca:"⤷",rdldhar:"⥩",rdquo:"”",rdquor:"”",rdsh:"↳",real:"ℜ",realine:"ℛ",realpart:"ℜ",reals:"ℝ",Re:"ℜ",rect:"▭",reg:"®",REG:"®",ReverseElement:"∋",ReverseEquilibrium:"⇋",ReverseUpEquilibrium:"⥯",rfisht:"⥽",rfloor:"⌋",rfr:"𝔯",Rfr:"ℜ",rHar:"⥤",rhard:"⇁",rharu:"⇀",rharul:"⥬",Rho:"Ρ",rho:"ρ",rhov:"ϱ",RightAngleBracket:"⟩",RightArrowBar:"⇥",rightarrow:"→",RightArrow:"→",Rightarrow:"⇒",RightArrowLeftArrow:"⇄",rightarrowtail:"↣",RightCeiling:"⌉",RightDoubleBracket:"⟧",RightDownTeeVector:"⥝",RightDownVectorBar:"⥕",RightDownVector:"⇂",RightFloor:"⌋",rightharpoondown:"⇁",rightharpoonup:"⇀",rightleftarrows:"⇄",rightleftharpoons:"⇌",rightrightarrows:"⇉",rightsquigarrow:"↝",RightTeeArrow:"↦",RightTee:"⊢",RightTeeVector:"⥛",rightthreetimes:"⋌",RightTriangleBar:"⧐",RightTriangle:"⊳",RightTriangleEqual:"⊵",RightUpDownVector:"⥏",RightUpTeeVector:"⥜",RightUpVectorBar:"⥔",RightUpVector:"↾",RightVectorBar:"⥓",RightVector:"⇀",ring:"˚",risingdotseq:"≓",rlarr:"⇄",rlhar:"⇌",rlm:"‏",rmoustache:"⎱",rmoust:"⎱",rnmid:"⫮",roang:"⟭",roarr:"⇾",robrk:"⟧",ropar:"⦆",ropf:"𝕣",Ropf:"ℝ",roplus:"⨮",rotimes:"⨵",RoundImplies:"⥰",rpar:")",rpargt:"⦔",rppolint:"⨒",rrarr:"⇉",Rrightarrow:"⇛",rsaquo:"›",rscr:"𝓇",Rscr:"ℛ",rsh:"↱",Rsh:"↱",rsqb:"]",rsquo:"’",rsquor:"’",rthree:"⋌",rtimes:"⋊",rtri:"▹",rtrie:"⊵",rtrif:"▸",rtriltri:"⧎",RuleDelayed:"⧴",ruluhar:"⥨",rx:"℞",Sacute:"Ś",sacute:"ś",sbquo:"‚",scap:"⪸",Scaron:"Š",scaron:"š",Sc:"⪼",sc:"≻",sccue:"≽",sce:"⪰",scE:"⪴",Scedil:"Ş",scedil:"ş",Scirc:"Ŝ",scirc:"ŝ",scnap:"⪺",scnE:"⪶",scnsim:"⋩",scpolint:"⨓",scsim:"≿",Scy:"С",scy:"с",sdotb:"⊡",sdot:"⋅",sdote:"⩦",searhk:"⤥",searr:"↘",seArr:"⇘",searrow:"↘",sect:"§",semi:";",seswar:"⤩",setminus:"∖",setmn:"∖",sext:"✶",Sfr:"𝔖",sfr:"𝔰",sfrown:"⌢",sharp:"♯",SHCHcy:"Щ",shchcy:"щ",SHcy:"Ш",shcy:"ш",ShortDownArrow:"↓",ShortLeftArrow:"←",shortmid:"∣",shortparallel:"∥",ShortRightArrow:"→",ShortUpArrow:"↑",shy:"­",Sigma:"Σ",sigma:"σ",sigmaf:"ς",sigmav:"ς",sim:"∼",simdot:"⩪",sime:"≃",simeq:"≃",simg:"⪞",simgE:"⪠",siml:"⪝",simlE:"⪟",simne:"≆",simplus:"⨤",simrarr:"⥲",slarr:"←",SmallCircle:"∘",smallsetminus:"∖",smashp:"⨳",smeparsl:"⧤",smid:"∣",smile:"⌣",smt:"⪪",smte:"⪬",smtes:"⪬︀",SOFTcy:"Ь",softcy:"ь",solbar:"⌿",solb:"⧄",sol:"/",Sopf:"𝕊",sopf:"𝕤",spades:"♠",spadesuit:"♠",spar:"∥",sqcap:"⊓",sqcaps:"⊓︀",sqcup:"⊔",sqcups:"⊔︀",Sqrt:"√",sqsub:"⊏",sqsube:"⊑",sqsubset:"⊏",sqsubseteq:"⊑",sqsup:"⊐",sqsupe:"⊒",sqsupset:"⊐",sqsupseteq:"⊒",square:"□",Square:"□",SquareIntersection:"⊓",SquareSubset:"⊏",SquareSubsetEqual:"⊑",SquareSuperset:"⊐",SquareSupersetEqual:"⊒",SquareUnion:"⊔",squarf:"▪",squ:"□",squf:"▪",srarr:"→",Sscr:"𝒮",sscr:"𝓈",ssetmn:"∖",ssmile:"⌣",sstarf:"⋆",Star:"⋆",star:"☆",starf:"★",straightepsilon:"ϵ",straightphi:"ϕ",strns:"¯",sub:"⊂",Sub:"⋐",subdot:"⪽",subE:"⫅",sube:"⊆",subedot:"⫃",submult:"⫁",subnE:"⫋",subne:"⊊",subplus:"⪿",subrarr:"⥹",subset:"⊂",Subset:"⋐",subseteq:"⊆",subseteqq:"⫅",SubsetEqual:"⊆",subsetneq:"⊊",subsetneqq:"⫋",subsim:"⫇",subsub:"⫕",subsup:"⫓",succapprox:"⪸",succ:"≻",succcurlyeq:"≽",Succeeds:"≻",SucceedsEqual:"⪰",SucceedsSlantEqual:"≽",SucceedsTilde:"≿",succeq:"⪰",succnapprox:"⪺",succneqq:"⪶",succnsim:"⋩",succsim:"≿",SuchThat:"∋",sum:"∑",Sum:"∑",sung:"♪",sup1:"¹",sup2:"²",sup3:"³",sup:"⊃",Sup:"⋑",supdot:"⪾",supdsub:"⫘",supE:"⫆",supe:"⊇",supedot:"⫄",Superset:"⊃",SupersetEqual:"⊇",suphsol:"⟉",suphsub:"⫗",suplarr:"⥻",supmult:"⫂",supnE:"⫌",supne:"⊋",supplus:"⫀",supset:"⊃",Supset:"⋑",supseteq:"⊇",supseteqq:"⫆",supsetneq:"⊋",supsetneqq:"⫌",supsim:"⫈",supsub:"⫔",supsup:"⫖",swarhk:"⤦",swarr:"↙",swArr:"⇙",swarrow:"↙",swnwar:"⤪",szlig:"ß",Tab:"\t",target:"⌖",Tau:"Τ",tau:"τ",tbrk:"⎴",Tcaron:"Ť",tcaron:"ť",Tcedil:"Ţ",tcedil:"ţ",Tcy:"Т",tcy:"т",tdot:"⃛",telrec:"⌕",Tfr:"𝔗",tfr:"𝔱",there4:"∴",therefore:"∴",Therefore:"∴",Theta:"Θ",theta:"θ",thetasym:"ϑ",thetav:"ϑ",thickapprox:"≈",thicksim:"∼", -ThickSpace:"  ",ThinSpace:" ",thinsp:" ",thkap:"≈",thksim:"∼",THORN:"Þ",thorn:"þ",tilde:"˜",Tilde:"∼",TildeEqual:"≃",TildeFullEqual:"≅",TildeTilde:"≈",timesbar:"⨱",timesb:"⊠",times:"×",timesd:"⨰",tint:"∭",toea:"⤨",topbot:"⌶",topcir:"⫱",top:"⊤",Topf:"𝕋",topf:"𝕥",topfork:"⫚",tosa:"⤩",tprime:"‴",trade:"™",TRADE:"™",triangle:"▵",triangledown:"▿",triangleleft:"◃",trianglelefteq:"⊴",triangleq:"≜",triangleright:"▹",trianglerighteq:"⊵",tridot:"◬",trie:"≜",triminus:"⨺",TripleDot:"⃛",triplus:"⨹",trisb:"⧍",tritime:"⨻",trpezium:"⏢",Tscr:"𝒯",tscr:"𝓉",TScy:"Ц",tscy:"ц",TSHcy:"Ћ",tshcy:"ћ",Tstrok:"Ŧ",tstrok:"ŧ",twixt:"≬",twoheadleftarrow:"↞",twoheadrightarrow:"↠",Uacute:"Ú",uacute:"ú",uarr:"↑",Uarr:"↟",uArr:"⇑",Uarrocir:"⥉",Ubrcy:"Ў",ubrcy:"ў",Ubreve:"Ŭ",ubreve:"ŭ",Ucirc:"Û",ucirc:"û",Ucy:"У",ucy:"у",udarr:"⇅",Udblac:"Ű",udblac:"ű",udhar:"⥮",ufisht:"⥾",Ufr:"𝔘",ufr:"𝔲",Ugrave:"Ù",ugrave:"ù",uHar:"⥣",uharl:"↿",uharr:"↾",uhblk:"▀",ulcorn:"⌜",ulcorner:"⌜",ulcrop:"⌏",ultri:"◸",Umacr:"Ū",umacr:"ū",uml:"¨",UnderBar:"_",UnderBrace:"⏟",UnderBracket:"⎵",UnderParenthesis:"⏝",Union:"⋃",UnionPlus:"⊎",Uogon:"Ų",uogon:"ų",Uopf:"𝕌",uopf:"𝕦",UpArrowBar:"⤒",uparrow:"↑",UpArrow:"↑",Uparrow:"⇑",UpArrowDownArrow:"⇅",updownarrow:"↕",UpDownArrow:"↕",Updownarrow:"⇕",UpEquilibrium:"⥮",upharpoonleft:"↿",upharpoonright:"↾",uplus:"⊎",UpperLeftArrow:"↖",UpperRightArrow:"↗",upsi:"υ",Upsi:"ϒ",upsih:"ϒ",Upsilon:"Υ",upsilon:"υ",UpTeeArrow:"↥",UpTee:"⊥",upuparrows:"⇈",urcorn:"⌝",urcorner:"⌝",urcrop:"⌎",Uring:"Ů",uring:"ů",urtri:"◹",Uscr:"𝒰",uscr:"𝓊",utdot:"⋰",Utilde:"Ũ",utilde:"ũ",utri:"▵",utrif:"▴",uuarr:"⇈",Uuml:"Ü",uuml:"ü",uwangle:"⦧",vangrt:"⦜",varepsilon:"ϵ",varkappa:"ϰ",varnothing:"∅",varphi:"ϕ",varpi:"ϖ",varpropto:"∝",varr:"↕",vArr:"⇕",varrho:"ϱ",varsigma:"ς",varsubsetneq:"⊊︀",varsubsetneqq:"⫋︀",varsupsetneq:"⊋︀",varsupsetneqq:"⫌︀",vartheta:"ϑ",vartriangleleft:"⊲",vartriangleright:"⊳",vBar:"⫨",Vbar:"⫫",vBarv:"⫩",Vcy:"В",vcy:"в",vdash:"⊢",vDash:"⊨",Vdash:"⊩",VDash:"⊫",Vdashl:"⫦",veebar:"⊻",vee:"∨",Vee:"⋁",veeeq:"≚",vellip:"⋮",verbar:"|",Verbar:"‖",vert:"|",Vert:"‖",VerticalBar:"∣",VerticalLine:"|",VerticalSeparator:"❘",VerticalTilde:"≀",VeryThinSpace:" ",Vfr:"𝔙",vfr:"𝔳",vltri:"⊲",vnsub:"⊂⃒",vnsup:"⊃⃒",Vopf:"𝕍",vopf:"𝕧",vprop:"∝",vrtri:"⊳",Vscr:"𝒱",vscr:"𝓋",vsubnE:"⫋︀",vsubne:"⊊︀",vsupnE:"⫌︀",vsupne:"⊋︀",Vvdash:"⊪",vzigzag:"⦚",Wcirc:"Ŵ",wcirc:"ŵ",wedbar:"⩟",wedge:"∧",Wedge:"⋀",wedgeq:"≙",weierp:"℘",Wfr:"𝔚",wfr:"𝔴",Wopf:"𝕎",wopf:"𝕨",wp:"℘",wr:"≀",wreath:"≀",Wscr:"𝒲",wscr:"𝓌",xcap:"⋂",xcirc:"◯",xcup:"⋃",xdtri:"▽",Xfr:"𝔛",xfr:"𝔵",xharr:"⟷",xhArr:"⟺",Xi:"Ξ",xi:"ξ",xlarr:"⟵",xlArr:"⟸",xmap:"⟼",xnis:"⋻",xodot:"⨀",Xopf:"𝕏",xopf:"𝕩",xoplus:"⨁",xotime:"⨂",xrarr:"⟶",xrArr:"⟹",Xscr:"𝒳",xscr:"𝓍",xsqcup:"⨆",xuplus:"⨄",xutri:"△",xvee:"⋁",xwedge:"⋀",Yacute:"Ý",yacute:"ý",YAcy:"Я",yacy:"я",Ycirc:"Ŷ",ycirc:"ŷ",Ycy:"Ы",ycy:"ы",yen:"¥",Yfr:"𝔜",yfr:"𝔶",YIcy:"Ї",yicy:"ї",Yopf:"𝕐",yopf:"𝕪",Yscr:"𝒴",yscr:"𝓎",YUcy:"Ю",yucy:"ю",yuml:"ÿ",Yuml:"Ÿ",Zacute:"Ź",zacute:"ź",Zcaron:"Ž",zcaron:"ž",Zcy:"З",zcy:"з",Zdot:"Ż",zdot:"ż",zeetrf:"ℨ",ZeroWidthSpace:"​",Zeta:"Ζ",zeta:"ζ",zfr:"𝔷",Zfr:"ℨ",ZHcy:"Ж",zhcy:"ж",zigrarr:"⇝",zopf:"𝕫",Zopf:"ℤ",Zscr:"𝒵",zscr:"𝓏",zwj:"‍",zwnj:"‌"}},{}],26:[function(t,e,r){e.exports={Aacute:"Á",aacute:"á",Acirc:"Â",acirc:"â",acute:"´",AElig:"Æ",aelig:"æ",Agrave:"À",agrave:"à",amp:"&",AMP:"&",Aring:"Å",aring:"å",Atilde:"Ã",atilde:"ã",Auml:"Ä",auml:"ä",brvbar:"¦",Ccedil:"Ç",ccedil:"ç",cedil:"¸",cent:"¢",copy:"©",COPY:"©",curren:"¤",deg:"°",divide:"÷",Eacute:"É",eacute:"é",Ecirc:"Ê",ecirc:"ê",Egrave:"È",egrave:"è",ETH:"Ð",eth:"ð",Euml:"Ë",euml:"ë",frac12:"½",frac14:"¼",frac34:"¾",gt:">",GT:">",Iacute:"Í",iacute:"í",Icirc:"Î",icirc:"î",iexcl:"¡",Igrave:"Ì",igrave:"ì",iquest:"¿",Iuml:"Ï",iuml:"ï",laquo:"«",lt:"<",LT:"<",macr:"¯",micro:"µ",middot:"·",nbsp:" ",not:"¬",Ntilde:"Ñ",ntilde:"ñ",Oacute:"Ó",oacute:"ó",Ocirc:"Ô",ocirc:"ô",Ograve:"Ò",ograve:"ò",ordf:"ª",ordm:"º",Oslash:"Ø",oslash:"ø",Otilde:"Õ",otilde:"õ",Ouml:"Ö",ouml:"ö",para:"¶",plusmn:"±",pound:"£",quot:'"',QUOT:'"',raquo:"»",reg:"®",REG:"®",sect:"§",shy:"­",sup1:"¹",sup2:"²",sup3:"³",szlig:"ß",THORN:"Þ",thorn:"þ",times:"×",Uacute:"Ú",uacute:"ú",Ucirc:"Û",ucirc:"û",Ugrave:"Ù",ugrave:"ù",uml:"¨",Uuml:"Ü",uuml:"ü",Yacute:"Ý",yacute:"ý",yen:"¥",yuml:"ÿ"}},{}],27:[function(t,e,r){e.exports={amp:"&",apos:"'",gt:">",lt:"<",quot:'"'}},{}],28:[function(t,e,r){function n(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function i(t){return"function"==typeof t}function s(t){return"number"==typeof t}function o(t){return"object"==typeof t&&null!==t}function a(t){return void 0===t}e.exports=n,n.EventEmitter=n,n.prototype._events=void 0,n.prototype._maxListeners=void 0,n.defaultMaxListeners=10,n.prototype.setMaxListeners=function(t){if(!s(t)||t<0||isNaN(t))throw TypeError("n must be a positive number");return this._maxListeners=t,this},n.prototype.emit=function(t){var e,r,n,s,c,u;if(this._events||(this._events={}),"error"===t&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if(e=arguments[1],e instanceof Error)throw e;var h=new Error('Uncaught, unspecified "error" event. ('+e+")");throw h.context=e,h}if(r=this._events[t],a(r))return!1;if(i(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:s=Array.prototype.slice.call(arguments,1),r.apply(this,s)}else if(o(r))for(s=Array.prototype.slice.call(arguments,1),u=r.slice(),n=u.length,c=0;c0&&this._events[t].length>r&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),"function"==typeof console.trace&&console.trace())),this},n.prototype.on=n.prototype.addListener,n.prototype.once=function(t,e){function r(){this.removeListener(t,r),n||(n=!0,e.apply(this,arguments))}if(!i(e))throw TypeError("listener must be a function");var n=!1;return r.listener=e,this.on(t,r),this},n.prototype.removeListener=function(t,e){var r,n,s,a;if(!i(e))throw TypeError("listener must be a function");if(!this._events||!this._events[t])return this;if(r=this._events[t],s=r.length,n=-1,r===e||i(r.listener)&&r.listener===e)delete this._events[t],this._events.removeListener&&this.emit("removeListener",t,e);else if(o(r)){for(a=s;a-- >0;)if(r[a]===e||r[a].listener&&r[a].listener===e){n=a;break}if(n<0)return this;1===r.length?(r.length=0,delete this._events[t]):r.splice(n,1),this._events.removeListener&&this.emit("removeListener",t,e)}return this},n.prototype.removeAllListeners=function(t){var e,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)"removeListener"!==e&&this.removeAllListeners(e);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[t],i(r))this.removeListener(t,r);else if(r)for(;r.length;)this.removeListener(t,r[r.length-1]);return delete this._events[t],this},n.prototype.listeners=function(t){var e;return e=this._events&&this._events[t]?i(this._events[t])?[this._events[t]]:this._events[t].slice():[]},n.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(i(e))return 1;if(e)return e.length}return 0},n.listenerCount=function(t,e){return t.listenerCount(e)}},{}],29:[function(t,e,r){function n(t){this._cbs=t||{},this.events=[]}e.exports=n;var i=t("./").EVENTS;Object.keys(i).forEach(function(t){if(0===i[t])t="on"+t,n.prototype[t]=function(){this.events.push([t]),this._cbs[t]&&this._cbs[t]()};else if(1===i[t])t="on"+t,n.prototype[t]=function(e){this.events.push([t,e]),this._cbs[t]&&this._cbs[t](e)};else{if(2!==i[t])throw Error("wrong number of arguments");t="on"+t,n.prototype[t]=function(e,r){this.events.push([t,e,r]),this._cbs[t]&&this._cbs[t](e,r)}}}),n.prototype.onreset=function(){this.events=[],this._cbs.onreset&&this._cbs.onreset()},n.prototype.restart=function(){this._cbs.onreset&&this._cbs.onreset();for(var t=0,e=this.events.length;t0;this._cbs.onclosetag(this._stack[--t]));this._cbs.onend&&this._cbs.onend()},n.prototype.reset=function(){this._cbs.onreset&&this._cbs.onreset(),this._tokenizer.reset(),this._tagname="",this._attribname="",this._attribs=null,this._stack=[],this._cbs.onparserinit&&this._cbs.onparserinit(this)},n.prototype.parseComplete=function(t){this.reset(),this.end(t)},n.prototype.write=function(t){this._tokenizer.write(t)},n.prototype.end=function(t){this._tokenizer.end(t)},n.prototype.pause=function(){this._tokenizer.pause()},n.prototype.resume=function(){this._tokenizer.resume()},n.prototype.parseChunk=n.prototype.write,n.prototype.done=n.prototype.end,e.exports=n},{"./Tokenizer.js":34,events:28,inherits:38}],32:[function(t,e,r){function n(t){this._cbs=t||{}}e.exports=n;var i=t("./").EVENTS;Object.keys(i).forEach(function(t){if(0===i[t])t="on"+t,n.prototype[t]=function(){this._cbs[t]&&this._cbs[t]()};else if(1===i[t])t="on"+t,n.prototype[t]=function(e){this._cbs[t]&&this._cbs[t](e)};else{if(2!==i[t])throw Error("wrong number of arguments");t="on"+t,n.prototype[t]=function(e,r){this._cbs[t]&&this._cbs[t](e,r)}}})},{"./":36}],33:[function(t,e,r){function n(t){s.call(this,new i(this),t)}function i(t){this.scope=t}e.exports=n;var s=t("./WritableStream.js");t("inherits")(n,s),n.prototype.readable=!0;var o=t("../").EVENTS;Object.keys(o).forEach(function(t){if(0===o[t])i.prototype["on"+t]=function(){this.scope.emit(t)};else if(1===o[t])i.prototype["on"+t]=function(e){this.scope.emit(t,e)};else{if(2!==o[t])throw Error("wrong number of arguments!");i.prototype["on"+t]=function(e,r){this.scope.emit(t,e,r)}}})},{"../":36,"./WritableStream.js":35,inherits:38}],34:[function(t,e,r){function n(t){return" "===t||"\n"===t||"\t"===t||"\f"===t||"\r"===t}function i(t,e){return function(r){r===t&&(this._state=e)}}function s(t,e,r){var n=t.toLowerCase();return t===n?function(t){t===n?this._state=e:(this._state=r,this._index--)}:function(i){i===n||i===t?this._state=e:(this._state=r,this._index--)}}function o(t,e){var r=t.toLowerCase();return function(n){n===r||n===t?this._state=e:(this._state=g,this._index--)}}function a(t,e){this._state=p,this._buffer="",this._sectionStart=0,this._index=0,this._bufferOffset=0,this._baseState=p,this._special=gt,this._cbs=e,this._running=!0,this._ended=!1,this._xmlMode=!(!t||!t.xmlMode),this._decodeEntities=!(!t||!t.decodeEntities)}e.exports=a;var c=t("entities/lib/decode_codepoint.js"),u=t("entities/maps/entities.json"),h=t("entities/maps/legacy.json"),l=t("entities/maps/xml.json"),f=0,p=f++,d=f++,g=f++,_=f++,m=f++,b=f++,y=f++,v=f++,w=f++,x=f++,S=f++,E=f++,T=f++,A=f++,k=f++,L=f++,q=f++,R=f++,C=f++,B=f++,D=f++,j=f++,N=f++,O=f++,M=f++,I=f++,P=f++,U=f++,H=f++,V=f++,z=f++,Y=f++,F=f++,G=f++,W=f++,X=f++,Q=f++,J=f++,Z=f++,K=f++,$=f++,tt=f++,et=f++,rt=f++,nt=f++,it=f++,st=f++,ot=f++,at=f++,ct=f++,ut=f++,ht=f++,lt=f++,ft=f++,pt=f++,dt=0,gt=dt++,_t=dt++,mt=dt++;a.prototype._stateText=function(t){"<"===t?(this._index>this._sectionStart&&this._cbs.ontext(this._getSection()),this._state=d,this._sectionStart=this._index):this._decodeEntities&&this._special===gt&&"&"===t&&(this._index>this._sectionStart&&this._cbs.ontext(this._getSection()),this._baseState=p,this._state=ut,this._sectionStart=this._index)},a.prototype._stateBeforeTagName=function(t){"/"===t?this._state=m:"<"===t?(this._cbs.ontext(this._getSection()),this._sectionStart=this._index):">"===t||this._special!==gt||n(t)?this._state=p:"!"===t?(this._state=k,this._sectionStart=this._index+1):"?"===t?(this._state=q,this._sectionStart=this._index+1):(this._state=this._xmlMode||"s"!==t&&"S"!==t?g:z,this._sectionStart=this._index)},a.prototype._stateInTagName=function(t){("/"===t||">"===t||n(t))&&(this._emitToken("onopentagname"),this._state=v,this._index--)},a.prototype._stateBeforeCloseingTagName=function(t){n(t)||(">"===t?this._state=p:this._special!==gt?"s"===t||"S"===t?this._state=Y:(this._state=p,this._index--):(this._state=b,this._sectionStart=this._index))},a.prototype._stateInCloseingTagName=function(t){(">"===t||n(t))&&(this._emitToken("onclosetag"),this._state=y,this._index--)},a.prototype._stateAfterCloseingTagName=function(t){">"===t&&(this._state=p,this._sectionStart=this._index+1)},a.prototype._stateBeforeAttributeName=function(t){">"===t?(this._cbs.onopentagend(),this._state=p,this._sectionStart=this._index+1):"/"===t?this._state=_:n(t)||(this._state=w,this._sectionStart=this._index)},a.prototype._stateInSelfClosingTag=function(t){">"===t?(this._cbs.onselfclosingtag(),this._state=p,this._sectionStart=this._index+1):n(t)||(this._state=v,this._index--)},a.prototype._stateInAttributeName=function(t){("="===t||"/"===t||">"===t||n(t))&&(this._cbs.onattribname(this._getSection()),this._sectionStart=-1,this._state=x,this._index--)},a.prototype._stateAfterAttributeName=function(t){"="===t?this._state=S:"/"===t||">"===t?(this._cbs.onattribend(),this._state=v,this._index--):n(t)||(this._cbs.onattribend(),this._state=w,this._sectionStart=this._index)},a.prototype._stateBeforeAttributeValue=function(t){'"'===t?(this._state=E,this._sectionStart=this._index+1):"'"===t?(this._state=T,this._sectionStart=this._index+1):n(t)||(this._state=A,this._sectionStart=this._index,this._index--)},a.prototype._stateInAttributeValueDoubleQuotes=function(t){'"'===t?(this._emitToken("onattribdata"),this._cbs.onattribend(),this._state=v):this._decodeEntities&&"&"===t&&(this._emitToken("onattribdata"),this._baseState=this._state,this._state=ut,this._sectionStart=this._index)},a.prototype._stateInAttributeValueSingleQuotes=function(t){"'"===t?(this._emitToken("onattribdata"),this._cbs.onattribend(),this._state=v):this._decodeEntities&&"&"===t&&(this._emitToken("onattribdata"),this._baseState=this._state,this._state=ut,this._sectionStart=this._index)},a.prototype._stateInAttributeValueNoQuotes=function(t){n(t)||">"===t?(this._emitToken("onattribdata"),this._cbs.onattribend(),this._state=v,this._index--):this._decodeEntities&&"&"===t&&(this._emitToken("onattribdata"),this._baseState=this._state,this._state=ut,this._sectionStart=this._index)},a.prototype._stateBeforeDeclaration=function(t){this._state="["===t?j:"-"===t?R:L},a.prototype._stateInDeclaration=function(t){">"===t&&(this._cbs.ondeclaration(this._getSection()),this._state=p,this._sectionStart=this._index+1)},a.prototype._stateInProcessingInstruction=function(t){">"===t&&(this._cbs.onprocessinginstruction(this._getSection()),this._state=p,this._sectionStart=this._index+1)},a.prototype._stateBeforeComment=function(t){"-"===t?(this._state=C,this._sectionStart=this._index+1):this._state=L},a.prototype._stateInComment=function(t){"-"===t&&(this._state=B)},a.prototype._stateAfterComment1=function(t){"-"===t?this._state=D:this._state=C},a.prototype._stateAfterComment2=function(t){">"===t?(this._cbs.oncomment(this._buffer.substring(this._sectionStart,this._index-2)),this._state=p,this._sectionStart=this._index+1):"-"!==t&&(this._state=C)},a.prototype._stateBeforeCdata1=s("C",N,L),a.prototype._stateBeforeCdata2=s("D",O,L),a.prototype._stateBeforeCdata3=s("A",M,L),a.prototype._stateBeforeCdata4=s("T",I,L),a.prototype._stateBeforeCdata5=s("A",P,L),a.prototype._stateBeforeCdata6=function(t){"["===t?(this._state=U,this._sectionStart=this._index+1):(this._state=L,this._index--)},a.prototype._stateInCdata=function(t){"]"===t&&(this._state=H)},a.prototype._stateAfterCdata1=i("]",V),a.prototype._stateAfterCdata2=function(t){">"===t?(this._cbs.oncdata(this._buffer.substring(this._sectionStart,this._index-2)),this._state=p,this._sectionStart=this._index+1):"]"!==t&&(this._state=U)},a.prototype._stateBeforeSpecial=function(t){"c"===t||"C"===t?this._state=F:"t"===t||"T"===t?this._state=et:(this._state=g,this._index--)},a.prototype._stateBeforeSpecialEnd=function(t){this._special!==_t||"c"!==t&&"C"!==t?this._special!==mt||"t"!==t&&"T"!==t?this._state=p:this._state=st:this._state=J},a.prototype._stateBeforeScript1=o("R",G),a.prototype._stateBeforeScript2=o("I",W),a.prototype._stateBeforeScript3=o("P",X),a.prototype._stateBeforeScript4=o("T",Q),a.prototype._stateBeforeScript5=function(t){("/"===t||">"===t||n(t))&&(this._special=_t),this._state=g,this._index--},a.prototype._stateAfterScript1=s("R",Z,p),a.prototype._stateAfterScript2=s("I",K,p),a.prototype._stateAfterScript3=s("P",$,p),a.prototype._stateAfterScript4=s("T",tt,p),a.prototype._stateAfterScript5=function(t){">"===t||n(t)?(this._special=gt,this._state=b,this._sectionStart=this._index-6,this._index--):this._state=p},a.prototype._stateBeforeStyle1=o("Y",rt),a.prototype._stateBeforeStyle2=o("L",nt),a.prototype._stateBeforeStyle3=o("E",it),a.prototype._stateBeforeStyle4=function(t){("/"===t||">"===t||n(t))&&(this._special=mt),this._state=g,this._index--},a.prototype._stateAfterStyle1=s("Y",ot,p),a.prototype._stateAfterStyle2=s("L",at,p),a.prototype._stateAfterStyle3=s("E",ct,p),a.prototype._stateAfterStyle4=function(t){">"===t||n(t)?(this._special=gt,this._state=b,this._sectionStart=this._index-5,this._index--):this._state=p},a.prototype._stateBeforeEntity=s("#",ht,lt),a.prototype._stateBeforeNumericEntity=s("X",pt,ft),a.prototype._parseNamedEntityStrict=function(){if(this._sectionStart+16&&(e=6);e>=2;){var r=this._buffer.substr(t,e);if(h.hasOwnProperty(r))return this._emitPartial(h[r]),void(this._sectionStart+=e+1);e--}},a.prototype._stateInNamedEntity=function(t){";"===t?(this._parseNamedEntityStrict(),this._sectionStart+1"z")&&(t<"A"||t>"Z")&&(t<"0"||t>"9")&&(this._xmlMode||this._sectionStart+1===this._index||(this._baseState!==p?"="!==t&&this._parseNamedEntityStrict():this._parseLegacyEntity()),this._state=this._baseState,this._index--)},a.prototype._decodeNumericEntity=function(t,e){var r=this._sectionStart+t;if(r!==this._index){var n=this._buffer.substring(r,this._index),i=parseInt(n,e);this._emitPartial(c(i)),this._sectionStart=this._index}else this._sectionStart--;this._state=this._baseState},a.prototype._stateInNumericEntity=function(t){";"===t?(this._decodeNumericEntity(2,10),this._sectionStart++):(t<"0"||t>"9")&&(this._xmlMode?this._state=this._baseState:this._decodeNumericEntity(2,10),this._index--)},a.prototype._stateInHexEntity=function(t){";"===t?(this._decodeNumericEntity(3,16),this._sectionStart++):(t<"a"||t>"f")&&(t<"A"||t>"F")&&(t<"0"||t>"9")&&(this._xmlMode?this._state=this._baseState:this._decodeNumericEntity(3,16),this._index--)},a.prototype._cleanup=function(){this._sectionStart<0?(this._buffer="",this._index=0,this._bufferOffset+=this._index):this._running&&(this._state===p?(this._sectionStart!==this._index&&this._cbs.ontext(this._buffer.substr(this._sectionStart)),this._buffer="",this._bufferOffset+=this._index,this._index=0):this._sectionStart===this._index?(this._buffer="",this._bufferOffset+=this._index,this._index=0):(this._buffer=this._buffer.substr(this._sectionStart),this._index-=this._sectionStart,this._bufferOffset+=this._sectionStart),this._sectionStart=0)},a.prototype.write=function(t){this._ended&&this._cbs.onerror(Error(".write() after done!")),this._buffer+=t,this._parse()},a.prototype._parse=function(){for(;this._index>1,h=-7,l=r?i-1:0,f=r?-1:1,p=t[e+l];for(l+=f,s=p&(1<<-h)-1,p>>=-h,h+=a;h>0;s=256*s+t[e+l],l+=f,h-=8);for(o=s&(1<<-h)-1,s>>=-h,h+=n;h>0;o=256*o+t[e+l],l+=f,h-=8);if(0===s)s=1-u;else{if(s===c)return o?NaN:(p?-1:1)*(1/0);o+=Math.pow(2,n),s-=u}return(p?-1:1)*o*Math.pow(2,s-n)},r.write=function(t,e,r,n,i,s){var o,a,c,u=8*s-i-1,h=(1<>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:s-1,d=n?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,o=h):(o=Math.floor(Math.log(e)/Math.LN2),e*(c=Math.pow(2,-o))<1&&(o--,c*=2),e+=o+l>=1?f/c:f*Math.pow(2,1-l),e*c>=2&&(o++,c/=2),o+l>=h?(a=0,o=h):o+l>=1?(a=(e*c-1)*Math.pow(2,i),o+=l):(a=e*Math.pow(2,l-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&a,p+=d,a/=256,i-=8);for(o=o<0;t[r+p]=255&o,p+=d,o/=256,u-=8);t[r+p-d]|=128*g}},{}],38:[function(t,e,r){"function"==typeof Object.create?e.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}},{}],39:[function(t,e,r){function n(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}function i(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&n(t.slice(0,0))}e.exports=function(t){return null!=t&&(n(t)||i(t)||!!t._isBuffer)}},{}],40:[function(t,e,r){var n={}.toString;e.exports=Array.isArray||function(t){return"[object Array]"==n.call(t)}},{}],41:[function(t,e,r){(function(t){"use strict";function r(e,r,n,i){if("function"!=typeof e)throw new TypeError('"callback" argument must be a function');var s,o,a=arguments.length;switch(a){case 0:case 1:return t.nextTick(e);case 2:return t.nextTick(function(){e.call(null,r)});case 3:return t.nextTick(function(){e.call(null,r,n)});case 4:return t.nextTick(function(){e.call(null,r,n,i)});default:for(s=new Array(a-1),o=0;o1)for(var r=1;r0)if(e.ended&&!i){var o=new Error("stream.push() after EOF");t.emit("error",o)}else if(e.endEmitted&&i){var c=new Error("stream.unshift() after end event");t.emit("error",c)}else{var u;!e.decoder||i||n||(r=e.decoder.write(r),u=!e.objectMode&&0===r.length),i||(e.reading=!1),u||(e.flowing&&0===e.length&&!e.sync?(t.emit("data",r),t.read(0)):(e.length+=e.objectMode?1:r.length,i?e.buffer.unshift(r):e.buffer.push(r),e.needReadable&&f(t))),d(t,e)}else i||(e.reading=!1);return a(e)}function a(t){return!t.ended&&(t.needReadable||t.length=H?t=H:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function u(t,e){return t<=0||0===e.length&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=c(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function h(t,e){var r=null;return D.isBuffer(e)||"string"==typeof e||null===e||void 0===e||t.objectMode||(r=new TypeError("Invalid non-string/buffer chunk")),r}function l(t,e){if(!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,f(t)}}function f(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(M("emitReadable",e.flowing),e.emittedReadable=!0,e.sync?q(p,t):p(t))}function p(t){M("emit readable"),t.emit("readable"),v(t)}function d(t,e){e.readingMore||(e.readingMore=!0,q(g,t,e))}function g(t,e){for(var r=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length=e.length?(r=e.decoder?e.buffer.join(""):1===e.buffer.length?e.buffer.head.data:e.buffer.concat(e.length),e.buffer.clear()):r=x(t,e.buffer,e.decoder),r}function x(t,e,r){var n;return ts.length?s.length:t;if(i+=o===s.length?s:s.slice(0,t),t-=o,0===t){o===s.length?(++n,r.next?e.head=r.next:e.head=e.tail=null):(e.head=r,r.data=s.slice(o));break}++n}return e.length-=n,i}function E(t,e){var r=j.allocUnsafe(t),n=e.head,i=1;for(n.data.copy(r),t-=n.data.length;n=n.next;){var s=n.data,o=t>s.length?s.length:t;if(s.copy(r,r.length-t,0,o),t-=o,0===t){o===s.length?(++i,n.next?e.head=n.next:e.head=e.tail=null):(e.head=n,n.data=s.slice(o));break}++i}return e.length-=i,r}function T(t){var e=t._readableState;if(e.length>0)throw new Error('"endReadable()" called on non-empty stream');e.endEmitted||(e.ended=!0,q(A,e,t))}function A(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit("end"))}function k(t,e){for(var r=0,n=t.length;r=e.highWaterMark||e.ended))return M("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?T(this):f(this),null;if(t=u(t,e),0===t&&e.ended)return 0===e.length&&T(this),null;var n=e.needReadable;M("need readable",n),(0===e.length||e.length-t0?w(t,e):null,null===i?(e.needReadable=!0,t=0):e.length-=t,0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&T(this)),null!==i&&this.emit("data",i),i},s.prototype._read=function(t){this.emit("error",new Error("not implemented"))},s.prototype.pipe=function(t,e){function i(t){M("onunpipe"),t===f&&o()}function s(){M("onend"),t.end()}function o(){M("cleanup"),t.removeListener("close",u),t.removeListener("finish",h),t.removeListener("drain",m),t.removeListener("error",c),t.removeListener("unpipe",i),f.removeListener("end",s),f.removeListener("end",o),f.removeListener("data",a),b=!0,!p.awaitDrain||t._writableState&&!t._writableState.needDrain||m()}function a(e){M("ondata"),y=!1;var r=t.write(e);!1!==r||y||((1===p.pipesCount&&p.pipes===t||p.pipesCount>1&&L(p.pipes,t)!==-1)&&!b&&(M("false write response, pause",f._readableState.awaitDrain),f._readableState.awaitDrain++,y=!0),f.pause())}function c(e){M("onerror",e),l(),t.removeListener("error",c),0===B(t,"error")&&t.emit("error",e)}function u(){t.removeListener("finish",h),l()}function h(){M("onfinish"),t.removeListener("close",u),l()}function l(){M("unpipe"),f.unpipe(t)}var f=this,p=this._readableState;switch(p.pipesCount){case 0:p.pipes=t;break;case 1:p.pipes=[p.pipes,t];break;default:p.pipes.push(t)}p.pipesCount+=1,M("pipe count=%d opts=%j",p.pipesCount,e);var d=(!e||e.end!==!1)&&t!==r.stdout&&t!==r.stderr,g=d?s:o;p.endEmitted?q(g):f.once("end",g),t.on("unpipe",i);var m=_(f);t.on("drain",m);var b=!1,y=!1;return f.on("data",a),n(t,"error",c),t.once("close",u),t.once("finish",h),t.emit("pipe",f),p.flowing||(M("pipe resume"),f.resume()),t},s.prototype.unpipe=function(t){var e=this._readableState;if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this),this);if(!t){var r=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var i=0;i-1?setImmediate:S;o.WritableState=s;var T=t("core-util-is");T.inherits=t("inherits");var A,k={deprecate:t("util-deprecate")};!function(){try{A=t("stream")}catch(e){}finally{A||(A=t("events").EventEmitter)}}();var L=t("buffer").Buffer,q=t("buffer-shims");T.inherits(o,A);var R;s.prototype.getBuffer=function(){for(var t=this.bufferedRequest,e=[];t;)e.push(t),t=t.next;return e},function(){try{Object.defineProperty(s.prototype,"buffer",{get:k.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(t){}}();var R;o.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},o.prototype.write=function(t,e,r){var i=this._writableState,s=!1;return"function"==typeof e&&(r=e,e=null),L.isBuffer(t)?e="buffer":e||(e=i.defaultEncoding),"function"!=typeof r&&(r=n),i.ended?a(this,r):c(this,i,t,r)&&(i.pendingcb++,s=h(this,i,t,e,r)),s},o.prototype.cork=function(){var t=this._writableState;t.corked++},o.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,t.writing||t.corked||t.finished||t.bufferProcessing||!t.bufferedRequest||m(this,t))},o.prototype.setDefaultEncoding=function(t){if("string"==typeof t&&(t=t.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((t+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+t);return this._writableState.defaultEncoding=t,this},o.prototype._write=function(t,e,r){r(new Error("not implemented"))},o.prototype._writev=null,o.prototype.end=function(t,e,r){var n=this._writableState;"function"==typeof t?(r=t,t=null,e=null):"function"==typeof e&&(r=e,e=null),null!==t&&void 0!==t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||w(this,n,r)}}).call(this,t("_process"))},{"./_stream_duplex":44,_process:42,buffer:5,"buffer-shims":4,"core-util-is":6,events:28,inherits:38,"process-nextick-args":41,"util-deprecate":57}],49:[function(t,e,r){"use strict";function n(){this.head=null,this.tail=null,this.length=0}var i=(t("buffer").Buffer,t("buffer-shims"));e.exports=n,n.prototype.push=function(t){var e={data:t,next:null};this.length>0?this.tail.next=e:this.head=e,this.tail=e,++this.length},n.prototype.unshift=function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length},n.prototype.shift=function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},n.prototype.clear=function(){this.head=this.tail=null,this.length=0},n.prototype.join=function(t){if(0===this.length)return"";for(var e=this.head,r=""+e.data;e=e.next;)r+=t+e.data;return r},n.prototype.concat=function(t){if(0===this.length)return i.alloc(0);if(1===this.length)return this.head.data;for(var e=i.allocUnsafe(t>>>0),r=this.head,n=0;r;)r.data.copy(e,n),n+=r.data.length,r=r.next;return e}},{buffer:5,"buffer-shims":4}],50:[function(t,e,r){e.exports=t("./lib/_stream_passthrough.js")},{"./lib/_stream_passthrough.js":45}],51:[function(t,e,r){(function(n){var i=function(){try{return t("stream")}catch(e){}}();r=e.exports=t("./lib/_stream_readable.js"),r.Stream=i||r,r.Readable=r,r.Writable=t("./lib/_stream_writable.js"),r.Duplex=t("./lib/_stream_duplex.js"),r.Transform=t("./lib/_stream_transform.js"),r.PassThrough=t("./lib/_stream_passthrough.js"),!n.browser&&"disable"===n.env.READABLE_STREAM&&i&&(e.exports=i)}).call(this,t("_process"))},{"./lib/_stream_duplex.js":44,"./lib/_stream_passthrough.js":45,"./lib/_stream_readable.js":46,"./lib/_stream_transform.js":47,"./lib/_stream_writable.js":48,_process:42}],52:[function(t,e,r){e.exports=t("./lib/_stream_transform.js")},{"./lib/_stream_transform.js":47}],53:[function(t,e,r){e.exports=t("./lib/_stream_writable.js")},{"./lib/_stream_writable.js":48}],54:[function(t,e,r){e.exports=function(t){return t.replace(/[-\\^$*+?.()|[\]{}]/g,"\\$&")}},{}],55:[function(t,e,r){function n(){i.call(this)}e.exports=n;var i=t("events").EventEmitter,s=t("inherits");s(n,i),n.Readable=t("readable-stream/readable.js"),n.Writable=t("readable-stream/writable.js"),n.Duplex=t("readable-stream/duplex.js"),n.Transform=t("readable-stream/transform.js"),n.PassThrough=t("readable-stream/passthrough.js"),n.Stream=n,n.prototype.pipe=function(t,e){function r(e){t.writable&&!1===t.write(e)&&u.pause&&u.pause()}function n(){u.readable&&u.resume&&u.resume()}function s(){h||(h=!0,t.end())}function o(){h||(h=!0,"function"==typeof t.destroy&&t.destroy())}function a(t){if(c(),0===i.listenerCount(this,"error"))throw t}function c(){u.removeListener("data",r),t.removeListener("drain",n),u.removeListener("end",s),u.removeListener("close",o),u.removeListener("error",a),t.removeListener("error",a),u.removeListener("end",c),u.removeListener("close",c),t.removeListener("close",c)}var u=this;u.on("data",r),t.on("drain",n),t._isStdio||e&&e.end===!1||(u.on("end",s),u.on("close",o));var h=!1;return u.on("error",a),t.on("error",a),u.on("end",c),u.on("close",c),t.on("close",c),t.emit("pipe",u),t}},{events:28,inherits:38,"readable-stream/duplex.js":43,"readable-stream/passthrough.js":50,"readable-stream/readable.js":51,"readable-stream/transform.js":52,"readable-stream/writable.js":53}],56:[function(t,e,r){function n(t){if(t&&!c(t))throw new Error("Unknown encoding: "+t)}function i(t){return t.toString(this.encoding)}function s(t){this.charReceived=t.length%2,this.charLength=this.charReceived?2:0}function o(t){this.charReceived=t.length%3,this.charLength=this.charReceived?3:0}var a=t("buffer").Buffer,c=a.isEncoding||function(t){switch(t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}},u=r.StringDecoder=function(t){switch(this.encoding=(t||"utf8").toLowerCase().replace(/[-_]/,""),n(t),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=s;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=o;break;default:return void(this.write=i)}this.charBuffer=new a(6),this.charReceived=0,this.charLength=0};u.prototype.write=function(t){for(var e="";this.charLength;){var r=t.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:t.length;if(t.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived=55296&&n<=56319)){if(this.charReceived=this.charLength=0,0===t.length)return e;break}this.charLength+=this.surrogateSize,e=""}this.detectIncompleteChar(t);var i=t.length;this.charLength&&(t.copy(this.charBuffer,0,t.length-this.charReceived,i),i-=this.charReceived),e+=t.toString(this.encoding,0,i);var i=e.length-1,n=e.charCodeAt(i);if(n>=55296&&n<=56319){var s=this.surrogateSize;return this.charLength+=s,this.charReceived+=s,this.charBuffer.copy(this.charBuffer,s,0,s),t.copy(this.charBuffer,0,0,s),e.substring(0,i)}return e},u.prototype.detectIncompleteChar=function(t){for(var e=t.length>=3?3:t.length;e>0;e--){var r=t[t.length-e];if(1==e&&r>>5==6){this.charLength=2;break}if(e<=2&&r>>4==14){this.charLength=3;break}if(e<=3&&r>>3==30){this.charLength=4;break}}this.charReceived=e},u.prototype.end=function(t){var e="";if(t&&t.length&&(e=this.write(t)),this.charReceived){var r=this.charReceived,n=this.charBuffer,i=this.encoding;e+=n.slice(0,r).toString(i)}return e}},{buffer:5}],57:[function(t,e,r){(function(t){function r(t,e){function r(){if(!i){if(n("throwDeprecation"))throw new Error(e);n("traceDeprecation")?console.trace(e):console.warn(e),i=!0}return t.apply(this,arguments)}if(n("noDeprecation"))return t;var i=!1;return r}function n(e){try{if(!t.localStorage)return!1}catch(r){return!1}var n=t.localStorage[e];return null!=n&&"true"===String(n).toLowerCase()}e.exports=r}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],58:[function(t,e,r){function n(){for(var t={},e=0;e','
    Select OAuth2.0 Scopes
    ','
    ',"

    Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.",'Learn how to use',"

    ","

    "+appName+" API requires the following scopes. Select which ones you want to grant to Swagger UI.

    ",'
      ',"
    ",'

    ','
    ',"
    ",""].join("")),$(document.body).append(popupDialog),popup=popupDialog.find("ul.api-popup-scopes").empty(),p=0;p",popup.append(str);var r=$(window),s=r.width(),c=r.height(),l=r.scrollTop(),d=popupDialog.outerWidth(),u=popupDialog.outerHeight(),h=(c-u)/2+l,g=(s-d)/2;popupDialog.css({top:(h<0?0:h)+"px",left:(g<0?0:g)+"px"}),popupDialog.find("button.api-popup-cancel").click(function(){popupMask.hide(),popupDialog.hide(),popupDialog.empty(),popupDialog=[]}),$("button.api-popup-authbtn").unbind(),popupDialog.find("button.api-popup-authbtn").click(function(){function e(e){return e.vendorExtensions["x-tokenName"]||e.tokenName}popupMask.hide(),popupDialog.hide();var o,i=window.swaggerUi.api.authSchemes,n=window.location,a=location.pathname.substring(0,location.pathname.lastIndexOf("/")),t=n.protocol+"//"+n.host+a+"/o2c.html",p=window.oAuthRedirectUrl||t,r=null,s=[],c=popup.find("input:checked"),l=[];for(k=0;k0?void log("auth unable initialize oauth: "+i):($("pre code").each(function(e,o){hljs.highlightBlock(o)}),$(".api-ic").unbind(),void $(".api-ic").click(function(e){$(e.target).hasClass("ic-off")?handleLogin():handleLogout()}))}function clientCredentialsFlow(e,o,i){var n={client_id:clientId,client_secret:clientSecret,scope:e.join(" "),grant_type:"client_credentials"};$.ajax({url:o,type:"POST",data:n,success:function(e,o,n){onOAuthComplete(e,i)},error:function(e,o,i){onOAuthComplete("")}})}var appName,popupMask,popupDialog,clientId,realm,redirect_uri,clientSecret,scopeSeparator,additionalQueryStringParams;window.processOAuthCode=function(e){var o=e.state,i=window.location,n=location.pathname.substring(0,location.pathname.lastIndexOf("/")),a=i.protocol+"//"+i.host+n+"/o2c.html",t=window.oAuthRedirectUrl||a,p={client_id:clientId,code:e.code,grant_type:"authorization_code",redirect_uri:t};clientSecret&&(p.client_secret=clientSecret),$.ajax({url:window.swaggerUiAuth.tokenUrl,type:"POST",data:p,success:function(e,i,n){onOAuthComplete(e,o)},error:function(e,o,i){onOAuthComplete("")}})},window.onOAuthComplete=function(e,o){if(e)if(e.error){var i=$("input[type=checkbox],.secured");i.each(function(e){i[e].checked=!1}),alert(e.error)}else{var n=e[window.swaggerUiAuth.tokenName];if(o||(o=e.state),n){var a=null;$.each($(".auth .api-ic .api_information_panel"),function(e,o){var i=o;if(i&&i.childNodes){var n=[];$.each(i.childNodes,function(e,o){var i=o.innerHTML;i&&n.push(i)});for(var t=[],p=0;p0?(a=o.parentNode.parentNode,$(a.parentNode).find(".api-ic.ic-on").addClass("ic-off"),$(a.parentNode).find(".api-ic.ic-on").removeClass("ic-on"),$(a).find(".api-ic").addClass("ic-warning"),$(a).find(".api-ic").removeClass("ic-error")):(a=o.parentNode.parentNode,$(a.parentNode).find(".api-ic.ic-off").addClass("ic-on"),$(a.parentNode).find(".api-ic.ic-off").removeClass("ic-off"),$(a).find(".api-ic").addClass("ic-info"),$(a).find(".api-ic").removeClass("ic-warning"),$(a).find(".api-ic").removeClass("ic-error"))}}),"undefined"!=typeof window.swaggerUi&&(window.swaggerUi.api.clientAuthorizations.add(window.swaggerUiAuth.OAuthSchemeKey,new SwaggerClient.ApiKeyAuthorization("Authorization","Bearer "+n,"header")),window.swaggerUi.load())}}}; \ No newline at end of file diff --git a/spring-boot-swagger/src/main/resources/static/swagger/o2c.html b/spring-boot-swagger/src/main/resources/static/swagger/o2c.html deleted file mode 100644 index 0cde1d3..0000000 --- a/spring-boot-swagger/src/main/resources/static/swagger/o2c.html +++ /dev/null @@ -1,20 +0,0 @@ - diff --git a/spring-boot-swagger/src/main/resources/static/swagger/swagger-ui.js b/spring-boot-swagger/src/main/resources/static/swagger/swagger-ui.js deleted file mode 100644 index 5219d03..0000000 --- a/spring-boot-swagger/src/main/resources/static/swagger/swagger-ui.js +++ /dev/null @@ -1,25344 +0,0 @@ -/** - * swagger-ui - Swagger UI is a dependency-free collection of HTML, JavaScript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API - * @version v2.2.10 - * @link http://swagger.io - * @license Apache-2.0 - */ -(function(){/* jshint ignore:start */ - {(function() { - var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; -templates['apikey_auth'] = template({"1":function(container,depth0,helpers,partials,data) { - var stack1; - - return " " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.value : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "\n"; -},"3":function(container,depth0,helpers,partials,data) { - return " \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "
    \n

    Api key authorization

    \n
    " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "
    \n
    \n
    \n name:\n " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n
    \n
    \n in:\n " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0["in"] : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n
    \n
    \n value:\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isLogout : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.program(3, data, 0),"data":data})) != null ? stack1 : "") - + "
    \n
    \n
    \n"; -},"useData":true}); -templates['auth_button'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - return "Authorize\n"; -},"useData":true}); -templates['auth_button_operation'] = template({"1":function(container,depth0,helpers,partials,data) { - return " authorize__btn_operation_login\n"; -},"3":function(container,depth0,helpers,partials,data) { - return " authorize__btn_operation_logout\n"; -},"5":function(container,depth0,helpers,partials,data) { - var stack1; - - return "
      \n" - + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.scopes : depth0),{"name":"each","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "
    \n"; -},"6":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "
  • " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.scope : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "
  • \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}; - - return "
    \n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.scopes : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "
    \n"; -},"useData":true}); -templates['auth_view'] = template({"1":function(container,depth0,helpers,partials,data) { - return " \n"; -},"3":function(container,depth0,helpers,partials,data) { - return " \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}; - - return "
    \n\n
    \n
    \n" - + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.isLogout : depth0),{"name":"unless","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isAuthorized : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "
    \n\n
    \n"; -},"useData":true}); -templates['basic_auth'] = template({"1":function(container,depth0,helpers,partials,data) { - return " - authorized"; -},"3":function(container,depth0,helpers,partials,data) { - var stack1; - - return " " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.username : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n"; -},"5":function(container,depth0,helpers,partials,data) { - return " \n"; -},"7":function(container,depth0,helpers,partials,data) { - return "
    \n password:\n \n
    \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}; - - return "
    \n

    Basic authentication" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isLogout : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "

    \n
    \n
    " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.description : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "
    \n
    \n username:\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isLogout : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.program(5, data, 0),"data":data})) != null ? stack1 : "") - + "
    \n" - + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.isLogout : depth0),{"name":"unless","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "
    \n
    \n"; -},"useData":true}); -templates['content_type'] = template({"1":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.produces : depth0),{"name":"each","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"2":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n"; -},"4":function(container,depth0,helpers,partials,data) { - return " \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "\n\n"; -},"useData":true}); -templates['main'] = template({"1":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "
    " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.title : stack1),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "
    \n
    " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.description : stack1),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "
    \n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.externalDocs : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + " " - + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.termsOfServiceUrl : stack1),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\n " - + ((stack1 = helpers["if"].call(alias1,((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.name : stack1),{"name":"if","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\n " - + ((stack1 = helpers["if"].call(alias1,((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.url : stack1),{"name":"if","hash":{},"fn":container.program(8, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\n " - + ((stack1 = helpers["if"].call(alias1,((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.email : stack1),{"name":"if","hash":{},"fn":container.program(10, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\n " - + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.license : stack1),{"name":"if","hash":{},"fn":container.program(12, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\n"; -},"2":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "

    " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,((stack1 = (depth0 != null ? depth0.externalDocs : depth0)) != null ? stack1.description : stack1),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "

    \n " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,((stack1 = (depth0 != null ? depth0.externalDocs : depth0)) != null ? stack1.url : stack1),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n"; -},"4":function(container,depth0,helpers,partials,data) { - var stack1; - - return ""; -},"6":function(container,depth0,helpers,partials,data) { - var stack1; - - return "
    Created by
    " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(depth0 != null ? depth0 : {},((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.name : stack1),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "
    "; -},"8":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return ""; -},"10":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return ""; -},"12":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return ""; -},"14":function(container,depth0,helpers,partials,data) { - var stack1; - - return " , api version: " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(depth0 != null ? depth0 : {},((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.version : stack1),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n "; -},"16":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}; - - return "
    \n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.info : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "
    \n
    \n
    \n\n
      \n\n
      \n

      [ base url: " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.basePath : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n" - + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.version : stack1),{"name":"if","hash":{},"fn":container.program(14, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "]\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.validatorUrl : depth0),{"name":"if","hash":{},"fn":container.program(16, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "

      \n
      \n
      \n"; -},"useData":true}); -templates['oauth2'] = template({"1":function(container,depth0,helpers,partials,data) { - var stack1; - - return "

      Authorization URL: " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.authorizationUrl : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "

      "; -},"3":function(container,depth0,helpers,partials,data) { - var stack1; - - return "

      Token URL: " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.tokenUrl : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "

      "; -},"5":function(container,depth0,helpers,partials,data) { - return "

      Please input username and password for password flow authorization

      \n
      \n
      \n
      \n
      \n"; -},"7":function(container,depth0,helpers,partials,data) { - var stack1; - - return "

      Setup client authentication." - + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.requireClientAuthenticaiton : depth0),{"name":"if","hash":{},"fn":container.program(8, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "

      \n
      \n
      \n \n
      \n"; -},"8":function(container,depth0,helpers,partials,data) { - return "(Required)"; -},"10":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "
    • \n \n
      \n " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.OAuthSchemeKey : depth0),{"name":"if","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + " \n
    • \n"; -},"11":function(container,depth0,helpers,partials,data) { - var stack1; - - return " (" - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.OAuthSchemeKey : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + ")\n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "
      \n

      OAuth2.0

      \n

      " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "

      \n " - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.authorizationUrl : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\n " - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.tokenUrl : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\n

      flow: " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.flow : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "

      \n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isPasswordFlow : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.clientAuthentication : depth0),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "

      " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.appName : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + " API requires the following scopes. Select which ones you want to grant to Swagger UI.

      \n

      Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.\n Learn how to use\n

      \n
        \n" - + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.scopes : depth0),{"name":"each","hash":{},"fn":container.program(10, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "
      \n
      "; -},"useData":true}); -templates['operation'] = template({"1":function(container,depth0,helpers,partials,data) { - return "deprecated"; -},"3":function(container,depth0,helpers,partials,data) { - return "

      Warning: Deprecated

      \n"; -},"5":function(container,depth0,helpers,partials,data) { - var stack1; - - return "

      Implementation Notes

      \n
      " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.description : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "
      \n"; -},"7":function(container,depth0,helpers,partials,data) { - return "
      \n"; -},"9":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}; - - return "
      \n

      Response Class (Status " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.successCode : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + ")

      \n " - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.successDescription : depth0),{"name":"if","hash":{},"fn":container.program(10, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\n

      \n
      \n
      \n
      \n"; -},"10":function(container,depth0,helpers,partials,data) { - var stack1; - - return "
      " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.successDescription : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "
      "; -},"12":function(container,depth0,helpers,partials,data) { - var stack1; - - return "

      Headers

      \n \n \n \n \n \n \n \n \n \n \n" - + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.headers : depth0),{"name":"each","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + " \n
      HeaderDescriptionTypeOther
      \n"; -},"13":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n " - + container.escapeExpression(((helper = (helper = helpers.key || (data && data.key)) != null ? helper : alias2),(typeof helper === "function" ? helper.call(alias1,{"name":"key","hash":{},"data":data}) : helper))) - + "\n " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "\n " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.type : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.other : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n \n"; -},"15":function(container,depth0,helpers,partials,data) { - return "

      Parameters

      \n \n \n \n \n \n \n \n \n \n \n \n\n \n
      ParameterValueDescriptionParameter TypeData Type
      \n"; -},"17":function(container,depth0,helpers,partials,data) { - return "
      \n

      Response Messages

      \n \n \n \n \n \n \n \n \n \n \n \n
      HTTP Status CodeReasonResponse ModelHeaders
      \n"; -},"19":function(container,depth0,helpers,partials,data) { - return ""; -},"21":function(container,depth0,helpers,partials,data) { - return "
      \n \n \n \n
      \n"; -},"23":function(container,depth0,helpers,partials,data) { - return "

      Request Headers

      \n
      \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=container.escapeExpression; - - return " \n"; -},"useData":true}); -templates['param'] = template({"1":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.isFile : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.program(4, data, 0),"data":data})) != null ? stack1 : ""); -},"2":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n
      \n"; -},"4":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0["default"] : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.program(7, data, 0),"data":data})) != null ? stack1 : ""); -},"5":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "
      \n \n
      \n
      \n"; -},"7":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n
      \n
      \n
      \n"; -},"9":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.isFile : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.program(10, data, 0),"data":data})) != null ? stack1 : ""); -},"10":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = (helpers.renderTextParam || (depth0 && depth0.renderTextParam) || helpers.helperMissing).call(depth0 != null ? depth0 : {},depth0,{"name":"renderTextParam","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"11":function(container,depth0,helpers,partials,data) { - return ""; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "\n\n\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isBody : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.program(9, data, 0),"data":data})) != null ? stack1 : "") - + "\n\n" - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "\n" - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.paramType : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n\n \n\n"; -},"useData":true}); -templates['param_list'] = template({"1":function(container,depth0,helpers,partials,data) { - return " required"; -},"3":function(container,depth0,helpers,partials,data) { - return " multiple=\"multiple\""; -},"5":function(container,depth0,helpers,partials,data) { - return " required "; -},"7":function(container,depth0,helpers,partials,data) { - var stack1; - - return " \n"; -},"8":function(container,depth0,helpers,partials,data) { - return " selected=\"\" "; -},"10":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "\n \n\n"; -},"11":function(container,depth0,helpers,partials,data) { - return " selected=\"\" "; -},"13":function(container,depth0,helpers,partials,data) { - return " (default) "; -},"15":function(container,depth0,helpers,partials,data) { - return ""; -},"17":function(container,depth0,helpers,partials,data) { - return ""; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "\n\n \n\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.required : depth0),{"name":"if","hash":{},"fn":container.program(15, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + ((stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : alias2),(typeof helper === "function" ? helper.call(alias1,{"name":"description","hash":{},"data":data}) : helper))) != null ? stack1 : "") - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.required : depth0),{"name":"if","hash":{},"fn":container.program(17, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\n" - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.paramType : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n\n"; -},"useData":true}); -templates['param_readonly'] = template({"1":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n
      \n"; -},"3":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0["default"] : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.program(6, data, 0),"data":data})) != null ? stack1 : ""); -},"4":function(container,depth0,helpers,partials,data) { - var stack1; - - return " " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0["default"] : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "\n"; -},"6":function(container,depth0,helpers,partials,data) { - return " (empty)\n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "\n\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isBody : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.program(3, data, 0),"data":data})) != null ? stack1 : "") - + "\n" - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "\n" - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.paramType : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n\n"; -},"useData":true}); -templates['param_readonly_required'] = template({"1":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n"; -},"3":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0["default"] : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.program(6, data, 0),"data":data})) != null ? stack1 : ""); -},"4":function(container,depth0,helpers,partials,data) { - var stack1; - - return " " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0["default"] : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "\n"; -},"6":function(container,depth0,helpers,partials,data) { - return " (empty)\n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "\n\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isBody : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.program(3, data, 0),"data":data})) != null ? stack1 : "") - + "\n" - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "\n" - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.paramType : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n\n"; -},"useData":true}); -templates['param_required'] = template({"1":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.isFile : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.program(4, data, 0),"data":data})) != null ? stack1 : ""); -},"2":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n"; -},"4":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0["default"] : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.program(7, data, 0),"data":data})) != null ? stack1 : ""); -},"5":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "
      \n \n
      \n
      \n"; -},"7":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n
      \n
      \n
      \n"; -},"9":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.isFile : depth0),{"name":"if","hash":{},"fn":container.program(10, data, 0),"inverse":container.program(12, data, 0),"data":data})) != null ? stack1 : ""); -},"10":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n"; -},"12":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = (helpers.renderTextParam || (depth0 && depth0.renderTextParam) || helpers.helperMissing).call(depth0 != null ? depth0 : {},depth0,{"name":"renderTextParam","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"13":function(container,depth0,helpers,partials,data) { - return ""; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "\n\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isBody : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.program(9, data, 0),"data":data})) != null ? stack1 : "") - + "\n\n " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "\n\n" - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.paramType : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n\n"; -},"useData":true}); -templates['parameter_content_type'] = template({"1":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.consumes : depth0),{"name":"each","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"2":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n"; -},"4":function(container,depth0,helpers,partials,data) { - return " \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "\n\n"; -},"useData":true}); -templates['popup'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper; - - return "
      \n
      " - + container.escapeExpression(((helper = (helper = helpers.title || (depth0 != null ? depth0.title : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},{"name":"title","hash":{},"data":data}) : helper))) - + "
      \n
      \n

      \n
      \n \n
      \n
      \n
      "; -},"useData":true}); -templates['resource'] = template({"1":function(container,depth0,helpers,partials,data) { - return " : "; -},"3":function(container,depth0,helpers,partials,data) { - var stack1; - - return "
    • \n Raw\n
    • \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, options, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, buffer = - "
      \n

      \n " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + " "; - stack1 = ((helper = (helper = helpers.summary || (depth0 != null ? depth0.summary : depth0)) != null ? helper : alias2),(options={"name":"summary","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(alias1,options) : helper)); - if (!helpers.summary) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)} - if (stack1 != null) { buffer += stack1; } - return buffer + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.summary : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "\n

      \n
        \n
      • \n Show/Hide\n
      • \n
      • \n \n List Operations\n \n
      • \n
      • \n \n Expand Operations\n \n
      • \n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.url : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "
      \n
      \n\n"; -},"useData":true}); -templates['response_content_type'] = template({"1":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.produces : depth0),{"name":"each","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"2":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n"; -},"4":function(container,depth0,helpers,partials,data) { - return " \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "\n\n"; -},"useData":true}); -templates['signature'] = template({"1":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}; - - return "\n
      \n\n
      \n\n
      \n
      \n " - + container.escapeExpression((helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.signature : depth0),{"name":"sanitize","hash":{},"data":data})) - + "\n
      \n\n
      \n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.sampleJSON : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.sampleXML : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "
      \n
      \n"; -},"2":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}; - - return "
      \n
      "
      -    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.sampleJSON : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "")
      -    + "
      \n " - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isParam : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\n
      \n"; -},"3":function(container,depth0,helpers,partials,data) { - return ""; -},"5":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}; - - return "
      \n
      "
      -    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.sampleXML : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "")
      -    + "
      \n " - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isParam : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\n
      \n"; -},"7":function(container,depth0,helpers,partials,data) { - var stack1; - - return " " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.signature : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1; - - return ((stack1 = (helpers.ifCond || (depth0 && depth0.ifCond) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.sampleJSON : depth0),"||",(depth0 != null ? depth0.sampleXML : depth0),{"name":"ifCond","hash":{},"fn":container.program(1, data, 0),"inverse":container.program(7, data, 0),"data":data})) != null ? stack1 : ""); -},"useData":true}); -templates['status_code'] = template({"1":function(container,depth0,helpers,partials,data) { - var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return " \n " - + container.escapeExpression(((helper = (helper = helpers.key || (data && data.key)) != null ? helper : alias2),(typeof helper === "function" ? helper.call(alias1,{"name":"key","hash":{},"data":data}) : helper))) - + "\n " - + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{"name":"sanitize","hash":{},"data":data})) != null ? stack1 : "") - + "\n " - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.type : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing; - - return "" - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.code : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n" - + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.message : depth0),{"name":"escape","hash":{},"data":data})) != null ? stack1 : "") - + "\n\n\n \n \n" - + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.headers : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + " \n
      \n"; -},"useData":true}); -})();} - /* jshint ignore:end */ -'use strict'; - - -$(function() { - - // Helper function for vertically aligning DOM elements - // http://www.seodenver.com/simple-vertical-align-plugin-for-jquery/ - $.fn.vAlign = function() { - return this.each(function(){ - var ah = $(this).height(); - var ph = $(this).parent().height(); - var mh = (ph - ah) / 2; - $(this).css('margin-top', mh); - }); - }; - - $.fn.stretchFormtasticInputWidthToParent = function() { - return this.each(function(){ - var p_width = $(this).closest("form").innerWidth(); - var p_padding = parseInt($(this).closest("form").css('padding-left') ,10) + parseInt($(this).closest('form').css('padding-right'), 10); - var this_padding = parseInt($(this).css('padding-left'), 10) + parseInt($(this).css('padding-right'), 10); - $(this).css('width', p_width - p_padding - this_padding); - }); - }; - - $('form.formtastic li.string input, form.formtastic textarea').stretchFormtasticInputWidthToParent(); - - // Vertically center these paragraphs - // Parent may need a min-height for this to work.. - $('ul.downplayed li div.content p').vAlign(); - - // When a sandbox form is submitted.. - $("form.sandbox").submit(function(){ - - var error_free = true; - - // Cycle through the forms required inputs - $(this).find("input.required").each(function() { - - // Remove any existing error styles from the input - $(this).removeClass('error'); - - // Tack the error style on if the input is empty.. - if ($(this).val() === '') { - $(this).addClass('error'); - $(this).wiggle(); - error_free = false; - } - - }); - - return error_free; - }); - -}); - -function clippyCopiedCallback() { - $('#api_key_copied').fadeIn().delay(1000).fadeOut(); - - // var b = $("#clippy_tooltip_" + a); - // b.length != 0 && (b.attr("title", "copied!").trigger("tipsy.reload"), setTimeout(function() { - // b.attr("title", "copy to clipboard") - // }, - // 500)) -} - -// Logging function that accounts for browsers that don't have window.console -function log(){ - log.history = log.history || []; - log.history.push(arguments); - if(this.console){ - console.log( Array.prototype.slice.call(arguments)[0] ); - } -} - -// Handle browsers that do console incorrectly (IE9 and below, see http://stackoverflow.com/a/5539378/7913) -if (Function.prototype.bind && console && typeof console.log === "object") { - [ - "log","info","warn","error","assert","dir","clear","profile","profileEnd" - ].forEach(function (method) { - console[method] = this.bind(console[method], console); - }, Function.prototype.call); -} - -window.Docs = { - - shebang: function() { - - // If shebang has an operation nickname in it.. - // e.g. /docs/#!/words/get_search - var fragments = $.param.fragment().split('/'); - fragments.shift(); // get rid of the bang - - switch (fragments.length) { - case 1: - if (fragments[0].length > 0) { // prevent matching "#/" - // Expand all operations for the resource and scroll to it - var dom_id = 'resource_' + fragments[0]; - - Docs.expandEndpointListForResource(fragments[0]); - $("#"+dom_id).slideto({highlight: false}); - } - break; - case 2: - // Refer to the endpoint DOM element, e.g. #words_get_search - - // Expand Resource - Docs.expandEndpointListForResource(fragments[0]); - $("#"+dom_id).slideto({highlight: false}); - - // Expand operation - var li_dom_id = fragments.join('_'); - var li_content_dom_id = li_dom_id + "_content"; - - - Docs.expandOperation($('#'+li_content_dom_id)); - $('#'+li_dom_id).slideto({highlight: false}); - break; - } - }, - - toggleEndpointListForResource: function(resource) { - var elem = $('li#resource_' + Docs.escapeResourceName(resource) + ' ul.endpoints'); - if (elem.is(':visible')) { - $.bbq.pushState('#/', 2); - Docs.collapseEndpointListForResource(resource); - } else { - $.bbq.pushState('#/' + resource, 2); - Docs.expandEndpointListForResource(resource); - } - }, - - // Expand resource - expandEndpointListForResource: function(resource) { - var resource = Docs.escapeResourceName(resource); - if (resource == '') { - $('.resource ul.endpoints').slideDown(); - return; - } - - $('li#resource_' + resource).addClass('active'); - - var elem = $('li#resource_' + resource + ' ul.endpoints'); - elem.slideDown(); - }, - - // Collapse resource and mark as explicitly closed - collapseEndpointListForResource: function(resource) { - var resource = Docs.escapeResourceName(resource); - if (resource == '') { - $('.resource ul.endpoints').slideUp(); - return; - } - - $('li#resource_' + resource).removeClass('active'); - - var elem = $('li#resource_' + resource + ' ul.endpoints'); - elem.slideUp(); - }, - - expandOperationsForResource: function(resource) { - // Make sure the resource container is open.. - Docs.expandEndpointListForResource(resource); - - if (resource == '') { - $('.resource ul.endpoints li.operation div.content').slideDown(); - return; - } - - $('li#resource_' + Docs.escapeResourceName(resource) + ' li.operation div.content').each(function() { - Docs.expandOperation($(this)); - }); - }, - - collapseOperationsForResource: function(resource) { - // Make sure the resource container is open.. - Docs.expandEndpointListForResource(resource); - - if (resource == '') { - $('.resource ul.endpoints li.operation div.content').slideUp(); - return; - } - - $('li#resource_' + Docs.escapeResourceName(resource) + ' li.operation div.content').each(function() { - Docs.collapseOperation($(this)); - }); - }, - - escapeResourceName: function(resource) { - return resource.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^`{|}~]/g, "\\$&"); - }, - - expandOperation: function(elem) { - elem.slideDown(); - }, - - collapseOperation: function(elem) { - elem.slideUp(); - } -}; - -/*! - * https://github.com/es-shims/es5-shim - * @license es5-shim Copyright 2009-2015 by contributors, MIT License - * see https://github.com/es-shims/es5-shim/blob/master/LICENSE - */ - -// vim: ts=4 sts=4 sw=4 expandtab - -// Add semicolon to prevent IIFE from being passed as argument to concatenated code. -; - -// UMD (Universal Module Definition) -// see https://github.com/umdjs/umd/blob/master/templates/returnExports.js -(function (root, factory) { - 'use strict'; - - /* global define, exports, module */ - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(factory); - } else if (typeof exports === 'object') { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like enviroments that support module.exports, - // like Node. - module.exports = factory(); - } else { - // Browser globals (root is window) - root.returnExports = factory(); - } -}(this, function () { - /** - * Brings an environment as close to ECMAScript 5 compliance - * as is possible with the facilities of erstwhile engines. - * - * Annotated ES5: http://es5.github.com/ (specific links below) - * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf - * Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/ - */ - - // Shortcut to an often accessed properties, in order to avoid multiple - // dereference that costs universally. This also holds a reference to known-good - // functions. - var $Array = Array; - var ArrayPrototype = $Array.prototype; - var $Object = Object; - var ObjectPrototype = $Object.prototype; - var $Function = Function; - var FunctionPrototype = $Function.prototype; - var $String = String; - var StringPrototype = $String.prototype; - var $Number = Number; - var NumberPrototype = $Number.prototype; - var array_slice = ArrayPrototype.slice; - var array_splice = ArrayPrototype.splice; - var array_push = ArrayPrototype.push; - var array_unshift = ArrayPrototype.unshift; - var array_concat = ArrayPrototype.concat; - var array_join = ArrayPrototype.join; - var call = FunctionPrototype.call; - var apply = FunctionPrototype.apply; - var max = Math.max; - var min = Math.min; - - // Having a toString local variable name breaks in Opera so use to_string. - var to_string = ObjectPrototype.toString; - - /* global Symbol */ - /* eslint-disable one-var-declaration-per-line, no-redeclare, max-statements-per-line */ - var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; - var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, constructorRegex = /^\s*class /, isES6ClassFn = function isES6ClassFn(value) { try { var fnStr = fnToStr.call(value); var singleStripped = fnStr.replace(/\/\/.*\n/g, ''); var multiStripped = singleStripped.replace(/\/\*[.\s\S]*\*\//g, ''); var spaceStripped = multiStripped.replace(/\n/mg, ' ').replace(/ {2}/g, ' '); return constructorRegex.test(spaceStripped); } catch (e) { return false; /* not a function */ } }, tryFunctionObject = function tryFunctionObject(value) { try { if (isES6ClassFn(value)) { return false; } fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]', isCallable = function isCallable(value) { if (!value) { return false; } if (typeof value !== 'function' && typeof value !== 'object') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } if (isES6ClassFn(value)) { return false; } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; }; - - var isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; }; - var isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; }; - /* eslint-enable one-var-declaration-per-line, no-redeclare, max-statements-per-line */ - - /* inlined from http://npmjs.com/define-properties */ - var supportsDescriptors = $Object.defineProperty && (function () { - try { - var obj = {}; - $Object.defineProperty(obj, 'x', { enumerable: false, value: obj }); - for (var _ in obj) { // jscs:ignore disallowUnusedVariables - return false; - } - return obj.x === obj; - } catch (e) { /* this is ES3 */ - return false; - } - }()); - var defineProperties = (function (has) { - // Define configurable, writable, and non-enumerable props - // if they don't exist. - var defineProperty; - if (supportsDescriptors) { - defineProperty = function (object, name, method, forceAssign) { - if (!forceAssign && (name in object)) { - return; - } - $Object.defineProperty(object, name, { - configurable: true, - enumerable: false, - writable: true, - value: method - }); - }; - } else { - defineProperty = function (object, name, method, forceAssign) { - if (!forceAssign && (name in object)) { - return; - } - object[name] = method; - }; - } - return function defineProperties(object, map, forceAssign) { - for (var name in map) { - if (has.call(map, name)) { - defineProperty(object, name, map[name], forceAssign); - } - } - }; - }(ObjectPrototype.hasOwnProperty)); - - // - // Util - // ====== - // - - /* replaceable with https://npmjs.com/package/es-abstract /helpers/isPrimitive */ - var isPrimitive = function isPrimitive(input) { - var type = typeof input; - return input === null || (type !== 'object' && type !== 'function'); - }; - - var isActualNaN = $Number.isNaN || function isActualNaN(x) { - return x !== x; - }; - - var ES = { - // ES5 9.4 - // http://es5.github.com/#x9.4 - // http://jsperf.com/to-integer - /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */ - ToInteger: function ToInteger(num) { - var n = +num; - if (isActualNaN(n)) { - n = 0; - } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { - n = (n > 0 || -1) * Math.floor(Math.abs(n)); - } - return n; - }, - - /* replaceable with https://npmjs.com/package/es-abstract ES5.ToPrimitive */ - ToPrimitive: function ToPrimitive(input) { - var val, valueOf, toStr; - if (isPrimitive(input)) { - return input; - } - valueOf = input.valueOf; - if (isCallable(valueOf)) { - val = valueOf.call(input); - if (isPrimitive(val)) { - return val; - } - } - toStr = input.toString; - if (isCallable(toStr)) { - val = toStr.call(input); - if (isPrimitive(val)) { - return val; - } - } - throw new TypeError(); - }, - - // ES5 9.9 - // http://es5.github.com/#x9.9 - /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */ - ToObject: function (o) { - if (o == null) { // this matches both null and undefined - throw new TypeError("can't convert " + o + ' to object'); - } - return $Object(o); - }, - - /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */ - ToUint32: function ToUint32(x) { - return x >>> 0; - } - }; - - // - // Function - // ======== - // - - // ES-5 15.3.4.5 - // http://es5.github.com/#x15.3.4.5 - - var Empty = function Empty() {}; - - defineProperties(FunctionPrototype, { - bind: function bind(that) { // .length is 1 - // 1. Let Target be the this value. - var target = this; - // 2. If IsCallable(Target) is false, throw a TypeError exception. - if (!isCallable(target)) { - throw new TypeError('Function.prototype.bind called on incompatible ' + target); - } - // 3. Let A be a new (possibly empty) internal list of all of the - // argument values provided after thisArg (arg1, arg2 etc), in order. - // XXX slicedArgs will stand in for "A" if used - var args = array_slice.call(arguments, 1); // for normal call - // 4. Let F be a new native ECMAScript object. - // 11. Set the [[Prototype]] internal property of F to the standard - // built-in Function prototype object as specified in 15.3.3.1. - // 12. Set the [[Call]] internal property of F as described in - // 15.3.4.5.1. - // 13. Set the [[Construct]] internal property of F as described in - // 15.3.4.5.2. - // 14. Set the [[HasInstance]] internal property of F as described in - // 15.3.4.5.3. - var bound; - var binder = function () { - - if (this instanceof bound) { - // 15.3.4.5.2 [[Construct]] - // When the [[Construct]] internal method of a function object, - // F that was created using the bind function is called with a - // list of arguments ExtraArgs, the following steps are taken: - // 1. Let target be the value of F's [[TargetFunction]] - // internal property. - // 2. If target has no [[Construct]] internal method, a - // TypeError exception is thrown. - // 3. Let boundArgs be the value of F's [[BoundArgs]] internal - // property. - // 4. Let args be a new list containing the same values as the - // list boundArgs in the same order followed by the same - // values as the list ExtraArgs in the same order. - // 5. Return the result of calling the [[Construct]] internal - // method of target providing args as the arguments. - - var result = apply.call( - target, - this, - array_concat.call(args, array_slice.call(arguments)) - ); - if ($Object(result) === result) { - return result; - } - return this; - - } else { - // 15.3.4.5.1 [[Call]] - // When the [[Call]] internal method of a function object, F, - // which was created using the bind function is called with a - // this value and a list of arguments ExtraArgs, the following - // steps are taken: - // 1. Let boundArgs be the value of F's [[BoundArgs]] internal - // property. - // 2. Let boundThis be the value of F's [[BoundThis]] internal - // property. - // 3. Let target be the value of F's [[TargetFunction]] internal - // property. - // 4. Let args be a new list containing the same values as the - // list boundArgs in the same order followed by the same - // values as the list ExtraArgs in the same order. - // 5. Return the result of calling the [[Call]] internal method - // of target providing boundThis as the this value and - // providing args as the arguments. - - // equiv: target.call(this, ...boundArgs, ...args) - return apply.call( - target, - that, - array_concat.call(args, array_slice.call(arguments)) - ); - - } - - }; - - // 15. If the [[Class]] internal property of Target is "Function", then - // a. Let L be the length property of Target minus the length of A. - // b. Set the length own property of F to either 0 or L, whichever is - // larger. - // 16. Else set the length own property of F to 0. - - var boundLength = max(0, target.length - args.length); - - // 17. Set the attributes of the length own property of F to the values - // specified in 15.3.5.1. - var boundArgs = []; - for (var i = 0; i < boundLength; i++) { - array_push.call(boundArgs, '$' + i); - } - - // XXX Build a dynamic function with desired amount of arguments is the only - // way to set the length property of a function. - // In environments where Content Security Policies enabled (Chrome extensions, - // for ex.) all use of eval or Function costructor throws an exception. - // However in all of these environments Function.prototype.bind exists - // and so this code will never be executed. - bound = $Function('binder', 'return function (' + array_join.call(boundArgs, ',') + '){ return binder.apply(this, arguments); }')(binder); - - if (target.prototype) { - Empty.prototype = target.prototype; - bound.prototype = new Empty(); - // Clean up dangling references. - Empty.prototype = null; - } - - // TODO - // 18. Set the [[Extensible]] internal property of F to true. - - // TODO - // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3). - // 20. Call the [[DefineOwnProperty]] internal method of F with - // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: - // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and - // false. - // 21. Call the [[DefineOwnProperty]] internal method of F with - // arguments "arguments", PropertyDescriptor {[[Get]]: thrower, - // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, - // and false. - - // TODO - // NOTE Function objects created using Function.prototype.bind do not - // have a prototype property or the [[Code]], [[FormalParameters]], and - // [[Scope]] internal properties. - // XXX can't delete prototype in pure-js. - - // 22. Return F. - return bound; - } - }); - - // _Please note: Shortcuts are defined after `Function.prototype.bind` as we - // use it in defining shortcuts. - var owns = call.bind(ObjectPrototype.hasOwnProperty); - var toStr = call.bind(ObjectPrototype.toString); - var arraySlice = call.bind(array_slice); - var arraySliceApply = apply.bind(array_slice); - var strSlice = call.bind(StringPrototype.slice); - var strSplit = call.bind(StringPrototype.split); - var strIndexOf = call.bind(StringPrototype.indexOf); - var pushCall = call.bind(array_push); - var isEnum = call.bind(ObjectPrototype.propertyIsEnumerable); - var arraySort = call.bind(ArrayPrototype.sort); - - // - // Array - // ===== - // - - var isArray = $Array.isArray || function isArray(obj) { - return toStr(obj) === '[object Array]'; - }; - - // ES5 15.4.4.12 - // http://es5.github.com/#x15.4.4.13 - // Return len+argCount. - // [bugfix, ielt8] - // IE < 8 bug: [].unshift(0) === undefined but should be "1" - var hasUnshiftReturnValueBug = [].unshift(0) !== 1; - defineProperties(ArrayPrototype, { - unshift: function () { - array_unshift.apply(this, arguments); - return this.length; - } - }, hasUnshiftReturnValueBug); - - // ES5 15.4.3.2 - // http://es5.github.com/#x15.4.3.2 - // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray - defineProperties($Array, { isArray: isArray }); - - // The IsCallable() check in the Array functions - // has been replaced with a strict check on the - // internal class of the object to trap cases where - // the provided function was actually a regular - // expression literal, which in V8 and - // JavaScriptCore is a typeof "function". Only in - // V8 are regular expression literals permitted as - // reduce parameters, so it is desirable in the - // general case for the shim to match the more - // strict and common behavior of rejecting regular - // expressions. - - // ES5 15.4.4.18 - // http://es5.github.com/#x15.4.4.18 - // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach - - // Check failure of by-index access of string characters (IE < 9) - // and failure of `0 in boxedString` (Rhino) - var boxedString = $Object('a'); - var splitString = boxedString[0] !== 'a' || !(0 in boxedString); - - var properlyBoxesContext = function properlyBoxed(method) { - // Check node 0.6.21 bug where third parameter is not boxed - var properlyBoxesNonStrict = true; - var properlyBoxesStrict = true; - var threwException = false; - if (method) { - try { - method.call('foo', function (_, __, context) { - if (typeof context !== 'object') { - properlyBoxesNonStrict = false; - } - }); - - method.call([1], function () { - 'use strict'; - - properlyBoxesStrict = typeof this === 'string'; - }, 'x'); - } catch (e) { - threwException = true; - } - } - return !!method && !threwException && properlyBoxesNonStrict && properlyBoxesStrict; - }; - - defineProperties(ArrayPrototype, { - forEach: function forEach(callbackfn/*, thisArg*/) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var i = -1; - var length = ES.ToUint32(self.length); - var T; - if (arguments.length > 1) { - T = arguments[1]; - } - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.forEach callback must be a function'); - } - - while (++i < length) { - if (i in self) { - // Invoke the callback function with call, passing arguments: - // context, property value, property key, thisArg object - if (typeof T === 'undefined') { - callbackfn(self[i], i, object); - } else { - callbackfn.call(T, self[i], i, object); - } - } - } - } - }, !properlyBoxesContext(ArrayPrototype.forEach)); - - // ES5 15.4.4.19 - // http://es5.github.com/#x15.4.4.19 - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map - defineProperties(ArrayPrototype, { - map: function map(callbackfn/*, thisArg*/) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var length = ES.ToUint32(self.length); - var result = $Array(length); - var T; - if (arguments.length > 1) { - T = arguments[1]; - } - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.map callback must be a function'); - } - - for (var i = 0; i < length; i++) { - if (i in self) { - if (typeof T === 'undefined') { - result[i] = callbackfn(self[i], i, object); - } else { - result[i] = callbackfn.call(T, self[i], i, object); - } - } - } - return result; - } - }, !properlyBoxesContext(ArrayPrototype.map)); - - // ES5 15.4.4.20 - // http://es5.github.com/#x15.4.4.20 - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter - defineProperties(ArrayPrototype, { - filter: function filter(callbackfn/*, thisArg*/) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var length = ES.ToUint32(self.length); - var result = []; - var value; - var T; - if (arguments.length > 1) { - T = arguments[1]; - } - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.filter callback must be a function'); - } - - for (var i = 0; i < length; i++) { - if (i in self) { - value = self[i]; - if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) { - pushCall(result, value); - } - } - } - return result; - } - }, !properlyBoxesContext(ArrayPrototype.filter)); - - // ES5 15.4.4.16 - // http://es5.github.com/#x15.4.4.16 - // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every - defineProperties(ArrayPrototype, { - every: function every(callbackfn/*, thisArg*/) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var length = ES.ToUint32(self.length); - var T; - if (arguments.length > 1) { - T = arguments[1]; - } - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.every callback must be a function'); - } - - for (var i = 0; i < length; i++) { - if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) { - return false; - } - } - return true; - } - }, !properlyBoxesContext(ArrayPrototype.every)); - - // ES5 15.4.4.17 - // http://es5.github.com/#x15.4.4.17 - // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some - defineProperties(ArrayPrototype, { - some: function some(callbackfn/*, thisArg */) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var length = ES.ToUint32(self.length); - var T; - if (arguments.length > 1) { - T = arguments[1]; - } - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.some callback must be a function'); - } - - for (var i = 0; i < length; i++) { - if (i in self && (typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) { - return true; - } - } - return false; - } - }, !properlyBoxesContext(ArrayPrototype.some)); - - // ES5 15.4.4.21 - // http://es5.github.com/#x15.4.4.21 - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce - var reduceCoercesToObject = false; - if (ArrayPrototype.reduce) { - reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) { - return list; - }) === 'object'; - } - defineProperties(ArrayPrototype, { - reduce: function reduce(callbackfn/*, initialValue*/) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var length = ES.ToUint32(self.length); - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.reduce callback must be a function'); - } - - // no value to return if no initial value and an empty array - if (length === 0 && arguments.length === 1) { - throw new TypeError('reduce of empty array with no initial value'); - } - - var i = 0; - var result; - if (arguments.length >= 2) { - result = arguments[1]; - } else { - do { - if (i in self) { - result = self[i++]; - break; - } - - // if array contains no values, no initial value to return - if (++i >= length) { - throw new TypeError('reduce of empty array with no initial value'); - } - } while (true); - } - - for (; i < length; i++) { - if (i in self) { - result = callbackfn(result, self[i], i, object); - } - } - - return result; - } - }, !reduceCoercesToObject); - - // ES5 15.4.4.22 - // http://es5.github.com/#x15.4.4.22 - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight - var reduceRightCoercesToObject = false; - if (ArrayPrototype.reduceRight) { - reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) { - return list; - }) === 'object'; - } - defineProperties(ArrayPrototype, { - reduceRight: function reduceRight(callbackfn/*, initial*/) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var length = ES.ToUint32(self.length); - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.reduceRight callback must be a function'); - } - - // no value to return if no initial value, empty array - if (length === 0 && arguments.length === 1) { - throw new TypeError('reduceRight of empty array with no initial value'); - } - - var result; - var i = length - 1; - if (arguments.length >= 2) { - result = arguments[1]; - } else { - do { - if (i in self) { - result = self[i--]; - break; - } - - // if array contains no values, no initial value to return - if (--i < 0) { - throw new TypeError('reduceRight of empty array with no initial value'); - } - } while (true); - } - - if (i < 0) { - return result; - } - - do { - if (i in self) { - result = callbackfn(result, self[i], i, object); - } - } while (i--); - - return result; - } - }, !reduceRightCoercesToObject); - - // ES5 15.4.4.14 - // http://es5.github.com/#x15.4.4.14 - // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf - var hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !== -1; - defineProperties(ArrayPrototype, { - indexOf: function indexOf(searchElement/*, fromIndex */) { - var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this); - var length = ES.ToUint32(self.length); - - if (length === 0) { - return -1; - } - - var i = 0; - if (arguments.length > 1) { - i = ES.ToInteger(arguments[1]); - } - - // handle negative indices - i = i >= 0 ? i : max(0, length + i); - for (; i < length; i++) { - if (i in self && self[i] === searchElement) { - return i; - } - } - return -1; - } - }, hasFirefox2IndexOfBug); - - // ES5 15.4.4.15 - // http://es5.github.com/#x15.4.4.15 - // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf - var hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1; - defineProperties(ArrayPrototype, { - lastIndexOf: function lastIndexOf(searchElement/*, fromIndex */) { - var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this); - var length = ES.ToUint32(self.length); - - if (length === 0) { - return -1; - } - var i = length - 1; - if (arguments.length > 1) { - i = min(i, ES.ToInteger(arguments[1])); - } - // handle negative indices - i = i >= 0 ? i : length - Math.abs(i); - for (; i >= 0; i--) { - if (i in self && searchElement === self[i]) { - return i; - } - } - return -1; - } - }, hasFirefox2LastIndexOfBug); - - // ES5 15.4.4.12 - // http://es5.github.com/#x15.4.4.12 - var spliceNoopReturnsEmptyArray = (function () { - var a = [1, 2]; - var result = a.splice(); - return a.length === 2 && isArray(result) && result.length === 0; - }()); - defineProperties(ArrayPrototype, { - // Safari 5.0 bug where .splice() returns undefined - splice: function splice(start, deleteCount) { - if (arguments.length === 0) { - return []; - } else { - return array_splice.apply(this, arguments); - } - } - }, !spliceNoopReturnsEmptyArray); - - var spliceWorksWithEmptyObject = (function () { - var obj = {}; - ArrayPrototype.splice.call(obj, 0, 0, 1); - return obj.length === 1; - }()); - defineProperties(ArrayPrototype, { - splice: function splice(start, deleteCount) { - if (arguments.length === 0) { - return []; - } - var args = arguments; - this.length = max(ES.ToInteger(this.length), 0); - if (arguments.length > 0 && typeof deleteCount !== 'number') { - args = arraySlice(arguments); - if (args.length < 2) { - pushCall(args, this.length - start); - } else { - args[1] = ES.ToInteger(deleteCount); - } - } - return array_splice.apply(this, args); - } - }, !spliceWorksWithEmptyObject); - var spliceWorksWithLargeSparseArrays = (function () { - // Per https://github.com/es-shims/es5-shim/issues/295 - // Safari 7/8 breaks with sparse arrays of size 1e5 or greater - var arr = new $Array(1e5); - // note: the index MUST be 8 or larger or the test will false pass - arr[8] = 'x'; - arr.splice(1, 1); - // note: this test must be defined *after* the indexOf shim - // per https://github.com/es-shims/es5-shim/issues/313 - return arr.indexOf('x') === 7; - }()); - var spliceWorksWithSmallSparseArrays = (function () { - // Per https://github.com/es-shims/es5-shim/issues/295 - // Opera 12.15 breaks on this, no idea why. - var n = 256; - var arr = []; - arr[n] = 'a'; - arr.splice(n + 1, 0, 'b'); - return arr[n] === 'a'; - }()); - defineProperties(ArrayPrototype, { - splice: function splice(start, deleteCount) { - var O = ES.ToObject(this); - var A = []; - var len = ES.ToUint32(O.length); - var relativeStart = ES.ToInteger(start); - var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) : min(relativeStart, len); - var actualDeleteCount = min(max(ES.ToInteger(deleteCount), 0), len - actualStart); - - var k = 0; - var from; - while (k < actualDeleteCount) { - from = $String(actualStart + k); - if (owns(O, from)) { - A[k] = O[from]; - } - k += 1; - } - - var items = arraySlice(arguments, 2); - var itemCount = items.length; - var to; - if (itemCount < actualDeleteCount) { - k = actualStart; - var maxK = len - actualDeleteCount; - while (k < maxK) { - from = $String(k + actualDeleteCount); - to = $String(k + itemCount); - if (owns(O, from)) { - O[to] = O[from]; - } else { - delete O[to]; - } - k += 1; - } - k = len; - var minK = len - actualDeleteCount + itemCount; - while (k > minK) { - delete O[k - 1]; - k -= 1; - } - } else if (itemCount > actualDeleteCount) { - k = len - actualDeleteCount; - while (k > actualStart) { - from = $String(k + actualDeleteCount - 1); - to = $String(k + itemCount - 1); - if (owns(O, from)) { - O[to] = O[from]; - } else { - delete O[to]; - } - k -= 1; - } - } - k = actualStart; - for (var i = 0; i < items.length; ++i) { - O[k] = items[i]; - k += 1; - } - O.length = len - actualDeleteCount + itemCount; - - return A; - } - }, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays); - - var originalJoin = ArrayPrototype.join; - var hasStringJoinBug; - try { - hasStringJoinBug = Array.prototype.join.call('123', ',') !== '1,2,3'; - } catch (e) { - hasStringJoinBug = true; - } - if (hasStringJoinBug) { - defineProperties(ArrayPrototype, { - join: function join(separator) { - var sep = typeof separator === 'undefined' ? ',' : separator; - return originalJoin.call(isString(this) ? strSplit(this, '') : this, sep); - } - }, hasStringJoinBug); - } - - var hasJoinUndefinedBug = [1, 2].join(undefined) !== '1,2'; - if (hasJoinUndefinedBug) { - defineProperties(ArrayPrototype, { - join: function join(separator) { - var sep = typeof separator === 'undefined' ? ',' : separator; - return originalJoin.call(this, sep); - } - }, hasJoinUndefinedBug); - } - - var pushShim = function push(item) { - var O = ES.ToObject(this); - var n = ES.ToUint32(O.length); - var i = 0; - while (i < arguments.length) { - O[n + i] = arguments[i]; - i += 1; - } - O.length = n + i; - return n + i; - }; - - var pushIsNotGeneric = (function () { - var obj = {}; - var result = Array.prototype.push.call(obj, undefined); - return result !== 1 || obj.length !== 1 || typeof obj[0] !== 'undefined' || !owns(obj, 0); - }()); - defineProperties(ArrayPrototype, { - push: function push(item) { - if (isArray(this)) { - return array_push.apply(this, arguments); - } - return pushShim.apply(this, arguments); - } - }, pushIsNotGeneric); - - // This fixes a very weird bug in Opera 10.6 when pushing `undefined - var pushUndefinedIsWeird = (function () { - var arr = []; - var result = arr.push(undefined); - return result !== 1 || arr.length !== 1 || typeof arr[0] !== 'undefined' || !owns(arr, 0); - }()); - defineProperties(ArrayPrototype, { push: pushShim }, pushUndefinedIsWeird); - - // ES5 15.2.3.14 - // http://es5.github.io/#x15.4.4.10 - // Fix boxed string bug - defineProperties(ArrayPrototype, { - slice: function (start, end) { - var arr = isString(this) ? strSplit(this, '') : this; - return arraySliceApply(arr, arguments); - } - }, splitString); - - var sortIgnoresNonFunctions = (function () { - try { - [1, 2].sort(null); - [1, 2].sort({}); - return true; - } catch (e) {} - return false; - }()); - var sortThrowsOnRegex = (function () { - // this is a problem in Firefox 4, in which `typeof /a/ === 'function'` - try { - [1, 2].sort(/a/); - return false; - } catch (e) {} - return true; - }()); - var sortIgnoresUndefined = (function () { - // applies in IE 8, for one. - try { - [1, 2].sort(undefined); - return true; - } catch (e) {} - return false; - }()); - defineProperties(ArrayPrototype, { - sort: function sort(compareFn) { - if (typeof compareFn === 'undefined') { - return arraySort(this); - } - if (!isCallable(compareFn)) { - throw new TypeError('Array.prototype.sort callback must be a function'); - } - return arraySort(this, compareFn); - } - }, sortIgnoresNonFunctions || !sortIgnoresUndefined || !sortThrowsOnRegex); - - // - // Object - // ====== - // - - // ES5 15.2.3.14 - // http://es5.github.com/#x15.2.3.14 - - // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation - var hasDontEnumBug = !isEnum({ 'toString': null }, 'toString'); - var hasProtoEnumBug = isEnum(function () {}, 'prototype'); - var hasStringEnumBug = !owns('x', '0'); - var equalsConstructorPrototype = function (o) { - var ctor = o.constructor; - return ctor && ctor.prototype === o; - }; - var blacklistedKeys = { - $window: true, - $console: true, - $parent: true, - $self: true, - $frame: true, - $frames: true, - $frameElement: true, - $webkitIndexedDB: true, - $webkitStorageInfo: true, - $external: true - }; - var hasAutomationEqualityBug = (function () { - /* globals window */ - if (typeof window === 'undefined') { - return false; - } - for (var k in window) { - try { - if (!blacklistedKeys['$' + k] && owns(window, k) && window[k] !== null && typeof window[k] === 'object') { - equalsConstructorPrototype(window[k]); - } - } catch (e) { - return true; - } - } - return false; - }()); - var equalsConstructorPrototypeIfNotBuggy = function (object) { - if (typeof window === 'undefined' || !hasAutomationEqualityBug) { - return equalsConstructorPrototype(object); - } - try { - return equalsConstructorPrototype(object); - } catch (e) { - return false; - } - }; - var dontEnums = [ - 'toString', - 'toLocaleString', - 'valueOf', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'constructor' - ]; - var dontEnumsLength = dontEnums.length; - - // taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js - // can be replaced with require('is-arguments') if we ever use a build process instead - var isStandardArguments = function isArguments(value) { - return toStr(value) === '[object Arguments]'; - }; - var isLegacyArguments = function isArguments(value) { - return value !== null && - typeof value === 'object' && - typeof value.length === 'number' && - value.length >= 0 && - !isArray(value) && - isCallable(value.callee); - }; - var isArguments = isStandardArguments(arguments) ? isStandardArguments : isLegacyArguments; - - defineProperties($Object, { - keys: function keys(object) { - var isFn = isCallable(object); - var isArgs = isArguments(object); - var isObject = object !== null && typeof object === 'object'; - var isStr = isObject && isString(object); - - if (!isObject && !isFn && !isArgs) { - throw new TypeError('Object.keys called on a non-object'); - } - - var theKeys = []; - var skipProto = hasProtoEnumBug && isFn; - if ((isStr && hasStringEnumBug) || isArgs) { - for (var i = 0; i < object.length; ++i) { - pushCall(theKeys, $String(i)); - } - } - - if (!isArgs) { - for (var name in object) { - if (!(skipProto && name === 'prototype') && owns(object, name)) { - pushCall(theKeys, $String(name)); - } - } - } - - if (hasDontEnumBug) { - var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); - for (var j = 0; j < dontEnumsLength; j++) { - var dontEnum = dontEnums[j]; - if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) { - pushCall(theKeys, dontEnum); - } - } - } - return theKeys; - } - }); - - var keysWorksWithArguments = $Object.keys && (function () { - // Safari 5.0 bug - return $Object.keys(arguments).length === 2; - }(1, 2)); - var keysHasArgumentsLengthBug = $Object.keys && (function () { - var argKeys = $Object.keys(arguments); - return arguments.length !== 1 || argKeys.length !== 1 || argKeys[0] !== 1; - }(1)); - var originalKeys = $Object.keys; - defineProperties($Object, { - keys: function keys(object) { - if (isArguments(object)) { - return originalKeys(arraySlice(object)); - } else { - return originalKeys(object); - } - } - }, !keysWorksWithArguments || keysHasArgumentsLengthBug); - - // - // Date - // ==== - // - - var hasNegativeMonthYearBug = new Date(-3509827329600292).getUTCMonth() !== 0; - var aNegativeTestDate = new Date(-1509842289600292); - var aPositiveTestDate = new Date(1449662400000); - var hasToUTCStringFormatBug = aNegativeTestDate.toUTCString() !== 'Mon, 01 Jan -45875 11:59:59 GMT'; - var hasToDateStringFormatBug; - var hasToStringFormatBug; - var timeZoneOffset = aNegativeTestDate.getTimezoneOffset(); - if (timeZoneOffset < -720) { - hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Tue Jan 02 -45875'; - hasToStringFormatBug = !(/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString()); - } else { - hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Mon Jan 01 -45875'; - hasToStringFormatBug = !(/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString()); - } - - var originalGetFullYear = call.bind(Date.prototype.getFullYear); - var originalGetMonth = call.bind(Date.prototype.getMonth); - var originalGetDate = call.bind(Date.prototype.getDate); - var originalGetUTCFullYear = call.bind(Date.prototype.getUTCFullYear); - var originalGetUTCMonth = call.bind(Date.prototype.getUTCMonth); - var originalGetUTCDate = call.bind(Date.prototype.getUTCDate); - var originalGetUTCDay = call.bind(Date.prototype.getUTCDay); - var originalGetUTCHours = call.bind(Date.prototype.getUTCHours); - var originalGetUTCMinutes = call.bind(Date.prototype.getUTCMinutes); - var originalGetUTCSeconds = call.bind(Date.prototype.getUTCSeconds); - var originalGetUTCMilliseconds = call.bind(Date.prototype.getUTCMilliseconds); - var dayName = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; - var monthName = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; - var daysInMonth = function daysInMonth(month, year) { - return originalGetDate(new Date(year, month, 0)); - }; - - defineProperties(Date.prototype, { - getFullYear: function getFullYear() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var year = originalGetFullYear(this); - if (year < 0 && originalGetMonth(this) > 11) { - return year + 1; - } - return year; - }, - getMonth: function getMonth() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var year = originalGetFullYear(this); - var month = originalGetMonth(this); - if (year < 0 && month > 11) { - return 0; - } - return month; - }, - getDate: function getDate() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var year = originalGetFullYear(this); - var month = originalGetMonth(this); - var date = originalGetDate(this); - if (year < 0 && month > 11) { - if (month === 12) { - return date; - } - var days = daysInMonth(0, year + 1); - return (days - date) + 1; - } - return date; - }, - getUTCFullYear: function getUTCFullYear() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var year = originalGetUTCFullYear(this); - if (year < 0 && originalGetUTCMonth(this) > 11) { - return year + 1; - } - return year; - }, - getUTCMonth: function getUTCMonth() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var year = originalGetUTCFullYear(this); - var month = originalGetUTCMonth(this); - if (year < 0 && month > 11) { - return 0; - } - return month; - }, - getUTCDate: function getUTCDate() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var year = originalGetUTCFullYear(this); - var month = originalGetUTCMonth(this); - var date = originalGetUTCDate(this); - if (year < 0 && month > 11) { - if (month === 12) { - return date; - } - var days = daysInMonth(0, year + 1); - return (days - date) + 1; - } - return date; - } - }, hasNegativeMonthYearBug); - - defineProperties(Date.prototype, { - toUTCString: function toUTCString() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var day = originalGetUTCDay(this); - var date = originalGetUTCDate(this); - var month = originalGetUTCMonth(this); - var year = originalGetUTCFullYear(this); - var hour = originalGetUTCHours(this); - var minute = originalGetUTCMinutes(this); - var second = originalGetUTCSeconds(this); - return dayName[day] + ', ' + - (date < 10 ? '0' + date : date) + ' ' + - monthName[month] + ' ' + - year + ' ' + - (hour < 10 ? '0' + hour : hour) + ':' + - (minute < 10 ? '0' + minute : minute) + ':' + - (second < 10 ? '0' + second : second) + ' GMT'; - } - }, hasNegativeMonthYearBug || hasToUTCStringFormatBug); - - // Opera 12 has `,` - defineProperties(Date.prototype, { - toDateString: function toDateString() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var day = this.getDay(); - var date = this.getDate(); - var month = this.getMonth(); - var year = this.getFullYear(); - return dayName[day] + ' ' + - monthName[month] + ' ' + - (date < 10 ? '0' + date : date) + ' ' + - year; - } - }, hasNegativeMonthYearBug || hasToDateStringFormatBug); - - // can't use defineProperties here because of toString enumeration issue in IE <= 8 - if (hasNegativeMonthYearBug || hasToStringFormatBug) { - Date.prototype.toString = function toString() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var day = this.getDay(); - var date = this.getDate(); - var month = this.getMonth(); - var year = this.getFullYear(); - var hour = this.getHours(); - var minute = this.getMinutes(); - var second = this.getSeconds(); - var timezoneOffset = this.getTimezoneOffset(); - var hoursOffset = Math.floor(Math.abs(timezoneOffset) / 60); - var minutesOffset = Math.floor(Math.abs(timezoneOffset) % 60); - return dayName[day] + ' ' + - monthName[month] + ' ' + - (date < 10 ? '0' + date : date) + ' ' + - year + ' ' + - (hour < 10 ? '0' + hour : hour) + ':' + - (minute < 10 ? '0' + minute : minute) + ':' + - (second < 10 ? '0' + second : second) + ' GMT' + - (timezoneOffset > 0 ? '-' : '+') + - (hoursOffset < 10 ? '0' + hoursOffset : hoursOffset) + - (minutesOffset < 10 ? '0' + minutesOffset : minutesOffset); - }; - if (supportsDescriptors) { - $Object.defineProperty(Date.prototype, 'toString', { - configurable: true, - enumerable: false, - writable: true - }); - } - } - - // ES5 15.9.5.43 - // http://es5.github.com/#x15.9.5.43 - // This function returns a String value represent the instance in time - // represented by this Date object. The format of the String is the Date Time - // string format defined in 15.9.1.15. All fields are present in the String. - // The time zone is always UTC, denoted by the suffix Z. If the time value of - // this object is not a finite Number a RangeError exception is thrown. - var negativeDate = -62198755200000; - var negativeYearString = '-000001'; - var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1; - var hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString() !== '1969-12-31T23:59:59.999Z'; - - var getTime = call.bind(Date.prototype.getTime); - - defineProperties(Date.prototype, { - toISOString: function toISOString() { - if (!isFinite(this) || !isFinite(getTime(this))) { - // Adope Photoshop requires the second check. - throw new RangeError('Date.prototype.toISOString called on non-finite value.'); - } - - var year = originalGetUTCFullYear(this); - - var month = originalGetUTCMonth(this); - // see https://github.com/es-shims/es5-shim/issues/111 - year += Math.floor(month / 12); - month = (month % 12 + 12) % 12; - - // the date time string format is specified in 15.9.1.15. - var result = [month + 1, originalGetUTCDate(this), originalGetUTCHours(this), originalGetUTCMinutes(this), originalGetUTCSeconds(this)]; - year = ( - (year < 0 ? '-' : (year > 9999 ? '+' : '')) + - strSlice('00000' + Math.abs(year), (0 <= year && year <= 9999) ? -4 : -6) - ); - - for (var i = 0; i < result.length; ++i) { - // pad months, days, hours, minutes, and seconds to have two digits. - result[i] = strSlice('00' + result[i], -2); - } - // pad milliseconds to have three digits. - return ( - year + '-' + arraySlice(result, 0, 2).join('-') + - 'T' + arraySlice(result, 2).join(':') + '.' + - strSlice('000' + originalGetUTCMilliseconds(this), -3) + 'Z' - ); - } - }, hasNegativeDateBug || hasSafari51DateBug); - - // ES5 15.9.5.44 - // http://es5.github.com/#x15.9.5.44 - // This function provides a String representation of a Date object for use by - // JSON.stringify (15.12.3). - var dateToJSONIsSupported = (function () { - try { - return Date.prototype.toJSON && - new Date(NaN).toJSON() === null && - new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 && - Date.prototype.toJSON.call({ // generic - toISOString: function () { return true; } - }); - } catch (e) { - return false; - } - }()); - if (!dateToJSONIsSupported) { - Date.prototype.toJSON = function toJSON(key) { - // When the toJSON method is called with argument key, the following - // steps are taken: - - // 1. Let O be the result of calling ToObject, giving it the this - // value as its argument. - // 2. Let tv be ES.ToPrimitive(O, hint Number). - var O = $Object(this); - var tv = ES.ToPrimitive(O); - // 3. If tv is a Number and is not finite, return null. - if (typeof tv === 'number' && !isFinite(tv)) { - return null; - } - // 4. Let toISO be the result of calling the [[Get]] internal method of - // O with argument "toISOString". - var toISO = O.toISOString; - // 5. If IsCallable(toISO) is false, throw a TypeError exception. - if (!isCallable(toISO)) { - throw new TypeError('toISOString property is not callable'); - } - // 6. Return the result of calling the [[Call]] internal method of - // toISO with O as the this value and an empty argument list. - return toISO.call(O); - - // NOTE 1 The argument is ignored. - - // NOTE 2 The toJSON function is intentionally generic; it does not - // require that its this value be a Date object. Therefore, it can be - // transferred to other kinds of objects for use as a method. However, - // it does require that any such object have a toISOString method. An - // object is free to use the argument key to filter its - // stringification. - }; - } - - // ES5 15.9.4.2 - // http://es5.github.com/#x15.9.4.2 - // based on work shared by Daniel Friesen (dantman) - // http://gist.github.com/303249 - var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15; - var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')) || !isNaN(Date.parse('2012-12-31T23:59:60.000Z')); - var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z')); - if (doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) { - // XXX global assignment won't work in embeddings that use - // an alternate object for the context. - /* global Date: true */ - /* eslint-disable no-undef */ - var maxSafeUnsigned32Bit = Math.pow(2, 31) - 1; - var hasSafariSignedIntBug = isActualNaN(new Date(1970, 0, 1, 0, 0, 0, maxSafeUnsigned32Bit + 1).getTime()); - /* eslint-disable no-implicit-globals */ - Date = (function (NativeDate) { - /* eslint-enable no-implicit-globals */ - /* eslint-enable no-undef */ - // Date.length === 7 - var DateShim = function Date(Y, M, D, h, m, s, ms) { - var length = arguments.length; - var date; - if (this instanceof NativeDate) { - var seconds = s; - var millis = ms; - if (hasSafariSignedIntBug && length >= 7 && ms > maxSafeUnsigned32Bit) { - // work around a Safari 8/9 bug where it treats the seconds as signed - var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit; - var sToShift = Math.floor(msToShift / 1e3); - seconds += sToShift; - millis -= sToShift * 1e3; - } - date = length === 1 && $String(Y) === Y ? // isString(Y) - // We explicitly pass it through parse: - new NativeDate(DateShim.parse(Y)) : - // We have to manually make calls depending on argument - // length here - length >= 7 ? new NativeDate(Y, M, D, h, m, seconds, millis) : - length >= 6 ? new NativeDate(Y, M, D, h, m, seconds) : - length >= 5 ? new NativeDate(Y, M, D, h, m) : - length >= 4 ? new NativeDate(Y, M, D, h) : - length >= 3 ? new NativeDate(Y, M, D) : - length >= 2 ? new NativeDate(Y, M) : - length >= 1 ? new NativeDate(Y instanceof NativeDate ? +Y : Y) : - new NativeDate(); - } else { - date = NativeDate.apply(this, arguments); - } - if (!isPrimitive(date)) { - // Prevent mixups with unfixed Date object - defineProperties(date, { constructor: DateShim }, true); - } - return date; - }; - - // 15.9.1.15 Date Time String Format. - var isoDateExpression = new RegExp('^' + - '(\\d{4}|[+-]\\d{6})' + // four-digit year capture or sign + - // 6-digit extended year - '(?:-(\\d{2})' + // optional month capture - '(?:-(\\d{2})' + // optional day capture - '(?:' + // capture hours:minutes:seconds.milliseconds - 'T(\\d{2})' + // hours capture - ':(\\d{2})' + // minutes capture - '(?:' + // optional :seconds.milliseconds - ':(\\d{2})' + // seconds capture - '(?:(\\.\\d{1,}))?' + // milliseconds capture - ')?' + - '(' + // capture UTC offset component - 'Z|' + // UTC capture - '(?:' + // offset specifier +/-hours:minutes - '([-+])' + // sign capture - '(\\d{2})' + // hours offset capture - ':(\\d{2})' + // minutes offset capture - ')' + - ')?)?)?)?' + - '$'); - - var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; - - var dayFromMonth = function dayFromMonth(year, month) { - var t = month > 1 ? 1 : 0; - return ( - months[month] + - Math.floor((year - 1969 + t) / 4) - - Math.floor((year - 1901 + t) / 100) + - Math.floor((year - 1601 + t) / 400) + - 365 * (year - 1970) - ); - }; - - var toUTC = function toUTC(t) { - var s = 0; - var ms = t; - if (hasSafariSignedIntBug && ms > maxSafeUnsigned32Bit) { - // work around a Safari 8/9 bug where it treats the seconds as signed - var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit; - var sToShift = Math.floor(msToShift / 1e3); - s += sToShift; - ms -= sToShift * 1e3; - } - return $Number(new NativeDate(1970, 0, 1, 0, 0, s, ms)); - }; - - // Copy any custom methods a 3rd party library may have added - for (var key in NativeDate) { - if (owns(NativeDate, key)) { - DateShim[key] = NativeDate[key]; - } - } - - // Copy "native" methods explicitly; they may be non-enumerable - defineProperties(DateShim, { - now: NativeDate.now, - UTC: NativeDate.UTC - }, true); - DateShim.prototype = NativeDate.prototype; - defineProperties(DateShim.prototype, { - constructor: DateShim - }, true); - - // Upgrade Date.parse to handle simplified ISO 8601 strings - var parseShim = function parse(string) { - var match = isoDateExpression.exec(string); - if (match) { - // parse months, days, hours, minutes, seconds, and milliseconds - // provide default values if necessary - // parse the UTC offset component - var year = $Number(match[1]), - month = $Number(match[2] || 1) - 1, - day = $Number(match[3] || 1) - 1, - hour = $Number(match[4] || 0), - minute = $Number(match[5] || 0), - second = $Number(match[6] || 0), - millisecond = Math.floor($Number(match[7] || 0) * 1000), - // When time zone is missed, local offset should be used - // (ES 5.1 bug) - // see https://bugs.ecmascript.org/show_bug.cgi?id=112 - isLocalTime = Boolean(match[4] && !match[8]), - signOffset = match[9] === '-' ? 1 : -1, - hourOffset = $Number(match[10] || 0), - minuteOffset = $Number(match[11] || 0), - result; - var hasMinutesOrSecondsOrMilliseconds = minute > 0 || second > 0 || millisecond > 0; - if ( - hour < (hasMinutesOrSecondsOrMilliseconds ? 24 : 25) && - minute < 60 && second < 60 && millisecond < 1000 && - month > -1 && month < 12 && hourOffset < 24 && - minuteOffset < 60 && // detect invalid offsets - day > -1 && - day < (dayFromMonth(year, month + 1) - dayFromMonth(year, month)) - ) { - result = ( - (dayFromMonth(year, month) + day) * 24 + - hour + - hourOffset * signOffset - ) * 60; - result = ( - (result + minute + minuteOffset * signOffset) * 60 + - second - ) * 1000 + millisecond; - if (isLocalTime) { - result = toUTC(result); - } - if (-8.64e15 <= result && result <= 8.64e15) { - return result; - } - } - return NaN; - } - return NativeDate.parse.apply(this, arguments); - }; - defineProperties(DateShim, { parse: parseShim }); - - return DateShim; - }(Date)); - /* global Date: false */ - } - - // ES5 15.9.4.4 - // http://es5.github.com/#x15.9.4.4 - if (!Date.now) { - Date.now = function now() { - return new Date().getTime(); - }; - } - - // - // Number - // ====== - // - - // ES5.1 15.7.4.5 - // http://es5.github.com/#x15.7.4.5 - var hasToFixedBugs = NumberPrototype.toFixed && ( - (0.00008).toFixed(3) !== '0.000' || - (0.9).toFixed(0) !== '1' || - (1.255).toFixed(2) !== '1.25' || - (1000000000000000128).toFixed(0) !== '1000000000000000128' - ); - - var toFixedHelpers = { - base: 1e7, - size: 6, - data: [0, 0, 0, 0, 0, 0], - multiply: function multiply(n, c) { - var i = -1; - var c2 = c; - while (++i < toFixedHelpers.size) { - c2 += n * toFixedHelpers.data[i]; - toFixedHelpers.data[i] = c2 % toFixedHelpers.base; - c2 = Math.floor(c2 / toFixedHelpers.base); - } - }, - divide: function divide(n) { - var i = toFixedHelpers.size; - var c = 0; - while (--i >= 0) { - c += toFixedHelpers.data[i]; - toFixedHelpers.data[i] = Math.floor(c / n); - c = (c % n) * toFixedHelpers.base; - } - }, - numToString: function numToString() { - var i = toFixedHelpers.size; - var s = ''; - while (--i >= 0) { - if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) { - var t = $String(toFixedHelpers.data[i]); - if (s === '') { - s = t; - } else { - s += strSlice('0000000', 0, 7 - t.length) + t; - } - } - } - return s; - }, - pow: function pow(x, n, acc) { - return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc))); - }, - log: function log(x) { - var n = 0; - var x2 = x; - while (x2 >= 4096) { - n += 12; - x2 /= 4096; - } - while (x2 >= 2) { - n += 1; - x2 /= 2; - } - return n; - } - }; - - var toFixedShim = function toFixed(fractionDigits) { - var f, x, s, m, e, z, j, k; - - // Test for NaN and round fractionDigits down - f = $Number(fractionDigits); - f = isActualNaN(f) ? 0 : Math.floor(f); - - if (f < 0 || f > 20) { - throw new RangeError('Number.toFixed called with invalid number of decimals'); - } - - x = $Number(this); - - if (isActualNaN(x)) { - return 'NaN'; - } - - // If it is too big or small, return the string value of the number - if (x <= -1e21 || x >= 1e21) { - return $String(x); - } - - s = ''; - - if (x < 0) { - s = '-'; - x = -x; - } - - m = '0'; - - if (x > 1e-21) { - // 1e-21 < x < 1e21 - // -70 < log2(x) < 70 - e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69; - z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1)); - z *= 0x10000000000000; // Math.pow(2, 52); - e = 52 - e; - - // -18 < e < 122 - // x = z / 2 ^ e - if (e > 0) { - toFixedHelpers.multiply(0, z); - j = f; - - while (j >= 7) { - toFixedHelpers.multiply(1e7, 0); - j -= 7; - } - - toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0); - j = e - 1; - - while (j >= 23) { - toFixedHelpers.divide(1 << 23); - j -= 23; - } - - toFixedHelpers.divide(1 << j); - toFixedHelpers.multiply(1, 1); - toFixedHelpers.divide(2); - m = toFixedHelpers.numToString(); - } else { - toFixedHelpers.multiply(0, z); - toFixedHelpers.multiply(1 << (-e), 0); - m = toFixedHelpers.numToString() + strSlice('0.00000000000000000000', 2, 2 + f); - } - } - - if (f > 0) { - k = m.length; - - if (k <= f) { - m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m; - } else { - m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f); - } - } else { - m = s + m; - } - - return m; - }; - defineProperties(NumberPrototype, { toFixed: toFixedShim }, hasToFixedBugs); - - var hasToPrecisionUndefinedBug = (function () { - try { - return 1.0.toPrecision(undefined) === '1'; - } catch (e) { - return true; - } - }()); - var originalToPrecision = NumberPrototype.toPrecision; - defineProperties(NumberPrototype, { - toPrecision: function toPrecision(precision) { - return typeof precision === 'undefined' ? originalToPrecision.call(this) : originalToPrecision.call(this, precision); - } - }, hasToPrecisionUndefinedBug); - - // - // String - // ====== - // - - // ES5 15.5.4.14 - // http://es5.github.com/#x15.5.4.14 - - // [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers] - // Many browsers do not split properly with regular expressions or they - // do not perform the split correctly under obscure conditions. - // See http://blog.stevenlevithan.com/archives/cross-browser-split - // I've tested in many browsers and this seems to cover the deviant ones: - // 'ab'.split(/(?:ab)*/) should be ["", ""], not [""] - // '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""] - // 'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not - // [undefined, "t", undefined, "e", ...] - // ''.split(/.?/) should be [], not [""] - // '.'.split(/()()/) should be ["."], not ["", "", "."] - - if ( - 'ab'.split(/(?:ab)*/).length !== 2 || - '.'.split(/(.?)(.?)/).length !== 4 || - 'tesst'.split(/(s)*/)[1] === 't' || - 'test'.split(/(?:)/, -1).length !== 4 || - ''.split(/.?/).length || - '.'.split(/()()/).length > 1 - ) { - (function () { - var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group - var maxSafe32BitInt = Math.pow(2, 32) - 1; - - StringPrototype.split = function (separator, limit) { - var string = String(this); - if (typeof separator === 'undefined' && limit === 0) { - return []; - } - - // If `separator` is not a regex, use native split - if (!isRegex(separator)) { - return strSplit(this, separator, limit); - } - - var output = []; - var flags = (separator.ignoreCase ? 'i' : '') + - (separator.multiline ? 'm' : '') + - (separator.unicode ? 'u' : '') + // in ES6 - (separator.sticky ? 'y' : ''), // Firefox 3+ and ES6 - lastLastIndex = 0, - // Make `global` and avoid `lastIndex` issues by working with a copy - separator2, match, lastIndex, lastLength; - var separatorCopy = new RegExp(separator.source, flags + 'g'); - if (!compliantExecNpcg) { - // Doesn't need flags gy, but they don't hurt - separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags); - } - /* Values for `limit`, per the spec: - * If undefined: 4294967295 // maxSafe32BitInt - * If 0, Infinity, or NaN: 0 - * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; - * If negative number: 4294967296 - Math.floor(Math.abs(limit)) - * If other: Type-convert, then use the above rules - */ - var splitLimit = typeof limit === 'undefined' ? maxSafe32BitInt : ES.ToUint32(limit); - match = separatorCopy.exec(string); - while (match) { - // `separatorCopy.lastIndex` is not reliable cross-browser - lastIndex = match.index + match[0].length; - if (lastIndex > lastLastIndex) { - pushCall(output, strSlice(string, lastLastIndex, match.index)); - // Fix browsers whose `exec` methods don't consistently return `undefined` for - // nonparticipating capturing groups - if (!compliantExecNpcg && match.length > 1) { - /* eslint-disable no-loop-func */ - match[0].replace(separator2, function () { - for (var i = 1; i < arguments.length - 2; i++) { - if (typeof arguments[i] === 'undefined') { - match[i] = void 0; - } - } - }); - /* eslint-enable no-loop-func */ - } - if (match.length > 1 && match.index < string.length) { - array_push.apply(output, arraySlice(match, 1)); - } - lastLength = match[0].length; - lastLastIndex = lastIndex; - if (output.length >= splitLimit) { - break; - } - } - if (separatorCopy.lastIndex === match.index) { - separatorCopy.lastIndex++; // Avoid an infinite loop - } - match = separatorCopy.exec(string); - } - if (lastLastIndex === string.length) { - if (lastLength || !separatorCopy.test('')) { - pushCall(output, ''); - } - } else { - pushCall(output, strSlice(string, lastLastIndex)); - } - return output.length > splitLimit ? arraySlice(output, 0, splitLimit) : output; - }; - }()); - - // [bugfix, chrome] - // If separator is undefined, then the result array contains just one String, - // which is the this value (converted to a String). If limit is not undefined, - // then the output array is truncated so that it contains no more than limit - // elements. - // "0".split(undefined, 0) -> [] - } else if ('0'.split(void 0, 0).length) { - StringPrototype.split = function split(separator, limit) { - if (typeof separator === 'undefined' && limit === 0) { - return []; - } - return strSplit(this, separator, limit); - }; - } - - var str_replace = StringPrototype.replace; - var replaceReportsGroupsCorrectly = (function () { - var groups = []; - 'x'.replace(/x(.)?/g, function (match, group) { - pushCall(groups, group); - }); - return groups.length === 1 && typeof groups[0] === 'undefined'; - }()); - - if (!replaceReportsGroupsCorrectly) { - StringPrototype.replace = function replace(searchValue, replaceValue) { - var isFn = isCallable(replaceValue); - var hasCapturingGroups = isRegex(searchValue) && (/\)[*?]/).test(searchValue.source); - if (!isFn || !hasCapturingGroups) { - return str_replace.call(this, searchValue, replaceValue); - } else { - var wrappedReplaceValue = function (match) { - var length = arguments.length; - var originalLastIndex = searchValue.lastIndex; - searchValue.lastIndex = 0; - var args = searchValue.exec(match) || []; - searchValue.lastIndex = originalLastIndex; - pushCall(args, arguments[length - 2], arguments[length - 1]); - return replaceValue.apply(this, args); - }; - return str_replace.call(this, searchValue, wrappedReplaceValue); - } - }; - } - - // ECMA-262, 3rd B.2.3 - // Not an ECMAScript standard, although ECMAScript 3rd Edition has a - // non-normative section suggesting uniform semantics and it should be - // normalized across all browsers - // [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE - var string_substr = StringPrototype.substr; - var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b'; - defineProperties(StringPrototype, { - substr: function substr(start, length) { - var normalizedStart = start; - if (start < 0) { - normalizedStart = max(this.length + start, 0); - } - return string_substr.call(this, normalizedStart, length); - } - }, hasNegativeSubstrBug); - - // ES5 15.5.4.20 - // whitespace from: http://es5.github.io/#x15.5.4.20 - var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + - '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' + - '\u2029\uFEFF'; - var zeroWidth = '\u200b'; - var wsRegexChars = '[' + ws + ']'; - var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*'); - var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$'); - var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim()); - defineProperties(StringPrototype, { - // http://blog.stevenlevithan.com/archives/faster-trim-javascript - // http://perfectionkills.com/whitespace-deviations/ - trim: function trim() { - if (typeof this === 'undefined' || this === null) { - throw new TypeError("can't convert " + this + ' to object'); - } - return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, ''); - } - }, hasTrimWhitespaceBug); - var trim = call.bind(String.prototype.trim); - - var hasLastIndexBug = StringPrototype.lastIndexOf && 'abcあい'.lastIndexOf('あい', 2) !== -1; - defineProperties(StringPrototype, { - lastIndexOf: function lastIndexOf(searchString) { - if (typeof this === 'undefined' || this === null) { - throw new TypeError("can't convert " + this + ' to object'); - } - var S = $String(this); - var searchStr = $String(searchString); - var numPos = arguments.length > 1 ? $Number(arguments[1]) : NaN; - var pos = isActualNaN(numPos) ? Infinity : ES.ToInteger(numPos); - var start = min(max(pos, 0), S.length); - var searchLen = searchStr.length; - var k = start + searchLen; - while (k > 0) { - k = max(0, k - searchLen); - var index = strIndexOf(strSlice(S, k, start + searchLen), searchStr); - if (index !== -1) { - return k + index; - } - } - return -1; - } - }, hasLastIndexBug); - - var originalLastIndexOf = StringPrototype.lastIndexOf; - defineProperties(StringPrototype, { - lastIndexOf: function lastIndexOf(searchString) { - return originalLastIndexOf.apply(this, arguments); - } - }, StringPrototype.lastIndexOf.length !== 1); - - // ES-5 15.1.2.2 - /* eslint-disable radix */ - if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) { - /* eslint-enable radix */ - /* global parseInt: true */ - parseInt = (function (origParseInt) { - var hexRegex = /^[\-+]?0[xX]/; - return function parseInt(str, radix) { - var string = trim(String(str)); - var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10); - return origParseInt(string, defaultedRadix); - }; - }(parseInt)); - } - - // https://es5.github.io/#x15.1.2.3 - if (1 / parseFloat('-0') !== -Infinity) { - /* global parseFloat: true */ - parseFloat = (function (origParseFloat) { - return function parseFloat(string) { - var inputString = trim(String(string)); - var result = origParseFloat(inputString); - return result === 0 && strSlice(inputString, 0, 1) === '-' ? -0 : result; - }; - }(parseFloat)); - } - - if (String(new RangeError('test')) !== 'RangeError: test') { - var errorToStringShim = function toString() { - if (typeof this === 'undefined' || this === null) { - throw new TypeError("can't convert " + this + ' to object'); - } - var name = this.name; - if (typeof name === 'undefined') { - name = 'Error'; - } else if (typeof name !== 'string') { - name = $String(name); - } - var msg = this.message; - if (typeof msg === 'undefined') { - msg = ''; - } else if (typeof msg !== 'string') { - msg = $String(msg); - } - if (!name) { - return msg; - } - if (!msg) { - return name; - } - return name + ': ' + msg; - }; - // can't use defineProperties here because of toString enumeration issue in IE <= 8 - Error.prototype.toString = errorToStringShim; - } - - if (supportsDescriptors) { - var ensureNonEnumerable = function (obj, prop) { - if (isEnum(obj, prop)) { - var desc = Object.getOwnPropertyDescriptor(obj, prop); - if (desc.configurable) { - desc.enumerable = false; - Object.defineProperty(obj, prop, desc); - } - } - }; - ensureNonEnumerable(Error.prototype, 'message'); - if (Error.prototype.message !== '') { - Error.prototype.message = ''; - } - ensureNonEnumerable(Error.prototype, 'name'); - } - - if (String(/a/mig) !== '/a/gim') { - var regexToString = function toString() { - var str = '/' + this.source + '/'; - if (this.global) { - str += 'g'; - } - if (this.ignoreCase) { - str += 'i'; - } - if (this.multiline) { - str += 'm'; - } - return str; - }; - // can't use defineProperties here because of toString enumeration issue in IE <= 8 - RegExp.prototype.toString = regexToString; - } -})); - -'use strict'; -/*jslint eqeq: true*/ - -Handlebars.registerHelper('sanitize', function (text) { - var result; - - if (text === undefined) { return ''; } - - result = sanitizeHtml(text, { - allowedTags: [ 'div', 'span', 'b', 'i', 'em', 'strong', 'a', 'br', 'table', 'tbody', 'tr', 'th', 'td' ], - allowedAttributes: { - 'div': [ 'class' ], - 'span': [ 'class' ], - 'table': [ 'class' ], - 'td': [ 'class' ], - 'th': [ 'colspan' ], - 'a': [ 'href' ] - } - }); - - return new Handlebars.SafeString(result); -}); - -Handlebars.registerHelper('renderTextParam', function(param) { - var result, type = 'text', idAtt = ''; - var paramType = param.type || param.schema && param.schema.type || ''; - var isArray = paramType.toLowerCase() === 'array' || param.allowMultiple; - var defaultValue = isArray && Array.isArray(param.default) ? param.default.join('\n') : param.default; - var name = Handlebars.Utils.escapeExpression(param.name); - var valueId = Handlebars.Utils.escapeExpression(param.valueId); - paramType = Handlebars.Utils.escapeExpression(paramType); - - var dataVendorExtensions = Object.keys(param).filter(function(property) { - // filter X-data- properties - return property.match(/^X-data-/i) !== null; - }).reduce(function(result, property) { - // remove X- from property name, so it results in html attributes like data-foo='bar' - return result += ' ' + property.substring(2, property.length) + '=\'' + param[property] + '\''; - }, ''); - - if(param.format && param.format === 'password') { - type = 'password'; - } - - if(valueId) { - idAtt = ' id=\'' + valueId + '\''; - } - - if (defaultValue) { - defaultValue = sanitizeHtml(defaultValue); - } else { - defaultValue = ''; - } - - if(isArray) { - result = ''; - } else { - var parameterClass = 'parameter'; - if(param.required) { - parameterClass += ' required'; - } - result = ''; - } - return new Handlebars.SafeString(result); -}); - -Handlebars.registerHelper('ifCond', function (v1, operator, v2, options) { - - switch (operator) { - case '==': - return (v1 == v2) ? options.fn(this) : options.inverse(this); - case '===': - return (v1 === v2) ? options.fn(this) : options.inverse(this); - case '<': - return (v1 < v2) ? options.fn(this) : options.inverse(this); - case '<=': - return (v1 <= v2) ? options.fn(this) : options.inverse(this); - case '>': - return (v1 > v2) ? options.fn(this) : options.inverse(this); - case '>=': - return (v1 >= v2) ? options.fn(this) : options.inverse(this); - case '&&': - return (v1 && v2) ? options.fn(this) : options.inverse(this); - case '||': - return (v1 || v2) ? options.fn(this) : options.inverse(this); - default: - return options.inverse(this); - } -}); - -Handlebars.registerHelper('escape', function (value) { - var text = Handlebars.Utils.escapeExpression(value); - - return new Handlebars.SafeString(text); -}); - -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.sanitizeHtml=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o=0){globRegex.push(quoteRegexp(name).replace(/\\\*/g,".*"))}else{allowedAttributesMap[tag].push(name)}});allowedAttributesGlobMap[tag]=new RegExp("^("+globRegex.join("|")+")$")})}var allowedClassesMap={};each(options.allowedClasses,function(classes,tag){if(allowedAttributesMap){if(!has(allowedAttributesMap,tag)){allowedAttributesMap[tag]=[]}allowedAttributesMap[tag].push("class")}allowedClassesMap[tag]=classes});var transformTagsMap={};var transformTagsAll;each(options.transformTags,function(transform,tag){var transFun;if(typeof transform==="function"){transFun=transform}else if(typeof transform==="string"){transFun=sanitizeHtml.simpleTransform(transform)}if(tag==="*"){transformTagsAll=transFun}else{transformTagsMap[tag]=transFun}});var depth=0;var stack=[];var skipMap={};var transformMap={};var skipText=false;var skipTextDepth=0;var parser=new htmlparser.Parser({onopentag:function(name,attribs){if(skipText){skipTextDepth++;return}var frame=new Frame(name,attribs);stack.push(frame);var skip=false;var hasText=frame.text?true:false;var transformedTag;if(has(transformTagsMap,name)){transformedTag=transformTagsMap[name](name,attribs);frame.attribs=attribs=transformedTag.attribs;if(transformedTag.text!==undefined){frame.innerText=transformedTag.text}if(name!==transformedTag.tagName){frame.name=name=transformedTag.tagName;transformMap[depth]=transformedTag.tagName}}if(transformTagsAll){transformedTag=transformTagsAll(name,attribs);frame.attribs=attribs=transformedTag.attribs;if(name!==transformedTag.tagName){frame.name=name=transformedTag.tagName;transformMap[depth]=transformedTag.tagName}}if(options.allowedTags&&options.allowedTags.indexOf(name)===-1){skip=true;if(nonTextTagsArray.indexOf(name)!==-1){skipText=true;skipTextDepth=1}skipMap[depth]=true}depth++;if(skip){return}result+="<"+name;if(!allowedAttributesMap||has(allowedAttributesMap,name)||allowedAttributesMap["*"]){each(attribs,function(value,a){if(!allowedAttributesMap||has(allowedAttributesMap,name)&&allowedAttributesMap[name].indexOf(a)!==-1||allowedAttributesMap["*"]&&allowedAttributesMap["*"].indexOf(a)!==-1||has(allowedAttributesGlobMap,name)&&allowedAttributesGlobMap[name].test(a)||allowedAttributesGlobMap["*"]&&allowedAttributesGlobMap["*"].test(a)){if(a==="href"||a==="src"){if(naughtyHref(name,value)){delete frame.attribs[a];return}}if(a==="class"){value=filterClasses(value,allowedClassesMap[name]);if(!value.length){delete frame.attribs[a];return}}result+=" "+a;if(value.length){result+='="'+escapeHtml(value)+'"'}}else{delete frame.attribs[a]}})}if(options.selfClosing.indexOf(name)!==-1){result+=" />"}else{result+=">";if(frame.innerText&&!hasText&&!options.textFilter){result+=frame.innerText}}},ontext:function(text){if(skipText){return}var lastFrame=stack[stack.length-1];var tag;if(lastFrame){tag=lastFrame.tag;text=lastFrame.innerText!==undefined?lastFrame.innerText:text}if(tag==="script"||tag==="style"){result+=text}else{var escaped=escapeHtml(text);if(options.textFilter){result+=options.textFilter(escaped)}else{result+=escaped}}if(stack.length){var frame=stack[stack.length-1];frame.text+=text}},onclosetag:function(name){if(skipText){skipTextDepth--;if(!skipTextDepth){skipText=false}else{return}}var frame=stack.pop();if(!frame){return}skipText=false;depth--;if(skipMap[depth]){delete skipMap[depth];frame.updateParentNodeText();return}if(transformMap[depth]){name=transformMap[depth];delete transformMap[depth]}if(options.exclusiveFilter&&options.exclusiveFilter(frame)){result=result.substr(0,frame.tagPosition);return}frame.updateParentNodeText();if(options.selfClosing.indexOf(name)!==-1){return}result+=""}},options.parser);parser.write(html);parser.end();return result;function escapeHtml(s){if(typeof s!=="string"){s=s+""}return s.replace(/\&/g,"&").replace(//g,">").replace(/\"/g,""")}function naughtyHref(name,href){href=href.replace(/[\x00-\x20]+/g,"");href=href.replace(/<\!\-\-.*?\-\-\>/g,"");var matches=href.match(/^([a-zA-Z]+)\:/);if(!matches){return false}var scheme=matches[1].toLowerCase();if(has(options.allowedSchemesByTag,name)){return options.allowedSchemesByTag[name].indexOf(scheme)===-1}return!options.allowedSchemes||options.allowedSchemes.indexOf(scheme)===-1}function filterClasses(classes,allowed){if(!allowed){return classes}classes=classes.split(/\s+/);return classes.filter(function(clss){return allowed.indexOf(clss)!==-1}).join(" ")}}var htmlParserDefaults={decodeEntities:true};sanitizeHtml.defaults={allowedTags:["h3","h4","h5","h6","blockquote","p","a","ul","ol","nl","li","b","i","strong","em","strike","code","hr","br","div","table","thead","caption","tbody","tr","th","td","pre"],allowedAttributes:{a:["href","name","target"],img:["src"]},selfClosing:["img","br","hr","area","base","basefont","input","link","meta"],allowedSchemes:["http","https","ftp","mailto"],allowedSchemesByTag:{}};sanitizeHtml.simpleTransform=function(newTagName,newAttribs,merge){merge=merge===undefined?true:merge;newAttribs=newAttribs||{};return function(tagName,attribs){var attrib;if(merge){for(attrib in newAttribs){attribs[attrib]=newAttribs[attrib]}}else{attribs=newAttribs}return{tagName:newTagName,attribs:attribs}}}},{htmlparser2:36,"regexp-quote":54,xtend:58}],2:[function(require,module,exports){"use strict";exports.toByteArray=toByteArray;exports.fromByteArray=fromByteArray;var lookup=[];var revLookup=[];var Arr=typeof Uint8Array!=="undefined"?Uint8Array:Array;function init(){var code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(var i=0,len=code.length;i0){throw new Error("Invalid string. Length must be a multiple of 4")}placeHolders=b64[len-2]==="="?2:b64[len-1]==="="?1:0;arr=new Arr(len*3/4-placeHolders);l=placeHolders>0?len-4:len;var L=0;for(i=0,j=0;i>16&255;arr[L++]=tmp>>8&255;arr[L++]=tmp&255}if(placeHolders===2){tmp=revLookup[b64.charCodeAt(i)]<<2|revLookup[b64.charCodeAt(i+1)]>>4;arr[L++]=tmp&255}else if(placeHolders===1){tmp=revLookup[b64.charCodeAt(i)]<<10|revLookup[b64.charCodeAt(i+1)]<<4|revLookup[b64.charCodeAt(i+2)]>>2;arr[L++]=tmp>>8&255;arr[L++]=tmp&255}return arr}function tripletToBase64(num){return lookup[num>>18&63]+lookup[num>>12&63]+lookup[num>>6&63]+lookup[num&63]}function encodeChunk(uint8,start,end){var tmp;var output=[];for(var i=start;ilen2?len2:i+maxChunkLength))}if(extraBytes===1){tmp=uint8[len-1];output+=lookup[tmp>>2];output+=lookup[tmp<<4&63];output+="=="}else if(extraBytes===2){tmp=(uint8[len-2]<<8)+uint8[len-1];output+=lookup[tmp>>10];output+=lookup[tmp>>4&63];output+=lookup[tmp<<2&63];output+="="}parts.push(output);return parts.join("")}},{}],3:[function(require,module,exports){},{}],4:[function(require,module,exports){(function(global){"use strict";var buffer=require("buffer");var Buffer=buffer.Buffer;var SlowBuffer=buffer.SlowBuffer;var MAX_LEN=buffer.kMaxLength||2147483647;exports.alloc=function alloc(size,fill,encoding){if(typeof Buffer.alloc==="function"){return Buffer.alloc(size,fill,encoding)}if(typeof encoding==="number"){throw new TypeError("encoding must not be number")}if(typeof size!=="number"){throw new TypeError("size must be a number")}if(size>MAX_LEN){throw new RangeError("size is too large")}var enc=encoding;var _fill=fill;if(_fill===undefined){enc=undefined;_fill=0}var buf=new Buffer(size);if(typeof _fill==="string"){var fillBuf=new Buffer(_fill,enc);var flen=fillBuf.length;var i=-1;while(++iMAX_LEN){throw new RangeError("size is too large")}return new Buffer(size)};exports.from=function from(value,encodingOrOffset,length){if(typeof Buffer.from==="function"&&(!global.Uint8Array||Uint8Array.from!==Buffer.from)){return Buffer.from(value,encodingOrOffset,length)}if(typeof value==="number"){throw new TypeError('"value" argument must not be a number')}if(typeof value==="string"){return new Buffer(value,encodingOrOffset)}if(typeof ArrayBuffer!=="undefined"&&value instanceof ArrayBuffer){var offset=encodingOrOffset;if(arguments.length===1){return new Buffer(value)}if(typeof offset==="undefined"){offset=0}var len=length;if(typeof len==="undefined"){len=value.byteLength-offset}if(offset>=value.byteLength){throw new RangeError("'offset' is out of bounds")}if(len>value.byteLength-offset){throw new RangeError("'length' is out of bounds")}return new Buffer(value.slice(offset,offset+len))}if(Buffer.isBuffer(value)){var out=new Buffer(value.length);value.copy(out,0,0,value.length);return out}if(value){if(Array.isArray(value)||typeof ArrayBuffer!=="undefined"&&value.buffer instanceof ArrayBuffer||"length"in value){return new Buffer(value)}if(value.type==="Buffer"&&Array.isArray(value.data)){return new Buffer(value.data)}}throw new TypeError("First argument must be a string, Buffer, "+"ArrayBuffer, Array, or array-like object.")};exports.allocUnsafeSlow=function allocUnsafeSlow(size){if(typeof Buffer.allocUnsafeSlow==="function"){return Buffer.allocUnsafeSlow(size)}if(typeof size!=="number"){throw new TypeError("size must be a number")}if(size>=MAX_LEN){throw new RangeError("size is too large")}return new SlowBuffer(size)}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{buffer:5}],5:[function(require,module,exports){(function(global){"use strict";var base64=require("base64-js");var ieee754=require("ieee754");var isArray=require("isarray");exports.Buffer=Buffer;exports.SlowBuffer=SlowBuffer;exports.INSPECT_MAX_BYTES=50;Buffer.TYPED_ARRAY_SUPPORT=global.TYPED_ARRAY_SUPPORT!==undefined?global.TYPED_ARRAY_SUPPORT:typedArraySupport();exports.kMaxLength=kMaxLength();function typedArraySupport(){try{var arr=new Uint8Array(1);arr.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}};return arr.foo()===42&&typeof arr.subarray==="function"&&arr.subarray(1,1).byteLength===0}catch(e){return false}}function kMaxLength(){return Buffer.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function createBuffer(that,length){if(kMaxLength()=kMaxLength()){throw new RangeError("Attempt to allocate Buffer larger than maximum "+"size: 0x"+kMaxLength().toString(16)+" bytes")}return length|0}function SlowBuffer(length){if(+length!=length){length=0}return Buffer.alloc(+length)}Buffer.isBuffer=function isBuffer(b){return!!(b!=null&&b._isBuffer)};Buffer.compare=function compare(a,b){if(!Buffer.isBuffer(a)||!Buffer.isBuffer(b)){throw new TypeError("Arguments must be Buffers")}if(a===b)return 0;var x=a.length;var y=b.length;for(var i=0,len=Math.min(x,y);i>>1;case"base64":return base64ToBytes(string).length;default:if(loweredCase)return utf8ToBytes(string).length;encoding=(""+encoding).toLowerCase();loweredCase=true}}}Buffer.byteLength=byteLength;function slowToString(encoding,start,end){var loweredCase=false;if(start===undefined||start<0){start=0}if(start>this.length){return""}if(end===undefined||end>this.length){end=this.length}if(end<=0){return""}end>>>=0;start>>>=0;if(end<=start){return""}if(!encoding)encoding="utf8";while(true){switch(encoding){case"hex":return hexSlice(this,start,end);case"utf8":case"utf-8":return utf8Slice(this,start,end);case"ascii":return asciiSlice(this,start,end);case"latin1":case"binary":return latin1Slice(this,start,end);case"base64":return base64Slice(this,start,end);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,start,end);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(encoding+"").toLowerCase();loweredCase=true}}}Buffer.prototype._isBuffer=true;function swap(b,n,m){var i=b[n];b[n]=b[m];b[m]=i}Buffer.prototype.swap16=function swap16(){var len=this.length;if(len%2!==0){throw new RangeError("Buffer size must be a multiple of 16-bits")}for(var i=0;i0){str=this.toString("hex",0,max).match(/.{2}/g).join(" ");if(this.length>max)str+=" ... "}return""};Buffer.prototype.compare=function compare(target,start,end,thisStart,thisEnd){if(!Buffer.isBuffer(target)){throw new TypeError("Argument must be a Buffer")}if(start===undefined){start=0}if(end===undefined){end=target?target.length:0}if(thisStart===undefined){thisStart=0}if(thisEnd===undefined){thisEnd=this.length}if(start<0||end>target.length||thisStart<0||thisEnd>this.length){throw new RangeError("out of range index")}if(thisStart>=thisEnd&&start>=end){return 0}if(thisStart>=thisEnd){return-1}if(start>=end){return 1}start>>>=0;end>>>=0;thisStart>>>=0;thisEnd>>>=0;if(this===target)return 0;var x=thisEnd-thisStart;var y=end-start;var len=Math.min(x,y);var thisCopy=this.slice(thisStart,thisEnd);var targetCopy=target.slice(start,end);for(var i=0;i2147483647){byteOffset=2147483647}else if(byteOffset<-2147483648){byteOffset=-2147483648}byteOffset=+byteOffset;if(isNaN(byteOffset)){byteOffset=dir?0:buffer.length-1}if(byteOffset<0)byteOffset=buffer.length+byteOffset;if(byteOffset>=buffer.length){if(dir)return-1;else byteOffset=buffer.length-1}else if(byteOffset<0){if(dir)byteOffset=0;else return-1}if(typeof val==="string"){val=Buffer.from(val,encoding)}if(Buffer.isBuffer(val)){if(val.length===0){return-1}return arrayIndexOf(buffer,val,byteOffset,encoding,dir)}else if(typeof val==="number"){val=val&255;if(Buffer.TYPED_ARRAY_SUPPORT&&typeof Uint8Array.prototype.indexOf==="function"){if(dir){return Uint8Array.prototype.indexOf.call(buffer,val,byteOffset)}else{return Uint8Array.prototype.lastIndexOf.call(buffer,val,byteOffset)}}return arrayIndexOf(buffer,[val],byteOffset,encoding,dir)}throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(arr,val,byteOffset,encoding,dir){var indexSize=1;var arrLength=arr.length;var valLength=val.length;if(encoding!==undefined){encoding=String(encoding).toLowerCase();if(encoding==="ucs2"||encoding==="ucs-2"||encoding==="utf16le"||encoding==="utf-16le"){if(arr.length<2||val.length<2){return-1}indexSize=2;arrLength/=2;valLength/=2;byteOffset/=2}}function read(buf,i){if(indexSize===1){return buf[i]}else{return buf.readUInt16BE(i*indexSize)}}var i;if(dir){var foundIndex=-1;for(i=byteOffset;iarrLength)byteOffset=arrLength-valLength;for(i=byteOffset;i>=0;i--){var found=true;for(var j=0;jremaining){length=remaining}}var strLen=string.length;if(strLen%2!==0)throw new TypeError("Invalid hex string");if(length>strLen/2){length=strLen/2}for(var i=0;iremaining)length=remaining;if(string.length>0&&(length<0||offset<0)||offset>this.length){throw new RangeError("Attempt to write outside buffer bounds")}if(!encoding)encoding="utf8";var loweredCase=false;for(;;){switch(encoding){case"hex":return hexWrite(this,string,offset,length);case"utf8":case"utf-8":return utf8Write(this,string,offset,length);case"ascii":return asciiWrite(this,string,offset,length);case"latin1":case"binary":return latin1Write(this,string,offset,length);case"base64":return base64Write(this,string,offset,length);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,string,offset,length);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(""+encoding).toLowerCase();loweredCase=true}}};Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function base64Slice(buf,start,end){if(start===0&&end===buf.length){return base64.fromByteArray(buf)}else{return base64.fromByteArray(buf.slice(start,end))}}function utf8Slice(buf,start,end){end=Math.min(buf.length,end);var res=[];var i=start;while(i239?4:firstByte>223?3:firstByte>191?2:1;if(i+bytesPerSequence<=end){var secondByte,thirdByte,fourthByte,tempCodePoint;switch(bytesPerSequence){case 1:if(firstByte<128){codePoint=firstByte}break;case 2:secondByte=buf[i+1];if((secondByte&192)===128){tempCodePoint=(firstByte&31)<<6|secondByte&63;if(tempCodePoint>127){codePoint=tempCodePoint}}break;case 3:secondByte=buf[i+1];thirdByte=buf[i+2];if((secondByte&192)===128&&(thirdByte&192)===128){tempCodePoint=(firstByte&15)<<12|(secondByte&63)<<6|thirdByte&63;if(tempCodePoint>2047&&(tempCodePoint<55296||tempCodePoint>57343)){codePoint=tempCodePoint}}break;case 4:secondByte=buf[i+1];thirdByte=buf[i+2];fourthByte=buf[i+3];if((secondByte&192)===128&&(thirdByte&192)===128&&(fourthByte&192)===128){tempCodePoint=(firstByte&15)<<18|(secondByte&63)<<12|(thirdByte&63)<<6|fourthByte&63;if(tempCodePoint>65535&&tempCodePoint<1114112){codePoint=tempCodePoint}}}}if(codePoint===null){codePoint=65533;bytesPerSequence=1}else if(codePoint>65535){codePoint-=65536;res.push(codePoint>>>10&1023|55296);codePoint=56320|codePoint&1023}res.push(codePoint);i+=bytesPerSequence}return decodeCodePointsArray(res)}var MAX_ARGUMENTS_LENGTH=4096;function decodeCodePointsArray(codePoints){var len=codePoints.length;if(len<=MAX_ARGUMENTS_LENGTH){return String.fromCharCode.apply(String,codePoints)}var res="";var i=0;while(ilen)end=len;var out="";for(var i=start;ilen){start=len}if(end<0){end+=len;if(end<0)end=0}else if(end>len){end=len}if(endlength)throw new RangeError("Trying to access beyond buffer length")}Buffer.prototype.readUIntLE=function readUIntLE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset];var mul=1;var i=0;while(++i0&&(mul*=256)){val+=this[offset+--byteLength]*mul}return val};Buffer.prototype.readUInt8=function readUInt8(offset,noAssert){if(!noAssert)checkOffset(offset,1,this.length);return this[offset]};Buffer.prototype.readUInt16LE=function readUInt16LE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);return this[offset]|this[offset+1]<<8};Buffer.prototype.readUInt16BE=function readUInt16BE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);return this[offset]<<8|this[offset+1]};Buffer.prototype.readUInt32LE=function readUInt32LE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return(this[offset]|this[offset+1]<<8|this[offset+2]<<16)+this[offset+3]*16777216};Buffer.prototype.readUInt32BE=function readUInt32BE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]*16777216+(this[offset+1]<<16|this[offset+2]<<8|this[offset+3])};Buffer.prototype.readIntLE=function readIntLE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset];var mul=1;var i=0;while(++i=mul)val-=Math.pow(2,8*byteLength);return val};Buffer.prototype.readIntBE=function readIntBE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert)checkOffset(offset,byteLength,this.length); -var i=byteLength;var mul=1;var val=this[offset+--i];while(i>0&&(mul*=256)){val+=this[offset+--i]*mul}mul*=128;if(val>=mul)val-=Math.pow(2,8*byteLength);return val};Buffer.prototype.readInt8=function readInt8(offset,noAssert){if(!noAssert)checkOffset(offset,1,this.length);if(!(this[offset]&128))return this[offset];return(255-this[offset]+1)*-1};Buffer.prototype.readInt16LE=function readInt16LE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);var val=this[offset]|this[offset+1]<<8;return val&32768?val|4294901760:val};Buffer.prototype.readInt16BE=function readInt16BE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);var val=this[offset+1]|this[offset]<<8;return val&32768?val|4294901760:val};Buffer.prototype.readInt32LE=function readInt32LE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]|this[offset+1]<<8|this[offset+2]<<16|this[offset+3]<<24};Buffer.prototype.readInt32BE=function readInt32BE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]<<24|this[offset+1]<<16|this[offset+2]<<8|this[offset+3]};Buffer.prototype.readFloatLE=function readFloatLE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return ieee754.read(this,offset,true,23,4)};Buffer.prototype.readFloatBE=function readFloatBE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return ieee754.read(this,offset,false,23,4)};Buffer.prototype.readDoubleLE=function readDoubleLE(offset,noAssert){if(!noAssert)checkOffset(offset,8,this.length);return ieee754.read(this,offset,true,52,8)};Buffer.prototype.readDoubleBE=function readDoubleBE(offset,noAssert){if(!noAssert)checkOffset(offset,8,this.length);return ieee754.read(this,offset,false,52,8)};function checkInt(buf,value,offset,ext,max,min){if(!Buffer.isBuffer(buf))throw new TypeError('"buffer" argument must be a Buffer instance');if(value>max||valuebuf.length)throw new RangeError("Index out of range")}Buffer.prototype.writeUIntLE=function writeUIntLE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;byteLength=byteLength|0;if(!noAssert){var maxBytes=Math.pow(2,8*byteLength)-1;checkInt(this,value,offset,byteLength,maxBytes,0)}var mul=1;var i=0;this[offset]=value&255;while(++i=0&&(mul*=256)){this[offset+i]=value/mul&255}return offset+byteLength};Buffer.prototype.writeUInt8=function writeUInt8(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,1,255,0);if(!Buffer.TYPED_ARRAY_SUPPORT)value=Math.floor(value);this[offset]=value&255;return offset+1};function objectWriteUInt16(buf,value,offset,littleEndian){if(value<0)value=65535+value+1;for(var i=0,j=Math.min(buf.length-offset,2);i>>(littleEndian?i:1-i)*8}}Buffer.prototype.writeUInt16LE=function writeUInt16LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,65535,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value&255;this[offset+1]=value>>>8}else{objectWriteUInt16(this,value,offset,true)}return offset+2};Buffer.prototype.writeUInt16BE=function writeUInt16BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,65535,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>8;this[offset+1]=value&255}else{objectWriteUInt16(this,value,offset,false)}return offset+2};function objectWriteUInt32(buf,value,offset,littleEndian){if(value<0)value=4294967295+value+1;for(var i=0,j=Math.min(buf.length-offset,4);i>>(littleEndian?i:3-i)*8&255}}Buffer.prototype.writeUInt32LE=function writeUInt32LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,4294967295,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset+3]=value>>>24;this[offset+2]=value>>>16;this[offset+1]=value>>>8;this[offset]=value&255}else{objectWriteUInt32(this,value,offset,true)}return offset+4};Buffer.prototype.writeUInt32BE=function writeUInt32BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,4294967295,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>24;this[offset+1]=value>>>16;this[offset+2]=value>>>8;this[offset+3]=value&255}else{objectWriteUInt32(this,value,offset,false)}return offset+4};Buffer.prototype.writeIntLE=function writeIntLE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;if(!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=0;var mul=1;var sub=0;this[offset]=value&255;while(++i>0)-sub&255}return offset+byteLength};Buffer.prototype.writeIntBE=function writeIntBE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;if(!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=byteLength-1;var mul=1;var sub=0;this[offset+i]=value&255;while(--i>=0&&(mul*=256)){if(value<0&&sub===0&&this[offset+i+1]!==0){sub=1}this[offset+i]=(value/mul>>0)-sub&255}return offset+byteLength};Buffer.prototype.writeInt8=function writeInt8(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,1,127,-128);if(!Buffer.TYPED_ARRAY_SUPPORT)value=Math.floor(value);if(value<0)value=255+value+1;this[offset]=value&255;return offset+1};Buffer.prototype.writeInt16LE=function writeInt16LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,32767,-32768);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value&255;this[offset+1]=value>>>8}else{objectWriteUInt16(this,value,offset,true)}return offset+2};Buffer.prototype.writeInt16BE=function writeInt16BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,32767,-32768);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>8;this[offset+1]=value&255}else{objectWriteUInt16(this,value,offset,false)}return offset+2};Buffer.prototype.writeInt32LE=function writeInt32LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,2147483647,-2147483648);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value&255;this[offset+1]=value>>>8;this[offset+2]=value>>>16;this[offset+3]=value>>>24}else{objectWriteUInt32(this,value,offset,true)}return offset+4};Buffer.prototype.writeInt32BE=function writeInt32BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,2147483647,-2147483648);if(value<0)value=4294967295+value+1;if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>24;this[offset+1]=value>>>16;this[offset+2]=value>>>8;this[offset+3]=value&255}else{objectWriteUInt32(this,value,offset,false)}return offset+4};function checkIEEE754(buf,value,offset,ext,max,min){if(offset+ext>buf.length)throw new RangeError("Index out of range");if(offset<0)throw new RangeError("Index out of range")}function writeFloat(buf,value,offset,littleEndian,noAssert){if(!noAssert){checkIEEE754(buf,value,offset,4,3.4028234663852886e38,-3.4028234663852886e38)}ieee754.write(buf,value,offset,littleEndian,23,4);return offset+4}Buffer.prototype.writeFloatLE=function writeFloatLE(value,offset,noAssert){return writeFloat(this,value,offset,true,noAssert)};Buffer.prototype.writeFloatBE=function writeFloatBE(value,offset,noAssert){return writeFloat(this,value,offset,false,noAssert)};function writeDouble(buf,value,offset,littleEndian,noAssert){if(!noAssert){checkIEEE754(buf,value,offset,8,1.7976931348623157e308,-1.7976931348623157e308)}ieee754.write(buf,value,offset,littleEndian,52,8);return offset+8}Buffer.prototype.writeDoubleLE=function writeDoubleLE(value,offset,noAssert){return writeDouble(this,value,offset,true,noAssert)};Buffer.prototype.writeDoubleBE=function writeDoubleBE(value,offset,noAssert){return writeDouble(this,value,offset,false,noAssert)};Buffer.prototype.copy=function copy(target,targetStart,start,end){if(!start)start=0;if(!end&&end!==0)end=this.length;if(targetStart>=target.length)targetStart=target.length;if(!targetStart)targetStart=0;if(end>0&&end=this.length)throw new RangeError("sourceStart out of bounds");if(end<0)throw new RangeError("sourceEnd out of bounds");if(end>this.length)end=this.length;if(target.length-targetStart=0;--i){target[i+targetStart]=this[i+start]}}else if(len<1e3||!Buffer.TYPED_ARRAY_SUPPORT){for(i=0;i>>0;end=end===undefined?this.length:end>>>0;if(!val)val=0;var i;if(typeof val==="number"){for(i=start;i55295&&codePoint<57344){if(!leadSurrogate){if(codePoint>56319){if((units-=3)>-1)bytes.push(239,191,189);continue}else if(i+1===length){if((units-=3)>-1)bytes.push(239,191,189);continue}leadSurrogate=codePoint;continue}if(codePoint<56320){if((units-=3)>-1)bytes.push(239,191,189);leadSurrogate=codePoint;continue}codePoint=(leadSurrogate-55296<<10|codePoint-56320)+65536}else if(leadSurrogate){if((units-=3)>-1)bytes.push(239,191,189)}leadSurrogate=null;if(codePoint<128){if((units-=1)<0)break;bytes.push(codePoint)}else if(codePoint<2048){if((units-=2)<0)break;bytes.push(codePoint>>6|192,codePoint&63|128)}else if(codePoint<65536){if((units-=3)<0)break;bytes.push(codePoint>>12|224,codePoint>>6&63|128,codePoint&63|128)}else if(codePoint<1114112){if((units-=4)<0)break;bytes.push(codePoint>>18|240,codePoint>>12&63|128,codePoint>>6&63|128,codePoint&63|128)}else{throw new Error("Invalid code point")}}return bytes}function asciiToBytes(str){var byteArray=[];for(var i=0;i>8;lo=c%256;byteArray.push(lo);byteArray.push(hi)}return byteArray}function base64ToBytes(str){return base64.toByteArray(base64clean(str))}function blitBuffer(src,dst,offset,length){for(var i=0;i=dst.length||i>=src.length)break;dst[i+offset]=src[i]}return i}function isnan(val){return val!==val}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"base64-js":2,ieee754:37,isarray:40}],6:[function(require,module,exports){(function(Buffer){function isArray(arg){if(Array.isArray){return Array.isArray(arg)}return objectToString(arg)==="[object Array]"}exports.isArray=isArray;function isBoolean(arg){return typeof arg==="boolean"}exports.isBoolean=isBoolean;function isNull(arg){return arg===null}exports.isNull=isNull;function isNullOrUndefined(arg){return arg==null}exports.isNullOrUndefined=isNullOrUndefined;function isNumber(arg){return typeof arg==="number"}exports.isNumber=isNumber;function isString(arg){return typeof arg==="string"}exports.isString=isString;function isSymbol(arg){return typeof arg==="symbol"}exports.isSymbol=isSymbol;function isUndefined(arg){return arg===void 0}exports.isUndefined=isUndefined;function isRegExp(re){return objectToString(re)==="[object RegExp]"}exports.isRegExp=isRegExp;function isObject(arg){return typeof arg==="object"&&arg!==null}exports.isObject=isObject;function isDate(d){return objectToString(d)==="[object Date]"}exports.isDate=isDate;function isError(e){return objectToString(e)==="[object Error]"||e instanceof Error}exports.isError=isError;function isFunction(arg){return typeof arg==="function"}exports.isFunction=isFunction;function isPrimitive(arg){return arg===null||typeof arg==="boolean"||typeof arg==="number"||typeof arg==="string"||typeof arg==="symbol"||typeof arg==="undefined"}exports.isPrimitive=isPrimitive;exports.isBuffer=Buffer.isBuffer;function objectToString(o){return Object.prototype.toString.call(o)}}).call(this,{isBuffer:require("../../is-buffer/index.js")})},{"../../is-buffer/index.js":39}],7:[function(require,module,exports){var ElementType=require("domelementtype");var entities=require("entities");var booleanAttributes={__proto__:null,allowfullscreen:true,async:true,autofocus:true,autoplay:true,checked:true,controls:true,default:true,defer:true,disabled:true,hidden:true,ismap:true,loop:true,multiple:true,muted:true,open:true,readonly:true,required:true,reversed:true,scoped:true,seamless:true,selected:true,typemustmatch:true};var unencodedElements={__proto__:null,style:true,script:true,xmp:true,iframe:true,noembed:true,noframes:true,plaintext:true,noscript:true};function formatAttrs(attributes,opts){if(!attributes)return;var output="",value;for(var key in attributes){value=attributes[key];if(output){output+=" "}if(!value&&booleanAttributes[key]){output+=key}else{output+=key+'="'+(opts.decodeEntities?entities.encodeXML(value):value)+'"'}}return output}var singleTag={__proto__:null,area:true,base:true,basefont:true,br:true,col:true,command:true,embed:true,frame:true,hr:true,img:true,input:true,isindex:true,keygen:true,link:true,meta:true,param:true,source:true,track:true,wbr:true};var render=module.exports=function(dom,opts){if(!Array.isArray(dom)&&!dom.cheerio)dom=[dom];opts=opts||{};var output="";for(var i=0;i"}else{tag+=">";if(elem.children){tag+=render(elem.children,opts)}if(!singleTag[elem.name]||opts.xmlMode){tag+=""}}return tag}function renderDirective(elem){return"<"+elem.data+">"}function renderText(elem,opts){var data=elem.data||"";if(opts.decodeEntities&&!(elem.parent&&elem.parent.name in unencodedElements)){data=entities.encodeXML(data)}return data}function renderCdata(elem){return""}function renderComment(elem){return""}},{domelementtype:8,entities:20}],8:[function(require,module,exports){module.exports={Text:"text",Directive:"directive",Comment:"comment",Script:"script",Style:"style",Tag:"tag",CDATA:"cdata",isTag:function(elem){return elem.type==="tag"||elem.type==="script"||elem.type==="style"}}},{}],9:[function(require,module,exports){module.exports={Text:"text",Directive:"directive",Comment:"comment",Script:"script",Style:"style",Tag:"tag",CDATA:"cdata",Doctype:"doctype",isTag:function(elem){return elem.type==="tag"||elem.type==="script"||elem.type==="style"}}},{}],10:[function(require,module,exports){var ElementType=require("domelementtype");var re_whitespace=/\s+/g;var NodePrototype=require("./lib/node");var ElementPrototype=require("./lib/element");function DomHandler(callback,options,elementCB){if(typeof callback==="object"){elementCB=options;options=callback;callback=null}else if(typeof options==="function"){elementCB=options;options=defaultOpts}this._callback=callback;this._options=options||defaultOpts;this._elementCB=elementCB;this.dom=[];this._done=false;this._tagStack=[];this._parser=this._parser||null}var defaultOpts={normalizeWhitespace:false,withStartIndices:false};DomHandler.prototype.onparserinit=function(parser){this._parser=parser};DomHandler.prototype.onreset=function(){DomHandler.call(this,this._callback,this._options,this._elementCB)};DomHandler.prototype.onend=function(){if(this._done)return;this._done=true;this._parser=null;this._handleCallback(null)};DomHandler.prototype._handleCallback=DomHandler.prototype.onerror=function(error){if(typeof this._callback==="function"){this._callback(error,this.dom)}else{if(error)throw error}};DomHandler.prototype.onclosetag=function(){var elem=this._tagStack.pop();if(this._elementCB)this._elementCB(elem)};DomHandler.prototype._addDomElement=function(element){var parent=this._tagStack[this._tagStack.length-1];var siblings=parent?parent.children:this.dom;var previousSibling=siblings[siblings.length-1];element.next=null;if(this._options.withStartIndices){element.startIndex=this._parser.startIndex}if(this._options.withDomLvl1){element.__proto__=element.type==="tag"?ElementPrototype:NodePrototype}if(previousSibling){element.prev=previousSibling;previousSibling.next=element}else{element.prev=null}siblings.push(element);element.parent=parent||null};DomHandler.prototype.onopentag=function(name,attribs){var element={type:name==="script"?ElementType.Script:name==="style"?ElementType.Style:ElementType.Tag,name:name,attribs:attribs,children:[]};this._addDomElement(element);this._tagStack.push(element)};DomHandler.prototype.ontext=function(data){var normalize=this._options.normalizeWhitespace||this._options.ignoreWhitespace;var lastTag;if(!this._tagStack.length&&this.dom.length&&(lastTag=this.dom[this.dom.length-1]).type===ElementType.Text){if(normalize){lastTag.data=(lastTag.data+data).replace(re_whitespace," ")}else{lastTag.data+=data}}else{if(this._tagStack.length&&(lastTag=this._tagStack[this._tagStack.length-1])&&(lastTag=lastTag.children[lastTag.children.length-1])&&lastTag.type===ElementType.Text){if(normalize){lastTag.data=(lastTag.data+data).replace(re_whitespace," ")}else{lastTag.data+=data}}else{if(normalize){data=data.replace(re_whitespace," ")}this._addDomElement({data:data,type:ElementType.Text})}}};DomHandler.prototype.oncomment=function(data){var lastTag=this._tagStack[this._tagStack.length-1];if(lastTag&&lastTag.type===ElementType.Comment){lastTag.data+=data;return}var element={data:data,type:ElementType.Comment};this._addDomElement(element);this._tagStack.push(element)};DomHandler.prototype.oncdatastart=function(){var element={children:[{data:"",type:ElementType.Text}],type:ElementType.CDATA};this._addDomElement(element);this._tagStack.push(element)};DomHandler.prototype.oncommentend=DomHandler.prototype.oncdataend=function(){this._tagStack.pop()};DomHandler.prototype.onprocessinginstruction=function(name,data){this._addDomElement({name:name,data:data,type:ElementType.Directive})};module.exports=DomHandler},{"./lib/element":11,"./lib/node":12,domelementtype:9}],11:[function(require,module,exports){var NodePrototype=require("./node");var ElementPrototype=module.exports=Object.create(NodePrototype);var domLvl1={tagName:"name"};Object.keys(domLvl1).forEach(function(key){var shorthand=domLvl1[key];Object.defineProperty(ElementPrototype,key,{get:function(){return this[shorthand]||null},set:function(val){this[shorthand]=val;return val}})})},{"./node":12}],12:[function(require,module,exports){var NodePrototype=module.exports={get firstChild(){var children=this.children;return children&&children[0]||null},get lastChild(){var children=this.children;return children&&children[children.length-1]||null},get nodeType(){return nodeTypes[this.type]||nodeTypes.element}};var domLvl1={tagName:"name",childNodes:"children",parentNode:"parent",previousSibling:"prev",nextSibling:"next",nodeValue:"data"};var nodeTypes={element:1,text:3,cdata:4,comment:8};Object.keys(domLvl1).forEach(function(key){var shorthand=domLvl1[key];Object.defineProperty(NodePrototype,key,{get:function(){return this[shorthand]||null},set:function(val){this[shorthand]=val;return val}})})},{}],13:[function(require,module,exports){var DomUtils=module.exports;[require("./lib/stringify"),require("./lib/traversal"),require("./lib/manipulation"),require("./lib/querying"),require("./lib/legacy"),require("./lib/helpers")].forEach(function(ext){Object.keys(ext).forEach(function(key){DomUtils[key]=ext[key].bind(DomUtils)})})},{"./lib/helpers":14,"./lib/legacy":15,"./lib/manipulation":16,"./lib/querying":17,"./lib/stringify":18,"./lib/traversal":19}],14:[function(require,module,exports){exports.removeSubsets=function(nodes){var idx=nodes.length,node,ancestor,replace;while(--idx>-1){node=ancestor=nodes[idx];nodes[idx]=null;replace=true;while(ancestor){if(nodes.indexOf(ancestor)>-1){replace=false;nodes.splice(idx,1);break}ancestor=ancestor.parent}if(replace){nodes[idx]=node}}return nodes};var POSITION={DISCONNECTED:1,PRECEDING:2,FOLLOWING:4,CONTAINS:8,CONTAINED_BY:16};var comparePos=exports.compareDocumentPosition=function(nodeA,nodeB){var aParents=[];var bParents=[];var current,sharedParent,siblings,aSibling,bSibling,idx;if(nodeA===nodeB){return 0}current=nodeA;while(current){aParents.unshift(current);current=current.parent}current=nodeB;while(current){bParents.unshift(current);current=current.parent}idx=0;while(aParents[idx]===bParents[idx]){idx++}if(idx===0){return POSITION.DISCONNECTED}sharedParent=aParents[idx-1];siblings=sharedParent.children;aSibling=aParents[idx];bSibling=bParents[idx];if(siblings.indexOf(aSibling)>siblings.indexOf(bSibling)){if(sharedParent===nodeB){return POSITION.FOLLOWING|POSITION.CONTAINED_BY}return POSITION.FOLLOWING}else{if(sharedParent===nodeA){return POSITION.PRECEDING|POSITION.CONTAINS}return POSITION.PRECEDING}};exports.uniqueSort=function(nodes){var idx=nodes.length,node,position;nodes=nodes.slice();while(--idx>-1){node=nodes[idx];position=nodes.indexOf(node);if(position>-1&&position0){childs=find(test,childs,recurse,limit);result=result.concat(childs);limit-=childs.length;if(limit<=0)break}}return result}function findOneChild(test,elems){for(var i=0,l=elems.length;i0){elem=findOne(test,elems[i].children)}}return elem}function existsOne(test,elems){for(var i=0,l=elems.length;i0&&existsOne(test,elems[i].children))){return true}}return false}function findAll(test,elems){var result=[];for(var i=0,j=elems.length;i0){result=result.concat(findAll(test,elems[i].children))}}return result}},{domelementtype:9}],18:[function(require,module,exports){var ElementType=require("domelementtype"),getOuterHTML=require("dom-serializer"),isTag=ElementType.isTag;module.exports={getInnerHTML:getInnerHTML,getOuterHTML:getOuterHTML,getText:getText};function getInnerHTML(elem,opts){return elem.children?elem.children.map(function(elem){return getOuterHTML(elem,opts)}).join(""):""}function getText(elem){if(Array.isArray(elem))return elem.map(getText).join("");if(isTag(elem)||elem.type===ElementType.CDATA)return getText(elem.children);if(elem.type===ElementType.Text)return elem.data;return""}},{"dom-serializer":7,domelementtype:9}],19:[function(require,module,exports){var getChildren=exports.getChildren=function(elem){return elem.children};var getParent=exports.getParent=function(elem){return elem.parent};exports.getSiblings=function(elem){var parent=getParent(elem);return parent?getChildren(parent):[elem]};exports.getAttributeValue=function(elem,name){return elem.attribs&&elem.attribs[name]};exports.hasAttrib=function(elem,name){return!!elem.attribs&&hasOwnProperty.call(elem.attribs,name)};exports.getName=function(elem){return elem.name}},{}],20:[function(require,module,exports){var encode=require("./lib/encode.js"),decode=require("./lib/decode.js");exports.decode=function(data,level){return(!level||level<=0?decode.XML:decode.HTML)(data)};exports.decodeStrict=function(data,level){return(!level||level<=0?decode.XML:decode.HTMLStrict)(data)};exports.encode=function(data,level){return(!level||level<=0?encode.XML:encode.HTML)(data)};exports.encodeXML=encode.XML;exports.encodeHTML4=exports.encodeHTML5=exports.encodeHTML=encode.HTML;exports.decodeXML=exports.decodeXMLStrict=decode.XML;exports.decodeHTML4=exports.decodeHTML5=exports.decodeHTML=decode.HTML;exports.decodeHTML4Strict=exports.decodeHTML5Strict=exports.decodeHTMLStrict=decode.HTMLStrict;exports.escape=encode.escape},{"./lib/decode.js":21,"./lib/encode.js":23}],21:[function(require,module,exports){var entityMap=require("../maps/entities.json"),legacyMap=require("../maps/legacy.json"),xmlMap=require("../maps/xml.json"),decodeCodePoint=require("./decode_codepoint.js");var decodeXMLStrict=getStrictDecoder(xmlMap),decodeHTMLStrict=getStrictDecoder(entityMap);function getStrictDecoder(map){var keys=Object.keys(map).join("|"),replace=getReplacer(map);keys+="|#[xX][\\da-fA-F]+|#\\d+";var re=new RegExp("&(?:"+keys+");","g");return function(str){return String(str).replace(re,replace)}}var decodeHTML=function(){var legacy=Object.keys(legacyMap).sort(sorter);var keys=Object.keys(entityMap).sort(sorter);for(var i=0,j=0;i=55296&&codePoint<=57343||codePoint>1114111){return"�"}if(codePoint in decodeMap){codePoint=decodeMap[codePoint]}var output="";if(codePoint>65535){codePoint-=65536;output+=String.fromCharCode(codePoint>>>10&1023|55296);codePoint=56320|codePoint&1023}output+=String.fromCharCode(codePoint);return output}},{"../maps/decode.json":24}],23:[function(require,module,exports){var inverseXML=getInverseObj(require("../maps/xml.json")),xmlReplacer=getInverseReplacer(inverseXML);exports.XML=getInverse(inverseXML,xmlReplacer);var inverseHTML=getInverseObj(require("../maps/entities.json")),htmlReplacer=getInverseReplacer(inverseHTML);exports.HTML=getInverse(inverseHTML,htmlReplacer);function getInverseObj(obj){return Object.keys(obj).sort().reduce(function(inverse,name){inverse[obj[name]]="&"+name+";";return inverse},{})}function getInverseReplacer(inverse){var single=[],multiple=[];Object.keys(inverse).forEach(function(k){if(k.length===1){single.push("\\"+k)}else{multiple.push(k)}});multiple.unshift("["+single.join("")+"]");return new RegExp(multiple.join("|"),"g")}var re_nonASCII=/[^\0-\x7F]/g,re_astralSymbols=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;function singleCharReplacer(c){return"&#x"+c.charCodeAt(0).toString(16).toUpperCase()+";"}function astralReplacer(c){var high=c.charCodeAt(0);var low=c.charCodeAt(1);var codePoint=(high-55296)*1024+low-56320+65536;return"&#x"+codePoint.toString(16).toUpperCase()+";"}function getInverse(inverse,re){function func(name){return inverse[name]}return function(data){return data.replace(re,func).replace(re_astralSymbols,astralReplacer).replace(re_nonASCII,singleCharReplacer)}}var re_xmlChars=getInverseReplacer(inverseXML);function escapeXML(data){return data.replace(re_xmlChars,singleCharReplacer).replace(re_astralSymbols,astralReplacer).replace(re_nonASCII,singleCharReplacer)}exports.escape=escapeXML},{"../maps/entities.json":25,"../maps/xml.json":27}],24:[function(require,module,exports){module.exports={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}},{}],25:[function(require,module,exports){module.exports={Aacute:"Á",aacute:"á",Abreve:"Ă",abreve:"ă",ac:"∾",acd:"∿",acE:"∾̳",Acirc:"Â",acirc:"â",acute:"´",Acy:"А",acy:"а",AElig:"Æ",aelig:"æ",af:"⁡",Afr:"𝔄",afr:"𝔞",Agrave:"À",agrave:"à",alefsym:"ℵ",aleph:"ℵ",Alpha:"Α",alpha:"α",Amacr:"Ā",amacr:"ā",amalg:"⨿",amp:"&",AMP:"&",andand:"⩕",And:"⩓",and:"∧",andd:"⩜",andslope:"⩘",andv:"⩚",ang:"∠",ange:"⦤",angle:"∠",angmsdaa:"⦨",angmsdab:"⦩",angmsdac:"⦪",angmsdad:"⦫",angmsdae:"⦬",angmsdaf:"⦭",angmsdag:"⦮",angmsdah:"⦯",angmsd:"∡",angrt:"∟",angrtvb:"⊾",angrtvbd:"⦝",angsph:"∢",angst:"Å",angzarr:"⍼",Aogon:"Ą",aogon:"ą",Aopf:"𝔸",aopf:"𝕒",apacir:"⩯",ap:"≈",apE:"⩰",ape:"≊",apid:"≋",apos:"'",ApplyFunction:"⁡",approx:"≈",approxeq:"≊",Aring:"Å",aring:"å",Ascr:"𝒜",ascr:"𝒶",Assign:"≔",ast:"*",asymp:"≈",asympeq:"≍",Atilde:"Ã",atilde:"ã",Auml:"Ä",auml:"ä",awconint:"∳",awint:"⨑",backcong:"≌",backepsilon:"϶",backprime:"‵",backsim:"∽",backsimeq:"⋍",Backslash:"∖",Barv:"⫧",barvee:"⊽",barwed:"⌅",Barwed:"⌆",barwedge:"⌅",bbrk:"⎵",bbrktbrk:"⎶",bcong:"≌",Bcy:"Б",bcy:"б",bdquo:"„",becaus:"∵",because:"∵",Because:"∵",bemptyv:"⦰",bepsi:"϶",bernou:"ℬ",Bernoullis:"ℬ",Beta:"Β",beta:"β",beth:"ℶ",between:"≬",Bfr:"𝔅",bfr:"𝔟",bigcap:"⋂",bigcirc:"◯",bigcup:"⋃",bigodot:"⨀",bigoplus:"⨁",bigotimes:"⨂",bigsqcup:"⨆",bigstar:"★",bigtriangledown:"▽",bigtriangleup:"△",biguplus:"⨄",bigvee:"⋁",bigwedge:"⋀",bkarow:"⤍",blacklozenge:"⧫",blacksquare:"▪",blacktriangle:"▴",blacktriangledown:"▾",blacktriangleleft:"◂",blacktriangleright:"▸",blank:"␣",blk12:"▒",blk14:"░",blk34:"▓",block:"█",bne:"=⃥",bnequiv:"≡⃥",bNot:"⫭",bnot:"⌐",Bopf:"𝔹",bopf:"𝕓",bot:"⊥",bottom:"⊥",bowtie:"⋈",boxbox:"⧉",boxdl:"┐",boxdL:"╕",boxDl:"╖",boxDL:"╗",boxdr:"┌",boxdR:"╒",boxDr:"╓",boxDR:"╔",boxh:"─",boxH:"═",boxhd:"┬",boxHd:"╤",boxhD:"╥",boxHD:"╦",boxhu:"┴",boxHu:"╧",boxhU:"╨",boxHU:"╩",boxminus:"⊟",boxplus:"⊞",boxtimes:"⊠",boxul:"┘",boxuL:"╛",boxUl:"╜",boxUL:"╝",boxur:"└",boxuR:"╘",boxUr:"╙",boxUR:"╚",boxv:"│",boxV:"║",boxvh:"┼",boxvH:"╪",boxVh:"╫",boxVH:"╬",boxvl:"┤",boxvL:"╡",boxVl:"╢",boxVL:"╣",boxvr:"├",boxvR:"╞",boxVr:"╟",boxVR:"╠",bprime:"‵",breve:"˘",Breve:"˘",brvbar:"¦",bscr:"𝒷",Bscr:"ℬ",bsemi:"⁏",bsim:"∽",bsime:"⋍",bsolb:"⧅",bsol:"\\",bsolhsub:"⟈",bull:"•",bullet:"•",bump:"≎",bumpE:"⪮",bumpe:"≏",Bumpeq:"≎",bumpeq:"≏",Cacute:"Ć",cacute:"ć",capand:"⩄",capbrcup:"⩉",capcap:"⩋",cap:"∩",Cap:"⋒",capcup:"⩇",capdot:"⩀",CapitalDifferentialD:"ⅅ",caps:"∩︀",caret:"⁁",caron:"ˇ",Cayleys:"ℭ",ccaps:"⩍",Ccaron:"Č",ccaron:"č",Ccedil:"Ç",ccedil:"ç",Ccirc:"Ĉ",ccirc:"ĉ",Cconint:"∰",ccups:"⩌",ccupssm:"⩐",Cdot:"Ċ",cdot:"ċ",cedil:"¸",Cedilla:"¸",cemptyv:"⦲",cent:"¢",centerdot:"·",CenterDot:"·",cfr:"𝔠",Cfr:"ℭ",CHcy:"Ч",chcy:"ч",check:"✓",checkmark:"✓",Chi:"Χ",chi:"χ",circ:"ˆ",circeq:"≗",circlearrowleft:"↺",circlearrowright:"↻",circledast:"⊛",circledcirc:"⊚",circleddash:"⊝",CircleDot:"⊙",circledR:"®",circledS:"Ⓢ",CircleMinus:"⊖",CirclePlus:"⊕",CircleTimes:"⊗",cir:"○",cirE:"⧃",cire:"≗",cirfnint:"⨐",cirmid:"⫯",cirscir:"⧂",ClockwiseContourIntegral:"∲",CloseCurlyDoubleQuote:"”",CloseCurlyQuote:"’",clubs:"♣",clubsuit:"♣",colon:":",Colon:"∷",Colone:"⩴",colone:"≔",coloneq:"≔",comma:",",commat:"@",comp:"∁",compfn:"∘",complement:"∁",complexes:"ℂ",cong:"≅",congdot:"⩭",Congruent:"≡",conint:"∮",Conint:"∯",ContourIntegral:"∮",copf:"𝕔",Copf:"ℂ",coprod:"∐",Coproduct:"∐",copy:"©",COPY:"©",copysr:"℗",CounterClockwiseContourIntegral:"∳",crarr:"↵",cross:"✗",Cross:"⨯",Cscr:"𝒞",cscr:"𝒸",csub:"⫏",csube:"⫑",csup:"⫐",csupe:"⫒",ctdot:"⋯",cudarrl:"⤸",cudarrr:"⤵",cuepr:"⋞",cuesc:"⋟",cularr:"↶",cularrp:"⤽",cupbrcap:"⩈",cupcap:"⩆",CupCap:"≍",cup:"∪",Cup:"⋓",cupcup:"⩊",cupdot:"⊍",cupor:"⩅",cups:"∪︀",curarr:"↷",curarrm:"⤼",curlyeqprec:"⋞",curlyeqsucc:"⋟",curlyvee:"⋎",curlywedge:"⋏",curren:"¤",curvearrowleft:"↶",curvearrowright:"↷",cuvee:"⋎",cuwed:"⋏",cwconint:"∲",cwint:"∱",cylcty:"⌭",dagger:"†",Dagger:"‡",daleth:"ℸ",darr:"↓",Darr:"↡",dArr:"⇓",dash:"‐",Dashv:"⫤",dashv:"⊣",dbkarow:"⤏",dblac:"˝",Dcaron:"Ď",dcaron:"ď",Dcy:"Д",dcy:"д",ddagger:"‡",ddarr:"⇊",DD:"ⅅ",dd:"ⅆ",DDotrahd:"⤑",ddotseq:"⩷",deg:"°",Del:"∇",Delta:"Δ",delta:"δ",demptyv:"⦱",dfisht:"⥿",Dfr:"𝔇",dfr:"𝔡",dHar:"⥥",dharl:"⇃",dharr:"⇂",DiacriticalAcute:"´",DiacriticalDot:"˙",DiacriticalDoubleAcute:"˝",DiacriticalGrave:"`",DiacriticalTilde:"˜",diam:"⋄",diamond:"⋄",Diamond:"⋄",diamondsuit:"♦",diams:"♦",die:"¨",DifferentialD:"ⅆ",digamma:"ϝ",disin:"⋲",div:"÷",divide:"÷",divideontimes:"⋇",divonx:"⋇",DJcy:"Ђ",djcy:"ђ",dlcorn:"⌞",dlcrop:"⌍",dollar:"$",Dopf:"𝔻",dopf:"𝕕",Dot:"¨",dot:"˙",DotDot:"⃜",doteq:"≐",doteqdot:"≑",DotEqual:"≐",dotminus:"∸",dotplus:"∔",dotsquare:"⊡",doublebarwedge:"⌆",DoubleContourIntegral:"∯",DoubleDot:"¨",DoubleDownArrow:"⇓",DoubleLeftArrow:"⇐",DoubleLeftRightArrow:"⇔",DoubleLeftTee:"⫤",DoubleLongLeftArrow:"⟸",DoubleLongLeftRightArrow:"⟺",DoubleLongRightArrow:"⟹",DoubleRightArrow:"⇒",DoubleRightTee:"⊨",DoubleUpArrow:"⇑",DoubleUpDownArrow:"⇕",DoubleVerticalBar:"∥",DownArrowBar:"⤓",downarrow:"↓",DownArrow:"↓",Downarrow:"⇓",DownArrowUpArrow:"⇵",DownBreve:"̑",downdownarrows:"⇊",downharpoonleft:"⇃",downharpoonright:"⇂",DownLeftRightVector:"⥐",DownLeftTeeVector:"⥞",DownLeftVectorBar:"⥖",DownLeftVector:"↽",DownRightTeeVector:"⥟",DownRightVectorBar:"⥗",DownRightVector:"⇁",DownTeeArrow:"↧",DownTee:"⊤",drbkarow:"⤐",drcorn:"⌟",drcrop:"⌌",Dscr:"𝒟",dscr:"𝒹",DScy:"Ѕ",dscy:"ѕ",dsol:"⧶",Dstrok:"Đ",dstrok:"đ",dtdot:"⋱",dtri:"▿",dtrif:"▾",duarr:"⇵",duhar:"⥯",dwangle:"⦦",DZcy:"Џ",dzcy:"џ",dzigrarr:"⟿",Eacute:"É",eacute:"é",easter:"⩮",Ecaron:"Ě",ecaron:"ě",Ecirc:"Ê",ecirc:"ê",ecir:"≖",ecolon:"≕",Ecy:"Э",ecy:"э",eDDot:"⩷",Edot:"Ė",edot:"ė",eDot:"≑",ee:"ⅇ",efDot:"≒",Efr:"𝔈",efr:"𝔢",eg:"⪚",Egrave:"È",egrave:"è",egs:"⪖",egsdot:"⪘",el:"⪙",Element:"∈",elinters:"⏧",ell:"ℓ",els:"⪕",elsdot:"⪗",Emacr:"Ē",emacr:"ē",empty:"∅",emptyset:"∅",EmptySmallSquare:"◻",emptyv:"∅",EmptyVerySmallSquare:"▫",emsp13:" ",emsp14:" ",emsp:" ",ENG:"Ŋ",eng:"ŋ",ensp:" ",Eogon:"Ę",eogon:"ę",Eopf:"𝔼",eopf:"𝕖",epar:"⋕",eparsl:"⧣",eplus:"⩱",epsi:"ε",Epsilon:"Ε",epsilon:"ε",epsiv:"ϵ",eqcirc:"≖",eqcolon:"≕",eqsim:"≂",eqslantgtr:"⪖",eqslantless:"⪕",Equal:"⩵",equals:"=",EqualTilde:"≂",equest:"≟",Equilibrium:"⇌",equiv:"≡",equivDD:"⩸",eqvparsl:"⧥",erarr:"⥱",erDot:"≓",escr:"ℯ",Escr:"ℰ",esdot:"≐",Esim:"⩳",esim:"≂",Eta:"Η",eta:"η",ETH:"Ð",eth:"ð",Euml:"Ë",euml:"ë",euro:"€",excl:"!",exist:"∃",Exists:"∃",expectation:"ℰ",exponentiale:"ⅇ",ExponentialE:"ⅇ",fallingdotseq:"≒",Fcy:"Ф",fcy:"ф",female:"♀",ffilig:"ffi",fflig:"ff",ffllig:"ffl",Ffr:"𝔉",ffr:"𝔣",filig:"fi",FilledSmallSquare:"◼",FilledVerySmallSquare:"▪",fjlig:"fj",flat:"♭",fllig:"fl",fltns:"▱",fnof:"ƒ",Fopf:"𝔽",fopf:"𝕗",forall:"∀",ForAll:"∀",fork:"⋔",forkv:"⫙",Fouriertrf:"ℱ",fpartint:"⨍",frac12:"½",frac13:"⅓",frac14:"¼",frac15:"⅕",frac16:"⅙",frac18:"⅛",frac23:"⅔",frac25:"⅖",frac34:"¾",frac35:"⅗",frac38:"⅜",frac45:"⅘",frac56:"⅚",frac58:"⅝",frac78:"⅞",frasl:"⁄",frown:"⌢",fscr:"𝒻",Fscr:"ℱ",gacute:"ǵ",Gamma:"Γ",gamma:"γ",Gammad:"Ϝ",gammad:"ϝ",gap:"⪆",Gbreve:"Ğ",gbreve:"ğ",Gcedil:"Ģ",Gcirc:"Ĝ",gcirc:"ĝ",Gcy:"Г",gcy:"г",Gdot:"Ġ",gdot:"ġ",ge:"≥",gE:"≧",gEl:"⪌",gel:"⋛",geq:"≥",geqq:"≧",geqslant:"⩾",gescc:"⪩",ges:"⩾",gesdot:"⪀",gesdoto:"⪂",gesdotol:"⪄",gesl:"⋛︀",gesles:"⪔",Gfr:"𝔊",gfr:"𝔤",gg:"≫",Gg:"⋙",ggg:"⋙",gimel:"ℷ",GJcy:"Ѓ",gjcy:"ѓ",gla:"⪥",gl:"≷",glE:"⪒",glj:"⪤",gnap:"⪊",gnapprox:"⪊",gne:"⪈",gnE:"≩",gneq:"⪈",gneqq:"≩",gnsim:"⋧",Gopf:"𝔾",gopf:"𝕘",grave:"`",GreaterEqual:"≥",GreaterEqualLess:"⋛",GreaterFullEqual:"≧",GreaterGreater:"⪢",GreaterLess:"≷",GreaterSlantEqual:"⩾",GreaterTilde:"≳",Gscr:"𝒢",gscr:"ℊ",gsim:"≳",gsime:"⪎",gsiml:"⪐",gtcc:"⪧",gtcir:"⩺",gt:">",GT:">",Gt:"≫",gtdot:"⋗",gtlPar:"⦕",gtquest:"⩼",gtrapprox:"⪆",gtrarr:"⥸",gtrdot:"⋗",gtreqless:"⋛",gtreqqless:"⪌",gtrless:"≷",gtrsim:"≳",gvertneqq:"≩︀",gvnE:"≩︀",Hacek:"ˇ",hairsp:" ",half:"½",hamilt:"ℋ",HARDcy:"Ъ",hardcy:"ъ",harrcir:"⥈",harr:"↔",hArr:"⇔",harrw:"↭",Hat:"^",hbar:"ℏ",Hcirc:"Ĥ",hcirc:"ĥ",hearts:"♥",heartsuit:"♥",hellip:"…",hercon:"⊹",hfr:"𝔥",Hfr:"ℌ",HilbertSpace:"ℋ",hksearow:"⤥",hkswarow:"⤦",hoarr:"⇿",homtht:"∻",hookleftarrow:"↩",hookrightarrow:"↪",hopf:"𝕙",Hopf:"ℍ",horbar:"―",HorizontalLine:"─",hscr:"𝒽",Hscr:"ℋ",hslash:"ℏ",Hstrok:"Ħ",hstrok:"ħ",HumpDownHump:"≎",HumpEqual:"≏",hybull:"⁃",hyphen:"‐",Iacute:"Í",iacute:"í",ic:"⁣",Icirc:"Î",icirc:"î",Icy:"И",icy:"и",Idot:"İ",IEcy:"Е",iecy:"е",iexcl:"¡",iff:"⇔",ifr:"𝔦",Ifr:"ℑ",Igrave:"Ì",igrave:"ì",ii:"ⅈ",iiiint:"⨌",iiint:"∭",iinfin:"⧜",iiota:"℩",IJlig:"IJ",ijlig:"ij",Imacr:"Ī",imacr:"ī",image:"ℑ",ImaginaryI:"ⅈ",imagline:"ℐ",imagpart:"ℑ",imath:"ı",Im:"ℑ",imof:"⊷",imped:"Ƶ",Implies:"⇒",incare:"℅",in:"∈",infin:"∞",infintie:"⧝",inodot:"ı",intcal:"⊺",int:"∫",Int:"∬",integers:"ℤ",Integral:"∫",intercal:"⊺",Intersection:"⋂",intlarhk:"⨗",intprod:"⨼",InvisibleComma:"⁣",InvisibleTimes:"⁢",IOcy:"Ё",iocy:"ё",Iogon:"Į",iogon:"į",Iopf:"𝕀",iopf:"𝕚",Iota:"Ι",iota:"ι",iprod:"⨼",iquest:"¿",iscr:"𝒾",Iscr:"ℐ",isin:"∈",isindot:"⋵",isinE:"⋹",isins:"⋴",isinsv:"⋳",isinv:"∈",it:"⁢",Itilde:"Ĩ",itilde:"ĩ",Iukcy:"І",iukcy:"і",Iuml:"Ï",iuml:"ï",Jcirc:"Ĵ",jcirc:"ĵ",Jcy:"Й",jcy:"й",Jfr:"𝔍",jfr:"𝔧",jmath:"ȷ",Jopf:"𝕁",jopf:"𝕛",Jscr:"𝒥",jscr:"𝒿",Jsercy:"Ј",jsercy:"ј",Jukcy:"Є",jukcy:"є",Kappa:"Κ",kappa:"κ",kappav:"ϰ",Kcedil:"Ķ",kcedil:"ķ",Kcy:"К",kcy:"к",Kfr:"𝔎",kfr:"𝔨",kgreen:"ĸ",KHcy:"Х",khcy:"х",KJcy:"Ќ",kjcy:"ќ",Kopf:"𝕂",kopf:"𝕜",Kscr:"𝒦",kscr:"𝓀",lAarr:"⇚",Lacute:"Ĺ",lacute:"ĺ",laemptyv:"⦴",lagran:"ℒ",Lambda:"Λ",lambda:"λ",lang:"⟨",Lang:"⟪",langd:"⦑",langle:"⟨",lap:"⪅",Laplacetrf:"ℒ",laquo:"«",larrb:"⇤",larrbfs:"⤟",larr:"←",Larr:"↞",lArr:"⇐",larrfs:"⤝",larrhk:"↩",larrlp:"↫",larrpl:"⤹",larrsim:"⥳",larrtl:"↢",latail:"⤙",lAtail:"⤛",lat:"⪫",late:"⪭",lates:"⪭︀",lbarr:"⤌",lBarr:"⤎",lbbrk:"❲",lbrace:"{",lbrack:"[",lbrke:"⦋",lbrksld:"⦏",lbrkslu:"⦍",Lcaron:"Ľ",lcaron:"ľ",Lcedil:"Ļ",lcedil:"ļ",lceil:"⌈",lcub:"{",Lcy:"Л",lcy:"л",ldca:"⤶",ldquo:"“",ldquor:"„",ldrdhar:"⥧",ldrushar:"⥋",ldsh:"↲",le:"≤",lE:"≦",LeftAngleBracket:"⟨",LeftArrowBar:"⇤",leftarrow:"←",LeftArrow:"←",Leftarrow:"⇐",LeftArrowRightArrow:"⇆",leftarrowtail:"↢",LeftCeiling:"⌈",LeftDoubleBracket:"⟦",LeftDownTeeVector:"⥡",LeftDownVectorBar:"⥙",LeftDownVector:"⇃",LeftFloor:"⌊",leftharpoondown:"↽",leftharpoonup:"↼",leftleftarrows:"⇇",leftrightarrow:"↔",LeftRightArrow:"↔",Leftrightarrow:"⇔",leftrightarrows:"⇆",leftrightharpoons:"⇋",leftrightsquigarrow:"↭",LeftRightVector:"⥎",LeftTeeArrow:"↤",LeftTee:"⊣",LeftTeeVector:"⥚",leftthreetimes:"⋋",LeftTriangleBar:"⧏",LeftTriangle:"⊲",LeftTriangleEqual:"⊴",LeftUpDownVector:"⥑",LeftUpTeeVector:"⥠",LeftUpVectorBar:"⥘",LeftUpVector:"↿",LeftVectorBar:"⥒",LeftVector:"↼",lEg:"⪋",leg:"⋚",leq:"≤",leqq:"≦",leqslant:"⩽",lescc:"⪨",les:"⩽",lesdot:"⩿",lesdoto:"⪁",lesdotor:"⪃",lesg:"⋚︀",lesges:"⪓",lessapprox:"⪅",lessdot:"⋖",lesseqgtr:"⋚",lesseqqgtr:"⪋",LessEqualGreater:"⋚",LessFullEqual:"≦",LessGreater:"≶",lessgtr:"≶",LessLess:"⪡",lesssim:"≲",LessSlantEqual:"⩽",LessTilde:"≲",lfisht:"⥼",lfloor:"⌊",Lfr:"𝔏",lfr:"𝔩",lg:"≶",lgE:"⪑",lHar:"⥢",lhard:"↽",lharu:"↼",lharul:"⥪",lhblk:"▄",LJcy:"Љ",ljcy:"љ",llarr:"⇇",ll:"≪",Ll:"⋘",llcorner:"⌞",Lleftarrow:"⇚",llhard:"⥫",lltri:"◺",Lmidot:"Ŀ",lmidot:"ŀ",lmoustache:"⎰",lmoust:"⎰",lnap:"⪉",lnapprox:"⪉",lne:"⪇",lnE:"≨",lneq:"⪇",lneqq:"≨",lnsim:"⋦",loang:"⟬",loarr:"⇽",lobrk:"⟦",longleftarrow:"⟵",LongLeftArrow:"⟵",Longleftarrow:"⟸",longleftrightarrow:"⟷",LongLeftRightArrow:"⟷",Longleftrightarrow:"⟺",longmapsto:"⟼",longrightarrow:"⟶",LongRightArrow:"⟶",Longrightarrow:"⟹",looparrowleft:"↫",looparrowright:"↬",lopar:"⦅",Lopf:"𝕃",lopf:"𝕝",loplus:"⨭",lotimes:"⨴",lowast:"∗",lowbar:"_",LowerLeftArrow:"↙",LowerRightArrow:"↘",loz:"◊",lozenge:"◊",lozf:"⧫",lpar:"(",lparlt:"⦓",lrarr:"⇆",lrcorner:"⌟",lrhar:"⇋",lrhard:"⥭",lrm:"‎",lrtri:"⊿",lsaquo:"‹",lscr:"𝓁",Lscr:"ℒ",lsh:"↰",Lsh:"↰",lsim:"≲",lsime:"⪍",lsimg:"⪏",lsqb:"[",lsquo:"‘",lsquor:"‚",Lstrok:"Ł",lstrok:"ł",ltcc:"⪦",ltcir:"⩹",lt:"<",LT:"<",Lt:"≪",ltdot:"⋖",lthree:"⋋",ltimes:"⋉",ltlarr:"⥶",ltquest:"⩻",ltri:"◃",ltrie:"⊴",ltrif:"◂",ltrPar:"⦖",lurdshar:"⥊",luruhar:"⥦",lvertneqq:"≨︀",lvnE:"≨︀",macr:"¯",male:"♂",malt:"✠",maltese:"✠",Map:"⤅",map:"↦",mapsto:"↦",mapstodown:"↧",mapstoleft:"↤",mapstoup:"↥",marker:"▮",mcomma:"⨩",Mcy:"М",mcy:"м",mdash:"—",mDDot:"∺",measuredangle:"∡",MediumSpace:" ",Mellintrf:"ℳ",Mfr:"𝔐",mfr:"𝔪",mho:"℧",micro:"µ",midast:"*",midcir:"⫰",mid:"∣",middot:"·",minusb:"⊟",minus:"−",minusd:"∸",minusdu:"⨪",MinusPlus:"∓",mlcp:"⫛",mldr:"…",mnplus:"∓",models:"⊧",Mopf:"𝕄",mopf:"𝕞",mp:"∓",mscr:"𝓂",Mscr:"ℳ",mstpos:"∾",Mu:"Μ",mu:"μ",multimap:"⊸",mumap:"⊸",nabla:"∇",Nacute:"Ń",nacute:"ń",nang:"∠⃒",nap:"≉",napE:"⩰̸",napid:"≋̸",napos:"ʼn",napprox:"≉",natural:"♮",naturals:"ℕ",natur:"♮",nbsp:" ",nbump:"≎̸",nbumpe:"≏̸",ncap:"⩃",Ncaron:"Ň",ncaron:"ň",Ncedil:"Ņ",ncedil:"ņ",ncong:"≇",ncongdot:"⩭̸",ncup:"⩂",Ncy:"Н",ncy:"н",ndash:"–",nearhk:"⤤",nearr:"↗",neArr:"⇗",nearrow:"↗",ne:"≠",nedot:"≐̸",NegativeMediumSpace:"​",NegativeThickSpace:"​",NegativeThinSpace:"​",NegativeVeryThinSpace:"​",nequiv:"≢",nesear:"⤨",nesim:"≂̸",NestedGreaterGreater:"≫",NestedLessLess:"≪",NewLine:"\n",nexist:"∄",nexists:"∄",Nfr:"𝔑",nfr:"𝔫",ngE:"≧̸",nge:"≱",ngeq:"≱",ngeqq:"≧̸",ngeqslant:"⩾̸",nges:"⩾̸",nGg:"⋙̸",ngsim:"≵",nGt:"≫⃒",ngt:"≯",ngtr:"≯",nGtv:"≫̸",nharr:"↮",nhArr:"⇎",nhpar:"⫲",ni:"∋",nis:"⋼",nisd:"⋺",niv:"∋",NJcy:"Њ",njcy:"њ",nlarr:"↚",nlArr:"⇍",nldr:"‥",nlE:"≦̸",nle:"≰",nleftarrow:"↚",nLeftarrow:"⇍",nleftrightarrow:"↮",nLeftrightarrow:"⇎",nleq:"≰",nleqq:"≦̸",nleqslant:"⩽̸",nles:"⩽̸",nless:"≮",nLl:"⋘̸",nlsim:"≴",nLt:"≪⃒",nlt:"≮",nltri:"⋪",nltrie:"⋬",nLtv:"≪̸",nmid:"∤",NoBreak:"⁠",NonBreakingSpace:" ",nopf:"𝕟",Nopf:"ℕ",Not:"⫬",not:"¬",NotCongruent:"≢",NotCupCap:"≭",NotDoubleVerticalBar:"∦",NotElement:"∉",NotEqual:"≠",NotEqualTilde:"≂̸",NotExists:"∄",NotGreater:"≯",NotGreaterEqual:"≱",NotGreaterFullEqual:"≧̸",NotGreaterGreater:"≫̸",NotGreaterLess:"≹",NotGreaterSlantEqual:"⩾̸",NotGreaterTilde:"≵",NotHumpDownHump:"≎̸",NotHumpEqual:"≏̸",notin:"∉",notindot:"⋵̸",notinE:"⋹̸",notinva:"∉",notinvb:"⋷",notinvc:"⋶",NotLeftTriangleBar:"⧏̸",NotLeftTriangle:"⋪",NotLeftTriangleEqual:"⋬",NotLess:"≮",NotLessEqual:"≰",NotLessGreater:"≸",NotLessLess:"≪̸",NotLessSlantEqual:"⩽̸",NotLessTilde:"≴",NotNestedGreaterGreater:"⪢̸",NotNestedLessLess:"⪡̸",notni:"∌",notniva:"∌",notnivb:"⋾",notnivc:"⋽",NotPrecedes:"⊀",NotPrecedesEqual:"⪯̸",NotPrecedesSlantEqual:"⋠",NotReverseElement:"∌",NotRightTriangleBar:"⧐̸",NotRightTriangle:"⋫",NotRightTriangleEqual:"⋭",NotSquareSubset:"⊏̸",NotSquareSubsetEqual:"⋢",NotSquareSuperset:"⊐̸",NotSquareSupersetEqual:"⋣",NotSubset:"⊂⃒",NotSubsetEqual:"⊈",NotSucceeds:"⊁",NotSucceedsEqual:"⪰̸",NotSucceedsSlantEqual:"⋡",NotSucceedsTilde:"≿̸",NotSuperset:"⊃⃒",NotSupersetEqual:"⊉",NotTilde:"≁",NotTildeEqual:"≄",NotTildeFullEqual:"≇",NotTildeTilde:"≉",NotVerticalBar:"∤",nparallel:"∦",npar:"∦",nparsl:"⫽⃥",npart:"∂̸",npolint:"⨔",npr:"⊀",nprcue:"⋠",nprec:"⊀",npreceq:"⪯̸",npre:"⪯̸",nrarrc:"⤳̸",nrarr:"↛",nrArr:"⇏",nrarrw:"↝̸",nrightarrow:"↛",nRightarrow:"⇏",nrtri:"⋫",nrtrie:"⋭",nsc:"⊁",nsccue:"⋡",nsce:"⪰̸",Nscr:"𝒩",nscr:"𝓃",nshortmid:"∤",nshortparallel:"∦",nsim:"≁",nsime:"≄",nsimeq:"≄",nsmid:"∤",nspar:"∦",nsqsube:"⋢",nsqsupe:"⋣",nsub:"⊄",nsubE:"⫅̸",nsube:"⊈",nsubset:"⊂⃒",nsubseteq:"⊈",nsubseteqq:"⫅̸",nsucc:"⊁",nsucceq:"⪰̸",nsup:"⊅",nsupE:"⫆̸",nsupe:"⊉",nsupset:"⊃⃒",nsupseteq:"⊉",nsupseteqq:"⫆̸",ntgl:"≹",Ntilde:"Ñ",ntilde:"ñ",ntlg:"≸",ntriangleleft:"⋪",ntrianglelefteq:"⋬",ntriangleright:"⋫",ntrianglerighteq:"⋭",Nu:"Ν",nu:"ν",num:"#",numero:"№",numsp:" ",nvap:"≍⃒",nvdash:"⊬",nvDash:"⊭",nVdash:"⊮",nVDash:"⊯",nvge:"≥⃒",nvgt:">⃒",nvHarr:"⤄",nvinfin:"⧞",nvlArr:"⤂",nvle:"≤⃒",nvlt:"<⃒",nvltrie:"⊴⃒",nvrArr:"⤃",nvrtrie:"⊵⃒",nvsim:"∼⃒",nwarhk:"⤣",nwarr:"↖",nwArr:"⇖",nwarrow:"↖",nwnear:"⤧",Oacute:"Ó",oacute:"ó",oast:"⊛",Ocirc:"Ô",ocirc:"ô",ocir:"⊚",Ocy:"О",ocy:"о",odash:"⊝",Odblac:"Ő",odblac:"ő",odiv:"⨸",odot:"⊙",odsold:"⦼",OElig:"Œ",oelig:"œ",ofcir:"⦿",Ofr:"𝔒",ofr:"𝔬",ogon:"˛",Ograve:"Ò",ograve:"ò",ogt:"⧁",ohbar:"⦵",ohm:"Ω",oint:"∮",olarr:"↺",olcir:"⦾",olcross:"⦻",oline:"‾",olt:"⧀",Omacr:"Ō",omacr:"ō",Omega:"Ω",omega:"ω",Omicron:"Ο",omicron:"ο",omid:"⦶",ominus:"⊖",Oopf:"𝕆",oopf:"𝕠",opar:"⦷",OpenCurlyDoubleQuote:"“",OpenCurlyQuote:"‘",operp:"⦹",oplus:"⊕",orarr:"↻",Or:"⩔",or:"∨",ord:"⩝",order:"ℴ",orderof:"ℴ",ordf:"ª",ordm:"º",origof:"⊶",oror:"⩖",orslope:"⩗",orv:"⩛",oS:"Ⓢ",Oscr:"𝒪",oscr:"ℴ",Oslash:"Ø",oslash:"ø",osol:"⊘",Otilde:"Õ",otilde:"õ",otimesas:"⨶",Otimes:"⨷",otimes:"⊗",Ouml:"Ö",ouml:"ö",ovbar:"⌽",OverBar:"‾",OverBrace:"⏞",OverBracket:"⎴",OverParenthesis:"⏜",para:"¶",parallel:"∥",par:"∥",parsim:"⫳",parsl:"⫽",part:"∂",PartialD:"∂",Pcy:"П",pcy:"п",percnt:"%",period:".",permil:"‰",perp:"⊥",pertenk:"‱",Pfr:"𝔓",pfr:"𝔭",Phi:"Φ",phi:"φ",phiv:"ϕ",phmmat:"ℳ",phone:"☎",Pi:"Π",pi:"π",pitchfork:"⋔",piv:"ϖ",planck:"ℏ",planckh:"ℎ",plankv:"ℏ",plusacir:"⨣",plusb:"⊞",pluscir:"⨢",plus:"+",plusdo:"∔",plusdu:"⨥",pluse:"⩲",PlusMinus:"±",plusmn:"±",plussim:"⨦",plustwo:"⨧",pm:"±",Poincareplane:"ℌ",pointint:"⨕",popf:"𝕡",Popf:"ℙ",pound:"£",prap:"⪷",Pr:"⪻",pr:"≺",prcue:"≼",precapprox:"⪷",prec:"≺",preccurlyeq:"≼",Precedes:"≺",PrecedesEqual:"⪯",PrecedesSlantEqual:"≼",PrecedesTilde:"≾",preceq:"⪯",precnapprox:"⪹",precneqq:"⪵",precnsim:"⋨",pre:"⪯",prE:"⪳",precsim:"≾",prime:"′",Prime:"″",primes:"ℙ",prnap:"⪹",prnE:"⪵",prnsim:"⋨",prod:"∏",Product:"∏",profalar:"⌮",profline:"⌒",profsurf:"⌓",prop:"∝",Proportional:"∝",Proportion:"∷",propto:"∝",prsim:"≾",prurel:"⊰",Pscr:"𝒫",pscr:"𝓅",Psi:"Ψ",psi:"ψ",puncsp:" ",Qfr:"𝔔",qfr:"𝔮",qint:"⨌",qopf:"𝕢",Qopf:"ℚ",qprime:"⁗",Qscr:"𝒬",qscr:"𝓆",quaternions:"ℍ",quatint:"⨖",quest:"?",questeq:"≟",quot:'"',QUOT:'"',rAarr:"⇛",race:"∽̱",Racute:"Ŕ",racute:"ŕ",radic:"√",raemptyv:"⦳",rang:"⟩",Rang:"⟫",rangd:"⦒",range:"⦥",rangle:"⟩",raquo:"»",rarrap:"⥵",rarrb:"⇥",rarrbfs:"⤠",rarrc:"⤳",rarr:"→",Rarr:"↠",rArr:"⇒",rarrfs:"⤞",rarrhk:"↪",rarrlp:"↬",rarrpl:"⥅",rarrsim:"⥴",Rarrtl:"⤖",rarrtl:"↣",rarrw:"↝",ratail:"⤚",rAtail:"⤜",ratio:"∶",rationals:"ℚ",rbarr:"⤍",rBarr:"⤏",RBarr:"⤐",rbbrk:"❳",rbrace:"}",rbrack:"]",rbrke:"⦌",rbrksld:"⦎",rbrkslu:"⦐",Rcaron:"Ř",rcaron:"ř",Rcedil:"Ŗ",rcedil:"ŗ",rceil:"⌉",rcub:"}",Rcy:"Р",rcy:"р",rdca:"⤷",rdldhar:"⥩",rdquo:"”",rdquor:"”",rdsh:"↳",real:"ℜ",realine:"ℛ",realpart:"ℜ",reals:"ℝ",Re:"ℜ",rect:"▭",reg:"®",REG:"®",ReverseElement:"∋",ReverseEquilibrium:"⇋",ReverseUpEquilibrium:"⥯",rfisht:"⥽",rfloor:"⌋",rfr:"𝔯",Rfr:"ℜ",rHar:"⥤",rhard:"⇁",rharu:"⇀",rharul:"⥬",Rho:"Ρ",rho:"ρ",rhov:"ϱ",RightAngleBracket:"⟩",RightArrowBar:"⇥",rightarrow:"→",RightArrow:"→",Rightarrow:"⇒",RightArrowLeftArrow:"⇄",rightarrowtail:"↣",RightCeiling:"⌉",RightDoubleBracket:"⟧",RightDownTeeVector:"⥝",RightDownVectorBar:"⥕",RightDownVector:"⇂",RightFloor:"⌋",rightharpoondown:"⇁",rightharpoonup:"⇀",rightleftarrows:"⇄",rightleftharpoons:"⇌",rightrightarrows:"⇉",rightsquigarrow:"↝",RightTeeArrow:"↦",RightTee:"⊢",RightTeeVector:"⥛",rightthreetimes:"⋌",RightTriangleBar:"⧐",RightTriangle:"⊳",RightTriangleEqual:"⊵",RightUpDownVector:"⥏",RightUpTeeVector:"⥜",RightUpVectorBar:"⥔",RightUpVector:"↾",RightVectorBar:"⥓",RightVector:"⇀",ring:"˚",risingdotseq:"≓",rlarr:"⇄",rlhar:"⇌",rlm:"‏",rmoustache:"⎱",rmoust:"⎱",rnmid:"⫮",roang:"⟭",roarr:"⇾",robrk:"⟧",ropar:"⦆",ropf:"𝕣",Ropf:"ℝ",roplus:"⨮",rotimes:"⨵",RoundImplies:"⥰",rpar:")",rpargt:"⦔",rppolint:"⨒",rrarr:"⇉",Rrightarrow:"⇛",rsaquo:"›",rscr:"𝓇",Rscr:"ℛ",rsh:"↱",Rsh:"↱",rsqb:"]",rsquo:"’",rsquor:"’",rthree:"⋌",rtimes:"⋊",rtri:"▹",rtrie:"⊵",rtrif:"▸",rtriltri:"⧎",RuleDelayed:"⧴",ruluhar:"⥨",rx:"℞",Sacute:"Ś",sacute:"ś",sbquo:"‚",scap:"⪸",Scaron:"Š",scaron:"š",Sc:"⪼",sc:"≻",sccue:"≽",sce:"⪰",scE:"⪴",Scedil:"Ş",scedil:"ş",Scirc:"Ŝ",scirc:"ŝ",scnap:"⪺",scnE:"⪶",scnsim:"⋩",scpolint:"⨓",scsim:"≿",Scy:"С",scy:"с",sdotb:"⊡",sdot:"⋅",sdote:"⩦",searhk:"⤥",searr:"↘",seArr:"⇘",searrow:"↘",sect:"§",semi:";",seswar:"⤩",setminus:"∖",setmn:"∖",sext:"✶",Sfr:"𝔖",sfr:"𝔰",sfrown:"⌢",sharp:"♯",SHCHcy:"Щ",shchcy:"щ",SHcy:"Ш",shcy:"ш",ShortDownArrow:"↓",ShortLeftArrow:"←",shortmid:"∣",shortparallel:"∥",ShortRightArrow:"→",ShortUpArrow:"↑",shy:"­",Sigma:"Σ",sigma:"σ",sigmaf:"ς",sigmav:"ς",sim:"∼",simdot:"⩪",sime:"≃",simeq:"≃",simg:"⪞",simgE:"⪠",siml:"⪝",simlE:"⪟",simne:"≆",simplus:"⨤",simrarr:"⥲",slarr:"←",SmallCircle:"∘",smallsetminus:"∖",smashp:"⨳",smeparsl:"⧤",smid:"∣",smile:"⌣",smt:"⪪",smte:"⪬",smtes:"⪬︀",SOFTcy:"Ь",softcy:"ь",solbar:"⌿",solb:"⧄",sol:"/",Sopf:"𝕊",sopf:"𝕤",spades:"♠",spadesuit:"♠",spar:"∥",sqcap:"⊓",sqcaps:"⊓︀",sqcup:"⊔",sqcups:"⊔︀",Sqrt:"√",sqsub:"⊏",sqsube:"⊑",sqsubset:"⊏",sqsubseteq:"⊑",sqsup:"⊐",sqsupe:"⊒",sqsupset:"⊐",sqsupseteq:"⊒",square:"□",Square:"□",SquareIntersection:"⊓",SquareSubset:"⊏",SquareSubsetEqual:"⊑",SquareSuperset:"⊐",SquareSupersetEqual:"⊒",SquareUnion:"⊔",squarf:"▪",squ:"□",squf:"▪",srarr:"→",Sscr:"𝒮",sscr:"𝓈",ssetmn:"∖",ssmile:"⌣",sstarf:"⋆",Star:"⋆",star:"☆",starf:"★",straightepsilon:"ϵ",straightphi:"ϕ",strns:"¯",sub:"⊂",Sub:"⋐",subdot:"⪽",subE:"⫅",sube:"⊆",subedot:"⫃",submult:"⫁",subnE:"⫋",subne:"⊊",subplus:"⪿",subrarr:"⥹",subset:"⊂",Subset:"⋐",subseteq:"⊆",subseteqq:"⫅",SubsetEqual:"⊆",subsetneq:"⊊",subsetneqq:"⫋",subsim:"⫇",subsub:"⫕",subsup:"⫓",succapprox:"⪸",succ:"≻",succcurlyeq:"≽",Succeeds:"≻",SucceedsEqual:"⪰",SucceedsSlantEqual:"≽",SucceedsTilde:"≿",succeq:"⪰",succnapprox:"⪺",succneqq:"⪶",succnsim:"⋩",succsim:"≿",SuchThat:"∋",sum:"∑",Sum:"∑",sung:"♪",sup1:"¹",sup2:"²",sup3:"³",sup:"⊃",Sup:"⋑",supdot:"⪾",supdsub:"⫘",supE:"⫆",supe:"⊇",supedot:"⫄",Superset:"⊃",SupersetEqual:"⊇",suphsol:"⟉",suphsub:"⫗",suplarr:"⥻",supmult:"⫂",supnE:"⫌",supne:"⊋",supplus:"⫀",supset:"⊃",Supset:"⋑",supseteq:"⊇",supseteqq:"⫆",supsetneq:"⊋",supsetneqq:"⫌",supsim:"⫈",supsub:"⫔",supsup:"⫖",swarhk:"⤦",swarr:"↙",swArr:"⇙",swarrow:"↙",swnwar:"⤪",szlig:"ß",Tab:"\t",target:"⌖",Tau:"Τ",tau:"τ",tbrk:"⎴",Tcaron:"Ť",tcaron:"ť",Tcedil:"Ţ",tcedil:"ţ",Tcy:"Т",tcy:"т",tdot:"⃛",telrec:"⌕",Tfr:"𝔗",tfr:"𝔱",there4:"∴",therefore:"∴",Therefore:"∴",Theta:"Θ",theta:"θ",thetasym:"ϑ",thetav:"ϑ",thickapprox:"≈",thicksim:"∼",ThickSpace:"  ",ThinSpace:" ",thinsp:" ",thkap:"≈",thksim:"∼",THORN:"Þ",thorn:"þ",tilde:"˜",Tilde:"∼",TildeEqual:"≃",TildeFullEqual:"≅",TildeTilde:"≈",timesbar:"⨱",timesb:"⊠",times:"×",timesd:"⨰",tint:"∭",toea:"⤨",topbot:"⌶",topcir:"⫱",top:"⊤",Topf:"𝕋",topf:"𝕥",topfork:"⫚",tosa:"⤩",tprime:"‴",trade:"™",TRADE:"™",triangle:"▵",triangledown:"▿",triangleleft:"◃",trianglelefteq:"⊴",triangleq:"≜",triangleright:"▹",trianglerighteq:"⊵",tridot:"◬",trie:"≜",triminus:"⨺",TripleDot:"⃛",triplus:"⨹",trisb:"⧍",tritime:"⨻",trpezium:"⏢",Tscr:"𝒯",tscr:"𝓉",TScy:"Ц",tscy:"ц",TSHcy:"Ћ",tshcy:"ћ",Tstrok:"Ŧ",tstrok:"ŧ",twixt:"≬",twoheadleftarrow:"↞",twoheadrightarrow:"↠",Uacute:"Ú",uacute:"ú",uarr:"↑",Uarr:"↟",uArr:"⇑",Uarrocir:"⥉",Ubrcy:"Ў",ubrcy:"ў",Ubreve:"Ŭ",ubreve:"ŭ",Ucirc:"Û",ucirc:"û",Ucy:"У",ucy:"у",udarr:"⇅",Udblac:"Ű",udblac:"ű",udhar:"⥮",ufisht:"⥾",Ufr:"𝔘",ufr:"𝔲",Ugrave:"Ù",ugrave:"ù",uHar:"⥣",uharl:"↿",uharr:"↾",uhblk:"▀",ulcorn:"⌜",ulcorner:"⌜",ulcrop:"⌏",ultri:"◸",Umacr:"Ū",umacr:"ū",uml:"¨",UnderBar:"_",UnderBrace:"⏟",UnderBracket:"⎵",UnderParenthesis:"⏝",Union:"⋃",UnionPlus:"⊎",Uogon:"Ų",uogon:"ų",Uopf:"𝕌",uopf:"𝕦",UpArrowBar:"⤒",uparrow:"↑",UpArrow:"↑",Uparrow:"⇑",UpArrowDownArrow:"⇅",updownarrow:"↕",UpDownArrow:"↕",Updownarrow:"⇕",UpEquilibrium:"⥮",upharpoonleft:"↿",upharpoonright:"↾",uplus:"⊎",UpperLeftArrow:"↖",UpperRightArrow:"↗",upsi:"υ",Upsi:"ϒ",upsih:"ϒ",Upsilon:"Υ",upsilon:"υ",UpTeeArrow:"↥",UpTee:"⊥",upuparrows:"⇈",urcorn:"⌝",urcorner:"⌝",urcrop:"⌎",Uring:"Ů",uring:"ů",urtri:"◹",Uscr:"𝒰",uscr:"𝓊",utdot:"⋰",Utilde:"Ũ",utilde:"ũ",utri:"▵",utrif:"▴",uuarr:"⇈",Uuml:"Ü",uuml:"ü",uwangle:"⦧",vangrt:"⦜",varepsilon:"ϵ",varkappa:"ϰ",varnothing:"∅",varphi:"ϕ",varpi:"ϖ",varpropto:"∝",varr:"↕",vArr:"⇕",varrho:"ϱ",varsigma:"ς",varsubsetneq:"⊊︀",varsubsetneqq:"⫋︀",varsupsetneq:"⊋︀",varsupsetneqq:"⫌︀",vartheta:"ϑ",vartriangleleft:"⊲",vartriangleright:"⊳",vBar:"⫨",Vbar:"⫫",vBarv:"⫩",Vcy:"В",vcy:"в",vdash:"⊢",vDash:"⊨",Vdash:"⊩",VDash:"⊫",Vdashl:"⫦",veebar:"⊻",vee:"∨",Vee:"⋁",veeeq:"≚",vellip:"⋮",verbar:"|",Verbar:"‖",vert:"|",Vert:"‖",VerticalBar:"∣",VerticalLine:"|",VerticalSeparator:"❘",VerticalTilde:"≀",VeryThinSpace:" ",Vfr:"𝔙",vfr:"𝔳",vltri:"⊲",vnsub:"⊂⃒",vnsup:"⊃⃒",Vopf:"𝕍",vopf:"𝕧",vprop:"∝",vrtri:"⊳",Vscr:"𝒱",vscr:"𝓋",vsubnE:"⫋︀",vsubne:"⊊︀",vsupnE:"⫌︀",vsupne:"⊋︀",Vvdash:"⊪",vzigzag:"⦚",Wcirc:"Ŵ",wcirc:"ŵ",wedbar:"⩟",wedge:"∧",Wedge:"⋀",wedgeq:"≙",weierp:"℘",Wfr:"𝔚",wfr:"𝔴",Wopf:"𝕎",wopf:"𝕨",wp:"℘",wr:"≀",wreath:"≀",Wscr:"𝒲",wscr:"𝓌",xcap:"⋂",xcirc:"◯",xcup:"⋃",xdtri:"▽",Xfr:"𝔛",xfr:"𝔵",xharr:"⟷",xhArr:"⟺",Xi:"Ξ",xi:"ξ",xlarr:"⟵",xlArr:"⟸",xmap:"⟼",xnis:"⋻",xodot:"⨀",Xopf:"𝕏",xopf:"𝕩",xoplus:"⨁",xotime:"⨂",xrarr:"⟶",xrArr:"⟹",Xscr:"𝒳",xscr:"𝓍",xsqcup:"⨆",xuplus:"⨄",xutri:"△",xvee:"⋁",xwedge:"⋀",Yacute:"Ý",yacute:"ý",YAcy:"Я",yacy:"я",Ycirc:"Ŷ",ycirc:"ŷ",Ycy:"Ы",ycy:"ы",yen:"¥",Yfr:"𝔜",yfr:"𝔶",YIcy:"Ї",yicy:"ї",Yopf:"𝕐",yopf:"𝕪",Yscr:"𝒴",yscr:"𝓎",YUcy:"Ю",yucy:"ю",yuml:"ÿ",Yuml:"Ÿ",Zacute:"Ź",zacute:"ź",Zcaron:"Ž",zcaron:"ž",Zcy:"З",zcy:"з",Zdot:"Ż",zdot:"ż",zeetrf:"ℨ",ZeroWidthSpace:"​",Zeta:"Ζ",zeta:"ζ",zfr:"𝔷",Zfr:"ℨ",ZHcy:"Ж",zhcy:"ж",zigrarr:"⇝",zopf:"𝕫",Zopf:"ℤ",Zscr:"𝒵",zscr:"𝓏",zwj:"‍",zwnj:"‌"}},{}],26:[function(require,module,exports){module.exports={Aacute:"Á",aacute:"á",Acirc:"Â",acirc:"â",acute:"´",AElig:"Æ",aelig:"æ",Agrave:"À",agrave:"à",amp:"&",AMP:"&",Aring:"Å",aring:"å",Atilde:"Ã",atilde:"ã",Auml:"Ä",auml:"ä",brvbar:"¦",Ccedil:"Ç",ccedil:"ç",cedil:"¸",cent:"¢",copy:"©",COPY:"©",curren:"¤",deg:"°",divide:"÷",Eacute:"É",eacute:"é",Ecirc:"Ê",ecirc:"ê",Egrave:"È",egrave:"è",ETH:"Ð",eth:"ð",Euml:"Ë",euml:"ë",frac12:"½",frac14:"¼",frac34:"¾",gt:">",GT:">",Iacute:"Í",iacute:"í",Icirc:"Î",icirc:"î",iexcl:"¡",Igrave:"Ì",igrave:"ì",iquest:"¿",Iuml:"Ï",iuml:"ï",laquo:"«",lt:"<",LT:"<",macr:"¯",micro:"µ",middot:"·",nbsp:" ",not:"¬",Ntilde:"Ñ",ntilde:"ñ",Oacute:"Ó",oacute:"ó",Ocirc:"Ô",ocirc:"ô",Ograve:"Ò",ograve:"ò",ordf:"ª",ordm:"º",Oslash:"Ø",oslash:"ø",Otilde:"Õ",otilde:"õ",Ouml:"Ö",ouml:"ö",para:"¶",plusmn:"±",pound:"£",quot:'"',QUOT:'"',raquo:"»",reg:"®",REG:"®",sect:"§",shy:"­",sup1:"¹",sup2:"²",sup3:"³",szlig:"ß",THORN:"Þ",thorn:"þ",times:"×",Uacute:"Ú",uacute:"ú",Ucirc:"Û",ucirc:"û",Ugrave:"Ù",ugrave:"ù",uml:"¨",Uuml:"Ü",uuml:"ü",Yacute:"Ý",yacute:"ý",yen:"¥",yuml:"ÿ"}},{}],27:[function(require,module,exports){module.exports={amp:"&",apos:"'",gt:">",lt:"<",quot:'"'}},{}],28:[function(require,module,exports){function EventEmitter(){this._events=this._events||{};this._maxListeners=this._maxListeners||undefined}module.exports=EventEmitter;EventEmitter.EventEmitter=EventEmitter;EventEmitter.prototype._events=undefined;EventEmitter.prototype._maxListeners=undefined;EventEmitter.defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||n<0||isNaN(n))throw TypeError("n must be a positive number");this._maxListeners=n;return this};EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(!this._events)this._events={};if(type==="error"){if(!this._events.error||isObject(this._events.error)&&!this._events.error.length){er=arguments[1];if(er instanceof Error){throw er}else{var err=new Error('Uncaught, unspecified "error" event. ('+er+")");err.context=er;throw err}}}handler=this._events[type];if(isUndefined(handler))return false;if(isFunction(handler)){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:args=Array.prototype.slice.call(arguments,1);handler.apply(this,args)}}else if(isObject(handler)){args=Array.prototype.slice.call(arguments,1);listeners=handler.slice();len=listeners.length;for(i=0;i0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);if(typeof console.trace==="function"){console.trace()}}}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){if(!isFunction(listener))throw TypeError("listener must be a function");var fired=false;function g(){this.removeListener(type,g);if(!fired){fired=true;listener.apply(this,arguments)}}g.listener=listener;this.on(type,g);return this};EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;list=this._events[type];length=list.length;position=-1;if(list===listener||isFunction(list.listener)&&list.listener===listener){delete this._events[type];if(this._events.removeListener)this.emit("removeListener",type,listener)}else if(isObject(list)){for(i=length;i-- >0;){if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}}if(position<0)return this;if(list.length===1){list.length=0;delete this._events[type]}else{list.splice(position,1); -}if(this._events.removeListener)this.emit("removeListener",type,listener)}return this};EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener){if(arguments.length===0)this._events={};else if(this._events[type])delete this._events[type];return this}if(arguments.length===0){for(key in this._events){if(key==="removeListener")continue;this.removeAllListeners(key)}this.removeAllListeners("removeListener");this._events={};return this}listeners=this._events[type];if(isFunction(listeners)){this.removeListener(type,listeners)}else if(listeners){while(listeners.length)this.removeListener(type,listeners[listeners.length-1])}delete this._events[type];return this};EventEmitter.prototype.listeners=function(type){var ret;if(!this._events||!this._events[type])ret=[];else if(isFunction(this._events[type]))ret=[this._events[type]];else ret=this._events[type].slice();return ret};EventEmitter.prototype.listenerCount=function(type){if(this._events){var evlistener=this._events[type];if(isFunction(evlistener))return 1;else if(evlistener)return evlistener.length}return 0};EventEmitter.listenerCount=function(emitter,type){return emitter.listenerCount(type)};function isFunction(arg){return typeof arg==="function"}function isNumber(arg){return typeof arg==="number"}function isObject(arg){return typeof arg==="object"&&arg!==null}function isUndefined(arg){return arg===void 0}},{}],29:[function(require,module,exports){module.exports=CollectingHandler;function CollectingHandler(cbs){this._cbs=cbs||{};this.events=[]}var EVENTS=require("./").EVENTS;Object.keys(EVENTS).forEach(function(name){if(EVENTS[name]===0){name="on"+name;CollectingHandler.prototype[name]=function(){this.events.push([name]);if(this._cbs[name])this._cbs[name]()}}else if(EVENTS[name]===1){name="on"+name;CollectingHandler.prototype[name]=function(a){this.events.push([name,a]);if(this._cbs[name])this._cbs[name](a)}}else if(EVENTS[name]===2){name="on"+name;CollectingHandler.prototype[name]=function(a,b){this.events.push([name,a,b]);if(this._cbs[name])this._cbs[name](a,b)}}else{throw Error("wrong number of arguments")}});CollectingHandler.prototype.onreset=function(){this.events=[];if(this._cbs.onreset)this._cbs.onreset()};CollectingHandler.prototype.restart=function(){if(this._cbs.onreset)this._cbs.onreset();for(var i=0,len=this.events.length;i0;this._cbs.onclosetag(this._stack[--i]));}if(this._cbs.onend)this._cbs.onend()};Parser.prototype.reset=function(){if(this._cbs.onreset)this._cbs.onreset();this._tokenizer.reset();this._tagname="";this._attribname="";this._attribs=null;this._stack=[];if(this._cbs.onparserinit)this._cbs.onparserinit(this)};Parser.prototype.parseComplete=function(data){this.reset();this.end(data)};Parser.prototype.write=function(chunk){this._tokenizer.write(chunk)};Parser.prototype.end=function(chunk){this._tokenizer.end(chunk)};Parser.prototype.pause=function(){this._tokenizer.pause()};Parser.prototype.resume=function(){this._tokenizer.resume()};Parser.prototype.parseChunk=Parser.prototype.write;Parser.prototype.done=Parser.prototype.end;module.exports=Parser},{"./Tokenizer.js":34,events:28,inherits:38}],32:[function(require,module,exports){module.exports=ProxyHandler;function ProxyHandler(cbs){this._cbs=cbs||{}}var EVENTS=require("./").EVENTS;Object.keys(EVENTS).forEach(function(name){if(EVENTS[name]===0){name="on"+name;ProxyHandler.prototype[name]=function(){if(this._cbs[name])this._cbs[name]()}}else if(EVENTS[name]===1){name="on"+name;ProxyHandler.prototype[name]=function(a){if(this._cbs[name])this._cbs[name](a)}}else if(EVENTS[name]===2){name="on"+name;ProxyHandler.prototype[name]=function(a,b){if(this._cbs[name])this._cbs[name](a,b)}}else{throw Error("wrong number of arguments")}})},{"./":36}],33:[function(require,module,exports){module.exports=Stream;var Parser=require("./WritableStream.js");function Stream(options){Parser.call(this,new Cbs(this),options)}require("inherits")(Stream,Parser);Stream.prototype.readable=true;function Cbs(scope){this.scope=scope}var EVENTS=require("../").EVENTS;Object.keys(EVENTS).forEach(function(name){if(EVENTS[name]===0){Cbs.prototype["on"+name]=function(){this.scope.emit(name)}}else if(EVENTS[name]===1){Cbs.prototype["on"+name]=function(a){this.scope.emit(name,a)}}else if(EVENTS[name]===2){Cbs.prototype["on"+name]=function(a,b){this.scope.emit(name,a,b)}}else{throw Error("wrong number of arguments!")}})},{"../":36,"./WritableStream.js":35,inherits:38}],34:[function(require,module,exports){module.exports=Tokenizer;var decodeCodePoint=require("entities/lib/decode_codepoint.js"),entityMap=require("entities/maps/entities.json"),legacyMap=require("entities/maps/legacy.json"),xmlMap=require("entities/maps/xml.json"),i=0,TEXT=i++,BEFORE_TAG_NAME=i++,IN_TAG_NAME=i++,IN_SELF_CLOSING_TAG=i++,BEFORE_CLOSING_TAG_NAME=i++,IN_CLOSING_TAG_NAME=i++,AFTER_CLOSING_TAG_NAME=i++,BEFORE_ATTRIBUTE_NAME=i++,IN_ATTRIBUTE_NAME=i++,AFTER_ATTRIBUTE_NAME=i++,BEFORE_ATTRIBUTE_VALUE=i++,IN_ATTRIBUTE_VALUE_DQ=i++,IN_ATTRIBUTE_VALUE_SQ=i++,IN_ATTRIBUTE_VALUE_NQ=i++,BEFORE_DECLARATION=i++,IN_DECLARATION=i++,IN_PROCESSING_INSTRUCTION=i++,BEFORE_COMMENT=i++,IN_COMMENT=i++,AFTER_COMMENT_1=i++,AFTER_COMMENT_2=i++,BEFORE_CDATA_1=i++,BEFORE_CDATA_2=i++,BEFORE_CDATA_3=i++,BEFORE_CDATA_4=i++,BEFORE_CDATA_5=i++,BEFORE_CDATA_6=i++,IN_CDATA=i++,AFTER_CDATA_1=i++,AFTER_CDATA_2=i++,BEFORE_SPECIAL=i++,BEFORE_SPECIAL_END=i++,BEFORE_SCRIPT_1=i++,BEFORE_SCRIPT_2=i++,BEFORE_SCRIPT_3=i++,BEFORE_SCRIPT_4=i++,BEFORE_SCRIPT_5=i++,AFTER_SCRIPT_1=i++,AFTER_SCRIPT_2=i++,AFTER_SCRIPT_3=i++,AFTER_SCRIPT_4=i++,AFTER_SCRIPT_5=i++,BEFORE_STYLE_1=i++,BEFORE_STYLE_2=i++,BEFORE_STYLE_3=i++,BEFORE_STYLE_4=i++,AFTER_STYLE_1=i++,AFTER_STYLE_2=i++,AFTER_STYLE_3=i++,AFTER_STYLE_4=i++,BEFORE_ENTITY=i++,BEFORE_NUMERIC_ENTITY=i++,IN_NAMED_ENTITY=i++,IN_NUMERIC_ENTITY=i++,IN_HEX_ENTITY=i++,j=0,SPECIAL_NONE=j++,SPECIAL_SCRIPT=j++,SPECIAL_STYLE=j++;function whitespace(c){return c===" "||c==="\n"||c==="\t"||c==="\f"||c==="\r"}function characterState(char,SUCCESS){return function(c){if(c===char)this._state=SUCCESS}}function ifElseState(upper,SUCCESS,FAILURE){var lower=upper.toLowerCase();if(upper===lower){return function(c){if(c===lower){this._state=SUCCESS}else{this._state=FAILURE;this._index--}}}else{return function(c){if(c===lower||c===upper){this._state=SUCCESS}else{this._state=FAILURE;this._index--}}}}function consumeSpecialNameChar(upper,NEXT_STATE){var lower=upper.toLowerCase();return function(c){if(c===lower||c===upper){this._state=NEXT_STATE}else{this._state=IN_TAG_NAME;this._index--}}}function Tokenizer(options,cbs){this._state=TEXT;this._buffer="";this._sectionStart=0;this._index=0;this._bufferOffset=0;this._baseState=TEXT;this._special=SPECIAL_NONE;this._cbs=cbs;this._running=true;this._ended=false;this._xmlMode=!!(options&&options.xmlMode);this._decodeEntities=!!(options&&options.decodeEntities)}Tokenizer.prototype._stateText=function(c){if(c==="<"){if(this._index>this._sectionStart){this._cbs.ontext(this._getSection())}this._state=BEFORE_TAG_NAME;this._sectionStart=this._index}else if(this._decodeEntities&&this._special===SPECIAL_NONE&&c==="&"){if(this._index>this._sectionStart){this._cbs.ontext(this._getSection())}this._baseState=TEXT;this._state=BEFORE_ENTITY;this._sectionStart=this._index}};Tokenizer.prototype._stateBeforeTagName=function(c){if(c==="/"){this._state=BEFORE_CLOSING_TAG_NAME}else if(c==="<"){this._cbs.ontext(this._getSection());this._sectionStart=this._index}else if(c===">"||this._special!==SPECIAL_NONE||whitespace(c)){this._state=TEXT}else if(c==="!"){this._state=BEFORE_DECLARATION;this._sectionStart=this._index+1}else if(c==="?"){this._state=IN_PROCESSING_INSTRUCTION;this._sectionStart=this._index+1}else{this._state=!this._xmlMode&&(c==="s"||c==="S")?BEFORE_SPECIAL:IN_TAG_NAME;this._sectionStart=this._index}};Tokenizer.prototype._stateInTagName=function(c){if(c==="/"||c===">"||whitespace(c)){this._emitToken("onopentagname");this._state=BEFORE_ATTRIBUTE_NAME;this._index--}};Tokenizer.prototype._stateBeforeCloseingTagName=function(c){if(whitespace(c));else if(c===">"){this._state=TEXT}else if(this._special!==SPECIAL_NONE){if(c==="s"||c==="S"){this._state=BEFORE_SPECIAL_END}else{this._state=TEXT;this._index--}}else{this._state=IN_CLOSING_TAG_NAME;this._sectionStart=this._index}};Tokenizer.prototype._stateInCloseingTagName=function(c){if(c===">"||whitespace(c)){this._emitToken("onclosetag");this._state=AFTER_CLOSING_TAG_NAME;this._index--}};Tokenizer.prototype._stateAfterCloseingTagName=function(c){if(c===">"){this._state=TEXT;this._sectionStart=this._index+1}};Tokenizer.prototype._stateBeforeAttributeName=function(c){if(c===">"){this._cbs.onopentagend();this._state=TEXT;this._sectionStart=this._index+1}else if(c==="/"){this._state=IN_SELF_CLOSING_TAG}else if(!whitespace(c)){this._state=IN_ATTRIBUTE_NAME;this._sectionStart=this._index}};Tokenizer.prototype._stateInSelfClosingTag=function(c){if(c===">"){this._cbs.onselfclosingtag();this._state=TEXT;this._sectionStart=this._index+1}else if(!whitespace(c)){this._state=BEFORE_ATTRIBUTE_NAME;this._index--}};Tokenizer.prototype._stateInAttributeName=function(c){if(c==="="||c==="/"||c===">"||whitespace(c)){this._cbs.onattribname(this._getSection());this._sectionStart=-1;this._state=AFTER_ATTRIBUTE_NAME;this._index--}};Tokenizer.prototype._stateAfterAttributeName=function(c){if(c==="="){this._state=BEFORE_ATTRIBUTE_VALUE}else if(c==="/"||c===">"){this._cbs.onattribend();this._state=BEFORE_ATTRIBUTE_NAME;this._index--}else if(!whitespace(c)){this._cbs.onattribend();this._state=IN_ATTRIBUTE_NAME;this._sectionStart=this._index}};Tokenizer.prototype._stateBeforeAttributeValue=function(c){if(c==='"'){this._state=IN_ATTRIBUTE_VALUE_DQ;this._sectionStart=this._index+1}else if(c==="'"){this._state=IN_ATTRIBUTE_VALUE_SQ;this._sectionStart=this._index+1}else if(!whitespace(c)){this._state=IN_ATTRIBUTE_VALUE_NQ;this._sectionStart=this._index;this._index--}};Tokenizer.prototype._stateInAttributeValueDoubleQuotes=function(c){if(c==='"'){this._emitToken("onattribdata");this._cbs.onattribend();this._state=BEFORE_ATTRIBUTE_NAME}else if(this._decodeEntities&&c==="&"){this._emitToken("onattribdata");this._baseState=this._state;this._state=BEFORE_ENTITY;this._sectionStart=this._index}};Tokenizer.prototype._stateInAttributeValueSingleQuotes=function(c){if(c==="'"){this._emitToken("onattribdata");this._cbs.onattribend();this._state=BEFORE_ATTRIBUTE_NAME}else if(this._decodeEntities&&c==="&"){this._emitToken("onattribdata");this._baseState=this._state;this._state=BEFORE_ENTITY;this._sectionStart=this._index}};Tokenizer.prototype._stateInAttributeValueNoQuotes=function(c){if(whitespace(c)||c===">"){this._emitToken("onattribdata");this._cbs.onattribend();this._state=BEFORE_ATTRIBUTE_NAME;this._index--}else if(this._decodeEntities&&c==="&"){this._emitToken("onattribdata");this._baseState=this._state;this._state=BEFORE_ENTITY;this._sectionStart=this._index}};Tokenizer.prototype._stateBeforeDeclaration=function(c){this._state=c==="["?BEFORE_CDATA_1:c==="-"?BEFORE_COMMENT:IN_DECLARATION};Tokenizer.prototype._stateInDeclaration=function(c){if(c===">"){this._cbs.ondeclaration(this._getSection());this._state=TEXT;this._sectionStart=this._index+1}};Tokenizer.prototype._stateInProcessingInstruction=function(c){if(c===">"){this._cbs.onprocessinginstruction(this._getSection());this._state=TEXT;this._sectionStart=this._index+1}};Tokenizer.prototype._stateBeforeComment=function(c){if(c==="-"){this._state=IN_COMMENT;this._sectionStart=this._index+1}else{this._state=IN_DECLARATION}};Tokenizer.prototype._stateInComment=function(c){if(c==="-")this._state=AFTER_COMMENT_1};Tokenizer.prototype._stateAfterComment1=function(c){if(c==="-"){this._state=AFTER_COMMENT_2}else{this._state=IN_COMMENT}};Tokenizer.prototype._stateAfterComment2=function(c){if(c===">"){this._cbs.oncomment(this._buffer.substring(this._sectionStart,this._index-2));this._state=TEXT;this._sectionStart=this._index+1}else if(c!=="-"){this._state=IN_COMMENT}};Tokenizer.prototype._stateBeforeCdata1=ifElseState("C",BEFORE_CDATA_2,IN_DECLARATION);Tokenizer.prototype._stateBeforeCdata2=ifElseState("D",BEFORE_CDATA_3,IN_DECLARATION);Tokenizer.prototype._stateBeforeCdata3=ifElseState("A",BEFORE_CDATA_4,IN_DECLARATION);Tokenizer.prototype._stateBeforeCdata4=ifElseState("T",BEFORE_CDATA_5,IN_DECLARATION);Tokenizer.prototype._stateBeforeCdata5=ifElseState("A",BEFORE_CDATA_6,IN_DECLARATION);Tokenizer.prototype._stateBeforeCdata6=function(c){if(c==="["){this._state=IN_CDATA;this._sectionStart=this._index+1}else{this._state=IN_DECLARATION;this._index--}};Tokenizer.prototype._stateInCdata=function(c){if(c==="]")this._state=AFTER_CDATA_1};Tokenizer.prototype._stateAfterCdata1=characterState("]",AFTER_CDATA_2);Tokenizer.prototype._stateAfterCdata2=function(c){if(c===">"){this._cbs.oncdata(this._buffer.substring(this._sectionStart,this._index-2));this._state=TEXT;this._sectionStart=this._index+1}else if(c!=="]"){this._state=IN_CDATA}};Tokenizer.prototype._stateBeforeSpecial=function(c){if(c==="c"||c==="C"){this._state=BEFORE_SCRIPT_1}else if(c==="t"||c==="T"){this._state=BEFORE_STYLE_1}else{this._state=IN_TAG_NAME;this._index--}};Tokenizer.prototype._stateBeforeSpecialEnd=function(c){if(this._special===SPECIAL_SCRIPT&&(c==="c"||c==="C")){this._state=AFTER_SCRIPT_1}else if(this._special===SPECIAL_STYLE&&(c==="t"||c==="T")){this._state=AFTER_STYLE_1}else this._state=TEXT};Tokenizer.prototype._stateBeforeScript1=consumeSpecialNameChar("R",BEFORE_SCRIPT_2);Tokenizer.prototype._stateBeforeScript2=consumeSpecialNameChar("I",BEFORE_SCRIPT_3);Tokenizer.prototype._stateBeforeScript3=consumeSpecialNameChar("P",BEFORE_SCRIPT_4);Tokenizer.prototype._stateBeforeScript4=consumeSpecialNameChar("T",BEFORE_SCRIPT_5);Tokenizer.prototype._stateBeforeScript5=function(c){if(c==="/"||c===">"||whitespace(c)){this._special=SPECIAL_SCRIPT}this._state=IN_TAG_NAME;this._index--};Tokenizer.prototype._stateAfterScript1=ifElseState("R",AFTER_SCRIPT_2,TEXT);Tokenizer.prototype._stateAfterScript2=ifElseState("I",AFTER_SCRIPT_3,TEXT);Tokenizer.prototype._stateAfterScript3=ifElseState("P",AFTER_SCRIPT_4,TEXT);Tokenizer.prototype._stateAfterScript4=ifElseState("T",AFTER_SCRIPT_5,TEXT);Tokenizer.prototype._stateAfterScript5=function(c){if(c===">"||whitespace(c)){this._special=SPECIAL_NONE;this._state=IN_CLOSING_TAG_NAME;this._sectionStart=this._index-6;this._index--}else this._state=TEXT};Tokenizer.prototype._stateBeforeStyle1=consumeSpecialNameChar("Y",BEFORE_STYLE_2);Tokenizer.prototype._stateBeforeStyle2=consumeSpecialNameChar("L",BEFORE_STYLE_3);Tokenizer.prototype._stateBeforeStyle3=consumeSpecialNameChar("E",BEFORE_STYLE_4);Tokenizer.prototype._stateBeforeStyle4=function(c){if(c==="/"||c===">"||whitespace(c)){this._special=SPECIAL_STYLE}this._state=IN_TAG_NAME;this._index--};Tokenizer.prototype._stateAfterStyle1=ifElseState("Y",AFTER_STYLE_2,TEXT);Tokenizer.prototype._stateAfterStyle2=ifElseState("L",AFTER_STYLE_3,TEXT);Tokenizer.prototype._stateAfterStyle3=ifElseState("E",AFTER_STYLE_4,TEXT);Tokenizer.prototype._stateAfterStyle4=function(c){if(c===">"||whitespace(c)){this._special=SPECIAL_NONE;this._state=IN_CLOSING_TAG_NAME;this._sectionStart=this._index-5;this._index--}else this._state=TEXT};Tokenizer.prototype._stateBeforeEntity=ifElseState("#",BEFORE_NUMERIC_ENTITY,IN_NAMED_ENTITY);Tokenizer.prototype._stateBeforeNumericEntity=ifElseState("X",IN_HEX_ENTITY,IN_NUMERIC_ENTITY);Tokenizer.prototype._parseNamedEntityStrict=function(){if(this._sectionStart+16)limit=6;while(limit>=2){var entity=this._buffer.substr(start,limit);if(legacyMap.hasOwnProperty(entity)){this._emitPartial(legacyMap[entity]);this._sectionStart+=limit+1;return}else{limit--}}};Tokenizer.prototype._stateInNamedEntity=function(c){if(c===";"){this._parseNamedEntityStrict();if(this._sectionStart+1"z")&&(c<"A"||c>"Z")&&(c<"0"||c>"9")){if(this._xmlMode);else if(this._sectionStart+1===this._index);else if(this._baseState!==TEXT){if(c!=="="){this._parseNamedEntityStrict()}}else{this._parseLegacyEntity()}this._state=this._baseState;this._index--}};Tokenizer.prototype._decodeNumericEntity=function(offset,base){var sectionStart=this._sectionStart+offset;if(sectionStart!==this._index){var entity=this._buffer.substring(sectionStart,this._index);var parsed=parseInt(entity,base);this._emitPartial(decodeCodePoint(parsed));this._sectionStart=this._index}else{this._sectionStart--}this._state=this._baseState};Tokenizer.prototype._stateInNumericEntity=function(c){if(c===";"){this._decodeNumericEntity(2,10);this._sectionStart++}else if(c<"0"||c>"9"){if(!this._xmlMode){this._decodeNumericEntity(2,10)}else{this._state=this._baseState}this._index--}};Tokenizer.prototype._stateInHexEntity=function(c){if(c===";"){this._decodeNumericEntity(3,16);this._sectionStart++}else if((c<"a"||c>"f")&&(c<"A"||c>"F")&&(c<"0"||c>"9")){if(!this._xmlMode){this._decodeNumericEntity(3,16)}else{this._state=this._baseState}this._index--}};Tokenizer.prototype._cleanup=function(){if(this._sectionStart<0){this._buffer="";this._index=0;this._bufferOffset+=this._index}else if(this._running){if(this._state===TEXT){if(this._sectionStart!==this._index){this._cbs.ontext(this._buffer.substr(this._sectionStart))}this._buffer="";this._bufferOffset+=this._index;this._index=0}else if(this._sectionStart===this._index){this._buffer="";this._bufferOffset+=this._index;this._index=0}else{this._buffer=this._buffer.substr(this._sectionStart);this._index-=this._sectionStart;this._bufferOffset+=this._sectionStart}this._sectionStart=0}};Tokenizer.prototype.write=function(chunk){if(this._ended)this._cbs.onerror(Error(".write() after done!"));this._buffer+=chunk;this._parse()};Tokenizer.prototype._parse=function(){while(this._index>1;var nBits=-7;var i=isLE?nBytes-1:0;var d=isLE?-1:1;var s=buffer[offset+i];i+=d;e=s&(1<<-nBits)-1;s>>=-nBits;nBits+=eLen;for(;nBits>0;e=e*256+buffer[offset+i],i+=d,nBits-=8){}m=e&(1<<-nBits)-1;e>>=-nBits;nBits+=mLen;for(;nBits>0;m=m*256+buffer[offset+i],i+=d,nBits-=8){}if(e===0){e=1-eBias}else if(e===eMax){return m?NaN:(s?-1:1)*Infinity}else{m=m+Math.pow(2,mLen);e=e-eBias}return(s?-1:1)*m*Math.pow(2,e-mLen)};exports.write=function(buffer,value,offset,isLE,mLen,nBytes){var e,m,c;var eLen=nBytes*8-mLen-1;var eMax=(1<>1;var rt=mLen===23?Math.pow(2,-24)-Math.pow(2,-77):0;var i=isLE?0:nBytes-1;var d=isLE?1:-1;var s=value<0||value===0&&1/value<0?1:0;value=Math.abs(value);if(isNaN(value)||value===Infinity){m=isNaN(value)?1:0;e=eMax}else{e=Math.floor(Math.log(value)/Math.LN2);if(value*(c=Math.pow(2,-e))<1){e--;c*=2}if(e+eBias>=1){value+=rt/c}else{value+=rt*Math.pow(2,1-eBias)}if(value*c>=2){e++;c/=2}if(e+eBias>=eMax){m=0;e=eMax}else if(e+eBias>=1){m=(value*c-1)*Math.pow(2,mLen);e=e+eBias}else{m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen);e=0}}for(;mLen>=8;buffer[offset+i]=m&255,i+=d,m/=256,mLen-=8){}e=e<0;buffer[offset+i]=e&255,i+=d,e/=256,eLen-=8){}buffer[offset+i-d]|=s*128}},{}],38:[function(require,module,exports){if(typeof Object.create==="function"){module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:false,writable:true,configurable:true}})}}else{module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype;ctor.prototype=new TempCtor;ctor.prototype.constructor=ctor}}},{}],39:[function(require,module,exports){module.exports=function(obj){return obj!=null&&(isBuffer(obj)||isSlowBuffer(obj)||!!obj._isBuffer)};function isBuffer(obj){return!!obj.constructor&&typeof obj.constructor.isBuffer==="function"&&obj.constructor.isBuffer(obj)}function isSlowBuffer(obj){return typeof obj.readFloatLE==="function"&&typeof obj.slice==="function"&&isBuffer(obj.slice(0,0))}},{}],40:[function(require,module,exports){var toString={}.toString;module.exports=Array.isArray||function(arr){return toString.call(arr)=="[object Array]"}},{}],41:[function(require,module,exports){(function(process){"use strict";if(!process.version||process.version.indexOf("v0.")===0||process.version.indexOf("v1.")===0&&process.version.indexOf("v1.8.")!==0){module.exports=nextTick}else{module.exports=process.nextTick}function nextTick(fn,arg1,arg2,arg3){if(typeof fn!=="function"){throw new TypeError('"callback" argument must be a function')}var len=arguments.length;var args,i;switch(len){case 0:case 1:return process.nextTick(fn);case 2:return process.nextTick(function afterTickOne(){fn.call(null,arg1)});case 3:return process.nextTick(function afterTickTwo(){fn.call(null,arg1,arg2)});case 4:return process.nextTick(function afterTickThree(){fn.call(null,arg1,arg2,arg3)});default:args=new Array(len-1);i=0;while(i1){for(var i=1;i0){if(state.ended&&!addToFront){var e=new Error("stream.push() after EOF");stream.emit("error",e)}else if(state.endEmitted&&addToFront){var _e=new Error("stream.unshift() after end event");stream.emit("error",_e)}else{var skipAdd;if(state.decoder&&!addToFront&&!encoding){chunk=state.decoder.write(chunk);skipAdd=!state.objectMode&&chunk.length===0}if(!addToFront)state.reading=false;if(!skipAdd){if(state.flowing&&state.length===0&&!state.sync){stream.emit("data",chunk);stream.read(0)}else{state.length+=state.objectMode?1:chunk.length;if(addToFront)state.buffer.unshift(chunk);else state.buffer.push(chunk);if(state.needReadable)emitReadable(stream)}}maybeReadMore(stream,state)}}else if(!addToFront){state.reading=false}return needMoreData(state)}function needMoreData(state){return!state.ended&&(state.needReadable||state.length=MAX_HWM){n=MAX_HWM}else{n--;n|=n>>>1;n|=n>>>2;n|=n>>>4;n|=n>>>8;n|=n>>>16;n++}return n}function howMuchToRead(n,state){if(n<=0||state.length===0&&state.ended)return 0;if(state.objectMode)return 1;if(n!==n){if(state.flowing&&state.length)return state.buffer.head.data.length;else return state.length}if(n>state.highWaterMark)state.highWaterMark=computeNewHighWaterMark(n);if(n<=state.length)return n;if(!state.ended){state.needReadable=true;return 0}return state.length}Readable.prototype.read=function(n){debug("read",n);n=parseInt(n,10);var state=this._readableState;var nOrig=n;if(n!==0)state.emittedReadable=false;if(n===0&&state.needReadable&&(state.length>=state.highWaterMark||state.ended)){debug("read: emitReadable",state.length,state.ended);if(state.length===0&&state.ended)endReadable(this);else emitReadable(this);return null}n=howMuchToRead(n,state);if(n===0&&state.ended){if(state.length===0)endReadable(this);return null}var doRead=state.needReadable;debug("need readable",doRead);if(state.length===0||state.length-n0)ret=fromList(n,state);else ret=null;if(ret===null){state.needReadable=true;n=0}else{state.length-=n}if(state.length===0){if(!state.ended)state.needReadable=true;if(nOrig!==n&&state.ended)endReadable(this)}if(ret!==null)this.emit("data",ret);return ret};function chunkInvalid(state,chunk){var er=null;if(!Buffer.isBuffer(chunk)&&typeof chunk!=="string"&&chunk!==null&&chunk!==undefined&&!state.objectMode){er=new TypeError("Invalid non-string/buffer chunk")}return er}function onEofChunk(stream,state){if(state.ended)return;if(state.decoder){var chunk=state.decoder.end();if(chunk&&chunk.length){state.buffer.push(chunk);state.length+=state.objectMode?1:chunk.length}}state.ended=true;emitReadable(stream)}function emitReadable(stream){var state=stream._readableState;state.needReadable=false;if(!state.emittedReadable){debug("emitReadable",state.flowing);state.emittedReadable=true;if(state.sync)processNextTick(emitReadable_,stream);else emitReadable_(stream)}}function emitReadable_(stream){debug("emit readable");stream.emit("readable");flow(stream)}function maybeReadMore(stream,state){if(!state.readingMore){state.readingMore=true;processNextTick(maybeReadMore_,stream,state)}}function maybeReadMore_(stream,state){var len=state.length;while(!state.reading&&!state.flowing&&!state.ended&&state.length1&&indexOf(state.pipes,dest)!==-1)&&!cleanedUp){debug("false write response, pause",src._readableState.awaitDrain);src._readableState.awaitDrain++;increasedAwaitDrain=true}src.pause()}}function onerror(er){debug("onerror",er);unpipe();dest.removeListener("error",onerror);if(EElistenerCount(dest,"error")===0)dest.emit("error",er)}prependListener(dest,"error",onerror);function onclose(){dest.removeListener("finish",onfinish);unpipe()}dest.once("close",onclose);function onfinish(){debug("onfinish");dest.removeListener("close",onclose);unpipe()}dest.once("finish",onfinish);function unpipe(){debug("unpipe");src.unpipe(dest)}dest.emit("pipe",src);if(!state.flowing){debug("pipe resume");src.resume()}return dest};function pipeOnDrain(src){return function(){var state=src._readableState;debug("pipeOnDrain",state.awaitDrain);if(state.awaitDrain)state.awaitDrain--;if(state.awaitDrain===0&&EElistenerCount(src,"data")){state.flowing=true;flow(src)}}}Readable.prototype.unpipe=function(dest){var state=this._readableState;if(state.pipesCount===0)return this;if(state.pipesCount===1){if(dest&&dest!==state.pipes)return this;if(!dest)dest=state.pipes;state.pipes=null;state.pipesCount=0;state.flowing=false;if(dest)dest.emit("unpipe",this);return this}if(!dest){var dests=state.pipes;var len=state.pipesCount;state.pipes=null;state.pipesCount=0;state.flowing=false;for(var _i=0;_i=state.length){if(state.decoder)ret=state.buffer.join("");else if(state.buffer.length===1)ret=state.buffer.head.data;else ret=state.buffer.concat(state.length);state.buffer.clear()}else{ret=fromListPartial(n,state.buffer,state.decoder)}return ret}function fromListPartial(n,list,hasStrings){var ret;if(nstr.length?str.length:n;if(nb===str.length)ret+=str;else ret+=str.slice(0,n);n-=nb;if(n===0){if(nb===str.length){++c;if(p.next)list.head=p.next;else list.head=list.tail=null}else{list.head=p;p.data=str.slice(nb)}break}++c}list.length-=c;return ret}function copyFromBuffer(n,list){var ret=bufferShim.allocUnsafe(n);var p=list.head;var c=1;p.data.copy(ret);n-=p.data.length;while(p=p.next){var buf=p.data;var nb=n>buf.length?buf.length:n;buf.copy(ret,ret.length-n,0,nb);n-=nb;if(n===0){if(nb===buf.length){++c;if(p.next)list.head=p.next;else list.head=list.tail=null}else{list.head=p;p.data=buf.slice(nb)}break}++c}list.length-=c;return ret}function endReadable(stream){var state=stream._readableState;if(state.length>0)throw new Error('"endReadable()" called on non-empty stream');if(!state.endEmitted){state.ended=true;processNextTick(endReadableNT,state,stream)}}function endReadableNT(state,stream){if(!state.endEmitted&&state.length===0){state.endEmitted=true;stream.readable=false;stream.emit("end")}}function forEach(xs,f){for(var i=0,l=xs.length;i-1?setImmediate:processNextTick;Writable.WritableState=WritableState;var util=require("core-util-is");util.inherits=require("inherits");var internalUtil={deprecate:require("util-deprecate")};var Stream;(function(){try{Stream=require("st"+"ream")}catch(_){}finally{if(!Stream)Stream=require("events").EventEmitter}})();var Buffer=require("buffer").Buffer;var bufferShim=require("buffer-shims");util.inherits(Writable,Stream);function nop(){}function WriteReq(chunk,encoding,cb){this.chunk=chunk;this.encoding=encoding;this.callback=cb;this.next=null}var Duplex;function WritableState(options,stream){Duplex=Duplex||require("./_stream_duplex");options=options||{};this.objectMode=!!options.objectMode;if(stream instanceof Duplex)this.objectMode=this.objectMode||!!options.writableObjectMode;var hwm=options.highWaterMark;var defaultHwm=this.objectMode?16:16*1024;this.highWaterMark=hwm||hwm===0?hwm:defaultHwm;this.highWaterMark=~~this.highWaterMark;this.needDrain=false;this.ending=false;this.ended=false;this.finished=false;var noDecode=options.decodeStrings===false;this.decodeStrings=!noDecode;this.defaultEncoding=options.defaultEncoding||"utf8";this.length=0;this.writing=false;this.corked=0;this.sync=true;this.bufferProcessing=false;this.onwrite=function(er){onwrite(stream,er)};this.writecb=null;this.writelen=0;this.bufferedRequest=null;this.lastBufferedRequest=null;this.pendingcb=0;this.prefinished=false;this.errorEmitted=false;this.bufferedRequestCount=0;this.corkedRequestsFree=new CorkedRequest(this)}WritableState.prototype.getBuffer=function writableStateGetBuffer(){var current=this.bufferedRequest;var out=[];while(current){out.push(current);current=current.next}return out};(function(){try{Object.defineProperty(WritableState.prototype,"buffer",{get:internalUtil.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer "+"instead.")})}catch(_){}})();var Duplex;function Writable(options){Duplex=Duplex||require("./_stream_duplex");if(!(this instanceof Writable)&&!(this instanceof Duplex))return new Writable(options);this._writableState=new WritableState(options,this);this.writable=true;if(options){if(typeof options.write==="function")this._write=options.write;if(typeof options.writev==="function")this._writev=options.writev}Stream.call(this)}Writable.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))};function writeAfterEnd(stream,cb){var er=new Error("write after end");stream.emit("error",er);processNextTick(cb,er)}function validChunk(stream,state,chunk,cb){var valid=true;var er=false;if(chunk===null){er=new TypeError("May not write null values to stream")}else if(!Buffer.isBuffer(chunk)&&typeof chunk!=="string"&&chunk!==undefined&&!state.objectMode){er=new TypeError("Invalid non-string/buffer chunk")}if(er){stream.emit("error",er);processNextTick(cb,er);valid=false}return valid}Writable.prototype.write=function(chunk,encoding,cb){var state=this._writableState;var ret=false;if(typeof encoding==="function"){cb=encoding;encoding=null}if(Buffer.isBuffer(chunk))encoding="buffer";else if(!encoding)encoding=state.defaultEncoding;if(typeof cb!=="function")cb=nop;if(state.ended)writeAfterEnd(this,cb);else if(validChunk(this,state,chunk,cb)){ -state.pendingcb++;ret=writeOrBuffer(this,state,chunk,encoding,cb)}return ret};Writable.prototype.cork=function(){var state=this._writableState;state.corked++};Writable.prototype.uncork=function(){var state=this._writableState;if(state.corked){state.corked--;if(!state.writing&&!state.corked&&!state.finished&&!state.bufferProcessing&&state.bufferedRequest)clearBuffer(this,state)}};Writable.prototype.setDefaultEncoding=function setDefaultEncoding(encoding){if(typeof encoding==="string")encoding=encoding.toLowerCase();if(!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((encoding+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+encoding);this._writableState.defaultEncoding=encoding;return this};function decodeChunk(state,chunk,encoding){if(!state.objectMode&&state.decodeStrings!==false&&typeof chunk==="string"){chunk=bufferShim.from(chunk,encoding)}return chunk}function writeOrBuffer(stream,state,chunk,encoding,cb){chunk=decodeChunk(state,chunk,encoding);if(Buffer.isBuffer(chunk))encoding="buffer";var len=state.objectMode?1:chunk.length;state.length+=len;var ret=state.length0)this.tail.next=entry;else this.head=entry;this.tail=entry;++this.length};BufferList.prototype.unshift=function(v){var entry={data:v,next:this.head};if(this.length===0)this.tail=entry;this.head=entry;++this.length};BufferList.prototype.shift=function(){if(this.length===0)return;var ret=this.head.data;if(this.length===1)this.head=this.tail=null;else this.head=this.head.next;--this.length;return ret};BufferList.prototype.clear=function(){this.head=this.tail=null;this.length=0};BufferList.prototype.join=function(s){if(this.length===0)return"";var p=this.head;var ret=""+p.data;while(p=p.next){ret+=s+p.data}return ret};BufferList.prototype.concat=function(n){if(this.length===0)return bufferShim.alloc(0);if(this.length===1)return this.head.data;var ret=bufferShim.allocUnsafe(n>>>0);var p=this.head;var i=0;while(p){p.data.copy(ret,i);i+=p.data.length;p=p.next}return ret}},{buffer:5,"buffer-shims":4}],50:[function(require,module,exports){module.exports=require("./lib/_stream_passthrough.js")},{"./lib/_stream_passthrough.js":45}],51:[function(require,module,exports){(function(process){var Stream=function(){try{return require("st"+"ream")}catch(_){}}();exports=module.exports=require("./lib/_stream_readable.js");exports.Stream=Stream||exports;exports.Readable=exports;exports.Writable=require("./lib/_stream_writable.js");exports.Duplex=require("./lib/_stream_duplex.js");exports.Transform=require("./lib/_stream_transform.js");exports.PassThrough=require("./lib/_stream_passthrough.js");if(!process.browser&&process.env.READABLE_STREAM==="disable"&&Stream){module.exports=Stream}}).call(this,require("_process"))},{"./lib/_stream_duplex.js":44,"./lib/_stream_passthrough.js":45,"./lib/_stream_readable.js":46,"./lib/_stream_transform.js":47,"./lib/_stream_writable.js":48,_process:42}],52:[function(require,module,exports){module.exports=require("./lib/_stream_transform.js")},{"./lib/_stream_transform.js":47}],53:[function(require,module,exports){module.exports=require("./lib/_stream_writable.js")},{"./lib/_stream_writable.js":48}],54:[function(require,module,exports){module.exports=function(string){return string.replace(/[-\\^$*+?.()|[\]{}]/g,"\\$&")}},{}],55:[function(require,module,exports){module.exports=Stream;var EE=require("events").EventEmitter;var inherits=require("inherits");inherits(Stream,EE);Stream.Readable=require("readable-stream/readable.js");Stream.Writable=require("readable-stream/writable.js");Stream.Duplex=require("readable-stream/duplex.js");Stream.Transform=require("readable-stream/transform.js");Stream.PassThrough=require("readable-stream/passthrough.js");Stream.Stream=Stream;function Stream(){EE.call(this)}Stream.prototype.pipe=function(dest,options){var source=this;function ondata(chunk){if(dest.writable){if(false===dest.write(chunk)&&source.pause){source.pause()}}}source.on("data",ondata);function ondrain(){if(source.readable&&source.resume){source.resume()}}dest.on("drain",ondrain);if(!dest._isStdio&&(!options||options.end!==false)){source.on("end",onend);source.on("close",onclose)}var didOnEnd=false;function onend(){if(didOnEnd)return;didOnEnd=true;dest.end()}function onclose(){if(didOnEnd)return;didOnEnd=true;if(typeof dest.destroy==="function")dest.destroy()}function onerror(er){cleanup();if(EE.listenerCount(this,"error")===0){throw er}}source.on("error",onerror);dest.on("error",onerror);function cleanup(){source.removeListener("data",ondata);dest.removeListener("drain",ondrain);source.removeListener("end",onend);source.removeListener("close",onclose);source.removeListener("error",onerror);dest.removeListener("error",onerror);source.removeListener("end",cleanup);source.removeListener("close",cleanup);dest.removeListener("close",cleanup)}source.on("end",cleanup);source.on("close",cleanup);dest.on("close",cleanup);dest.emit("pipe",source);return dest}},{events:28,inherits:38,"readable-stream/duplex.js":43,"readable-stream/passthrough.js":50,"readable-stream/readable.js":51,"readable-stream/transform.js":52,"readable-stream/writable.js":53}],56:[function(require,module,exports){var Buffer=require("buffer").Buffer;var isBufferEncoding=Buffer.isEncoding||function(encoding){switch(encoding&&encoding.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return true;default:return false}};function assertEncoding(encoding){if(encoding&&!isBufferEncoding(encoding)){throw new Error("Unknown encoding: "+encoding)}}var StringDecoder=exports.StringDecoder=function(encoding){this.encoding=(encoding||"utf8").toLowerCase().replace(/[-_]/,"");assertEncoding(encoding);switch(this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2;this.detectIncompleteChar=utf16DetectIncompleteChar;break;case"base64":this.surrogateSize=3;this.detectIncompleteChar=base64DetectIncompleteChar;break;default:this.write=passThroughWrite;return}this.charBuffer=new Buffer(6);this.charReceived=0;this.charLength=0};StringDecoder.prototype.write=function(buffer){var charStr="";while(this.charLength){var available=buffer.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:buffer.length;buffer.copy(this.charBuffer,this.charReceived,0,available);this.charReceived+=available;if(this.charReceived=55296&&charCode<=56319){this.charLength+=this.surrogateSize;charStr="";continue}this.charReceived=this.charLength=0;if(buffer.length===0){return charStr}break}this.detectIncompleteChar(buffer);var end=buffer.length;if(this.charLength){buffer.copy(this.charBuffer,0,buffer.length-this.charReceived,end);end-=this.charReceived}charStr+=buffer.toString(this.encoding,0,end);var end=charStr.length-1;var charCode=charStr.charCodeAt(end);if(charCode>=55296&&charCode<=56319){var size=this.surrogateSize;this.charLength+=size;this.charReceived+=size;this.charBuffer.copy(this.charBuffer,size,0,size);buffer.copy(this.charBuffer,0,0,size);return charStr.substring(0,end)}return charStr};StringDecoder.prototype.detectIncompleteChar=function(buffer){var i=buffer.length>=3?3:buffer.length;for(;i>0;i--){var c=buffer[buffer.length-i];if(i==1&&c>>5==6){this.charLength=2;break}if(i<=2&&c>>4==14){this.charLength=3;break}if(i<=3&&c>>3==30){this.charLength=4;break}}this.charReceived=i};StringDecoder.prototype.end=function(buffer){var res="";if(buffer&&buffer.length)res=this.write(buffer);if(this.charReceived){var cr=this.charReceived;var buf=this.charBuffer;var enc=this.encoding;res+=buf.slice(0,cr).toString(enc)}return res};function passThroughWrite(buffer){return buffer.toString(this.encoding)}function utf16DetectIncompleteChar(buffer){this.charReceived=buffer.length%2;this.charLength=this.charReceived?2:0}function base64DetectIncompleteChar(buffer){this.charReceived=buffer.length%3;this.charLength=this.charReceived?3:0}},{buffer:5}],57:[function(require,module,exports){(function(global){module.exports=deprecate;function deprecate(fn,msg){if(config("noDeprecation")){return fn}var warned=false;function deprecated(){if(!warned){if(config("throwDeprecation")){throw new Error(msg)}else if(config("traceDeprecation")){console.trace(msg)}else{console.warn(msg)}warned=true}return fn.apply(this,arguments)}return deprecated}function config(name){try{if(!global.localStorage)return false}catch(_){return false}var val=global.localStorage[name];if(null==val)return false;return String(val).toLowerCase()==="true"}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],58:[function(require,module,exports){module.exports=extend;var hasOwnProperty=Object.prototype.hasOwnProperty;function extend(){var target={};for(var i=0;i 0) { - qp = obj.url.substring(obj.url.indexOf('?') + 1); - var parts = qp.split('&'); - if(parts && parts.length > 0) { - for(var i = 0; i < parts.length; i++) { - var kv = parts[i].split('='); - if(kv && kv.length > 0) { - if (kv[0] === this.name) { - // skip it - return false; - } - } - } - } - } - - if (obj.url.indexOf('?') > 0) { - obj.url = obj.url + '&' + this.name + '=' + this.value; - } else { - obj.url = obj.url + '?' + this.name + '=' + this.value; - } - - return true; - } else if (this.type === 'header') { - if(typeof obj.headers[this.name] === 'undefined') { - obj.headers[this.name] = this.value; - } - - return true; - } -}; - -var CookieAuthorization = module.exports.CookieAuthorization = function (cookie) { - this.cookie = cookie; -}; - -CookieAuthorization.prototype.apply = function (obj) { - obj.cookieJar = obj.cookieJar || new CookieJar(); - obj.cookieJar.setCookie(this.cookie); - - return true; -}; - -/** - * Password Authorization is a basic auth implementation - */ -var PasswordAuthorization = module.exports.PasswordAuthorization = function (username, password) { - if (arguments.length === 3) { - helpers.log('PasswordAuthorization: the \'name\' argument has been removed, pass only username and password'); - username = arguments[1]; - password = arguments[2]; - } - this.username = username; - this.password = password; -}; - -PasswordAuthorization.prototype.apply = function (obj) { - if(typeof obj.headers.Authorization === 'undefined') { - obj.headers.Authorization = 'Basic ' + btoa(this.username + ':' + this.password); - } - - return true; -}; - -},{"./helpers":4,"btoa":13,"cookiejar":18,"lodash-compat/collection/each":52,"lodash-compat/collection/includes":55,"lodash-compat/lang/isArray":140,"lodash-compat/lang/isObject":144}],3:[function(require,module,exports){ -'use strict'; - -var _ = { - bind: require('lodash-compat/function/bind'), - cloneDeep: require('lodash-compat/lang/cloneDeep'), - find: require('lodash-compat/collection/find'), - forEach: require('lodash-compat/collection/forEach'), - indexOf: require('lodash-compat/array/indexOf'), - isArray: require('lodash-compat/lang/isArray'), - isObject: require('lodash-compat/lang/isObject'), - isFunction: require('lodash-compat/lang/isFunction'), - isPlainObject: require('lodash-compat/lang/isPlainObject'), - isUndefined: require('lodash-compat/lang/isUndefined') -}; -var auth = require('./auth'); -var helpers = require('./helpers'); -var Model = require('./types/model'); -var Operation = require('./types/operation'); -var OperationGroup = require('./types/operationGroup'); -var Resolver = require('./resolver'); -var SwaggerHttp = require('./http'); -var SwaggerSpecConverter = require('./spec-converter'); -var Q = require('q'); - -// We have to keep track of the function/property names to avoid collisions for tag names which are used to allow the -// following usage: 'client.{tagName}' -var reservedClientTags = [ - 'apis', - 'authorizationScheme', - 'authorizations', - 'basePath', - 'build', - 'buildFrom1_1Spec', - 'buildFrom1_2Spec', - 'buildFromSpec', - 'clientAuthorizations', - 'convertInfo', - 'debug', - 'defaultErrorCallback', - 'defaultSuccessCallback', - 'enableCookies', - 'fail', - 'failure', - 'finish', - 'help', - 'host', - 'idFromOp', - 'info', - 'initialize', - 'isBuilt', - 'isValid', - 'modelPropertyMacro', - 'models', - 'modelsArray', - 'options', - 'parameterMacro', - 'parseUri', - 'progress', - 'resourceCount', - 'sampleModels', - 'selfReflect', - 'setConsolidatedModels', - 'spec', - 'supportedSubmitMethods', - 'swaggerRequestHeaders', - 'tagFromLabel', - 'title', - 'url', - 'useJQuery', - 'jqueryAjaxCache' -]; -// We have to keep track of the function/property names to avoid collisions for tag names which are used to allow the -// following usage: 'client.apis.{tagName}' -var reservedApiTags = [ - 'apis', - 'asCurl', - 'description', - 'externalDocs', - 'help', - 'label', - 'name', - 'operation', - 'operations', - 'operationsArray', - 'path', - 'tag' -]; -var supportedOperationMethods = ['delete', 'get', 'head', 'options', 'patch', 'post', 'put']; -var SwaggerClient = module.exports = function (url, options) { - this.authorizations = null; - this.authorizationScheme = null; - this.basePath = null; - this.debug = false; - this.enableCookies = false; - this.info = null; - this.isBuilt = false; - this.isValid = false; - this.modelsArray = []; - this.resourceCount = 0; - this.url = null; - this.useJQuery = false; - this.jqueryAjaxCache = false; - this.swaggerObject = {}; - this.deferredClient = undefined; - - this.clientAuthorizations = new auth.SwaggerAuthorizations(); - - if (typeof url !== 'undefined') { - return this.initialize(url, options); - } else { - return this; - } -}; - -SwaggerClient.prototype.initialize = function (url, options) { - this.models = {}; - this.sampleModels = {}; - - if (typeof url === 'string') { - this.url = url; - } else if (_.isObject(url)) { - options = url; - this.url = options.url; - } - - if(this.url && this.url.indexOf('http:') === -1 && this.url.indexOf('https:') === -1) { - // no protocol, so we can only use window if it exists - if(typeof(window) !== 'undefined' && window && window.location) { - this.url = window.location.origin + this.url; - } - } - - options = options || {}; - this.clientAuthorizations.add(options.authorizations); - this.swaggerRequestHeaders = options.swaggerRequestHeaders || 'application/json;charset=utf-8,*/*'; - this.defaultSuccessCallback = options.defaultSuccessCallback || null; - this.defaultErrorCallback = options.defaultErrorCallback || null; - this.modelPropertyMacro = options.modelPropertyMacro || null; - this.connectionAgent = options.connectionAgent || null; - this.parameterMacro = options.parameterMacro || null; - this.usePromise = options.usePromise || null; - - // operation request timeout default - this.timeout = options.timeout || null; - // default to request timeout when not specified - this.fetchSpecTimeout = typeof options.fetchSpecTimeout !== 'undefined' ? - options.fetchSpecTimeout : options.timeout || null; - - if(this.usePromise) { - this.deferredClient = Q.defer(); - } - - if (typeof options.success === 'function') { - this.success = options.success; - } - if (options.useJQuery) { - this.useJQuery = options.useJQuery; - } - - if (options.jqueryAjaxCache) { - this.jqueryAjaxCache = options.jqueryAjaxCache; - } - - if (options.enableCookies) { - this.enableCookies = options.enableCookies; - } - - this.options = options || {}; - - // maybe don't need this? - this.options.timeout = this.timeout; - this.options.fetchSpecTimeout = this.fetchSpecTimeout; - - this.supportedSubmitMethods = options.supportedSubmitMethods || []; - this.failure = options.failure || function (err) { throw err; }; - this.progress = options.progress || function () {}; - this.spec = _.cloneDeep(options.spec); // Clone so we do not alter the provided document - - if (options.scheme) { - this.scheme = options.scheme; - } - - if (this.usePromise || typeof options.success === 'function') { - this.ready = true; - return this.build(); - } -}; - -SwaggerClient.prototype.build = function (mock) { - if (this.isBuilt) { - return this; - } - - var self = this; - - if (this.spec) { - this.progress('fetching resource list; Please wait.'); - } else { - this.progress('fetching resource list: ' + this.url + '; Please wait.'); - } - - var obj = { - useJQuery: this.useJQuery, - jqueryAjaxCache: this.jqueryAjaxCache, - connectionAgent: this.connectionAgent, - enableCookies: this.enableCookies, - url: this.url, - method: 'get', - headers: { - accept: this.swaggerRequestHeaders - }, - on: { - error: function (response) { - if (self.url.substring(0, 4) !== 'http') { - return self.fail('Please specify the protocol for ' + self.url); - } else if (response.errObj && (response.errObj.code === 'ECONNABORTED' || response.errObj.message.indexOf('timeout') !== -1)) { - return self.fail('Request timed out after ' + self.fetchSpecTimeout + 'ms'); - } else if (response.status === 0) { - return self.fail('Can\'t read from server. It may not have the appropriate access-control-origin settings.'); - } else if (response.status === 404) { - return self.fail('Can\'t read swagger JSON from ' + self.url); - } else { - return self.fail(response.status + ' : ' + response.statusText + ' ' + self.url); - } - }, - response: function (resp) { - - var responseObj = resp.obj; - if(!responseObj) { - return self.fail('failed to parse JSON/YAML response'); - } - - self.swaggerVersion = responseObj.swaggerVersion; - self.swaggerObject = responseObj; - - if (responseObj.swagger && parseInt(responseObj.swagger) === 2) { - self.swaggerVersion = responseObj.swagger; - - new Resolver().resolve(responseObj, self.url, self.buildFromSpec, self); - - self.isValid = true; - } else { - var converter = new SwaggerSpecConverter(); - self.oldSwaggerObject = self.swaggerObject; - - converter.setDocumentationLocation(self.url); - converter.convert(responseObj, self.clientAuthorizations, self.options, function(spec) { - self.swaggerObject = spec; - new Resolver().resolve(spec, self.url, self.buildFromSpec, self); - self.isValid = true; - }); - } - } - } - }; - - // only set timeout when specified - if (this.fetchSpecTimeout) { - obj.timeout = this.fetchSpecTimeout; - } - - if (this.spec) { - self.swaggerObject = this.spec; - setTimeout(function () { - new Resolver().resolve(self.spec, self.url, self.buildFromSpec, self); - }, 10); - } else { - this.clientAuthorizations.apply(obj); - - if (mock) { - return obj; - } - - new SwaggerHttp().execute(obj, this.options); - } - - return (this.usePromise) ? this.deferredClient.promise : this; -}; - -SwaggerClient.prototype.buildFromSpec = function (response) { - if (this.isBuilt) { - return this; - } - - this.apis = {}; - this.apisArray = []; - this.basePath = response.basePath || ''; - this.consumes = response.consumes; - this.host = response.host || ''; - this.info = response.info || {}; - this.produces = response.produces; - this.schemes = response.schemes || []; - this.securityDefinitions = _.cloneDeep(response.securityDefinitions); - this.security = response.security; - this.title = response.title || ''; - - var key, definedTags = {}, k, location, self = this, i; - - if (response.externalDocs) { - this.externalDocs = response.externalDocs; - } - - // legacy support - this.authSchemes = this.securityDefinitions; - - if(this.securityDefinitions) { - for(key in this.securityDefinitions) { - var securityDefinition = this.securityDefinitions[key]; - securityDefinition.vendorExtensions = {}; - for(var ext in securityDefinition) { - helpers.extractExtensions(ext, securityDefinition); - if (ext === 'scopes') { - var scopes = securityDefinition[ext]; - if(typeof scopes === 'object') { - scopes.vendorExtensions = {}; - for (var s in scopes) { - helpers.extractExtensions(s, scopes); - if(s.indexOf('x-') === 0) { - delete scopes[s]; - } - } - } - } - } - } - } - - if (Array.isArray(response.tags)) { - definedTags = {}; - - for (k = 0; k < response.tags.length; k++) { - var t = _.cloneDeep(response.tags[k]); - definedTags[t.name] = t; - for(i in t) { - if(i === 'externalDocs' && typeof t[i] === 'object') { - for(var j in t[i]) { - helpers.extractExtensions(j, t[i]); - } - } - helpers.extractExtensions(i, t); - } - } - } - - - if (typeof this.url === 'string') { - location = this.parseUri(this.url); - if (typeof this.scheme === 'undefined' && typeof this.schemes === 'undefined' || this.schemes.length === 0) { - if(typeof window !== 'undefined') { - // use the window scheme - this.scheme = window.location.protocol.replace(':',''); - } - else { - this.scheme = location.scheme || 'http'; - } - } else if (typeof window !== 'undefined' && window.location.protocol.indexOf('chrome-extension') === 0) { - // if it is chrome swagger ui extension scheme then let swagger doc url scheme decide the protocol - this.scheme = location.scheme; - } else if (typeof this.scheme === 'undefined') { - if(typeof window !== 'undefined') { - var scheme = window.location.protocol.replace(':',''); - if(scheme === 'https' && this.schemes.indexOf(scheme) === -1) { - // can't call http from https served page in a browser! - helpers.log('Cannot call a http server from https inside a browser!'); - this.scheme = 'http'; - } - else if(this.schemes.indexOf(scheme) !== -1) { - this.scheme = scheme; - } - else { - if(this.schemes.indexOf('https') !== -1) { - this.scheme = 'https'; - } - else { - this.scheme = 'http'; - } - } - } - else { - this.scheme = this.schemes[0] || location.scheme; - } - } - - if (typeof this.host === 'undefined' || this.host === '') { - this.host = location.host; - - if (location.port) { - this.host = this.host + ':' + location.port; - } - } - } - else { - if (typeof this.schemes === 'undefined' || this.schemes.length === 0) { - this.scheme = 'http'; - } - else if (typeof this.scheme === 'undefined') { - this.scheme = this.schemes[0]; - } - } - - this.definitions = response.definitions; - - for (key in this.definitions) { - var model = new Model(key, this.definitions[key], this.models, this.modelPropertyMacro); - - if (model) { - this.models[key] = model; - } - } - - // get paths, create functions for each operationId - - // Bind help to 'client.apis' - self.apis.help = _.bind(self.help, self); - - _.forEach(response.paths, function (pathObj, path) { - // Only process a path if it's an object - if (!_.isPlainObject(pathObj)) { - return; - } - - _.forEach(supportedOperationMethods, function (method) { - var operation = pathObj[method]; - - if (_.isUndefined(operation)) { - // Operation does not exist - return; - } else if (!_.isPlainObject(operation)) { - // Operation exists but it is not an Operation Object. Since this is invalid, log it. - helpers.log('The \'' + method + '\' operation for \'' + path + '\' path is not an Operation Object'); - - return; - } - - var tags = operation.tags; - - if (_.isUndefined(tags) || !_.isArray(tags) || tags.length === 0) { - tags = operation.tags = [ 'default' ]; - } - - var operationId = self.idFromOp(path, method, operation); - - var operationObject = new Operation(self, - operation.scheme, - operationId, - method, - path, - operation, - self.definitions, - self.models, - self.clientAuthorizations); - - operationObject.connectionAgent = self.connectionAgent; - operationObject.vendorExtensions = {}; - for(i in operation) { - helpers.extractExtensions(i, operationObject, operation[i]); - } - operationObject.externalDocs = operation.externalDocs; - if(operationObject.externalDocs) { - operationObject.externalDocs = _.cloneDeep(operationObject.externalDocs); - operationObject.externalDocs.vendorExtensions = {}; - for(i in operationObject.externalDocs) { - helpers.extractExtensions(i, operationObject.externalDocs); - } - } - - // bind self operation's execute command to the api - _.forEach(tags, function (tag) { - var clientProperty = _.indexOf(reservedClientTags, tag) > -1 ? '_' + tag : tag; - var apiProperty = _.indexOf(reservedApiTags, tag) > -1 ? '_' + tag : tag; - var operationGroup = self[clientProperty]; - - if (clientProperty !== tag) { - helpers.log('The \'' + tag + '\' tag conflicts with a SwaggerClient function/property name. Use \'client.' + - clientProperty + '\' or \'client.apis.' + tag + '\' instead of \'client.' + tag + '\'.'); - } - - if (apiProperty !== tag) { - helpers.log('The \'' + tag + '\' tag conflicts with a SwaggerClient operation function/property name. Use ' + - '\'client.apis.' + apiProperty + '\' instead of \'client.apis.' + tag + '\'.'); - } - - if (_.indexOf(reservedApiTags, operationId) > -1) { - helpers.log('The \'' + operationId + '\' operationId conflicts with a SwaggerClient operation ' + - 'function/property name. Use \'client.apis.' + apiProperty + '._' + operationId + - '\' instead of \'client.apis.' + apiProperty + '.' + operationId + '\'.'); - - operationId = '_' + operationId; - operationObject.nickname = operationId; // So 'client.apis.[tag].operationId.help() works properly - } - - if (_.isUndefined(operationGroup)) { - operationGroup = self[clientProperty] = self.apis[apiProperty] = {}; - - operationGroup.operations = {}; - operationGroup.label = apiProperty; - operationGroup.apis = {}; - - var tagDef = definedTags[tag]; - - if (!_.isUndefined(tagDef)) { - operationGroup.description = tagDef.description; - operationGroup.externalDocs = tagDef.externalDocs; - operationGroup.vendorExtensions = tagDef.vendorExtensions; - } - - self[clientProperty].help = _.bind(self.help, operationGroup); - self.apisArray.push(new OperationGroup(tag, operationGroup.description, operationGroup.externalDocs, operationObject)); - } - - operationId = self.makeUniqueOperationId(operationId, self.apis[apiProperty]); - - // Bind tag help - if (!_.isFunction(operationGroup.help)) { - operationGroup.help = _.bind(self.help, operationGroup); - } - - // bind to the apis object - self.apis[apiProperty][operationId] = operationGroup[operationId] = _.bind(operationObject.execute, - operationObject); - self.apis[apiProperty][operationId].help = operationGroup[operationId].help = _.bind(operationObject.help, - operationObject); - self.apis[apiProperty][operationId].asCurl = operationGroup[operationId].asCurl = _.bind(operationObject.asCurl, - operationObject); - - operationGroup.apis[operationId] = operationGroup.operations[operationId] = operationObject; - - // legacy UI feature - var api = _.find(self.apisArray, function (api) { - return api.tag === tag; - }); - - if (api) { - api.operationsArray.push(operationObject); - } - }); - }); - }); - - // sort the apisArray according to the tags - var sortedApis = []; - _.forEach(Object.keys(definedTags), function (tag) { - var pos; - for(pos in self.apisArray) { - var _api = self.apisArray[pos]; - if(_api && tag === _api.name) { - sortedApis.push(_api); - self.apisArray[pos] = null; - } - } - }); - // add anything left - _.forEach(self.apisArray, function (api) { - if(api) { - sortedApis.push(api); - } - }); - self.apisArray = sortedApis; - - _.forEach(response.definitions, function (definitionObj, definition) { - definitionObj.id = definition.toLowerCase(); - definitionObj.name = definition; - self.modelsArray.push(definitionObj); - }); - - this.isBuilt = true; - - if (this.usePromise) { - this.isValid = true; - this.isBuilt = true; - this.deferredClient.resolve(this); - - return this.deferredClient.promise; - } - - if (this.success) { - this.success(); - } - - return this; -}; - -SwaggerClient.prototype.makeUniqueOperationId = function(operationId, api) { - var count = 0; - var name = operationId; - - // make unique across this operation group - while(true) { - var matched = false; - _.forEach(api.operations, function (operation) { - if(operation.nickname === name) { - matched = true; - } - }); - if(!matched) { - return name; - } - name = operationId + '_' + count; - count ++; - } - - return operationId; -}; - -SwaggerClient.prototype.parseUri = function (uri) { - var urlParseRE = /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/; - var parts = urlParseRE.exec(uri); - - return { - scheme: parts[4] ? parts[4].replace(':','') : undefined, - host: parts[11], - port: parts[12], - path: parts[15] - }; -}; - -SwaggerClient.prototype.help = function (dontPrint) { - var output = ''; - - if (this instanceof SwaggerClient) { - _.forEach(this.apis, function (api, name) { - if (_.isPlainObject(api)) { - output += 'operations for the \'' + name + '\' tag\n'; - - _.forEach(api.operations, function (operation, name) { - output += ' * ' + name + ': ' + operation.summary + '\n'; - }); - } - }); - } else if (this instanceof OperationGroup || _.isPlainObject(this)) { - output += 'operations for the \'' + this.label + '\' tag\n'; - - _.forEach(this.apis, function (operation, name) { - output += ' * ' + name + ': ' + operation.summary + '\n'; - }); - } - - if (dontPrint) { - return output; - } else { - helpers.log(output); - - return output; - } -}; - -SwaggerClient.prototype.tagFromLabel = function (label) { - return label; -}; - -SwaggerClient.prototype.idFromOp = function (path, httpMethod, op) { - if(!op || !op.operationId) { - op = op || {}; - op.operationId = httpMethod + '_' + path; - } - var opId = op.operationId.replace(/[\s!@#$%^&*()_+=\[{\]};:<>|.\/?,\\'""-]/g, '_') || (path.substring(1) + '_' + httpMethod); - - opId = opId.replace(/((_){2,})/g, '_'); - opId = opId.replace(/^(_)*/g, ''); - opId = opId.replace(/([_])*$/g, ''); - - return opId; -}; - -SwaggerClient.prototype.setHost = function (host) { - this.host = host; - - if(this.apis) { - _.forEach(this.apis, function(api) { - if(api.operations) { - _.forEach(api.operations, function(operation) { - operation.host = host; - }); - } - }); - } -}; - -SwaggerClient.prototype.setBasePath = function (basePath) { - this.basePath = basePath; - - if(this.apis) { - _.forEach(this.apis, function(api) { - if(api.operations) { - _.forEach(api.operations, function(operation) { - operation.basePath = basePath; - }); - } - }); - } -}; - -SwaggerClient.prototype.setSchemes = function (schemes) { - this.schemes = schemes; - - if(schemes && schemes.length > 0) { - if(this.apis) { - _.forEach(this.apis, function (api) { - if (api.operations) { - _.forEach(api.operations, function (operation) { - operation.scheme = schemes[0]; - }); - } - }); - } - } -}; - -SwaggerClient.prototype.fail = function (message) { - if (this.usePromise) { - this.deferredClient.reject(message); - return this.deferredClient.promise; - } else { - if (this.failure) { - this.failure(message); - } - else { - this.failure(message); - } - } -}; - -},{"./auth":2,"./helpers":4,"./http":5,"./resolver":6,"./spec-converter":8,"./types/model":9,"./types/operation":10,"./types/operationGroup":11,"lodash-compat/array/indexOf":49,"lodash-compat/collection/find":53,"lodash-compat/collection/forEach":54,"lodash-compat/function/bind":58,"lodash-compat/lang/cloneDeep":138,"lodash-compat/lang/isArray":140,"lodash-compat/lang/isFunction":142,"lodash-compat/lang/isObject":144,"lodash-compat/lang/isPlainObject":145,"lodash-compat/lang/isUndefined":148,"q":157}],4:[function(require,module,exports){ -(function (process){ -'use strict'; - -var _ = { - isPlainObject: require('lodash-compat/lang/isPlainObject'), - indexOf: require('lodash-compat/array/indexOf') -}; - -module.exports.__bind = function (fn, me) { - return function(){ - return fn.apply(me, arguments); - }; -}; - -var log = module.exports.log = function() { - // Only log if available and we're not testing - if (console && process.env.NODE_ENV !== 'test') { - console.log(Array.prototype.slice.call(arguments)[0]); - } -}; - -module.exports.fail = function (message) { - log(message); -}; - -module.exports.optionHtml = function (label, value) { - return '' + label + ':' + value + ''; -}; - -var resolveSchema = module.exports.resolveSchema = function (schema) { - if (_.isPlainObject(schema.schema)) { - schema = resolveSchema(schema.schema); - } - - return schema; -}; - -module.exports.simpleRef = function (name) { - if (typeof name === 'undefined') { - return null; - } - - if (name.indexOf('#/definitions/') === 0) { - return name.substring('#/definitions/'.length); - } else { - return name; - } -}; - -/** - * helper to remove extensions and add them to an object - * - * @param keyname - * @param obj - */ -module.exports.extractExtensions = function (keyname, obj, value) { - if(!keyname || !obj) { - return; - } - - if (typeof keyname === 'string' && keyname.indexOf('x-') === 0) { - obj.vendorExtensions = obj.vendorExtensions || {}; - if(value) { - obj.vendorExtensions[keyname] = value; - } - else { - obj.vendorExtensions[keyname] = obj[keyname]; - } - } -}; -}).call(this,require('_process')) - -},{"_process":12,"lodash-compat/array/indexOf":49,"lodash-compat/lang/isPlainObject":145}],5:[function(require,module,exports){ -(function (Buffer){ -'use strict'; - -var helpers = require('./helpers'); -var request = require('superagent'); -var jsyaml = require('js-yaml'); -var _ = { - isObject: require('lodash-compat/lang/isObject'), - keys: require('lodash-compat/object/keys') -}; - -/* - * JQueryHttpClient is a light-weight, node or browser HTTP client - */ -var JQueryHttpClient = function () { - this.type = 'JQueryHttpClient'; -}; - -/* - * SuperagentHttpClient is a light-weight, node or browser HTTP client - */ -var SuperagentHttpClient = function () { - this.type = 'SuperagentHttpClient'; -}; - -/** - * SwaggerHttp is a wrapper for executing requests - */ -var SwaggerHttp = module.exports = function () {}; - -SwaggerHttp.prototype.execute = function (obj, opts) { - var client; - - if(opts && opts.client) { - client = opts.client; - } - else { - client = new SuperagentHttpClient(opts); - } - client.opts = opts || {}; - - if (opts && opts.requestAgent) { - request = opts.requestAgent; - } - - // legacy support - var hasJQuery = false; - if(typeof window !== 'undefined') { - if(typeof window.jQuery !== 'undefined') { - hasJQuery = true; - } - } - // OPTIONS support - if(obj.method.toLowerCase() === 'options' && client.type === 'SuperagentHttpClient') { - log('forcing jQuery as OPTIONS are not supported by SuperAgent'); - obj.useJQuery = true; - } - if(this.isInternetExplorer() && (obj.useJQuery === false || !hasJQuery )) { - throw new Error('Unsupported configuration! JQuery is required but not available'); - } - if ((obj && obj.useJQuery === true) || this.isInternetExplorer() && hasJQuery) { - client = new JQueryHttpClient(opts); - } - - var success = obj.on.response; - var error = obj.on.error; - - var requestInterceptor = function(data) { - if(opts && opts.requestInterceptor) { - data = opts.requestInterceptor.apply(data); - } - return data; - }; - - var responseInterceptor = function(data) { - if(opts && opts.responseInterceptor) { - data = opts.responseInterceptor.apply(data, [obj]); - } - return success(data); - }; - - var errorInterceptor = function(data) { - if(opts && opts.responseInterceptor) { - data = opts.responseInterceptor.apply(data, [obj]); - } - error(data); - }; - - obj.on.error = function(data) { - errorInterceptor(data); - }; - - obj.on.response = function(data) { - if(data && data.status >= 400) { - errorInterceptor(data); - } - else { - responseInterceptor(data); - } - }; - - if (_.isObject(obj) && _.isObject(obj.body)) { - // special processing for file uploads via jquery - if (obj.body.type && obj.body.type === 'formData'){ - if(opts.useJQuery) { - obj.contentType = false; - obj.processData = false; - delete obj.headers['Content-Type']; - } - } - } - - obj = requestInterceptor(obj) || obj; - if (obj.beforeSend) { - obj.beforeSend(function(_obj) { - client.execute(_obj || obj); - }); - } else { - client.execute(obj); - } - - return (obj.deferred) ? obj.deferred.promise : obj; -}; - -SwaggerHttp.prototype.isInternetExplorer = function () { - var detectedIE = false; - - if (typeof navigator !== 'undefined' && navigator.userAgent) { - var nav = navigator.userAgent.toLowerCase(); - - if (nav.indexOf('msie') !== -1) { - var version = parseInt(nav.split('msie')[1]); - - if (version <= 8) { - detectedIE = true; - } - } - } - - return detectedIE; -}; - -JQueryHttpClient.prototype.execute = function (obj) { - var jq = this.jQuery || (typeof window !== 'undefined' && window.jQuery); - var cb = obj.on; - var request = obj; - - if(typeof jq === 'undefined' || jq === false) { - throw new Error('Unsupported configuration! JQuery is required but not available'); - } - - obj.type = obj.method; - obj.cache = obj.jqueryAjaxCache; - obj.data = obj.body; - delete obj.jqueryAjaxCache; - delete obj.useJQuery; - delete obj.body; - - obj.complete = function (response) { - var headers = {}; - var headerArray = response.getAllResponseHeaders().split('\n'); - - for (var i = 0; i < headerArray.length; i++) { - var toSplit = headerArray[i].trim(); - - if (toSplit.length === 0) { - continue; - } - - var separator = toSplit.indexOf(':'); - - if (separator === -1) { - // Name but no value in the header - headers[toSplit] = null; - - continue; - } - - var name = toSplit.substring(0, separator).trim(); - var value = toSplit.substring(separator + 1).trim(); - - headers[name] = value; - } - - var out = { - url: request.url, - method: request.method, - status: response.status, - statusText: response.statusText, - data: response.responseText, - headers: headers - }; - - try { - var possibleObj = response.responseJSON || jsyaml.safeLoad(response.responseText); - out.obj = (typeof possibleObj === 'string') ? {} : possibleObj; - } catch (ex) { - // do not set out.obj - helpers.log('unable to parse JSON/YAML content'); - } - - // I can throw, or parse null? - out.obj = out.obj || null; - - if (response.status >= 200 && response.status < 300) { - cb.response(out); - } else if (response.status === 0 || (response.status >= 400 && response.status < 599)) { - cb.error(out); - } else { - return cb.response(out); - } - }; - - jq.support.cors = true; - - return jq.ajax(obj); -}; - -SuperagentHttpClient.prototype.execute = function (obj) { - var method = obj.method.toLowerCase(); - var timeout = obj.timeout; - - if (method === 'delete') { - method = 'del'; - } - var headers = obj.headers || {}; - - var r = request[method](obj.url); - - if (obj.connectionAgent) { - r.agent(obj.connectionAgent); - } - - if (timeout) { - r.timeout(timeout); - } - - if (obj.enableCookies) { - r.withCredentials(); - } - - var accept = obj.headers.Accept; - - if(this.binaryRequest(accept)) { - r.on('request', function () { - if(this.xhr) { - this.xhr.responseType = 'blob'; - } - }); - } - - if(obj.body) { - if(_.isObject(obj.body)) { - var contentType = obj.headers['Content-Type'] || ''; - if (contentType.indexOf('multipart/form-data') === 0) { - delete headers['Content-Type']; - if({}.toString.apply(obj.body) === '[object FormData]') { - r.send(obj.body); - } - else { - var keyname, value, v; - for (keyname in obj.body) { - value = obj.body[keyname]; - if(Array.isArray(value)) { - for(v in value) { - r.field(keyname, v); - } - } - else { - r.field(keyname, value); - } - } - } - } - else if (_.isObject(obj.body)) { - // non multipart/form-data - obj.body = JSON.stringify(obj.body); - r.send(obj.body); - } - } - else { - r.send(obj.body); - } - } - - var name; - for (name in headers) { - r.set(name, headers[name]); - } - - if(typeof r.buffer === 'function') { - r.buffer(); // force superagent to populate res.text with the raw response data - } - - r.end(function (err, res) { - res = res || { - status: 0, - headers: {error: 'no response from server'} - }; - var response = { - url: obj.url, - method: obj.method, - headers: res.headers - }; - var cb; - - if (!err && res.error) { - err = res.error; - } - - if (err && obj.on && obj.on.error) { - response.errObj = err; - response.status = res ? res.status : 500; - response.statusText = res ? res.text : err.message; - if (res.headers && res.headers['content-type']) { - if (res.headers['content-type'].indexOf('application/json') >= 0) { - try { - response.obj = JSON.parse(response.statusText); - } - catch (e) { - response.obj = null; - } - } - } - cb = obj.on.error; - } else if (res && obj.on && obj.on.response) { - var possibleObj; - - // Already parsed by by superagent? - if (res.body && _.keys(res.body).length > 0) { - possibleObj = res.body; - } else { - try { - possibleObj = jsyaml.safeLoad(res.text); - // can parse into a string... which we don't need running around in the system - possibleObj = (typeof possibleObj === 'string') ? null : possibleObj; - } catch (e) { - helpers.log('cannot parse JSON/YAML content'); - } - } - - // null means we can't parse into object - if(typeof Buffer === 'function' && Buffer.isBuffer(possibleObj)) { - response.data = possibleObj; - } - else { - response.obj = (typeof possibleObj === 'object') ? possibleObj : null; - } - - response.status = res.status; - response.statusText = res.text; - cb = obj.on.response; - } - if (res.xhr && res.xhr.response) { - response.data = res.xhr.response; - } - else if(!response.data) { - response.data = response.statusText; - } - - if (cb) { - cb(response); - } - }); -}; - -SuperagentHttpClient.prototype. binaryRequest = function (accept) { - if(!accept) { - return false; - } - return (/^image/i).test(accept) - || (/^application\/pdf/).test(accept) - || (/^application\/octet-stream/).test(accept); -}; - -}).call(this,require("buffer").Buffer) - -},{"./helpers":4,"buffer":14,"js-yaml":19,"lodash-compat/lang/isObject":144,"lodash-compat/object/keys":149,"superagent":158}],6:[function(require,module,exports){ -'use strict'; - -var SwaggerHttp = require('./http'); -var _ = { - isObject: require('lodash-compat/lang/isObject'), - cloneDeep: require('lodash-compat/lang/cloneDeep'), - isArray: require('lodash-compat/lang/isArray'), - isString: require('lodash-compat/lang/isString') -}; - - -/** - * Resolves a spec's remote references - */ -var Resolver = module.exports = function () { - this.failedUrls = []; - this.resolverCache = {}; - this.pendingUrls = {}; -}; - -Resolver.prototype.processAllOf = function(root, name, definition, resolutionTable, unresolvedRefs, spec) { - var i, location, property; - - definition['x-resolved-from'] = [ '#/definitions/' + name ]; - var allOf = definition.allOf; - // the refs go first - allOf.sort(function(a, b) { - if(a.$ref && b.$ref) { return 0; } - else if(a.$ref) { return -1; } - else { return 1; } - }); - for (i = 0; i < allOf.length; i++) { - property = allOf[i]; - location = '/definitions/' + name + '/allOf'; - this.resolveInline(root, spec, property, resolutionTable, unresolvedRefs, location); - } -}; - -Resolver.prototype.resolve = function (spec, arg1, arg2, arg3) { - this.spec = spec; - var root = arg1, callback = arg2, scope = arg3, opts = {}, location, i; - if(typeof arg1 === 'function') { - root = null; - callback = arg1; - scope = arg2; - } - var _root = root, modelName; - this.scope = (scope || this); - this.iteration = this.iteration || 0; - - if(this.scope.options && this.scope.options.requestInterceptor){ - opts.requestInterceptor = this.scope.options.requestInterceptor; - } - - if(this.scope.options && this.scope.options.responseInterceptor){ - opts.responseInterceptor = this.scope.options.responseInterceptor; - } - - var name, path, property, propertyName, parameter, done, counter; - var processedCalls = 0, resolvedRefs = {}, unresolvedRefs = {}; - var resolutionTable = []; // store objects for dereferencing - - spec.definitions = spec.definitions || {}; - // definitions - for (name in spec.definitions) { - var definition = spec.definitions[name]; - if(definition.$ref) { - this.resolveInline(root, spec, definition, resolutionTable, unresolvedRefs, definition); - } - else { - for (propertyName in definition.properties) { - property = definition.properties[propertyName]; - if (_.isArray(property.allOf)) { - this.processAllOf(root, name, property, resolutionTable, unresolvedRefs, spec); - } - else { - this.resolveTo(root, property, resolutionTable, '/definitions'); - } - } - - if (definition.allOf) { - this.processAllOf(root, name, definition, resolutionTable, unresolvedRefs, spec); - } - } - } - - // shared parameters - spec.parameters = spec.parameters || {}; - for(name in spec.parameters) { - parameter = spec.parameters[name]; - if (parameter.in === 'body' && parameter.schema) { - if(_.isArray(parameter.schema.allOf)) { - // move to a definition - modelName = 'inline_model'; - var _name = modelName; - done = false; counter = 0; - while(!done) { - if(typeof spec.definitions[_name] === 'undefined') { - done = true; - break; - } - _name = modelName + '_' + counter; - counter ++; - } - spec.definitions[_name] = { allOf: parameter.schema.allOf }; - delete parameter.schema.allOf; - parameter.schema.$ref = '#/definitions/' + _name; - this.processAllOf(root, _name, spec.definitions[_name], resolutionTable, unresolvedRefs, spec); - } - else { - this.resolveTo(root, parameter.schema, resolutionTable, location); - } - } - - if (parameter.$ref) { - // parameter reference - this.resolveInline(root, spec, parameter, resolutionTable, unresolvedRefs, parameter.$ref); - } - } - - // operations - for (name in spec.paths) { - var method, operation, responseCode; - path = spec.paths[name]; - - if(typeof path === 'object') { - for (method in path) { - // operation reference - if (method === '$ref') { - // location = path[method]; - location = '/paths' + name; - this.resolveInline(root, spec, path, resolutionTable, unresolvedRefs, location); - } - else { - operation = path[method]; - var sharedParameters = path.parameters || []; - var parameters = operation.parameters || []; - - sharedParameters.forEach(function(parameter) { - parameters.unshift(parameter); - }); - - if (method !== 'parameters' && _.isObject(operation)) { - operation.parameters = operation.parameters || parameters; - } - - for (i in parameters) { - parameter = parameters[i]; - location = '/paths' + name + '/' + method + '/parameters'; - - if (parameter.in === 'body' && parameter.schema) { - if (_.isArray(parameter.schema.allOf)) { - // move to a definition - modelName = 'inline_model'; - name = modelName; - done = false; - counter = 0; - while (!done) { - if (typeof spec.definitions[name] === 'undefined') { - done = true; - break; - } - name = modelName + '_' + counter; - counter++; - } - spec.definitions[name] = {allOf: parameter.schema.allOf}; - delete parameter.schema.allOf; - parameter.schema.$ref = '#/definitions/' + name; - this.processAllOf(root, name, spec.definitions[name], resolutionTable, unresolvedRefs, spec); - } - else { - this.resolveTo(root, parameter.schema, resolutionTable, location); - } - } - - if (parameter.$ref) { - // parameter reference - this.resolveInline(root, spec, parameter, resolutionTable, unresolvedRefs, parameter.$ref); - } - } - - for (responseCode in operation.responses) { - var response = operation.responses[responseCode]; - location = '/paths' + name + '/' + method + '/responses/' + responseCode; - - if (_.isObject(response)) { - if (response.$ref) { - // response reference - this.resolveInline(root, spec, response, resolutionTable, unresolvedRefs, location); - } - if (response.schema) { - var responseObj = response; - if (_.isArray(responseObj.schema.allOf)) { - // move to a definition - modelName = 'inline_model'; - name = modelName; - done = false; - counter = 0; - while (!done) { - if (typeof spec.definitions[name] === 'undefined') { - done = true; - break; - } - name = modelName + '_' + counter; - counter++; - } - spec.definitions[name] = {allOf: responseObj.schema.allOf}; - delete responseObj.schema.allOf; - delete responseObj.schema.type; - responseObj.schema.$ref = '#/definitions/' + name; - this.processAllOf(root, name, spec.definitions[name], resolutionTable, unresolvedRefs, spec); - } - else if ('array' === responseObj.schema.type) { - if (responseObj.schema.items && responseObj.schema.items.$ref) { - // response reference - this.resolveInline(root, spec, responseObj.schema.items, resolutionTable, unresolvedRefs, location); - } - } - else { - this.resolveTo(root, response.schema, resolutionTable, location); - } - } - } - } - } - } - // clear them out to avoid multiple resolutions - path.parameters = []; - } - } - - var expectedCalls = 0, toResolve = []; - // if the root is same as obj[i].root we can resolve locally - var all = resolutionTable; - - var parts; - for(i = 0; i < all.length; i++) { - var a = all[i]; - if(root === a.root) { - if(a.resolveAs === 'ref') { - // resolve any path walking - var joined = ((a.root || '') + '/' + a.key).split('/'); - var normalized = []; - var url = ''; - var k; - - if(a.key.indexOf('../') >= 0) { - for(var j = 0; j < joined.length; j++) { - if(joined[j] === '..') { - normalized = normalized.slice(0, normalized.length-1); - } - else { - normalized.push(joined[j]); - } - } - for(k = 0; k < normalized.length; k ++) { - if(k > 0) { - url += '/'; - } - url += normalized[k]; - } - // we now have to remote resolve this because the path has changed - a.root = url; - toResolve.push(a); - } - else { - parts = a.key.split('#'); - if(parts.length === 2) { - if(parts[0].indexOf('http:') === 0 || parts[0].indexOf('https:') === 0) { - a.root = parts[0]; - } - location = parts[1].split('/'); - var r; - var s = spec; - for(k = 0; k < location.length; k++) { - var part = location[k]; - if(part !== '') { - s = s[part]; - if(typeof s !== 'undefined') { - r = s; - } - else { - r = null; - break; - } - } - } - if(r === null) { - // must resolve this too - toResolve.push(a); - } - } - } - } - else { - if (a.resolveAs === 'inline') { - if(a.key && a.key.indexOf('#') === -1 && a.key.charAt(0) !== '/') { - // handle relative schema - parts = a.root.split('/'); - location = ''; - for(i = 0; i < parts.length - 1; i++) { - location += parts[i] + '/'; - } - location += a.key; - a.root = location; - a.location = ''; - } - toResolve.push(a); - } - } - } - else { - toResolve.push(a); - } - } - expectedCalls = toResolve.length; - - // resolve anything that is local - - var lock = {}; - for(var ii = 0; ii < toResolve.length; ii++) { - (function(item, spec, self, lock, ii) { - if(!item.root || item.root === root) { - // local resolve - self.resolveItem(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, item); - processedCalls += 1; - - if(processedCalls === expectedCalls) { - self.finish(spec, root, resolutionTable, resolvedRefs, unresolvedRefs, callback, true); - } - } - else if(self.failedUrls.indexOf(item.root) === -1) { - var obj = { - useJQuery: false, // TODO - url: item.root, - method: 'get', - headers: { - accept: self.scope.swaggerRequestHeaders || 'application/json' - }, - on: { - error: function (error) { - processedCalls += 1; - console.log('failed url: ' + obj.url); - self.failedUrls.push(obj.url); - if (lock) { - delete lock[item.root]; - } - unresolvedRefs[item.key] = { - root: item.root, - location: item.location - }; - - if (processedCalls === expectedCalls) { - self.finish(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, callback); - } - }, // jshint ignore:line - response: function (response) { - var swagger = response.obj; - if (lock) { - delete lock[item.root]; - } - if (self.resolverCache) { - self.resolverCache[item.root] = swagger; - } - self.resolveItem(swagger, item.root, resolutionTable, resolvedRefs, unresolvedRefs, item); - processedCalls += 1; - - if (processedCalls === expectedCalls) { - self.finish(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, callback); - } - } - } // jshint ignore:line - }; - - // apply timeout only when specified - if (scope && scope.fetchSpecTimeout) { - obj.timeout = scope.fetchSpecTimeout; - } - - if (scope && scope.clientAuthorizations) { - scope.clientAuthorizations.apply(obj); - } - - (function waitForUnlock() { - setTimeout(function() { - if (lock[obj.url]) { - waitForUnlock(); - } - else { - var cached = self.resolverCache[obj.url]; - if (_.isObject(cached)) { - obj.on.response({obj: cached}); - } - else { - lock[obj.url] = true; - new SwaggerHttp().execute(obj, opts); - } - } - }, 0); - })(); - } - - else { - processedCalls += 1; - unresolvedRefs[item.key] = { - root: item.root, - location: item.location - }; - if (processedCalls === expectedCalls) { - self.finish(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, callback); - } - } - }(toResolve[ii], spec, this, lock, ii)); - } - - if (Object.keys(toResolve).length === 0) { - this.finish(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, callback); - } -}; - -Resolver.prototype.resolveItem = function(spec, root, resolutionTable, resolvedRefs, unresolvedRefs, item) { - var path = item.location; - var location = spec, parts = path.split('/'); - if(path !== '') { - for (var j = 0; j < parts.length; j++) { - var segment = parts[j]; - if (segment.indexOf('~1') !== -1) { - segment = parts[j].replace(/~0/g, '~').replace(/~1/g, '/'); - if (segment.charAt(0) !== '/') { - segment = '/' + segment; - } - } - if (typeof location === 'undefined' || location === null) { - break; - } - if (segment === '' && j === (parts.length - 1) && parts.length > 1) { - location = null; - break; - } - if (segment.length > 0) { - location = location[segment]; - } - } - } - var resolved = item.key; - parts = item.key.split('/'); - var resolvedName = parts[parts.length-1]; - - if(resolvedName.indexOf('#') >= 0) { - resolvedName = resolvedName.split('#')[1]; - } - - if (location !== null && typeof location !== 'undefined') { - resolvedRefs[resolved] = { - name: resolvedName, - obj: location, - key: item.key, - root: item.root - }; - } else { - unresolvedRefs[resolved] = { - root: item.root, - location: item.location - }; - } -}; - -Resolver.prototype.finish = function (spec, root, resolutionTable, resolvedRefs, unresolvedRefs, callback, localResolve) { - // walk resolution table and replace with resolved refs - var ref, abs; - for (ref in resolutionTable) { - var item = resolutionTable[ref]; - - var key = item.key; - var resolvedTo = resolvedRefs[key]; - if (resolvedTo) { - spec.definitions = spec.definitions || {}; - if (item.resolveAs === 'ref') { - if (localResolve !== true) { - // don't retain root for local definitions - for (key in resolvedTo.obj) { - abs = this.retainRoot(key, resolvedTo.obj[key], item.root); - resolvedTo.obj[key] = abs; - } - } - spec.definitions[resolvedTo.name] = resolvedTo.obj; - item.obj.$ref = '#/definitions/' + resolvedTo.name; - } else if (item.resolveAs === 'inline') { - var targetObj = item.obj; - targetObj['x-resolved-from'] = [ item.key ]; - delete targetObj.$ref; - - for (key in resolvedTo.obj) { - abs = resolvedTo.obj[key]; - - if (localResolve !== true) { - // don't retain root for local definitions - abs = this.retainRoot(key, resolvedTo.obj[key], item.root); - } - targetObj[key] = abs; - } - } - } - } - var existingUnresolved = this.countUnresolvedRefs(spec); - - if(existingUnresolved === 0 || this.iteration > 5) { - this.resolveAllOf(spec.definitions); - this.resolverCache = null; - callback.call(this.scope, spec, unresolvedRefs); - } - else { - this.iteration += 1; - this.resolve(spec, root, callback, this.scope); - } -}; - -Resolver.prototype.countUnresolvedRefs = function(spec) { - var i; - var refs = this.getRefs(spec); - var keys = []; - var unresolvedKeys = []; - for(i in refs) { - if(i.indexOf('#') === 0) { - keys.push(i.substring(1)); - } - else { - unresolvedKeys.push(i); - } - } - - // verify possible keys - for (i = 0; i < keys.length; i++) { - var part = keys[i]; - var parts = part.split('/'); - var obj = spec; - - for (var k = 0; k < parts.length; k++) { - var key = parts[k]; - if(key !== '') { - obj = obj[key]; - if(typeof obj === 'undefined') { - unresolvedKeys.push(part); - break; - } - } - } - } - return unresolvedKeys.length; -}; - -Resolver.prototype.getRefs = function(spec, obj) { - obj = obj || spec; - var output = {}; - for(var key in obj) { - if (!obj.hasOwnProperty(key)) { - continue; - } - var item = obj[key]; - if(key === '$ref' && typeof item === 'string') { - output[item] = null; - } - else if(_.isObject(item)) { - var o = this.getRefs(item); - for(var k in o) { - output[k] = null; - } - } - } - return output; -}; - -function splitUrl(url) { - var result = {}; - var proto = /[a-z]+:\/\//i.exec(url); - if (proto) { - result.proto = proto[0].slice(0, -3); - url = url.slice(result.proto.length + 1); - } - if (url.slice(0, 2) === '//') { - result.domain = url.slice(2).split('/')[0]; - url = url.slice(2 + result.domain.length); - } - var p = url.split('#'); - if (p[0].length) { - result.path = p[0]; - } - if (p.length > 1) { - result.fragment = p.slice(1).join('#'); - } - return result; -} - -function unsplitUrl(url) { - var result = url.path; - if (result === undefined) { - result = ''; - } - if (url.fragment !== undefined) { - result += '#' + url.fragment; - } - if (url.domain !== undefined) { - if (result.slice(0, 1) === '/') { - result = result.slice(1); - } - result = '//' + url.domain + '/' + result; - if (url.proto !== undefined) { - result = url.proto + ':' + result; - } - } - return result; -} - -function joinUrl(base, rel) { - var relsp = splitUrl(rel); - if (relsp.domain !== undefined) { - return rel; - } - var result = splitUrl(base); - if (relsp.path === undefined) { - // change only fragment part - result.fragment = relsp.fragment; - } else if (relsp.path.slice(0, 1) === '/') { - // relative to domain - result.path = relsp.path; - result.fragment = relsp.fragment; - } else { - // relative to path - var path = result.path === undefined ? [] : result.path.split('/'); - var relpath = relsp.path.split('/'); - if (path.length) { - path.pop(); - } - while (relpath[0] === '..' || relpath[0] === '.') { - if (relpath[0] === '..') { - path.pop(); - } - relpath.shift(); - } - result.path = path.concat(relpath).join('/'); - result.fragment = relsp.fragment; - } - return unsplitUrl(result); -} - -Resolver.prototype.retainRoot = function(origKey, obj, root) { - // walk object and look for relative $refs - if(_.isObject(obj)) { - for(var key in obj) { - var item = obj[key]; - if (key === '$ref' && typeof item === 'string') { - obj[key] = joinUrl(root, item); - } - else if (_.isObject(item)) { - this.retainRoot(key, item, root); - } - } - } - else if(_.isString(obj) && origKey === '$ref') { - obj = joinUrl(root, obj); - } - return obj; -}; - -/** - * immediately in-lines local refs, queues remote refs - * for inline resolution - */ -Resolver.prototype.resolveInline = function (root, spec, property, resolutionTable, unresolvedRefs, location) { - var key = property.$ref, ref = property.$ref, i, p, p2, rs; - var rootTrimmed = false; - - root = root || ''; // Guard against .split. @fehguy, you'll need to check if this logic fits - // More imporantly is how do we gracefully handle relative urls, when provided just a 'spec', not a 'url' ? - - if (ref) { - if(ref.indexOf('../') === 0) { - // reset root - p = ref.split('../'); - p2 = root.split('/'); - ref = ''; - for(i = 0; i < p.length; i++) { - if(p[i] === '') { - p2 = p2.slice(0, p2.length-1); - } - else { - ref += p[i]; - } - } - root = ''; - for(i = 0; i < p2.length - 1; i++) { - if(i > 0) { root += '/'; } - root += p2[i]; - } - rootTrimmed = true; - } - if(ref.indexOf('#') >= 0) { - if(ref.indexOf('/') === 0) { - rs = ref.split('#'); - p = root.split('//'); - p2 = p[1].split('/'); - root = p[0] + '//' + p2[0] + rs[0]; - location = rs[1]; - } - else { - rs = ref.split('#'); - if(rs[0] !== '') { - p2 = root.split('/'); - p2 = p2.slice(0, p2.length - 1); - if(!rootTrimmed) { - root = ''; - for (var k = 0; k < p2.length; k++) { - if(k > 0) { root += '/'; } - root += p2[k]; - } - } - root += '/' + ref.split('#')[0]; - } - location = rs[1]; - } - } - if (ref.indexOf('http:') === 0 || ref.indexOf('https:') === 0) { - if(ref.indexOf('#') >= 0) { - root = ref.split('#')[0]; - location = ref.split('#')[1]; - } - else { - root = ref; - location = ''; - } - resolutionTable.push({obj: property, resolveAs: 'inline', root: root, key: key, location: location}); - } else if (ref.indexOf('#') === 0) { - location = ref.split('#')[1]; - resolutionTable.push({obj: property, resolveAs: 'inline', root: root, key: key, location: location}); - } else if (ref.indexOf('/') === 0 && ref.indexOf('#') === -1) { - location = ref; - var matches = root.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i); - if(matches) { - root = matches[0] + ref.substring(1); - location = ''; - } - resolutionTable.push({obj: property, resolveAs: 'inline', root: root, key: key, location: location}); - } - else { - resolutionTable.push({obj: property, resolveAs: 'inline', root: root, key: key, location: location}); - } - } - else if (property.type === 'array') { - this.resolveTo(root, property.items, resolutionTable, location); - } -}; - -Resolver.prototype.resolveTo = function (root, property, resolutionTable, location) { - var sp, i; - var ref = property.$ref; - var lroot = root; - if ((typeof ref !== 'undefined') && (ref !== null)) { - if(ref.indexOf('#') >= 0) { - var parts = ref.split('#'); - - // #/definitions/foo - // foo.json#/bar - if(parts[0] && ref.indexOf('/') === 0) { - - } - else if(parts[0] && (parts[0].indexOf('http:') === 0 || parts[0].indexOf('https:') === 0)) { - lroot = parts[0]; - ref = parts[1]; - } - else if(parts[0] && parts[0].length > 0) { - // relative file - sp = root.split('/'); - lroot = ''; - for(i = 0; i < sp.length - 1; i++) { - lroot += sp[i] + '/'; - } - lroot += parts[0]; - } - else { - - } - - location = parts[1]; - } - else if (ref.indexOf('http:') === 0 || ref.indexOf('https:') === 0) { - lroot = ref; - location = ''; - } - else { - // relative file - sp = root.split('/'); - lroot = ''; - for(i = 0; i < sp.length - 1; i++) { - lroot += sp[i] + '/'; - } - lroot += ref; - location = ''; - } - resolutionTable.push({ - obj: property, resolveAs: 'ref', root: lroot, key: ref, location: location - }); - } else if (property.type === 'array') { - var items = property.items; - this.resolveTo(root, items, resolutionTable, location); - } else { - if(property && (property.properties || property.additionalProperties)) { - var name = this.uniqueName('inline_model'); - if (property.title) { - name = this.uniqueName(property.title); - } - delete property.title; - this.spec.definitions[name] = _.cloneDeep(property); - property.$ref = '#/definitions/' + name; - delete property.type; - delete property.properties; - } - } -}; - -Resolver.prototype.uniqueName = function(base) { - var name = base; - var count = 0; - while(true) { - if(!_.isObject(this.spec.definitions[name])) { - return name; - } - name = base + '_' + count; - count++; - } -}; - -Resolver.prototype.resolveAllOf = function(spec, obj, depth) { - depth = depth || 0; - obj = obj || spec; - var name; - for(var key in obj) { - if (!obj.hasOwnProperty(key)) { - continue; - } - var item = obj[key]; - if(item === null) { - throw new TypeError('Swagger 2.0 does not support null types (' + obj + '). See https://github.com/swagger-api/swagger-spec/issues/229.'); - } - if(typeof item === 'object') { - this.resolveAllOf(spec, item, depth + 1); - } - if(item && typeof item.allOf !== 'undefined') { - var allOf = item.allOf; - if(_.isArray(allOf)) { - var output = _.cloneDeep(item); - delete output.allOf; - - output['x-composed'] = true; - if (typeof item['x-resolved-from'] !== 'undefined') { - output['x-resolved-from'] = item['x-resolved-from']; - } - - for(var i = 0; i < allOf.length; i++) { - var component = allOf[i]; - var source = 'self'; - if(typeof component['x-resolved-from'] !== 'undefined') { - source = component['x-resolved-from'][0]; - } - - for(var part in component) { - if(!output.hasOwnProperty(part)) { - output[part] = _.cloneDeep(component[part]); - if(part === 'properties') { - for(name in output[part]) { - output[part][name]['x-resolved-from'] = source; - } - } - } - else { - if(part === 'properties') { - var properties = component[part]; - for(name in properties) { - output.properties[name] = _.cloneDeep(properties[name]); - var resolvedFrom = properties[name]['x-resolved-from']; - if (typeof resolvedFrom === 'undefined' || resolvedFrom === 'self') { - resolvedFrom = source; - } - output.properties[name]['x-resolved-from'] = resolvedFrom; - } - } - else if(part === 'required') { - // merge & dedup the required array - var a = output.required.concat(component[part]); - for(var k = 0; k < a.length; ++k) { - for(var j = k + 1; j < a.length; ++j) { - if(a[k] === a[j]) { a.splice(j--, 1); } - } - } - output.required = a; - } - else if(part === 'x-resolved-from') { - output['x-resolved-from'].push(source); - } - else { - // TODO: need to merge this property - // console.log('what to do with ' + part) - } - } - } - } - obj[key] = output; - } - } - } -}; - -},{"./http":5,"lodash-compat/lang/cloneDeep":138,"lodash-compat/lang/isArray":140,"lodash-compat/lang/isObject":144,"lodash-compat/lang/isString":146}],7:[function(require,module,exports){ -'use strict'; - -var Helpers = require('./helpers'); - -var _ = { - isPlainObject: require('lodash-compat/lang/isPlainObject'), - isUndefined: require('lodash-compat/lang/isUndefined'), - isArray: require('lodash-compat/lang/isArray'), - isObject: require('lodash-compat/lang/isObject'), - isEmpty: require('lodash-compat/lang/isEmpty'), - map: require('lodash-compat/collection/map'), - indexOf: require('lodash-compat/array/indexOf'), - cloneDeep: require('lodash-compat/lang/cloneDeep'), - keys: require('lodash-compat/object/keys'), - forEach: require('lodash-compat/collection/forEach') -}; - -var optionHtml = module.exports.optionHtml = function (label, value) { - return '' + label + ':' + value + ''; -}; - -module.exports.typeFromJsonSchema = function (type, format) { - var str; - - if (type === 'integer' && format === 'int32') { - str = 'integer'; - } else if (type === 'integer' && format === 'int64') { - str = 'long'; - } else if (type === 'integer' && typeof format === 'undefined') { - str = 'long'; - } else if (type === 'string' && format === 'date-time') { - str = 'date-time'; - } else if (type === 'string' && format === 'date') { - str = 'date'; - } else if (type === 'number' && format === 'float') { - str = 'float'; - } else if (type === 'number' && format === 'double') { - str = 'double'; - } else if (type === 'number' && typeof format === 'undefined') { - str = 'double'; - } else if (type === 'boolean') { - str = 'boolean'; - } else if (type === 'string') { - str = 'string'; - } - - return str; -}; - -var getStringSignature = module.exports.getStringSignature = function (obj, baseComponent) { - var str = ''; - - if (typeof obj.$ref !== 'undefined') { - str += Helpers.simpleRef(obj.$ref); - } else if (typeof obj.type === 'undefined') { - str += 'object'; - } else if (obj.type === 'array') { - if (baseComponent) { - str += getStringSignature((obj.items || obj.$ref || {})); - } else { - str += 'Array['; - str += getStringSignature((obj.items || obj.$ref || {})); - str += ']'; - } - } else if (obj.type === 'integer' && obj.format === 'int32') { - str += 'integer'; - } else if (obj.type === 'integer' && obj.format === 'int64') { - str += 'long'; - } else if (obj.type === 'integer' && typeof obj.format === 'undefined') { - str += 'long'; - } else if (obj.type === 'string' && obj.format === 'date-time') { - str += 'date-time'; - } else if (obj.type === 'string' && obj.format === 'date') { - str += 'date'; - } else if (obj.type === 'string' && typeof obj.format === 'undefined') { - str += 'string'; - } else if (obj.type === 'number' && obj.format === 'float') { - str += 'float'; - } else if (obj.type === 'number' && obj.format === 'double') { - str += 'double'; - } else if (obj.type === 'number' && typeof obj.format === 'undefined') { - str += 'double'; - } else if (obj.type === 'boolean') { - str += 'boolean'; - } else if (obj.$ref) { - str += Helpers.simpleRef(obj.$ref); - } else { - str += obj.type; - } - - return str; -}; - -var schemaToJSON = module.exports.schemaToJSON = function (schema, models, modelsToIgnore, modelPropertyMacro) { - // Resolve the schema (Handle nested schemas) - schema = Helpers.resolveSchema(schema); - - if(typeof modelPropertyMacro !== 'function') { - modelPropertyMacro = function(prop){ - return (prop || {}).default; - }; - } - - modelsToIgnore= modelsToIgnore || {}; - - var type = schema.type || 'object'; - var format = schema.format; - var model; - var output; - - if (!_.isUndefined(schema.example)) { - output = schema.example; - } else if (_.isUndefined(schema.items) && _.isArray(schema.enum)) { - output = schema.enum[0]; - } - - if (_.isUndefined(output)) { - if (schema.$ref) { - model = models[Helpers.simpleRef(schema.$ref)]; - - if (!_.isUndefined(model)) { - if (_.isUndefined(modelsToIgnore[model.name])) { - modelsToIgnore[model.name] = model; - output = schemaToJSON(model.definition, models, modelsToIgnore, modelPropertyMacro); - delete modelsToIgnore[model.name]; - } else { - if (model.type === 'array') { - output = []; - } else { - output = {}; - } - } - } - } else if (!_.isUndefined(schema.default)) { - output = schema.default; - } else if (type === 'string') { - if (format === 'date-time') { - output = new Date().toISOString(); - } else if (format === 'date') { - output = new Date().toISOString().split('T')[0]; - } else { - output = 'string'; - } - } else if (type === 'integer') { - output = 0; - } else if (type === 'number') { - output = 0.0; - } else if (type === 'boolean') { - output = true; - } else if (type === 'object') { - output = {}; - - _.forEach(schema.properties, function (property, name) { - var cProperty = _.cloneDeep(property); - - // Allow macro to set the default value - cProperty.default = modelPropertyMacro(property); - - output[name] = schemaToJSON(cProperty, models, modelsToIgnore, modelPropertyMacro); - }); - } else if (type === 'array') { - output = []; - - if (_.isArray(schema.items)) { - _.forEach(schema.items, function (item) { - output.push(schemaToJSON(item, models, modelsToIgnore, modelPropertyMacro)); - }); - } else if (_.isPlainObject(schema.items)) { - output.push(schemaToJSON(schema.items, models, modelsToIgnore, modelPropertyMacro)); - } else if (_.isUndefined(schema.items)) { - output.push({}); - } else { - Helpers.log('Array type\'s \'items\' property is not an array or an object, cannot process'); - } - } - } - - return output; -}; - -module.exports.schemaToHTML =function (name, schema, models, modelPropertyMacro) { - var strongOpen = ''; - var strongClose = ''; - - // Allow for ignoring the 'name' argument.... shifting the rest - if(_.isObject(arguments[0])) { - name = void 0; - schema = arguments[0]; - models = arguments[1]; - modelPropertyMacro = arguments[2]; - } - - models = models || {}; - - // Resolve the schema (Handle nested schemas) - schema = Helpers.resolveSchema(schema); - - // Return for empty object - if(_.isEmpty(schema)) { - return strongOpen + 'Empty' + strongClose; - } - - // Dereference $ref from 'models' - if(typeof schema.$ref === 'string') { - name = Helpers.simpleRef(schema.$ref); - schema = models[name]; - if(typeof schema === 'undefined') - { - return strongOpen + name + ' is not defined!' + strongClose; - } - } - - if(typeof name !== 'string') { - name = schema.title || 'Inline Model'; - } - - // If we are a Model object... adjust accordingly - if(schema.definition) { - schema = schema.definition; - } - - if(typeof modelPropertyMacro !== 'function') { - modelPropertyMacro = function(prop){ - return (prop || {}).default; - }; - } - - var references = {}; - var seenModels = []; - var inlineModels = 0; - - - - // Generate current HTML - var html = processModel(schema, name); - - // Generate references HTML - while (_.keys(references).length > 0) { - /* jshint ignore:start */ - _.forEach(references, function (schema, name) { - var seenModel = _.indexOf(seenModels, name) > -1; - - delete references[name]; - - if (!seenModel) { - seenModels.push(name); - - html += '
      ' + processModel(schema, name); - } - }); - /* jshint ignore:end */ - } - - return html; - - ///////////////////////////////// - - function addReference(schema, name, skipRef) { - var modelName = name; - var model; - - if (schema.$ref) { - modelName = schema.title || Helpers.simpleRef(schema.$ref); - model = models[modelName]; - } else if (_.isUndefined(name)) { - modelName = schema.title || 'Inline Model ' + (++inlineModels); - model = {definition: schema}; - } - - if (skipRef !== true) { - references[modelName] = _.isUndefined(model) ? {} : model.definition; - } - - return modelName; - } - - function primitiveToHTML(schema) { - var html = ''; - var type = schema.type || 'object'; - - if (schema.$ref) { - html += addReference(schema, Helpers.simpleRef(schema.$ref)); - } else if (type === 'object') { - if (!_.isUndefined(schema.properties)) { - html += addReference(schema); - } else { - html += 'object'; - } - } else if (type === 'array') { - html += 'Array['; - - if (_.isArray(schema.items)) { - html += _.map(schema.items, addReference).join(','); - } else if (_.isPlainObject(schema.items)) { - if (_.isUndefined(schema.items.$ref)) { - if (!_.isUndefined(schema.items.type) && _.indexOf(['array', 'object'], schema.items.type) === -1) { - html += schema.items.type; - } else { - html += addReference(schema.items); - } - } else { - html += addReference(schema.items, Helpers.simpleRef(schema.items.$ref)); - } - } else { - Helpers.log('Array type\'s \'items\' schema is not an array or an object, cannot process'); - html += 'object'; - } - - html += ']'; - } else { - html += schema.type; - } - - html += ''; - - return html; - } - - function primitiveToOptionsHTML(schema, html) { - var options = ''; - var type = schema.type || 'object'; - var isArray = type === 'array'; - - if (isArray) { - if (_.isPlainObject(schema.items) && !_.isUndefined(schema.items.type)) { - type = schema.items.type; - } else { - type = 'object'; - } - } - - if (!_.isUndefined(schema.default)) { - options += optionHtml('Default', schema.default); - } - - switch (type) { - case 'string': - if (schema.minLength) { - options += optionHtml('Min. Length', schema.minLength); - } - - if (schema.maxLength) { - options += optionHtml('Max. Length', schema.maxLength); - } - - if (schema.pattern) { - options += optionHtml('Reg. Exp.', schema.pattern); - } - break; - case 'integer': - case 'number': - if (schema.minimum) { - options += optionHtml('Min. Value', schema.minimum); - } - - if (schema.exclusiveMinimum) { - options += optionHtml('Exclusive Min.', 'true'); - } - - if (schema.maximum) { - options += optionHtml('Max. Value', schema.maximum); - } - - if (schema.exclusiveMaximum) { - options += optionHtml('Exclusive Max.', 'true'); - } - - if (schema.multipleOf) { - options += optionHtml('Multiple Of', schema.multipleOf); - } - - break; - } - - if (isArray) { - if (schema.minItems) { - options += optionHtml('Min. Items', schema.minItems); - } - - if (schema.maxItems) { - options += optionHtml('Max. Items', schema.maxItems); - } - - if (schema.uniqueItems) { - options += optionHtml('Unique Items', 'true'); - } - - if (schema.collectionFormat) { - options += optionHtml('Coll. Format', schema.collectionFormat); - } - } - - if (_.isUndefined(schema.items)) { - if (_.isArray(schema.enum)) { - var enumString; - - if (type === 'number' || type === 'integer') { - enumString = schema.enum.join(', '); - } else { - enumString = '"' + schema.enum.join('", "') + '"'; - } - - options += optionHtml('Enum', enumString); - } - } - - if (options.length > 0) { - html = '' + html + '' + options + '
      ' + type + '
      '; - } - - return html; - } - - function processModel(schema, name) { - var type = schema.type || 'object'; - var isArray = schema.type === 'array'; - var html = strongOpen + name + ' ' + (isArray ? '[' : '{') + strongClose; - - if (name) { - seenModels.push(name); - } - - if (isArray) { - if (_.isArray(schema.items)) { - html += '
      ' + _.map(schema.items, function (item) { - var type = item.type || 'object'; - - if (_.isUndefined(item.$ref)) { - if (_.indexOf(['array', 'object'], type) > -1) { - if (type === 'object' && _.isUndefined(item.properties)) { - return 'object'; - } else { - return addReference(item); - } - } else { - return primitiveToOptionsHTML(item, type); - } - } else { - return addReference(item, Helpers.simpleRef(item.$ref)); - } - }).join(',
      '); - } else if (_.isPlainObject(schema.items)) { - if (_.isUndefined(schema.items.$ref)) { - if (_.indexOf(['array', 'object'], schema.items.type || 'object') > -1) { - if ((_.isUndefined(schema.items.type) || schema.items.type === 'object') && _.isUndefined(schema.items.properties)) { - html += '
      object
      '; - } else { - html += '
      ' + addReference(schema.items) + '
      '; - } - } else { - html += '
      ' + primitiveToOptionsHTML(schema.items, schema.items.type) + '
      '; - } - } else { - html += '
      ' + addReference(schema.items, Helpers.simpleRef(schema.items.$ref)) + '
      '; - } - } else { - Helpers.log('Array type\'s \'items\' property is not an array or an object, cannot process'); - html += '
      object
      '; - } - } else { - if (schema.$ref) { - html += '
      ' + addReference(schema, name) + '
      '; - } else if (type === 'object') { - if (_.isPlainObject(schema.properties)) { - var contents = _.map(schema.properties, function (property, name) { - var propertyIsRequired = (_.indexOf(schema.required, name) >= 0); - var cProperty = _.cloneDeep(property); - - var requiredClass = propertyIsRequired ? 'required' : ''; - var html = '' + name + ' ('; - var model; - var propDescription; - - // Allow macro to set the default value - cProperty.default = modelPropertyMacro(cProperty); - - // Resolve the schema (Handle nested schemas) - cProperty = Helpers.resolveSchema(cProperty); - - propDescription = property.description || cProperty.description; - - // We need to handle property references to primitives (Issue 339) - if (!_.isUndefined(cProperty.$ref)) { - model = models[Helpers.simpleRef(cProperty.$ref)]; - - if (!_.isUndefined(model) && _.indexOf([undefined, 'array', 'object'], model.definition.type) === -1) { - // Use referenced schema - cProperty = Helpers.resolveSchema(model.definition); - } - } - - html += primitiveToHTML(cProperty); - - if(!propertyIsRequired) { - html += ', optional'; - } - - if(property.readOnly) { - html += ', read only'; - } - - html += ')'; - - if (!_.isUndefined(propDescription)) { - html += ': ' + '' + propDescription + ''; - } - - if (cProperty.enum) { - html += ' = [\'' + cProperty.enum.join('\', \'') + '\']'; - } - - return '' + primitiveToOptionsHTML(cProperty, html); - }).join(',
      '); - - if (contents) { - html += contents + '
      '; - } - } - } else { - html += '
      ' + primitiveToOptionsHTML(schema, type) + '
      '; - } - } - - return html + strongOpen + (isArray ? ']' : '}') + strongClose; - } -}; -},{"./helpers":4,"lodash-compat/array/indexOf":49,"lodash-compat/collection/forEach":54,"lodash-compat/collection/map":56,"lodash-compat/lang/cloneDeep":138,"lodash-compat/lang/isArray":140,"lodash-compat/lang/isEmpty":141,"lodash-compat/lang/isObject":144,"lodash-compat/lang/isPlainObject":145,"lodash-compat/lang/isUndefined":148,"lodash-compat/object/keys":149}],8:[function(require,module,exports){ -'use strict'; - -var SwaggerHttp = require('./http'); -var _ = { - isObject: require('lodash-compat/lang/isObject') -}; - -var SwaggerSpecConverter = module.exports = function () { - this.errors = []; - this.warnings = []; - this.modelMap = {}; -}; - -SwaggerSpecConverter.prototype.setDocumentationLocation = function (location) { - this.docLocation = location; -}; - -/** - * converts a resource listing OR api declaration - **/ -SwaggerSpecConverter.prototype.convert = function (obj, clientAuthorizations, opts, callback) { - // not a valid spec - if(!obj || !Array.isArray(obj.apis)) { - return this.finish(callback, null); - } - this.clientAuthorizations = clientAuthorizations; - - // create a new swagger object to return - var swagger = { swagger: '2.0' }; - - swagger.originalVersion = obj.swaggerVersion; - - // add the info - this.apiInfo(obj, swagger); - - // add security definitions - this.securityDefinitions(obj, swagger); - - // take basePath into account - if (obj.basePath) { - this.setDocumentationLocation(obj.basePath); - } - - // see if this is a single-file swagger definition - var isSingleFileSwagger = false; - var i; - for(i = 0; i < obj.apis.length; i++) { - var api = obj.apis[i]; - if(Array.isArray(api.operations)) { - isSingleFileSwagger = true; - } - } - if(isSingleFileSwagger) { - this.declaration(obj, swagger); - this.finish(callback, swagger); - } - else { - this.resourceListing(obj, swagger, opts, callback); - } -}; - -SwaggerSpecConverter.prototype.declaration = function(obj, swagger) { - var name, i, p, pos; - if(!obj.apis) { - return; - } - - if (obj.basePath.indexOf('http://') === 0) { - p = obj.basePath.substring('http://'.length); - pos = p.indexOf('/'); - if (pos > 0) { - swagger.host = p.substring(0, pos); - swagger.basePath = p.substring(pos); - } - else { - swagger.host = p; - swagger.basePath = '/'; - } - } else if (obj.basePath.indexOf('https://') === 0) { - p = obj.basePath.substring('https://'.length); - pos = p.indexOf('/'); - if (pos > 0) { - swagger.host = p.substring(0, pos); - swagger.basePath = p.substring(pos); - } - else { - swagger.host = p; - swagger.basePath = '/'; - } - } else { - swagger.basePath = obj.basePath; - } - - var resourceLevelAuth; - if(obj.authorizations) { - resourceLevelAuth = obj.authorizations; - } - if(obj.consumes) { - swagger.consumes = obj.consumes; - } - if(obj.produces) { - swagger.produces = obj.produces; - } - - // build a mapping of id to name for 1.0 model resolutions - if(_.isObject(obj)) { - for(name in obj.models) { - var existingModel = obj.models[name]; - var key = (existingModel.id || name); - this.modelMap[key] = name; - } - } - - for(i = 0; i < obj.apis.length; i++) { - var api = obj.apis[i]; - var path = api.path; - var operations = api.operations; - this.operations(path, obj.resourcePath, operations, resourceLevelAuth, swagger); - } - - var models = obj.models || {}; - this.models(models, swagger); -}; - -SwaggerSpecConverter.prototype.models = function(obj, swagger) { - if(!_.isObject(obj)) { - return; - } - var name; - - swagger.definitions = swagger.definitions || {}; - for(name in obj) { - var existingModel = obj[name]; - var _required = []; - var schema = { properties: {}}; - var propertyName; - for(propertyName in existingModel.properties) { - var existingProperty = existingModel.properties[propertyName]; - var property = {}; - this.dataType(existingProperty, property); - if(existingProperty.description) { - property.description = existingProperty.description; - } - if(existingProperty['enum']) { - property['enum'] = existingProperty['enum']; - } - if(typeof existingProperty.required === 'boolean' && existingProperty.required === true) { - _required.push(propertyName); - } - if(typeof existingProperty.required === 'string' && existingProperty.required === 'true') { - _required.push(propertyName); - } - schema.properties[propertyName] = property; - } - if(_required.length > 0) { - schema.required = _required; - } else { - schema.required = existingModel.required; - } - swagger.definitions[name] = schema; - } -}; - -SwaggerSpecConverter.prototype.extractTag = function(resourcePath) { - var pathString = resourcePath || 'default'; - if(pathString.indexOf('http:') === 0 || pathString.indexOf('https:') === 0) { - pathString = pathString.split(['/']); - pathString = pathString[pathString.length -1].substring(); - } - if(pathString.endsWith('.json')) { - pathString = pathString.substring(0, pathString.length - '.json'.length); - } - return pathString.replace('/',''); -}; - -SwaggerSpecConverter.prototype.operations = function(path, resourcePath, obj, resourceLevelAuth, swagger) { - if(!Array.isArray(obj)) { - return; - } - var i; - - if(!swagger.paths) { - swagger.paths = {}; - } - - var pathObj = swagger.paths[path] || {}; - var tag = this.extractTag(resourcePath); - swagger.tags = swagger.tags || []; - var matched = false; - for(i = 0; i < swagger.tags.length; i++) { - var tagObject = swagger.tags[i]; - if(tagObject.name === tag) { - matched = true; - } - } - if(!matched) { - swagger.tags.push({name: tag}); - } - - for(i = 0; i < obj.length; i++) { - var existingOperation = obj[i]; - var method = (existingOperation.method || existingOperation.httpMethod).toLowerCase(); - var operation = {tags: [tag]}; - var existingAuthorizations = existingOperation.authorizations; - - if(existingAuthorizations && Object.keys(existingAuthorizations).length === 0) { - existingAuthorizations = resourceLevelAuth; - } - - if(typeof existingAuthorizations !== 'undefined') { - var scopesObject; - for(var key in existingAuthorizations) { - operation.security = operation.security || []; - var scopes = existingAuthorizations[key]; - if(scopes) { - var securityScopes = []; - for(var j in scopes) { - securityScopes.push(scopes[j].scope); - } - scopesObject = {}; - scopesObject[key] = securityScopes; - operation.security.push(scopesObject); - } - else { - scopesObject = {}; - scopesObject[key] = []; - operation.security.push(scopesObject); - } - } - } - - if(existingOperation.consumes) { - operation.consumes = existingOperation.consumes; - } - else if(swagger.consumes) { - operation.consumes = swagger.consumes; - } - if(existingOperation.produces) { - operation.produces = existingOperation.produces; - } - else if(swagger.produces) { - operation.produces = swagger.produces; - } - if(existingOperation.summary) { - operation.summary = existingOperation.summary; - } - if(existingOperation.notes) { - operation.description = existingOperation.notes; - } - if(existingOperation.nickname) { - operation.operationId = existingOperation.nickname; - } - if(existingOperation.deprecated) { - operation.deprecated = existingOperation.deprecated; - } - - this.authorizations(existingAuthorizations, swagger); - this.parameters(operation, existingOperation.parameters, swagger); - this.responseMessages(operation, existingOperation, swagger); - - pathObj[method] = operation; - } - - swagger.paths[path] = pathObj; -}; - -SwaggerSpecConverter.prototype.responseMessages = function(operation, existingOperation) { - if(!_.isObject(existingOperation)) { - return; - } - // build default response from the operation (1.x) - var defaultResponse = {}; - this.dataType(existingOperation, defaultResponse); - // TODO: look into the real problem of rendering responses in swagger-ui - // ....should reponseType have an implicit schema? - if(!defaultResponse.schema && defaultResponse.type) { - defaultResponse = {schema: defaultResponse}; - } - - operation.responses = operation.responses || {}; - - // grab from responseMessages (1.2) - var has200 = false; - if(Array.isArray(existingOperation.responseMessages)) { - var i; - var existingResponses = existingOperation.responseMessages; - for(i = 0; i < existingResponses.length; i++) { - var existingResponse = existingResponses[i]; - var response = { description: existingResponse.message }; - if(existingResponse.code === 200) { - has200 = true; - } - // Convert responseModel -> schema{$ref: responseModel} - if(existingResponse.responseModel) { - response.schema = {'$ref': '#/definitions/' + existingResponse.responseModel}; - } - operation.responses['' + existingResponse.code] = response; - } - } - - if(has200) { - operation.responses['default'] = defaultResponse; - } - else { - operation.responses['200'] = defaultResponse; - } -}; - -SwaggerSpecConverter.prototype.authorizations = function(obj) { - // TODO - if(!_.isObject(obj)) { - return; - } -}; - -SwaggerSpecConverter.prototype.parameters = function(operation, obj) { - if(!Array.isArray(obj)) { - return; - } - var i; - for(i = 0; i < obj.length; i++) { - var existingParameter = obj[i]; - var parameter = {}; - parameter.name = existingParameter.name; - parameter.description = existingParameter.description; - parameter.required = existingParameter.required; - parameter.in = existingParameter.paramType; - - // per #168 - if(parameter.in === 'body') { - parameter.name = 'body'; - } - if(parameter.in === 'form') { - parameter.in = 'formData'; - } - - if(existingParameter.enum) { - parameter.enum = existingParameter.enum; - } - - if(existingParameter.allowMultiple === true || existingParameter.allowMultiple === 'true') { - var innerType = {}; - this.dataType(existingParameter, innerType); - parameter.type = 'array'; - parameter.items = innerType; - - if(existingParameter.allowableValues) { - var av = existingParameter.allowableValues; - if(av.valueType === 'LIST') { - parameter['enum'] = av.values; - } - } - } - else { - this.dataType(existingParameter, parameter); - } - if(typeof existingParameter.defaultValue !== 'undefined') { - parameter.default = existingParameter.defaultValue; - } - - operation.parameters = operation.parameters || []; - operation.parameters.push(parameter); - } -}; - -SwaggerSpecConverter.prototype.dataType = function(source, target) { - if(!_.isObject(source)) { - return; - } - - if(source.minimum) { - target.minimum = source.minimum; - } - if(source.maximum) { - target.maximum = source.maximum; - } - if (source.format) { - target.format = source.format; - } - - // default can be 'false' - if(typeof source.defaultValue !== 'undefined') { - target.default = source.defaultValue; - } - - var jsonSchemaType = this.toJsonSchema(source); - if(jsonSchemaType) { - target = target || {}; - if(jsonSchemaType.type) { - target.type = jsonSchemaType.type; - } - if(jsonSchemaType.format) { - target.format = jsonSchemaType.format; - } - if(jsonSchemaType.$ref) { - target.schema = {$ref: jsonSchemaType.$ref}; - } - if(jsonSchemaType.items) { - target.items = jsonSchemaType.items; - } - } -}; - -SwaggerSpecConverter.prototype.toJsonSchema = function(source) { - if(!source) { - return 'object'; - } - var detectedType = (source.type || source.dataType || source.responseClass || ''); - var lcType = detectedType.toLowerCase(); - var format = (source.format || '').toLowerCase(); - - if(lcType.indexOf('list[') === 0) { - var innerType = detectedType.substring(5, detectedType.length - 1); - var jsonType = this.toJsonSchema({type: innerType}); - return {type: 'array', items: jsonType}; - } else if(lcType === 'int' || (lcType === 'integer' && format === 'int32')) { - {return {type: 'integer', format: 'int32'};} - } else if(lcType === 'long' || (lcType === 'integer' && format === 'int64')) { - {return {type: 'integer', format: 'int64'};} - } else if(lcType === 'integer') { - {return {type: 'integer', format: 'int64'};} - } else if(lcType === 'float' || (lcType === 'number' && format === 'float')) { - {return {type: 'number', format: 'float'};} - } else if(lcType === 'double' || (lcType === 'number' && format === 'double')) { - {return {type: 'number', format: 'double'};} - } else if((lcType === 'string' && format === 'date-time') || (lcType === 'date')) { - {return {type: 'string', format: 'date-time'};} - } else if(lcType === 'string') { - {return {type: 'string'};} - } else if(lcType === 'file') { - {return {type: 'file'};} - } else if(lcType === 'boolean') { - {return {type: 'boolean'};} - } else if(lcType === 'boolean') { - {return {type: 'boolean'};} - } else if(lcType === 'array' || lcType === 'list') { - if(source.items) { - var it = this.toJsonSchema(source.items); - return {type: 'array', items: it}; - } - else { - return {type: 'array', items: {type: 'object'}}; - } - } else if(source.$ref) { - return {$ref: this.modelMap[source.$ref] ? '#/definitions/' + this.modelMap[source.$ref] : source.$ref}; - } else if(lcType === 'void' || lcType === '') { - {return {};} - } else if (this.modelMap[source.type]) { - // If this a model using `type` instead of `$ref`, that's fine. - return {$ref: '#/definitions/' + this.modelMap[source.type]}; - } else { - // Unknown model type or 'object', pass it along. - return {type: source.type}; - } -}; - -SwaggerSpecConverter.prototype.resourceListing = function(obj, swagger, opts, callback) { - var i; - var processedCount = 0; // jshint ignore:line - var self = this; // jshint ignore:line - var expectedCount = obj.apis.length; - var _swagger = swagger; // jshint ignore:line - var _opts = {}; - - if(opts && opts.requestInterceptor){ - _opts.requestInterceptor = opts.requestInterceptor; - } - - if(opts && opts.responseInterceptor){ - _opts.responseInterceptor = opts.responseInterceptor; - } - - var swaggerRequestHeaders = 'application/json'; - - if(opts && opts.swaggerRequestHeaders) { - swaggerRequestHeaders = opts.swaggerRequestHeaders; - } - - if(expectedCount === 0) { - this.finish(callback, swagger); - } - - for(i = 0; i < expectedCount; i++) { - var api = obj.apis[i]; - var path = api.path; - var absolutePath = this.getAbsolutePath(obj.swaggerVersion, this.docLocation, path); - - if(api.description) { - swagger.tags = swagger.tags || []; - swagger.tags.push({ - name : this.extractTag(api.path), - description : api.description || '' - }); - } - var http = { - url: absolutePath, - headers: { accept: swaggerRequestHeaders }, - on: {}, - method: 'get', - timeout: opts.timeout - }; - /* jshint ignore:start */ - http.on.response = function(data) { - processedCount += 1; - var obj = data.obj; - if(obj) { - self.declaration(obj, _swagger); - } - if(processedCount === expectedCount) { - self.finish(callback, _swagger); - } - }; - http.on.error = function(data) { - console.error(data); - processedCount += 1; - if(processedCount === expectedCount) { - self.finish(callback, _swagger); - } - }; - /* jshint ignore:end */ - - if(this.clientAuthorizations && typeof this.clientAuthorizations.apply === 'function') { - this.clientAuthorizations.apply(http); - } - - new SwaggerHttp().execute(http, _opts); - } -}; - -SwaggerSpecConverter.prototype.getAbsolutePath = function(version, docLocation, path) { - if(version === '1.0') { - if(docLocation.endsWith('.json')) { - // get root path - var pos = docLocation.lastIndexOf('/'); - if(pos > 0) { - docLocation = docLocation.substring(0, pos); - } - } - } - - var location = docLocation; - if(path.indexOf('http:') === 0 || path.indexOf('https:') === 0) { - location = path; - } - else { - if(docLocation.endsWith('/')) { - location = docLocation.substring(0, docLocation.length - 1); - } - location += path; - } - location = location.replace('{format}', 'json'); - return location; -}; - -SwaggerSpecConverter.prototype.securityDefinitions = function(obj, swagger) { - if(obj.authorizations) { - var name; - for(name in obj.authorizations) { - var isValid = false; - var securityDefinition = { - vendorExtensions: {} - }; - var definition = obj.authorizations[name]; - if(definition.type === 'apiKey') { - securityDefinition.type = 'apiKey'; - securityDefinition.in = definition.passAs; - securityDefinition.name = definition.keyname || name; - isValid = true; - } - else if(definition.type === 'basicAuth') { - securityDefinition.type = 'basicAuth'; - isValid = true; - } - else if(definition.type === 'oauth2') { - var existingScopes = definition.scopes || []; - var scopes = {}; - var i; - for(i in existingScopes) { - var scope = existingScopes[i]; - scopes[scope.scope] = scope.description; - } - securityDefinition.type = 'oauth2'; - if(i > 0) { - securityDefinition.scopes = scopes; - } - if(definition.grantTypes) { - if(definition.grantTypes.implicit) { - var implicit = definition.grantTypes.implicit; - securityDefinition.flow = 'implicit'; - securityDefinition.authorizationUrl = implicit.loginEndpoint; - isValid = true; - } - /* jshint ignore:start */ - if(definition.grantTypes['authorization_code']) { - if(!securityDefinition.flow) { - // cannot set if flow is already defined - var authCode = definition.grantTypes['authorization_code']; - securityDefinition.flow = 'accessCode'; - securityDefinition.authorizationUrl = authCode.tokenRequestEndpoint.url; - securityDefinition.tokenUrl = authCode.tokenEndpoint.url; - isValid = true; - } - } - /* jshint ignore:end */ - } - } - if(isValid) { - swagger.securityDefinitions = swagger.securityDefinitions || {}; - swagger.securityDefinitions[name] = securityDefinition; - } - } - } -}; - -SwaggerSpecConverter.prototype.apiInfo = function(obj, swagger) { - // info section - if(obj.info) { - var info = obj.info; - swagger.info = {}; - - if(info.contact) { - swagger.info.contact = {}; - swagger.info.contact.email = info.contact; - } - if(info.description) { - swagger.info.description = info.description; - } - if(info.title) { - swagger.info.title = info.title; - } - if(info.termsOfServiceUrl) { - swagger.info.termsOfService = info.termsOfServiceUrl; - } - if(info.license || info.licenseUrl) { - swagger.license = {}; - if(info.license) { - swagger.license.name = info.license; - } - if(info.licenseUrl) { - swagger.license.url = info.licenseUrl; - } - } - } - else { - this.warnings.push('missing info section'); - } -}; - -SwaggerSpecConverter.prototype.finish = function (callback, obj) { - callback(obj); -}; - -},{"./http":5,"lodash-compat/lang/isObject":144}],9:[function(require,module,exports){ -'use strict'; - -var log = require('../helpers').log; -var _ = { - isPlainObject: require('lodash-compat/lang/isPlainObject'), - isString: require('lodash-compat/lang/isString'), -}; - -var SchemaMarkup = require('../schema-markup.js'); -var jsyaml = require('js-yaml'); - -var Model = module.exports = function (name, definition, models, modelPropertyMacro) { - this.definition = definition || {}; - this.isArray = definition.type === 'array'; - this.models = models || {}; - this.name = name || definition.title || 'Inline Model'; - this.modelPropertyMacro = modelPropertyMacro || function (property) { - return property.default; - }; - - return this; -}; - -// Note! This function will be removed in 2.2.x! -Model.prototype.createJSONSample = Model.prototype.getSampleValue = function (modelsToIgnore) { - modelsToIgnore = modelsToIgnore || {}; - - modelsToIgnore[this.name] = this; - - // Response support - if (this.examples && _.isPlainObject(this.examples) && this.examples['application/json']) { - this.definition.example = this.examples['application/json']; - - if (_.isString(this.definition.example)) { - this.definition.example = jsyaml.safeLoad(this.definition.example); - } - } else if (!this.definition.example) { - this.definition.example = this.examples; - } - - return SchemaMarkup.schemaToJSON(this.definition, this.models, modelsToIgnore, this.modelPropertyMacro); -}; - -Model.prototype.getMockSignature = function () { - return SchemaMarkup.schemaToHTML(this.name, this.definition, this.models, this.modelPropertyMacro); -}; - -},{"../helpers":4,"../schema-markup.js":7,"js-yaml":19,"lodash-compat/lang/isPlainObject":145,"lodash-compat/lang/isString":146}],10:[function(require,module,exports){ -'use strict'; - -var _ = { - cloneDeep: require('lodash-compat/lang/cloneDeep'), - isUndefined: require('lodash-compat/lang/isUndefined'), - isEmpty: require('lodash-compat/lang/isEmpty'), - isObject: require('lodash-compat/lang/isObject') -}; -var helpers = require('../helpers'); -var Model = require('./model'); -var SwaggerHttp = require('../http'); -var Q = require('q'); - -var Operation = module.exports = function (parent, scheme, operationId, httpMethod, path, args, definitions, models, clientAuthorizations) { - var errors = []; - - parent = parent || {}; - args = args || {}; - - if(parent && parent.options) { - this.client = parent.options.client || null; - this.requestInterceptor = parent.options.requestInterceptor || null; - this.responseInterceptor = parent.options.responseInterceptor || null; - this.requestAgent = parent.options.requestAgent; - } - this.authorizations = args.security; - this.basePath = parent.basePath || '/'; - this.clientAuthorizations = clientAuthorizations; - this.consumes = args.consumes || parent.consumes || ['application/json']; - this.produces = args.produces || parent.produces || ['application/json']; - this.deprecated = args.deprecated; - this.description = args.description; - this.host = parent.host; - this.method = (httpMethod || errors.push('Operation ' + operationId + ' is missing method.')); - this.models = models || {}; - this.nickname = (operationId || errors.push('Operations must have a nickname.')); - this.operation = args; - this.operations = {}; - this.parameters = args !== null ? (args.parameters || []) : {}; - this.parent = parent; - this.path = (path || errors.push('Operation ' + this.nickname + ' is missing path.')); - this.responses = (args.responses || {}); - this.scheme = scheme || parent.scheme || 'http'; - this.schemes = args.schemes || parent.schemes; - this.security = args.security || parent.security; - this.summary = args.summary || ''; - this.timeout = parent.timeout; - this.type = null; - this.useJQuery = parent.useJQuery; - this.jqueryAjaxCache = parent.jqueryAjaxCache; - this.enableCookies = parent.enableCookies; - - var key; - - if(!this.host) { - if(typeof window !== 'undefined') { - this.host = window.location.host; - } - else { - this.host = 'localhost'; - } - } - this.parameterMacro = parent.parameterMacro || function (operation, parameter) { - return parameter.default; - }; - - this.inlineModels = []; - - if(this.basePath !== '/' && this.basePath.slice(-1) === '/') { - this.basePath = this.basePath.slice(0, -1); - } - - if (typeof this.deprecated === 'string') { - switch(this.deprecated.toLowerCase()) { - case 'true': case 'yes': case '1': { - this.deprecated = true; - break; - } - - case 'false': case 'no': case '0': case null: { - this.deprecated = false; - break; - } - - default: this.deprecated = Boolean(this.deprecated); - } - } - - var i, model; - - if (definitions) { - // add to global models - for (key in definitions) { - model = new Model(key, definitions[key], this.models, parent.modelPropertyMacro); - - if (model) { - this.models[key] = model; - } - } - } - else { - definitions = {}; - } - - for (i = 0; i < this.parameters.length; i++) { - var d, param = this.parameters[i]; - - // Allow macro to set the default value - param.default = this.parameterMacro(this, param); - - if (param.type === 'array') { - param.isList = true; - param.allowMultiple = true; - } - - var innerType = this.getType(param); - - if (innerType && innerType.toString().toLowerCase() === 'boolean') { - param.allowableValues = {}; - param.isList = true; - param['enum'] = [true, false]; // use actual primitives - } - - for(key in param) { - helpers.extractExtensions(key, param); - } - if(typeof param['x-example'] !== 'undefined') { - d = param['x-example']; - param.default = d; - } - if(param['x-examples']) { - d = param['x-examples'].default; - if(typeof d !== 'undefined') { - param.default = d; - } - } - - var enumValues = param['enum'] || (param.items && param.items['enum']); - - if (typeof enumValues !== 'undefined') { - var id; - - param.allowableValues = {}; - param.allowableValues.values = []; - param.allowableValues.descriptiveValues = []; - - for (id = 0; id < enumValues.length; id++) { - var value = enumValues[id]; - var isDefault = (value === param.default || value+'' === param.default); - - param.allowableValues.values.push(value); - // Always have string for descriptive values.... - param.allowableValues.descriptiveValues.push({value : value+'', isDefault: isDefault}); - } - } - - if (param.type === 'array') { - innerType = [innerType]; - - if (typeof param.allowableValues === 'undefined') { - // can't show as a list if no values to select from - delete param.isList; - delete param.allowMultiple; - } - } - - param.modelSignature = {type: innerType, definitions: this.models}; - param.signature = this.getModelSignature(innerType, this.models).toString(); - param.sampleJSON = this.getModelSampleJSON(innerType, this.models); - param.responseClassSignature = param.signature; - } - - var keyname, defaultResponseCode, response, responses = this.responses; - - if (responses['200']) { - response = responses['200']; - defaultResponseCode = '200'; - } else if (responses['201']) { - response = responses['201']; - defaultResponseCode = '201'; - } else if (responses['202']) { - response = responses['202']; - defaultResponseCode = '202'; - } else if (responses['203']) { - response = responses['203']; - defaultResponseCode = '203'; - } else if (responses['204']) { - response = responses['204']; - defaultResponseCode = '204'; - } else if (responses['205']) { - response = responses['205']; - defaultResponseCode = '205'; - } else if (responses['206']) { - response = responses['206']; - defaultResponseCode = '206'; - } else if (responses['default']) { - response = responses['default']; - defaultResponseCode = 'default'; - } - - for(keyname in responses) { - helpers.extractExtensions(keyname, responses); - if(typeof keyname === 'string' && keyname.indexOf('x-') === -1) { - var responseObject = responses[keyname]; - if(typeof responseObject === 'object' && typeof responseObject.headers === 'object') { - var headers = responseObject.headers; - for(var headerName in headers) { - var header = headers[headerName]; - if(typeof header === 'object') { - for(var headerKey in header) { - helpers.extractExtensions(headerKey, header); - } - } - } - } - } - } - - if (response) { - for(keyname in response) { - helpers.extractExtensions(keyname, response); - } - } - - if (response && response.schema) { - var resolvedModel = this.resolveModel(response.schema, definitions); - var successResponse; - - delete responses[defaultResponseCode]; - - if (resolvedModel) { - this.successResponse = {}; - successResponse = this.successResponse[defaultResponseCode] = resolvedModel; - } else if (!response.schema.type || response.schema.type === 'object' || response.schema.type === 'array') { - // Inline model - this.successResponse = {}; - successResponse = this.successResponse[defaultResponseCode] = new Model(undefined, response.schema || {}, this.models, parent.modelPropertyMacro); - } else { - // Primitive - this.successResponse = {}; - successResponse = this.successResponse[defaultResponseCode] = response.schema; - } - - if (successResponse) { - successResponse.vendorExtensions = response.vendorExtensions; - // Attach response properties - if (response.description) { - successResponse.description = response.description; - } - - if (response.examples) { - successResponse.examples = response.examples; - } - - if (response.headers) { - successResponse.headers = response.headers; - } - } - - this.type = response; - } - - if (errors.length > 0) { - if (this.resource && this.resource.api && this.resource.api.fail) { - this.resource.api.fail(errors); - } - } - - return this; -}; - -Operation.prototype.isDefaultArrayItemValue = function(value, param) { - if (param.default && Array.isArray(param.default)) { - return param.default.indexOf(value) !== -1; - } - return value === param.default; -}; - -Operation.prototype.getType = function (param) { - var type = param.type; - var format = param.format; - var isArray = false; - var str; - - if (type === 'integer' && format === 'int32') { - str = 'integer'; - } else if (type === 'integer' && format === 'int64') { - str = 'long'; - } else if (type === 'integer') { - str = 'integer'; - } else if (type === 'string') { - if (format === 'date-time') { - str = 'date-time'; - } else if (format === 'date') { - str = 'date'; - } else { - str = 'string'; - } - } else if (type === 'number' && format === 'float') { - str = 'float'; - } else if (type === 'number' && format === 'double') { - str = 'double'; - } else if (type === 'number') { - str = 'double'; - } else if (type === 'boolean') { - str = 'boolean'; - } else if (type === 'array') { - isArray = true; - - if (param.items) { - str = this.getType(param.items); - } - } else if (type === 'file') { - str = 'file'; - } - - if (param.$ref) { - str = helpers.simpleRef(param.$ref); - } - - var schema = param.schema; - - if (schema) { - var ref = schema.$ref; - - if (ref) { - ref = helpers.simpleRef(ref); - - if (isArray) { - return [ ref ]; - } else { - return ref; - } - } else { - // If inline schema, we add it our interal hash -> which gives us it's ID (int) - if(schema.type === 'object') { - return this.addInlineModel(schema); - } - return this.getType(schema); - } - } - if (isArray) { - return [ str ]; - } else { - return str; - } -}; - -/** - * adds an inline schema (model) to a hash, where we can ref it later - * @param {object} schema a schema - * @return {number} the ID of the schema being added, or null - **/ -Operation.prototype.addInlineModel = function (schema) { - var len = this.inlineModels.length; - var model = this.resolveModel(schema, {}); - if(model) { - this.inlineModels.push(model); - return 'Inline Model '+len; // return string ref of the inline model (used with #getInlineModel) - } - return null; // report errors? -}; - -/** - * gets the internal ref to an inline model - * @param {string} inline_str a string reference to an inline model - * @return {Model} the model being referenced. Or null - **/ -Operation.prototype.getInlineModel = function(inlineStr) { - if(/^Inline Model \d+$/.test(inlineStr)) { - var id = parseInt(inlineStr.substr('Inline Model'.length).trim(),10); // - var model = this.inlineModels[id]; - return model; - } - // I'm returning null here, should I rather throw an error? - return null; -}; - -Operation.prototype.resolveModel = function (schema, definitions) { - if (typeof schema.$ref !== 'undefined') { - var ref = schema.$ref; - - if (ref.indexOf('#/definitions/') === 0) { - ref = ref.substring('#/definitions/'.length); - } - - if (definitions[ref]) { - return new Model(ref, definitions[ref], this.models, this.parent.modelPropertyMacro); - } - // schema must at least be an object to get resolved to an inline Model - } else if (schema && typeof schema === 'object' && - (schema.type === 'object' || _.isUndefined(schema.type))) { - return new Model(undefined, schema, this.models, this.parent.modelPropertyMacro); - } - - return null; -}; - -Operation.prototype.help = function (dontPrint) { - var out = this.nickname + ': ' + this.summary + '\n'; - - for (var i = 0; i < this.parameters.length; i++) { - var param = this.parameters[i]; - var typeInfo = param.signature; - - out += '\n * ' + param.name + ' (' + typeInfo + '): ' + param.description; - } - - if (typeof dontPrint === 'undefined') { - helpers.log(out); - } - - return out; -}; - -Operation.prototype.getModelSignature = function (type, definitions) { - var isPrimitive, listType; - - if (type instanceof Array) { - listType = true; - type = type[0]; - } - - // Convert undefined to string of 'undefined' - if (typeof type === 'undefined') { - type = 'undefined'; - isPrimitive = true; - - } else if (definitions[type]){ - // a model def exists? - type = definitions[type]; /* Model */ - isPrimitive = false; - - } else if (this.getInlineModel(type)) { - type = this.getInlineModel(type); /* Model */ - isPrimitive = false; - - } else { - // We default to primitive - isPrimitive = true; - } - - if (isPrimitive) { - if (listType) { - return 'Array[' + type + ']'; - } else { - return type.toString(); - } - } else { - if (listType) { - return 'Array[' + type.getMockSignature() + ']'; - } else { - return type.getMockSignature(); - } - } -}; - -Operation.prototype.supportHeaderParams = function () { - return true; -}; - -Operation.prototype.supportedSubmitMethods = function () { - return this.parent.supportedSubmitMethods; -}; - -Operation.prototype.getHeaderParams = function (args) { - var headers = this.setContentTypes(args, {}); - var headerParamsByLowerCase = {}; - - for (var i = 0; i < this.parameters.length; i++) { - var param = this.parameters[i]; - - if (param.in === 'header') { - headerParamsByLowerCase[param.name.toLowerCase()] = param; - } - } - - for (var arg in args) { - var headerParam = headerParamsByLowerCase[arg.toLowerCase()]; - if (typeof headerParam !== 'undefined') { - var value = args[arg]; - - if (Array.isArray(value)) { - value = value.toString(); - } - - headers[headerParam.name] = value; - } - } - - return headers; -}; - -Operation.prototype.urlify = function (args, maskPasswords) { - var formParams = {}; - var requestUrl = this.path.replace(/#.*/, ''); // remove URL fragment - var querystring = ''; // grab params from the args, build the querystring along the way - - for (var i = 0; i < this.parameters.length; i++) { - var param = this.parameters[i]; - - if (typeof args[param.name] !== 'undefined') { - var isPassword; - if(param.type === 'string' && param.format === 'password' && maskPasswords) { - isPassword = true; - } - - if (param.in === 'path') { - var reg = new RegExp('\{' + param.name + '\}', 'gi'); - var value = args[param.name]; - - if (Array.isArray(value)) { - value = this.encodePathCollection(param.collectionFormat, param.name, value, isPassword); - } else { - value = this.encodePathParam(value, isPassword); - } - - requestUrl = requestUrl.replace(reg, value); - } else if (param.in === 'query' && typeof args[param.name] !== 'undefined') { - if (querystring === '' && requestUrl.indexOf('?') < 0) { - querystring += '?'; - } else { - querystring += '&'; - } - - if (typeof param.collectionFormat !== 'undefined') { - var qp = args[param.name]; - - if (Array.isArray(qp)) { - querystring += this.encodeQueryCollection(param.collectionFormat, param.name, qp, isPassword); - } else { - querystring += this.encodeQueryKey(param.name) + '=' + this.encodeQueryParam(args[param.name], isPassword); - } - } else { - querystring += this.encodeQueryKey(param.name) + '=' + this.encodeQueryParam(args[param.name], isPassword); - } - } else if (param.in === 'formData') { - formParams[param.name] = args[param.name]; - } - } - } - var url = this.scheme + '://' + this.host; - - if (this.basePath !== '/') { - url += this.basePath; - } - return url + requestUrl + querystring; -}; - -Operation.prototype.getMissingParams = function (args) { - var missingParams = []; // check required params, track the ones that are missing - var i; - - for (i = 0; i < this.parameters.length; i++) { - var param = this.parameters[i]; - - if (param.required === true) { - if (typeof args[param.name] === 'undefined') { - missingParams = param.name; - } - } - } - - return missingParams; -}; - -Operation.prototype.getBody = function (headers, args, opts) { - var formParams = {}, hasFormParams, param, body, key, value, hasBody = false; - - // look at each param and put form params in an object - for (var i = 0; i < this.parameters.length; i++) { - param = this.parameters[i]; - if (typeof args[param.name] !== 'undefined') { - var isPassword; - if(param.type === 'string' && param.format === 'password') { - isPassword = 'password'; - } - if (param.in === 'body') { - body = args[param.name]; - } else if (param.in === 'formData') { - formParams[param.name] = { - param: param, - value: args[param.name], - password: isPassword - }; - hasFormParams = true; - } - } - else { - if(param.in === 'body') { - hasBody = true; - } - } - } - - // if body is null and hasBody is true, AND a JSON body is requested, send empty {} - if(hasBody && typeof body === 'undefined') { - var contentType = headers['Content-Type']; - if(contentType && contentType.indexOf('application/json') === 0) { - body = '{}'; - } - } - - var isMultiPart = false; - if(headers['Content-Type'] && headers['Content-Type'].indexOf('multipart/form-data') >= 0) { - isMultiPart = true; - } - - // handle form params - if (hasFormParams && !isMultiPart) { - var encoded = ''; - - for (key in formParams) { - param = formParams[key].param; - value = formParams[key].value; - var password; - - if(opts && opts.maskPasswords) { - password = formParams[key].password; - } - - if (typeof value !== 'undefined') { - if (Array.isArray(value)) { - if (encoded !== '') { - encoded += '&'; - } - encoded += this.encodeQueryCollection(param.collectionFormat, key, value, password); - } - else { - if (encoded !== '') { - encoded += '&'; - } - - encoded += encodeURIComponent(key) + '=' + mask(encodeURIComponent(value), password); - } - } - } - - body = encoded; - } else if (isMultiPart) { - var bodyParam; - if (typeof FormData === 'function') { - bodyParam = new FormData(); - - bodyParam.type = 'formData'; - - for (key in formParams) { - param = formParams[key].param; - value = args[key]; - - if (typeof value !== 'undefined') { - if({}.toString.apply(value) === '[object File]') { - bodyParam.append(key, value); - } - else if (value.type === 'file' && value.value) { - bodyParam.append(key, value.value); - } else { - if (Array.isArray(value)) { - if(param.collectionFormat === 'multi') { - bodyParam.delete(key); - for(var v in value) { - bodyParam.append(key, value[v]); - } - } - else { - bodyParam.append(key, this.encodeQueryCollection(param.collectionFormat, key, value).split('=').slice(1).join('=')); - } - } - else { - bodyParam.append(key, value); - } - } - } - } - body = bodyParam; - } - else { - bodyParam = {}; - for (key in formParams) { - value = args[key]; - if (Array.isArray(value)) { - var delimeter; - var format = param.collectionFormat || 'multi'; - if(format === 'ssv') { - delimeter = ' '; - } - else if(format === 'pipes') { - delimeter = '|'; - } - else if(format === 'tsv') { - delimeter = '\t'; - } - else if(format === 'multi') { - bodyParam[key] = value; - break; - } - else { - delimeter = ','; - } - var data; - value.forEach(function(v) { - if(data) { - data += delimeter; - } - else { - data = ''; - } - data += v; - }); - bodyParam[key] = data; - } - else { - bodyParam[key] = value; - } - } - body = bodyParam; - } - headers['Content-Type'] = 'multipart/form-data'; - } - - return body; -}; - -/** - * gets sample response for a single operation - **/ -Operation.prototype.getModelSampleJSON = function (type, models) { - var listType, sampleJson, innerType; - models = models || {}; - - listType = (type instanceof Array); - innerType = listType ? type[0] : type; - - if(models[innerType]) { - sampleJson = models[innerType].createJSONSample(); - } else if (this.getInlineModel(innerType)){ - sampleJson = this.getInlineModel(innerType).createJSONSample(); // may return null, if type isn't correct - } - - - if (sampleJson) { - sampleJson = listType ? [sampleJson] : sampleJson; - - if (typeof sampleJson === 'string') { - return sampleJson; - } else if (_.isObject(sampleJson)) { - var t = sampleJson; - - if (sampleJson instanceof Array && sampleJson.length > 0) { - t = sampleJson[0]; - } - - if (t.nodeName && typeof t === 'Node') { - var xmlString = new XMLSerializer().serializeToString(t); - - return this.formatXml(xmlString); - } else { - return JSON.stringify(sampleJson, null, 2); - } - } else { - return sampleJson; - } - } -}; - -/** - * legacy binding - **/ -Operation.prototype.do = function (args, opts, callback, error, parent) { - return this.execute(args, opts, callback, error, parent); -}; - -/** - * executes an operation - **/ -Operation.prototype.execute = function (arg1, arg2, arg3, arg4, parent) { - var args = arg1 || {}; - var opts = {}, success, error, deferred, timeout; - - if (_.isObject(arg2)) { - opts = arg2; - success = arg3; - error = arg4; - } - - timeout = typeof opts.timeout !== 'undefined' ? opts.timeout : this.timeout; - - if(this.client) { - opts.client = this.client; - } - - if(this.requestAgent) { - opts.requestAgent = this.requestAgent; - } - - // add the request interceptor from parent, if none sent from client - if(!opts.requestInterceptor && this.requestInterceptor ) { - opts.requestInterceptor = this.requestInterceptor ; - } - - if(!opts.responseInterceptor && this.responseInterceptor) { - opts.responseInterceptor = this.responseInterceptor; - } - - if (typeof arg2 === 'function') { - success = arg2; - error = arg3; - } - - if (this.parent.usePromise) { - deferred = Q.defer(); - } else { - success = (success || this.parent.defaultSuccessCallback || helpers.log); - error = (error || this.parent.defaultErrorCallback || helpers.log); - } - - if (typeof opts.useJQuery === 'undefined') { - opts.useJQuery = this.useJQuery; - } - - if (typeof opts.jqueryAjaxCache === 'undefined') { - opts.jqueryAjaxCache = this.jqueryAjaxCache; - } - - if (typeof opts.enableCookies === 'undefined') { - opts.enableCookies = this.enableCookies; - } - - var missingParams = this.getMissingParams(args); - - if (missingParams.length > 0) { - var message = 'missing required params: ' + missingParams; - - helpers.fail(message); - - if (this.parent.usePromise) { - deferred.reject(message); - return deferred.promise; - } else { - error(message, parent); - return {}; - } - } - - var allHeaders = this.getHeaderParams(args); - var contentTypeHeaders = this.setContentTypes(args, opts); - var headers = {}, attrname; - - for (attrname in allHeaders) { headers[attrname] = allHeaders[attrname]; } - for (attrname in contentTypeHeaders) { headers[attrname] = contentTypeHeaders[attrname]; } - - var body = this.getBody(contentTypeHeaders, args, opts); - var url = this.urlify(args, opts.maskPasswords); - - if(url.indexOf('.{format}') > 0) { - if(headers) { - var format = headers.Accept || headers.accept; - if(format && format.indexOf('json') > 0) { - url = url.replace('.{format}', '.json'); - } - else if(format && format.indexOf('xml') > 0) { - url = url.replace('.{format}', '.xml'); - } - } - } - - var obj = { - url: url, - method: this.method.toUpperCase(), - body: body, - enableCookies: opts.enableCookies, - useJQuery: opts.useJQuery, - jqueryAjaxCache: opts.jqueryAjaxCache, - deferred: deferred, - headers: headers, - clientAuthorizations: opts.clientAuthorizations, - operation: this, - connectionAgent: this.connectionAgent, - on: { - response: function (response) { - if (deferred) { - deferred.resolve(response); - return deferred.promise; - } else { - return success(response, parent); - } - }, - error: function (response) { - if (deferred) { - deferred.reject(response); - return deferred.promise; - } else { - return error(response, parent); - } - } - } - }; - - if (timeout) { - obj.timeout = timeout; - } - - this.clientAuthorizations.apply(obj, this.operation.security); - if (opts.mock === true) { - return obj; - } else { - return new SwaggerHttp().execute(obj, opts); - } -}; - -function itemByPriority(col, itemPriority) { - - // No priorities? return first... - if(_.isEmpty(itemPriority)) { - return col[0]; - } - - for (var i = 0, len = itemPriority.length; i < len; i++) { - if(col.indexOf(itemPriority[i]) > -1) { - return itemPriority[i]; - } - } - - // Otherwise return first - return col[0]; -} - -Operation.prototype.setContentTypes = function (args, opts) { - // default type - var allDefinedParams = this.parameters; - var body; - var consumes = args.parameterContentType || itemByPriority(this.consumes, ['application/json', 'application/yaml']); - var accepts = opts.responseContentType || itemByPriority(this.produces, ['application/json', 'application/yaml']); - var definedFileParams = []; - var definedFormParams = []; - var headers = {}; - var i; - - // get params from the operation and set them in definedFileParams, definedFormParams, headers - for (i = 0; i < allDefinedParams.length; i++) { - var param = allDefinedParams[i]; - - if (param.in === 'formData') { - if (param.type === 'file') { - definedFileParams.push(param); - } else { - definedFormParams.push(param); - } - } else if (param.in === 'header' && opts) { - var key = param.name; - var headerValue = opts[param.name]; - - if (typeof opts[param.name] !== 'undefined') { - headers[key] = headerValue; - } - } else if (param.in === 'body' && typeof args[param.name] !== 'undefined') { - body = args[param.name]; - } - } - - // if there's a body, need to set the consumes header via requestContentType - var hasBody = body || definedFileParams.length || definedFormParams.length; - if (this.method === 'post' || this.method === 'put' || this.method === 'patch' || - ((this.method === 'delete' || this.method === 'get') && hasBody)) { - if (opts.requestContentType) { - consumes = opts.requestContentType; - } - // if any form params, content type must be set - if (definedFormParams.length > 0) { - consumes = undefined; - if (opts.requestContentType) { // override if set - consumes = opts.requestContentType; - } else if (definedFileParams.length > 0) { // if a file, must be multipart/form-data - consumes = 'multipart/form-data'; - } else { - if (this.consumes && this.consumes.length > 0) { - // use the consumes setting - for(var c in this.consumes) { - var chk = this.consumes[c]; - if(chk.indexOf('application/x-www-form-urlencoded') === 0 || chk.indexOf('multipart/form-data') === 0) { - consumes = chk; - } - } - } - } - if(typeof consumes === 'undefined') { - // default to x-www-from-urlencoded - consumes = 'application/x-www-form-urlencoded'; - } - } - } - else { - consumes = null; - } - - if (consumes && this.consumes) { - if (this.consumes.indexOf(consumes) === -1) { - helpers.log('server doesn\'t consume ' + consumes + ', try ' + JSON.stringify(this.consumes)); - } - } - - if (!this.matchesAccept(accepts)) { - helpers.log('server can\'t produce ' + accepts); - } - - if ((consumes && body !== '') || (consumes === 'application/x-www-form-urlencoded')) { - headers['Content-Type'] = consumes; - } - else if(this.consumes && this.consumes.length > 0 && this.consumes[0] === 'application/x-www-form-urlencoded') { - headers['Content-Type'] = this.consumes[0]; - } - - if (accepts) { - headers.Accept = accepts; - } - - return headers; -}; - -/** - * Returns true if the request accepts header matches anything in this.produces. - * If this.produces contains * / *, ignore the accept header. - * @param {string=} accepts The client request accept header. - * @return {boolean} - */ -Operation.prototype.matchesAccept = function(accepts) { - // no accepts or produces, no problem! - if (!accepts || !this.produces) { - return true; - } - return this.produces.indexOf(accepts) !== -1 || this.produces.indexOf('*/*') !== -1; -}; - -Operation.prototype.asCurl = function (args1, args2) { - var opts = {mock: true, maskPasswords: true}; - if (typeof args2 === 'object') { - for (var argKey in args2) { - opts[argKey] = args2[argKey]; - } - } - var obj = this.execute(args1, opts); - - this.clientAuthorizations.apply(obj, this.operation.security); - - var results = []; - - results.push('-X ' + this.method.toUpperCase()); - - if (typeof obj.headers !== 'undefined') { - var key; - - for (key in obj.headers) { - var value = obj.headers[key]; - if(typeof value === 'string'){ - value = value.replace(/\'/g, '\\u0027'); - } - results.push('--header \'' + key + ': ' + value + '\''); - } - } - var isFormData = false; - var isMultipart = false; - - var type = obj.headers['Content-Type']; - if(type && type.indexOf('application/x-www-form-urlencoded') === 0) { - isFormData = true; - } - else if (type && type.indexOf('multipart/form-data') === 0) { - isFormData = true; - isMultipart = true; - } - - if (obj.body) { - var body; - if (_.isObject(obj.body)) { - if(isMultipart) { - isMultipart = true; - // add the form data - for(var i = 0; i < this.parameters.length; i++) { - var parameter = this.parameters[i]; - if(parameter.in === 'formData') { - if (!body) { - body = ''; - } - - var paramValue; - if(typeof FormData === 'function' && obj.body instanceof FormData) { - paramValue = obj.body.getAll(parameter.name); - } - else { - paramValue = obj.body[parameter.name]; - } - if (paramValue) { - if (parameter.type === 'file') { - if(paramValue.name) { - body += '-F ' + parameter.name + '=@"' + paramValue.name + '" '; - } - } - else { - if (Array.isArray(paramValue)) { - if(parameter.collectionFormat === 'multi') { - for(var v in paramValue) { - body += '-F ' + this.encodeQueryKey(parameter.name) + '=' + mask(paramValue[v], parameter.format) + ' '; - } - } - else { - body += '-F ' + this.encodeQueryCollection(parameter.collectionFormat, parameter.name, mask(paramValue, parameter.format)) + ' '; - } - } else { - body += '-F ' + this.encodeQueryKey(parameter.name) + '=' + mask(paramValue, parameter.format) + ' '; - } - } - } - } - } - } - if(!body) { - body = JSON.stringify(obj.body); - } - } else { - body = obj.body; - } - // escape @ => %40, ' => %27 - body = body.replace(/\'/g, '%27').replace(/\n/g, ' \\ \n '); - - if(!isFormData) { - // escape & => %26 - body = body.replace(/&/g, '%26'); - } - if(isMultipart) { - results.push(body); - } - else { - results.push('-d \'' + body.replace(/@/g, '%40') + '\''); - } - } - - return 'curl ' + (results.join(' ')) + ' \'' + obj.url + '\''; -}; - -Operation.prototype.encodePathCollection = function (type, name, value, maskPasswords) { - var encoded = ''; - var i; - var separator = ''; - - if (type === 'ssv') { - separator = '%20'; - } else if (type === 'tsv') { - separator = '%09'; - } else if (type === 'pipes') { - separator = '|'; - } else { - separator = ','; - } - - for (i = 0; i < value.length; i++) { - if (i === 0) { - encoded = this.encodeQueryParam(value[i], maskPasswords); - } else { - encoded += separator + this.encodeQueryParam(value[i], maskPasswords); - } - } - - return encoded; -}; - -Operation.prototype.encodeQueryCollection = function (type, name, value, maskPasswords) { - var encoded = ''; - var i; - - type = type || 'default'; - if (type === 'default' || type === 'multi') { - for (i = 0; i < value.length; i++) { - if (i > 0) {encoded += '&';} - - encoded += this.encodeQueryKey(name) + '=' + mask(this.encodeQueryParam(value[i]), maskPasswords); - } - } else { - var separator = ''; - - if (type === 'csv') { - separator = ','; - } else if (type === 'ssv') { - separator = '%20'; - } else if (type === 'tsv') { - separator = '%09'; - } else if (type === 'pipes') { - separator = '|'; - } else if (type === 'brackets') { - for (i = 0; i < value.length; i++) { - if (i !== 0) { - encoded += '&'; - } - encoded += this.encodeQueryKey(name) + '[]=' + mask(this.encodeQueryParam(value[i]), maskPasswords); - } - } - - if (separator !== '') { - for (i = 0; i < value.length; i++) { - if (i === 0) { - encoded = this.encodeQueryKey(name) + '=' + this.encodeQueryParam(value[i]); - } else { - encoded += separator + this.encodeQueryParam(value[i]); - } - } - } - } - - return encoded; -}; - -Operation.prototype.encodeQueryKey = function (arg) { - return encodeURIComponent(arg) - .replace('%5B','[').replace('%5D', ']').replace('%24', '$'); -}; - -Operation.prototype.encodeQueryParam = function (arg, maskPasswords) { - if(maskPasswords) { - return "******"; - } - return encodeURIComponent(arg); -}; - -/** - * TODO revisit, might not want to leave '/' - **/ -Operation.prototype.encodePathParam = function (pathParam, maskPasswords) { - return encodeURIComponent(pathParam, maskPasswords); -}; - -var mask = function(value, format) { - if(typeof format === 'string' && format === 'password') { - return '******'; - } - return value; -} -},{"../helpers":4,"../http":5,"./model":9,"lodash-compat/lang/cloneDeep":138,"lodash-compat/lang/isEmpty":141,"lodash-compat/lang/isObject":144,"lodash-compat/lang/isUndefined":148,"q":157}],11:[function(require,module,exports){ -'use strict'; - -var OperationGroup = module.exports = function (tag, description, externalDocs, operation) { - this.description = description; - this.externalDocs = externalDocs; - this.name = tag; - this.operation = operation; - this.operationsArray = []; - this.path = tag; - this.tag = tag; -}; - -OperationGroup.prototype.sort = function () { - -}; - - -},{}],12:[function(require,module,exports){ -// shim for using process in browser - -var process = module.exports = {}; -var queue = []; -var draining = false; - -function drainQueue() { - if (draining) { - return; - } - draining = true; - var currentQueue; - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - var i = -1; - while (++i < len) { - currentQueue[i](); - } - len = queue.length; - } - draining = false; -} -process.nextTick = function (fun) { - queue.push(fun); - if (!draining) { - setTimeout(drainQueue, 0); - } -}; - -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -// TODO(shtylman) -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],13:[function(require,module,exports){ -(function (Buffer){ -(function () { - "use strict"; - - function btoa(str) { - var buffer - ; - - if (str instanceof Buffer) { - buffer = str; - } else { - buffer = new Buffer(str.toString(), 'binary'); - } - - return buffer.toString('base64'); - } - - module.exports = btoa; -}()); - -}).call(this,require("buffer").Buffer) - -},{"buffer":14}],14:[function(require,module,exports){ -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ - -var base64 = require('base64-js') -var ieee754 = require('ieee754') -var isArray = require('is-array') - -exports.Buffer = Buffer -exports.SlowBuffer = SlowBuffer -exports.INSPECT_MAX_BYTES = 50 -Buffer.poolSize = 8192 // not used by this implementation - -var rootParent = {} - -/** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * Due to various browser bugs, sometimes the Object implementation will be used even - * when the browser supports typed arrays. - * - * Note: - * - * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property - * on objects. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they - * get the Object implementation, which is slower but behaves correctly. - */ -Buffer.TYPED_ARRAY_SUPPORT = (function () { - function Bar () {} - try { - var arr = new Uint8Array(1) - arr.foo = function () { return 42 } - arr.constructor = Bar - return arr.foo() === 42 && // typed array instances can be augmented - arr.constructor === Bar && // constructor can be set - typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` - arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` - } catch (e) { - return false - } -})() - -function kMaxLength () { - return Buffer.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff -} - -/** - * Class: Buffer - * ============= - * - * The Buffer constructor returns instances of `Uint8Array` that are augmented - * with function properties for all the node `Buffer` API functions. We use - * `Uint8Array` so that square bracket notation works as expected -- it returns - * a single octet. - * - * By augmenting the instances, we can avoid modifying the `Uint8Array` - * prototype. - */ -function Buffer (arg) { - if (!(this instanceof Buffer)) { - // Avoid going through an ArgumentsAdaptorTrampoline in the common case. - if (arguments.length > 1) return new Buffer(arg, arguments[1]) - return new Buffer(arg) - } - - this.length = 0 - this.parent = undefined - - // Common case. - if (typeof arg === 'number') { - return fromNumber(this, arg) - } - - // Slightly less common case. - if (typeof arg === 'string') { - return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') - } - - // Unusual. - return fromObject(this, arg) -} - -function fromNumber (that, length) { - that = allocate(that, length < 0 ? 0 : checked(length) | 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < length; i++) { - that[i] = 0 - } - } - return that -} - -function fromString (that, string, encoding) { - if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' - - // Assumption: byteLength() return value is always < kMaxLength. - var length = byteLength(string, encoding) | 0 - that = allocate(that, length) - - that.write(string, encoding) - return that -} - -function fromObject (that, object) { - if (Buffer.isBuffer(object)) return fromBuffer(that, object) - - if (isArray(object)) return fromArray(that, object) - - if (object == null) { - throw new TypeError('must start with number, buffer, array or string') - } - - if (typeof ArrayBuffer !== 'undefined') { - if (object.buffer instanceof ArrayBuffer) { - return fromTypedArray(that, object) - } - if (object instanceof ArrayBuffer) { - return fromArrayBuffer(that, object) - } - } - - if (object.length) return fromArrayLike(that, object) - - return fromJsonObject(that, object) -} - -function fromBuffer (that, buffer) { - var length = checked(buffer.length) | 0 - that = allocate(that, length) - buffer.copy(that, 0, 0, length) - return that -} - -function fromArray (that, array) { - var length = checked(array.length) | 0 - that = allocate(that, length) - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 - } - return that -} - -// Duplicate of fromArray() to keep fromArray() monomorphic. -function fromTypedArray (that, array) { - var length = checked(array.length) | 0 - that = allocate(that, length) - // Truncating the elements is probably not what people expect from typed - // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior - // of the old Buffer constructor. - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 - } - return that -} - -function fromArrayBuffer (that, array) { - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - array.byteLength - that = Buffer._augment(new Uint8Array(array)) - } else { - // Fallback: Return an object instance of the Buffer class - that = fromTypedArray(that, new Uint8Array(array)) - } - return that -} - -function fromArrayLike (that, array) { - var length = checked(array.length) | 0 - that = allocate(that, length) - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 - } - return that -} - -// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. -// Returns a zero-length buffer for inputs that don't conform to the spec. -function fromJsonObject (that, object) { - var array - var length = 0 - - if (object.type === 'Buffer' && isArray(object.data)) { - array = object.data - length = checked(array.length) | 0 - } - that = allocate(that, length) - - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 - } - return that -} - -function allocate (that, length) { - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = Buffer._augment(new Uint8Array(length)) - } else { - // Fallback: Return an object instance of the Buffer class - that.length = length - that._isBuffer = true - } - - var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 - if (fromPool) that.parent = rootParent - - return that -} - -function checked (length) { - // Note: cannot use `length < kMaxLength` here because that fails when - // length is NaN (which is otherwise coerced to zero.) - if (length >= kMaxLength()) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength().toString(16) + ' bytes') - } - return length | 0 -} - -function SlowBuffer (subject, encoding) { - if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) - - var buf = new Buffer(subject, encoding) - delete buf.parent - return buf -} - -Buffer.isBuffer = function isBuffer (b) { - return !!(b != null && b._isBuffer) -} - -Buffer.compare = function compare (a, b) { - if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { - throw new TypeError('Arguments must be Buffers') - } - - if (a === b) return 0 - - var x = a.length - var y = b.length - - var i = 0 - var len = Math.min(x, y) - while (i < len) { - if (a[i] !== b[i]) break - - ++i - } - - if (i !== len) { - x = a[i] - y = b[i] - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -} - -Buffer.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'binary': - case 'base64': - case 'raw': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } -} - -Buffer.concat = function concat (list, length) { - if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') - - if (list.length === 0) { - return new Buffer(0) - } - - var i - if (length === undefined) { - length = 0 - for (i = 0; i < list.length; i++) { - length += list[i].length - } - } - - var buf = new Buffer(length) - var pos = 0 - for (i = 0; i < list.length; i++) { - var item = list[i] - item.copy(buf, pos) - pos += item.length - } - return buf -} - -function byteLength (string, encoding) { - if (typeof string !== 'string') string = '' + string - - var len = string.length - if (len === 0) return 0 - - // Use a for loop to avoid recursion - var loweredCase = false - for (;;) { - switch (encoding) { - case 'ascii': - case 'binary': - // Deprecated - case 'raw': - case 'raws': - return len - case 'utf8': - case 'utf-8': - return utf8ToBytes(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes(string).length - default: - if (loweredCase) return utf8ToBytes(string).length // assume utf8 - encoding = ('' + encoding).toLowerCase() - loweredCase = true - } - } -} -Buffer.byteLength = byteLength - -// pre-set for values that may exist in the future -Buffer.prototype.length = undefined -Buffer.prototype.parent = undefined - -function slowToString (encoding, start, end) { - var loweredCase = false - - start = start | 0 - end = end === undefined || end === Infinity ? this.length : end | 0 - - if (!encoding) encoding = 'utf8' - if (start < 0) start = 0 - if (end > this.length) end = this.length - if (end <= start) return '' - - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) - - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) - - case 'ascii': - return asciiSlice(this, start, end) - - case 'binary': - return binarySlice(this, start, end) - - case 'base64': - return base64Slice(this, start, end) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase() - loweredCase = true - } - } -} - -Buffer.prototype.toString = function toString () { - var length = this.length | 0 - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice(this, 0, length) - return slowToString.apply(this, arguments) -} - -Buffer.prototype.equals = function equals (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 -} - -Buffer.prototype.inspect = function inspect () { - var str = '' - var max = exports.INSPECT_MAX_BYTES - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') - if (this.length > max) str += ' ... ' - } - return '' -} - -Buffer.prototype.compare = function compare (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return 0 - return Buffer.compare(this, b) -} - -Buffer.prototype.indexOf = function indexOf (val, byteOffset) { - if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff - else if (byteOffset < -0x80000000) byteOffset = -0x80000000 - byteOffset >>= 0 - - if (this.length === 0) return -1 - if (byteOffset >= this.length) return -1 - - // Negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) - - if (typeof val === 'string') { - if (val.length === 0) return -1 // special case: looking for empty string always fails - return String.prototype.indexOf.call(this, val, byteOffset) - } - if (Buffer.isBuffer(val)) { - return arrayIndexOf(this, val, byteOffset) - } - if (typeof val === 'number') { - if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { - return Uint8Array.prototype.indexOf.call(this, val, byteOffset) - } - return arrayIndexOf(this, [ val ], byteOffset) - } - - function arrayIndexOf (arr, val, byteOffset) { - var foundIndex = -1 - for (var i = 0; byteOffset + i < arr.length; i++) { - if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { - if (foundIndex === -1) foundIndex = i - if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex - } else { - foundIndex = -1 - } - } - return -1 - } - - throw new TypeError('val must be string, number or Buffer') -} - -// `get` is deprecated -Buffer.prototype.get = function get (offset) { - console.log('.get() is deprecated. Access using array indexes instead.') - return this.readUInt8(offset) -} - -// `set` is deprecated -Buffer.prototype.set = function set (v, offset) { - console.log('.set() is deprecated. Access using array indexes instead.') - return this.writeUInt8(v, offset) -} - -function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0 - var remaining = buf.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining - } - } - - // must be an even number of digits - var strLen = string.length - if (strLen % 2 !== 0) throw new Error('Invalid hex string') - - if (length > strLen / 2) { - length = strLen / 2 - } - for (var i = 0; i < length; i++) { - var parsed = parseInt(string.substr(i * 2, 2), 16) - if (isNaN(parsed)) throw new Error('Invalid hex string') - buf[offset + i] = parsed - } - return i -} - -function utf8Write (buf, string, offset, length) { - return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) -} - -function asciiWrite (buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length) -} - -function binaryWrite (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) -} - -function base64Write (buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length) -} - -function ucs2Write (buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) -} - -Buffer.prototype.write = function write (string, offset, length, encoding) { - // Buffer#write(string) - if (offset === undefined) { - encoding = 'utf8' - length = this.length - offset = 0 - // Buffer#write(string, encoding) - } else if (length === undefined && typeof offset === 'string') { - encoding = offset - length = this.length - offset = 0 - // Buffer#write(string, offset[, length][, encoding]) - } else if (isFinite(offset)) { - offset = offset | 0 - if (isFinite(length)) { - length = length | 0 - if (encoding === undefined) encoding = 'utf8' - } else { - encoding = length - length = undefined - } - // legacy write(string, encoding, offset, length) - remove in v0.13 - } else { - var swap = encoding - encoding = offset - offset = length | 0 - length = swap - } - - var remaining = this.length - offset - if (length === undefined || length > remaining) length = remaining - - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('attempt to write outside buffer bounds') - } - - if (!encoding) encoding = 'utf8' - - var loweredCase = false - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite(this, string, offset, length) - - case 'utf8': - case 'utf-8': - return utf8Write(this, string, offset, length) - - case 'ascii': - return asciiWrite(this, string, offset, length) - - case 'binary': - return binaryWrite(this, string, offset, length) - - case 'base64': - // Warning: maxLength not taken into account in base64Write - return base64Write(this, string, offset, length) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, string, offset, length) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase() - loweredCase = true - } - } -} - -Buffer.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -} - -function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return base64.fromByteArray(buf) - } else { - return base64.fromByteArray(buf.slice(start, end)) - } -} - -function utf8Slice (buf, start, end) { - end = Math.min(buf.length, end) - var res = [] - - var i = start - while (i < end) { - var firstByte = buf[i] - var codePoint = null - var bytesPerSequence = (firstByte > 0xEF) ? 4 - : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1 - - if (i + bytesPerSequence <= end) { - var secondByte, thirdByte, fourthByte, tempCodePoint - - switch (bytesPerSequence) { - case 1: - if (firstByte < 0x80) { - codePoint = firstByte - } - break - case 2: - secondByte = buf[i + 1] - if ((secondByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) - if (tempCodePoint > 0x7F) { - codePoint = tempCodePoint - } - } - break - case 3: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) - if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { - codePoint = tempCodePoint - } - } - break - case 4: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - fourthByte = buf[i + 3] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) - if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { - codePoint = tempCodePoint - } - } - } - } - - if (codePoint === null) { - // we did not generate a valid codePoint so insert a - // replacement char (U+FFFD) and advance only 1 byte - codePoint = 0xFFFD - bytesPerSequence = 1 - } else if (codePoint > 0xFFFF) { - // encode to utf16 (surrogate pair dance) - codePoint -= 0x10000 - res.push(codePoint >>> 10 & 0x3FF | 0xD800) - codePoint = 0xDC00 | codePoint & 0x3FF - } - - res.push(codePoint) - i += bytesPerSequence - } - - return decodeCodePointsArray(res) -} - -// Based on http://stackoverflow.com/a/22747272/680742, the browser with -// the lowest limit is Chrome, with 0x10000 args. -// We go 1 magnitude less, for safety -var MAX_ARGUMENTS_LENGTH = 0x1000 - -function decodeCodePointsArray (codePoints) { - var len = codePoints.length - if (len <= MAX_ARGUMENTS_LENGTH) { - return String.fromCharCode.apply(String, codePoints) // avoid extra slice() - } - - // Decode in chunks to avoid "call stack size exceeded". - var res = '' - var i = 0 - while (i < len) { - res += String.fromCharCode.apply( - String, - codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) - ) - } - return res -} - -function asciiSlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; i++) { - ret += String.fromCharCode(buf[i] & 0x7F) - } - return ret -} - -function binarySlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; i++) { - ret += String.fromCharCode(buf[i]) - } - return ret -} - -function hexSlice (buf, start, end) { - var len = buf.length - - if (!start || start < 0) start = 0 - if (!end || end < 0 || end > len) end = len - - var out = '' - for (var i = start; i < end; i++) { - out += toHex(buf[i]) - } - return out -} - -function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end) - var res = '' - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) - } - return res -} - -Buffer.prototype.slice = function slice (start, end) { - var len = this.length - start = ~~start - end = end === undefined ? len : ~~end - - if (start < 0) { - start += len - if (start < 0) start = 0 - } else if (start > len) { - start = len - } - - if (end < 0) { - end += len - if (end < 0) end = 0 - } else if (end > len) { - end = len - } - - if (end < start) end = start - - var newBuf - if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = Buffer._augment(this.subarray(start, end)) - } else { - var sliceLen = end - start - newBuf = new Buffer(sliceLen, undefined) - for (var i = 0; i < sliceLen; i++) { - newBuf[i] = this[i + start] - } - } - - if (newBuf.length) newBuf.parent = this.parent || this - - return newBuf -} - -/* - * Need to make sure that buffer isn't trying to write out of bounds. - */ -function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') -} - -Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - - return val -} - -Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) { - checkOffset(offset, byteLength, this.length) - } - - var val = this[offset + --byteLength] - var mul = 1 - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul - } - - return val -} - -Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length) - return this[offset] -} - -Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - return this[offset] | (this[offset + 1] << 8) -} - -Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - return (this[offset] << 8) | this[offset + 1] -} - -Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) -} - -Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) -} - -Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var i = byteLength - var mul = 1 - var val = this[offset + --i] - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length) - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -} - -Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset] | (this[offset + 1] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset + 1] | (this[offset] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) -} - -Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) -} - -Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, true, 23, 4) -} - -Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, false, 23, 4) -} - -Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, true, 52, 8) -} - -Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, false, 52, 8) -} - -function checkInt (buf, value, offset, ext, max, min) { - if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') -} - -Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) - - var mul = 1 - var i = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) - - var i = byteLength - 1 - var mul = 1 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - this[offset] = value - return offset + 1 -} - -function objectWriteUInt16 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8 - } -} - -Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } - return offset + 2 -} - -Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = value - } else { - objectWriteUInt16(this, value, offset, false) - } - return offset + 2 -} - -function objectWriteUInt32 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff - } -} - -Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24) - this[offset + 2] = (value >>> 16) - this[offset + 1] = (value >>> 8) - this[offset] = value - } else { - objectWriteUInt32(this, value, offset, true) - } - return offset + 4 -} - -Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = value - } else { - objectWriteUInt32(this, value, offset, false) - } - return offset + 4 -} - -Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1) - - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } - - var i = 0 - var mul = 1 - var sub = value < 0 ? 1 : 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1) - - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } - - var i = byteLength - 1 - var mul = 1 - var sub = value < 0 ? 1 : 0 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - if (value < 0) value = 0xff + value + 1 - this[offset] = value - return offset + 1 -} - -Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } - return offset + 2 -} - -Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = value - } else { - objectWriteUInt16(this, value, offset, false) - } - return offset + 2 -} - -Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value - this[offset + 1] = (value >>> 8) - this[offset + 2] = (value >>> 16) - this[offset + 3] = (value >>> 24) - } else { - objectWriteUInt32(this, value, offset, true) - } - return offset + 4 -} - -Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (value < 0) value = 0xffffffff + value + 1 - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = value - } else { - objectWriteUInt32(this, value, offset, false) - } - return offset + 4 -} - -function checkIEEE754 (buf, value, offset, ext, max, min) { - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') - if (offset < 0) throw new RangeError('index out of range') -} - -function writeFloat (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) - } - ieee754.write(buf, value, offset, littleEndian, 23, 4) - return offset + 4 -} - -Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) -} - -function writeDouble (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) - } - ieee754.write(buf, value, offset, littleEndian, 52, 8) - return offset + 8 -} - -Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) -} - -// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer.prototype.copy = function copy (target, targetStart, start, end) { - if (!start) start = 0 - if (!end && end !== 0) end = this.length - if (targetStart >= target.length) targetStart = target.length - if (!targetStart) targetStart = 0 - if (end > 0 && end < start) end = start - - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 - - // Fatal error conditions - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - - // Are we oob? - if (end > this.length) end = this.length - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start - } - - var len = end - start - var i - - if (this === target && start < targetStart && targetStart < end) { - // descending copy from end - for (i = len - 1; i >= 0; i--) { - target[i + targetStart] = this[i + start] - } - } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { - // ascending copy from start - for (i = 0; i < len; i++) { - target[i + targetStart] = this[i + start] - } - } else { - target._set(this.subarray(start, start + len), targetStart) - } - - return len -} - -// fill(value, start=0, end=buffer.length) -Buffer.prototype.fill = function fill (value, start, end) { - if (!value) value = 0 - if (!start) start = 0 - if (!end) end = this.length - - if (end < start) throw new RangeError('end < start') - - // Fill 0 bytes; we're done - if (end === start) return - if (this.length === 0) return - - if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') - if (end < 0 || end > this.length) throw new RangeError('end out of bounds') - - var i - if (typeof value === 'number') { - for (i = start; i < end; i++) { - this[i] = value - } - } else { - var bytes = utf8ToBytes(value.toString()) - var len = bytes.length - for (i = start; i < end; i++) { - this[i] = bytes[i % len] - } - } - - return this -} - -/** - * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. - * Added in Node 0.12. Only available in browsers that support ArrayBuffer. - */ -Buffer.prototype.toArrayBuffer = function toArrayBuffer () { - if (typeof Uint8Array !== 'undefined') { - if (Buffer.TYPED_ARRAY_SUPPORT) { - return (new Buffer(this)).buffer - } else { - var buf = new Uint8Array(this.length) - for (var i = 0, len = buf.length; i < len; i += 1) { - buf[i] = this[i] - } - return buf.buffer - } - } else { - throw new TypeError('Buffer.toArrayBuffer not supported in this browser') - } -} - -// HELPER FUNCTIONS -// ================ - -var BP = Buffer.prototype - -/** - * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods - */ -Buffer._augment = function _augment (arr) { - arr.constructor = Buffer - arr._isBuffer = true - - // save reference to original Uint8Array set method before overwriting - arr._set = arr.set - - // deprecated - arr.get = BP.get - arr.set = BP.set - - arr.write = BP.write - arr.toString = BP.toString - arr.toLocaleString = BP.toString - arr.toJSON = BP.toJSON - arr.equals = BP.equals - arr.compare = BP.compare - arr.indexOf = BP.indexOf - arr.copy = BP.copy - arr.slice = BP.slice - arr.readUIntLE = BP.readUIntLE - arr.readUIntBE = BP.readUIntBE - arr.readUInt8 = BP.readUInt8 - arr.readUInt16LE = BP.readUInt16LE - arr.readUInt16BE = BP.readUInt16BE - arr.readUInt32LE = BP.readUInt32LE - arr.readUInt32BE = BP.readUInt32BE - arr.readIntLE = BP.readIntLE - arr.readIntBE = BP.readIntBE - arr.readInt8 = BP.readInt8 - arr.readInt16LE = BP.readInt16LE - arr.readInt16BE = BP.readInt16BE - arr.readInt32LE = BP.readInt32LE - arr.readInt32BE = BP.readInt32BE - arr.readFloatLE = BP.readFloatLE - arr.readFloatBE = BP.readFloatBE - arr.readDoubleLE = BP.readDoubleLE - arr.readDoubleBE = BP.readDoubleBE - arr.writeUInt8 = BP.writeUInt8 - arr.writeUIntLE = BP.writeUIntLE - arr.writeUIntBE = BP.writeUIntBE - arr.writeUInt16LE = BP.writeUInt16LE - arr.writeUInt16BE = BP.writeUInt16BE - arr.writeUInt32LE = BP.writeUInt32LE - arr.writeUInt32BE = BP.writeUInt32BE - arr.writeIntLE = BP.writeIntLE - arr.writeIntBE = BP.writeIntBE - arr.writeInt8 = BP.writeInt8 - arr.writeInt16LE = BP.writeInt16LE - arr.writeInt16BE = BP.writeInt16BE - arr.writeInt32LE = BP.writeInt32LE - arr.writeInt32BE = BP.writeInt32BE - arr.writeFloatLE = BP.writeFloatLE - arr.writeFloatBE = BP.writeFloatBE - arr.writeDoubleLE = BP.writeDoubleLE - arr.writeDoubleBE = BP.writeDoubleBE - arr.fill = BP.fill - arr.inspect = BP.inspect - arr.toArrayBuffer = BP.toArrayBuffer - - return arr -} - -var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g - -function base64clean (str) { - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = stringtrim(str).replace(INVALID_BASE64_RE, '') - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '=' - } - return str -} - -function stringtrim (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') -} - -function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) -} - -function utf8ToBytes (string, units) { - units = units || Infinity - var codePoint - var length = string.length - var leadSurrogate = null - var bytes = [] - - for (var i = 0; i < length; i++) { - codePoint = string.charCodeAt(i) - - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (!leadSurrogate) { - // no lead yet - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } - - // valid lead - leadSurrogate = codePoint - - continue - } - - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = codePoint - continue - } - - // valid surrogate pair - codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - } - - leadSurrogate = null - - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint) - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x110000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else { - throw new Error('Invalid code point') - } - } - - return bytes -} - -function asciiToBytes (str) { - var byteArray = [] - for (var i = 0; i < str.length; i++) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF) - } - return byteArray -} - -function utf16leToBytes (str, units) { - var c, hi, lo - var byteArray = [] - for (var i = 0; i < str.length; i++) { - if ((units -= 2) < 0) break - - c = str.charCodeAt(i) - hi = c >> 8 - lo = c % 256 - byteArray.push(lo) - byteArray.push(hi) - } - - return byteArray -} - -function base64ToBytes (str) { - return base64.toByteArray(base64clean(str)) -} - -function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; i++) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i] - } - return i -} - -},{"base64-js":15,"ieee754":16,"is-array":17}],15:[function(require,module,exports){ -var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - -;(function (exports) { - 'use strict'; - - var Arr = (typeof Uint8Array !== 'undefined') - ? Uint8Array - : Array - - var PLUS = '+'.charCodeAt(0) - var SLASH = '/'.charCodeAt(0) - var NUMBER = '0'.charCodeAt(0) - var LOWER = 'a'.charCodeAt(0) - var UPPER = 'A'.charCodeAt(0) - var PLUS_URL_SAFE = '-'.charCodeAt(0) - var SLASH_URL_SAFE = '_'.charCodeAt(0) - - function decode (elt) { - var code = elt.charCodeAt(0) - if (code === PLUS || - code === PLUS_URL_SAFE) - return 62 // '+' - if (code === SLASH || - code === SLASH_URL_SAFE) - return 63 // '/' - if (code < NUMBER) - return -1 //no match - if (code < NUMBER + 10) - return code - NUMBER + 26 + 26 - if (code < UPPER + 26) - return code - UPPER - if (code < LOWER + 26) - return code - LOWER + 26 - } - - function b64ToByteArray (b64) { - var i, j, l, tmp, placeHolders, arr - - if (b64.length % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - var len = b64.length - placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 - - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(b64.length * 3 / 4 - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? b64.length - 4 : b64.length - - var L = 0 - - function push (v) { - arr[L++] = v - } - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) - push((tmp & 0xFF0000) >> 16) - push((tmp & 0xFF00) >> 8) - push(tmp & 0xFF) - } - - if (placeHolders === 2) { - tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) - push(tmp & 0xFF) - } else if (placeHolders === 1) { - tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) - push((tmp >> 8) & 0xFF) - push(tmp & 0xFF) - } - - return arr - } - - function uint8ToBase64 (uint8) { - var i, - extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes - output = "", - temp, length - - function encode (num) { - return lookup.charAt(num) - } - - function tripletToBase64 (num) { - return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) - } - - // go through the array every three bytes, we'll deal with trailing stuff later - for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { - temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output += tripletToBase64(temp) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - switch (extraBytes) { - case 1: - temp = uint8[uint8.length - 1] - output += encode(temp >> 2) - output += encode((temp << 4) & 0x3F) - output += '==' - break - case 2: - temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) - output += encode(temp >> 10) - output += encode((temp >> 4) & 0x3F) - output += encode((temp << 2) & 0x3F) - output += '=' - break - } - - return output - } - - exports.toByteArray = b64ToByteArray - exports.fromByteArray = uint8ToBase64 -}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) - -},{}],16:[function(require,module,exports){ -exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] - - i += d - - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} - -exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 - - value = Math.abs(value) - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax - } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } - - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128 -} - -},{}],17:[function(require,module,exports){ - -/** - * isArray - */ - -var isArray = Array.isArray; - -/** - * toString - */ - -var str = Object.prototype.toString; - -/** - * Whether or not the given `val` - * is an array. - * - * example: - * - * isArray([]); - * // > true - * isArray(arguments); - * // > false - * isArray(''); - * // > false - * - * @param {mixed} val - * @return {bool} - */ - -module.exports = isArray || function (val) { - return !! val && '[object Array]' == str.call(val); -}; - -},{}],18:[function(require,module,exports){ -/* jshint node: true */ -(function () { - "use strict"; - - function CookieAccessInfo(domain, path, secure, script) { - if (this instanceof CookieAccessInfo) { - this.domain = domain || undefined; - this.path = path || "/"; - this.secure = !!secure; - this.script = !!script; - return this; - } - return new CookieAccessInfo(domain, path, secure, script); - } - exports.CookieAccessInfo = CookieAccessInfo; - - function Cookie(cookiestr, request_domain, request_path) { - if (cookiestr instanceof Cookie) { - return cookiestr; - } - if (this instanceof Cookie) { - this.name = null; - this.value = null; - this.expiration_date = Infinity; - this.path = String(request_path || "/"); - this.explicit_path = false; - this.domain = request_domain || null; - this.explicit_domain = false; - this.secure = false; //how to define default? - this.noscript = false; //httponly - if (cookiestr) { - this.parse(cookiestr, request_domain, request_path); - } - return this; - } - return new Cookie(cookiestr, request_domain, request_path); - } - exports.Cookie = Cookie; - - Cookie.prototype.toString = function toString() { - var str = [this.name + "=" + this.value]; - if (this.expiration_date !== Infinity) { - str.push("expires=" + (new Date(this.expiration_date)).toGMTString()); - } - if (this.domain) { - str.push("domain=" + this.domain); - } - if (this.path) { - str.push("path=" + this.path); - } - if (this.secure) { - str.push("secure"); - } - if (this.noscript) { - str.push("httponly"); - } - return str.join("; "); - }; - - Cookie.prototype.toValueString = function toValueString() { - return this.name + "=" + this.value; - }; - - var cookie_str_splitter = /[:](?=\s*[a-zA-Z0-9_\-]+\s*[=])/g; - Cookie.prototype.parse = function parse(str, request_domain, request_path) { - if (this instanceof Cookie) { - var parts = str.split(";").filter(function (value) { - return !!value; - }), - pair = parts[0].match(/([^=]+)=([\s\S]*)/), - key = pair[1], - value = pair[2], - i; - this.name = key; - this.value = value; - - for (i = 1; i < parts.length; i += 1) { - pair = parts[i].match(/([^=]+)(?:=([\s\S]*))?/); - key = pair[1].trim().toLowerCase(); - value = pair[2]; - switch (key) { - case "httponly": - this.noscript = true; - break; - case "expires": - this.expiration_date = value ? - Number(Date.parse(value)) : - Infinity; - break; - case "path": - this.path = value ? - value.trim() : - ""; - this.explicit_path = true; - break; - case "domain": - this.domain = value ? - value.trim() : - ""; - this.explicit_domain = !!this.domain; - break; - case "secure": - this.secure = true; - break; - } - } - - if (!this.explicit_path) { - this.path = request_path || "/"; - } - if (!this.explicit_domain) { - this.domain = request_domain; - } - - return this; - } - return new Cookie().parse(str, request_domain, request_path); - }; - - Cookie.prototype.matches = function matches(access_info) { - if (this.noscript && access_info.script || - this.secure && !access_info.secure || - !this.collidesWith(access_info)) { - return false; - } - return true; - }; - - Cookie.prototype.collidesWith = function collidesWith(access_info) { - if ((this.path && !access_info.path) || (this.domain && !access_info.domain)) { - return false; - } - if (this.path && access_info.path.indexOf(this.path) !== 0) { - return false; - } - if (this.explicit_path && access_info.path.indexOf( this.path ) !== 0) { - return false; - } - var access_domain = access_info.domain && access_info.domain.replace(/^[\.]/,''); - var cookie_domain = this.domain && this.domain.replace(/^[\.]/,''); - if (cookie_domain === access_domain) { - return true; - } - if (cookie_domain) { - if (!this.explicit_domain) { - return false; // we already checked if the domains were exactly the same - } - var wildcard = access_domain.indexOf(cookie_domain); - if (wildcard === -1 || wildcard !== access_domain.length - cookie_domain.length) { - return false; - } - return true; - } - return true; - }; - - function CookieJar() { - var cookies, cookies_list, collidable_cookie; - if (this instanceof CookieJar) { - cookies = Object.create(null); //name: [Cookie] - - this.setCookie = function setCookie(cookie, request_domain, request_path) { - var remove, i; - cookie = new Cookie(cookie, request_domain, request_path); - //Delete the cookie if the set is past the current time - remove = cookie.expiration_date <= Date.now(); - if (cookies[cookie.name] !== undefined) { - cookies_list = cookies[cookie.name]; - for (i = 0; i < cookies_list.length; i += 1) { - collidable_cookie = cookies_list[i]; - if (collidable_cookie.collidesWith(cookie)) { - if (remove) { - cookies_list.splice(i, 1); - if (cookies_list.length === 0) { - delete cookies[cookie.name]; - } - return false; - } - cookies_list[i] = cookie; - return cookie; - } - } - if (remove) { - return false; - } - cookies_list.push(cookie); - return cookie; - } - if (remove) { - return false; - } - cookies[cookie.name] = [cookie]; - return cookies[cookie.name]; - }; - //returns a cookie - this.getCookie = function getCookie(cookie_name, access_info) { - var cookie, i; - cookies_list = cookies[cookie_name]; - if (!cookies_list) { - return; - } - for (i = 0; i < cookies_list.length; i += 1) { - cookie = cookies_list[i]; - if (cookie.expiration_date <= Date.now()) { - if (cookies_list.length === 0) { - delete cookies[cookie.name]; - } - continue; - } - - if (cookie.matches(access_info)) { - return cookie; - } - } - }; - //returns a list of cookies - this.getCookies = function getCookies(access_info) { - var matches = [], cookie_name, cookie; - for (cookie_name in cookies) { - cookie = this.getCookie(cookie_name, access_info); - if (cookie) { - matches.push(cookie); - } - } - matches.toString = function toString() { - return matches.join(":"); - }; - matches.toValueString = function toValueString() { - return matches.map(function (c) { - return c.toValueString(); - }).join(';'); - }; - return matches; - }; - - return this; - } - return new CookieJar(); - } - exports.CookieJar = CookieJar; - - //returns list of cookies that were set correctly. Cookies that are expired and removed are not returned. - CookieJar.prototype.setCookies = function setCookies(cookies, request_domain, request_path) { - cookies = Array.isArray(cookies) ? - cookies : - cookies.split(cookie_str_splitter); - var successful = [], - i, - cookie; - cookies = cookies.map(function(item){ - return new Cookie(item, request_domain, request_path); - }); - for (i = 0; i < cookies.length; i += 1) { - cookie = cookies[i]; - if (this.setCookie(cookie, request_domain, request_path)) { - successful.push(cookie); - } - } - return successful; - }; -}()); - -},{}],19:[function(require,module,exports){ -'use strict'; - - -var yaml = require('./lib/js-yaml.js'); - - -module.exports = yaml; - -},{"./lib/js-yaml.js":20}],20:[function(require,module,exports){ -'use strict'; - - -var loader = require('./js-yaml/loader'); -var dumper = require('./js-yaml/dumper'); - - -function deprecated(name) { - return function () { - throw new Error('Function ' + name + ' is deprecated and cannot be used.'); - }; -} - - -module.exports.Type = require('./js-yaml/type'); -module.exports.Schema = require('./js-yaml/schema'); -module.exports.FAILSAFE_SCHEMA = require('./js-yaml/schema/failsafe'); -module.exports.JSON_SCHEMA = require('./js-yaml/schema/json'); -module.exports.CORE_SCHEMA = require('./js-yaml/schema/core'); -module.exports.DEFAULT_SAFE_SCHEMA = require('./js-yaml/schema/default_safe'); -module.exports.DEFAULT_FULL_SCHEMA = require('./js-yaml/schema/default_full'); -module.exports.load = loader.load; -module.exports.loadAll = loader.loadAll; -module.exports.safeLoad = loader.safeLoad; -module.exports.safeLoadAll = loader.safeLoadAll; -module.exports.dump = dumper.dump; -module.exports.safeDump = dumper.safeDump; -module.exports.YAMLException = require('./js-yaml/exception'); - -// Deprecated schema names from JS-YAML 2.0.x -module.exports.MINIMAL_SCHEMA = require('./js-yaml/schema/failsafe'); -module.exports.SAFE_SCHEMA = require('./js-yaml/schema/default_safe'); -module.exports.DEFAULT_SCHEMA = require('./js-yaml/schema/default_full'); - -// Deprecated functions from JS-YAML 1.x.x -module.exports.scan = deprecated('scan'); -module.exports.parse = deprecated('parse'); -module.exports.compose = deprecated('compose'); -module.exports.addConstructor = deprecated('addConstructor'); - -},{"./js-yaml/dumper":22,"./js-yaml/exception":23,"./js-yaml/loader":24,"./js-yaml/schema":26,"./js-yaml/schema/core":27,"./js-yaml/schema/default_full":28,"./js-yaml/schema/default_safe":29,"./js-yaml/schema/failsafe":30,"./js-yaml/schema/json":31,"./js-yaml/type":32}],21:[function(require,module,exports){ -'use strict'; - - -function isNothing(subject) { - return (typeof subject === 'undefined') || (subject === null); -} - - -function isObject(subject) { - return (typeof subject === 'object') && (subject !== null); -} - - -function toArray(sequence) { - if (Array.isArray(sequence)) return sequence; - else if (isNothing(sequence)) return []; - - return [ sequence ]; -} - - -function extend(target, source) { - var index, length, key, sourceKeys; - - if (source) { - sourceKeys = Object.keys(source); - - for (index = 0, length = sourceKeys.length; index < length; index += 1) { - key = sourceKeys[index]; - target[key] = source[key]; - } - } - - return target; -} - - -function repeat(string, count) { - var result = '', cycle; - - for (cycle = 0; cycle < count; cycle += 1) { - result += string; - } - - return result; -} - - -function isNegativeZero(number) { - return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number); -} - - -module.exports.isNothing = isNothing; -module.exports.isObject = isObject; -module.exports.toArray = toArray; -module.exports.repeat = repeat; -module.exports.isNegativeZero = isNegativeZero; -module.exports.extend = extend; - -},{}],22:[function(require,module,exports){ -'use strict'; - -/*eslint-disable no-use-before-define*/ - -var common = require('./common'); -var YAMLException = require('./exception'); -var DEFAULT_FULL_SCHEMA = require('./schema/default_full'); -var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe'); - -var _toString = Object.prototype.toString; -var _hasOwnProperty = Object.prototype.hasOwnProperty; - -var CHAR_TAB = 0x09; /* Tab */ -var CHAR_LINE_FEED = 0x0A; /* LF */ -var CHAR_SPACE = 0x20; /* Space */ -var CHAR_EXCLAMATION = 0x21; /* ! */ -var CHAR_DOUBLE_QUOTE = 0x22; /* " */ -var CHAR_SHARP = 0x23; /* # */ -var CHAR_PERCENT = 0x25; /* % */ -var CHAR_AMPERSAND = 0x26; /* & */ -var CHAR_SINGLE_QUOTE = 0x27; /* ' */ -var CHAR_ASTERISK = 0x2A; /* * */ -var CHAR_COMMA = 0x2C; /* , */ -var CHAR_MINUS = 0x2D; /* - */ -var CHAR_COLON = 0x3A; /* : */ -var CHAR_GREATER_THAN = 0x3E; /* > */ -var CHAR_QUESTION = 0x3F; /* ? */ -var CHAR_COMMERCIAL_AT = 0x40; /* @ */ -var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ -var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ -var CHAR_GRAVE_ACCENT = 0x60; /* ` */ -var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ -var CHAR_VERTICAL_LINE = 0x7C; /* | */ -var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ - -var ESCAPE_SEQUENCES = {}; - -ESCAPE_SEQUENCES[0x00] = '\\0'; -ESCAPE_SEQUENCES[0x07] = '\\a'; -ESCAPE_SEQUENCES[0x08] = '\\b'; -ESCAPE_SEQUENCES[0x09] = '\\t'; -ESCAPE_SEQUENCES[0x0A] = '\\n'; -ESCAPE_SEQUENCES[0x0B] = '\\v'; -ESCAPE_SEQUENCES[0x0C] = '\\f'; -ESCAPE_SEQUENCES[0x0D] = '\\r'; -ESCAPE_SEQUENCES[0x1B] = '\\e'; -ESCAPE_SEQUENCES[0x22] = '\\"'; -ESCAPE_SEQUENCES[0x5C] = '\\\\'; -ESCAPE_SEQUENCES[0x85] = '\\N'; -ESCAPE_SEQUENCES[0xA0] = '\\_'; -ESCAPE_SEQUENCES[0x2028] = '\\L'; -ESCAPE_SEQUENCES[0x2029] = '\\P'; - -var DEPRECATED_BOOLEANS_SYNTAX = [ - 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', - 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF' -]; - -function compileStyleMap(schema, map) { - var result, keys, index, length, tag, style, type; - - if (map === null) return {}; - - result = {}; - keys = Object.keys(map); - - for (index = 0, length = keys.length; index < length; index += 1) { - tag = keys[index]; - style = String(map[tag]); - - if (tag.slice(0, 2) === '!!') { - tag = 'tag:yaml.org,2002:' + tag.slice(2); - } - - type = schema.compiledTypeMap[tag]; - - if (type && _hasOwnProperty.call(type.styleAliases, style)) { - style = type.styleAliases[style]; - } - - result[tag] = style; - } - - return result; -} - -function encodeHex(character) { - var string, handle, length; - - string = character.toString(16).toUpperCase(); - - if (character <= 0xFF) { - handle = 'x'; - length = 2; - } else if (character <= 0xFFFF) { - handle = 'u'; - length = 4; - } else if (character <= 0xFFFFFFFF) { - handle = 'U'; - length = 8; - } else { - throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF'); - } - - return '\\' + handle + common.repeat('0', length - string.length) + string; -} - -function State(options) { - this.schema = options['schema'] || DEFAULT_FULL_SCHEMA; - this.indent = Math.max(1, (options['indent'] || 2)); - this.skipInvalid = options['skipInvalid'] || false; - this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']); - this.styleMap = compileStyleMap(this.schema, options['styles'] || null); - this.sortKeys = options['sortKeys'] || false; - this.lineWidth = options['lineWidth'] || 80; - this.noRefs = options['noRefs'] || false; - this.noCompatMode = options['noCompatMode'] || false; - - this.implicitTypes = this.schema.compiledImplicit; - this.explicitTypes = this.schema.compiledExplicit; - - this.tag = null; - this.result = ''; - - this.duplicates = []; - this.usedDuplicates = null; -} - -// Indents every line in a string. Empty lines (\n only) are not indented. -function indentString(string, spaces) { - var ind = common.repeat(' ', spaces), - position = 0, - next = -1, - result = '', - line, - length = string.length; - - while (position < length) { - next = string.indexOf('\n', position); - if (next === -1) { - line = string.slice(position); - position = length; - } else { - line = string.slice(position, next + 1); - position = next + 1; - } - - if (line.length && line !== '\n') result += ind; - - result += line; - } - - return result; -} - -function generateNextLine(state, level) { - return '\n' + common.repeat(' ', state.indent * level); -} - -function testImplicitResolving(state, str) { - var index, length, type; - - for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { - type = state.implicitTypes[index]; - - if (type.resolve(str)) { - return true; - } - } - - return false; -} - -// [33] s-white ::= s-space | s-tab -function isWhitespace(c) { - return c === CHAR_SPACE || c === CHAR_TAB; -} - -// Returns true if the character can be printed without escaping. -// From YAML 1.2: "any allowed characters known to be non-printable -// should also be escaped. [However,] This isn’t mandatory" -// Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029. -function isPrintable(c) { - return (0x00020 <= c && c <= 0x00007E) - || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029) - || ((0x0E000 <= c && c <= 0x00FFFD) && c !== 0xFEFF /* BOM */) - || (0x10000 <= c && c <= 0x10FFFF); -} - -// Simplified test for values allowed after the first character in plain style. -function isPlainSafe(c) { - // Uses a subset of nb-char - c-flow-indicator - ":" - "#" - // where nb-char ::= c-printable - b-char - c-byte-order-mark. - return isPrintable(c) && c !== 0xFEFF - // - c-flow-indicator - && c !== CHAR_COMMA - && c !== CHAR_LEFT_SQUARE_BRACKET - && c !== CHAR_RIGHT_SQUARE_BRACKET - && c !== CHAR_LEFT_CURLY_BRACKET - && c !== CHAR_RIGHT_CURLY_BRACKET - // - ":" - "#" - && c !== CHAR_COLON - && c !== CHAR_SHARP; -} - -// Simplified test for values allowed as the first character in plain style. -function isPlainSafeFirst(c) { - // Uses a subset of ns-char - c-indicator - // where ns-char = nb-char - s-white. - return isPrintable(c) && c !== 0xFEFF - && !isWhitespace(c) // - s-white - // - (c-indicator ::= - // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}” - && c !== CHAR_MINUS - && c !== CHAR_QUESTION - && c !== CHAR_COLON - && c !== CHAR_COMMA - && c !== CHAR_LEFT_SQUARE_BRACKET - && c !== CHAR_RIGHT_SQUARE_BRACKET - && c !== CHAR_LEFT_CURLY_BRACKET - && c !== CHAR_RIGHT_CURLY_BRACKET - // | “#” | “&” | “*” | “!” | “|” | “>” | “'” | “"” - && c !== CHAR_SHARP - && c !== CHAR_AMPERSAND - && c !== CHAR_ASTERISK - && c !== CHAR_EXCLAMATION - && c !== CHAR_VERTICAL_LINE - && c !== CHAR_GREATER_THAN - && c !== CHAR_SINGLE_QUOTE - && c !== CHAR_DOUBLE_QUOTE - // | “%” | “@” | “`”) - && c !== CHAR_PERCENT - && c !== CHAR_COMMERCIAL_AT - && c !== CHAR_GRAVE_ACCENT; -} - -var STYLE_PLAIN = 1, - STYLE_SINGLE = 2, - STYLE_LITERAL = 3, - STYLE_FOLDED = 4, - STYLE_DOUBLE = 5; - -// Determines which scalar styles are possible and returns the preferred style. -// lineWidth = -1 => no limit. -// Pre-conditions: str.length > 0. -// Post-conditions: -// STYLE_PLAIN or STYLE_SINGLE => no \n are in the string. -// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1). -// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1). -function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) { - var i; - var char; - var hasLineBreak = false; - var hasFoldableLine = false; // only checked if shouldTrackWidth - var shouldTrackWidth = lineWidth !== -1; - var previousLineBreak = -1; // count the first line correctly - var plain = isPlainSafeFirst(string.charCodeAt(0)) - && !isWhitespace(string.charCodeAt(string.length - 1)); - - if (singleLineOnly) { - // Case: no block styles. - // Check for disallowed characters to rule out plain and single. - for (i = 0; i < string.length; i++) { - char = string.charCodeAt(i); - if (!isPrintable(char)) { - return STYLE_DOUBLE; - } - plain = plain && isPlainSafe(char); - } - } else { - // Case: block styles permitted. - for (i = 0; i < string.length; i++) { - char = string.charCodeAt(i); - if (char === CHAR_LINE_FEED) { - hasLineBreak = true; - // Check if any line can be folded. - if (shouldTrackWidth) { - hasFoldableLine = hasFoldableLine || - // Foldable line = too long, and not more-indented. - (i - previousLineBreak - 1 > lineWidth && - string[previousLineBreak + 1] !== ' '); - previousLineBreak = i; - } - } else if (!isPrintable(char)) { - return STYLE_DOUBLE; - } - plain = plain && isPlainSafe(char); - } - // in case the end is missing a \n - hasFoldableLine = hasFoldableLine || (shouldTrackWidth && - (i - previousLineBreak - 1 > lineWidth && - string[previousLineBreak + 1] !== ' ')); - } - // Although every style can represent \n without escaping, prefer block styles - // for multiline, since they're more readable and they don't add empty lines. - // Also prefer folding a super-long line. - if (!hasLineBreak && !hasFoldableLine) { - // Strings interpretable as another type have to be quoted; - // e.g. the string 'true' vs. the boolean true. - return plain && !testAmbiguousType(string) - ? STYLE_PLAIN : STYLE_SINGLE; - } - // Edge case: block indentation indicator can only have one digit. - if (string[0] === ' ' && indentPerLevel > 9) { - return STYLE_DOUBLE; - } - // At this point we know block styles are valid. - // Prefer literal style unless we want to fold. - return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; -} - -// Note: line breaking/folding is implemented for only the folded style. -// NB. We drop the last trailing newline (if any) of a returned block scalar -// since the dumper adds its own newline. This always works: -// • No ending newline => unaffected; already using strip "-" chomping. -// • Ending newline => removed then restored. -// Importantly, this keeps the "+" chomp indicator from gaining an extra line. -function writeScalar(state, string, level, iskey) { - state.dump = (function () { - if (string.length === 0) { - return "''"; - } - if (!state.noCompatMode && - DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) { - return "'" + string + "'"; - } - - var indent = state.indent * Math.max(1, level); // no 0-indent scalars - // As indentation gets deeper, let the width decrease monotonically - // to the lower bound min(state.lineWidth, 40). - // Note that this implies - // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound. - // state.lineWidth > 40 + state.indent: width decreases until the lower bound. - // This behaves better than a constant minimum width which disallows narrower options, - // or an indent threshold which causes the width to suddenly increase. - var lineWidth = state.lineWidth === -1 - ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); - - // Without knowing if keys are implicit/explicit, assume implicit for safety. - var singleLineOnly = iskey - // No block styles in flow mode. - || (state.flowLevel > -1 && level >= state.flowLevel); - function testAmbiguity(string) { - return testImplicitResolving(state, string); - } - - switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) { - case STYLE_PLAIN: - return string; - case STYLE_SINGLE: - return "'" + string.replace(/'/g, "''") + "'"; - case STYLE_LITERAL: - return '|' + blockHeader(string, state.indent) - + dropEndingNewline(indentString(string, indent)); - case STYLE_FOLDED: - return '>' + blockHeader(string, state.indent) - + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); - case STYLE_DOUBLE: - return '"' + escapeString(string, lineWidth) + '"'; - default: - throw new YAMLException('impossible error: invalid scalar style'); - } - }()); -} - -// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. -function blockHeader(string, indentPerLevel) { - var indentIndicator = (string[0] === ' ') ? String(indentPerLevel) : ''; - - // note the special case: the string '\n' counts as a "trailing" empty line. - var clip = string[string.length - 1] === '\n'; - var keep = clip && (string[string.length - 2] === '\n' || string === '\n'); - var chomp = keep ? '+' : (clip ? '' : '-'); - - return indentIndicator + chomp + '\n'; -} - -// (See the note for writeScalar.) -function dropEndingNewline(string) { - return string[string.length - 1] === '\n' ? string.slice(0, -1) : string; -} - -// Note: a long line without a suitable break point will exceed the width limit. -// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. -function foldString(string, width) { - // In folded style, $k$ consecutive newlines output as $k+1$ newlines— - // unless they're before or after a more-indented line, or at the very - // beginning or end, in which case $k$ maps to $k$. - // Therefore, parse each chunk as newline(s) followed by a content line. - var lineRe = /(\n+)([^\n]*)/g; - - // first line (possibly an empty line) - var result = (function () { - var nextLF = string.indexOf('\n'); - nextLF = nextLF !== -1 ? nextLF : string.length; - lineRe.lastIndex = nextLF; - return foldLine(string.slice(0, nextLF), width); - }()); - // If we haven't reached the first content line yet, don't add an extra \n. - var prevMoreIndented = string[0] === '\n' || string[0] === ' '; - var moreIndented; - - // rest of the lines - var match; - while ((match = lineRe.exec(string))) { - var prefix = match[1], line = match[2]; - moreIndented = (line[0] === ' '); - result += prefix - + (!prevMoreIndented && !moreIndented && line !== '' - ? '\n' : '') - + foldLine(line, width); - prevMoreIndented = moreIndented; - } - - return result; -} - -// Greedy line breaking. -// Picks the longest line under the limit each time, -// otherwise settles for the shortest line over the limit. -// NB. More-indented lines *cannot* be folded, as that would add an extra \n. -function foldLine(line, width) { - if (line === '' || line[0] === ' ') return line; - - // Since a more-indented line adds a \n, breaks can't be followed by a space. - var breakRe = / [^ ]/g; // note: the match index will always be <= length-2. - var match; - // start is an inclusive index. end, curr, and next are exclusive. - var start = 0, end, curr = 0, next = 0; - var result = ''; - - // Invariants: 0 <= start <= length-1. - // 0 <= curr <= next <= max(0, length-2). curr - start <= width. - // Inside the loop: - // A match implies length >= 2, so curr and next are <= length-2. - while ((match = breakRe.exec(line))) { - next = match.index; - // maintain invariant: curr - start <= width - if (next - start > width) { - end = (curr > start) ? curr : next; // derive end <= length-2 - result += '\n' + line.slice(start, end); - // skip the space that was output as \n - start = end + 1; // derive start <= length-1 - } - curr = next; - } - - // By the invariants, start <= length-1, so there is something left over. - // It is either the whole string or a part starting from non-whitespace. - result += '\n'; - // Insert a break if the remainder is too long and there is a break available. - if (line.length - start > width && curr > start) { - result += line.slice(start, curr) + '\n' + line.slice(curr + 1); - } else { - result += line.slice(start); - } - - return result.slice(1); // drop extra \n joiner -} - -// Escapes a double-quoted string. -function escapeString(string) { - var result = ''; - var char; - var escapeSeq; - - for (var i = 0; i < string.length; i++) { - char = string.charCodeAt(i); - escapeSeq = ESCAPE_SEQUENCES[char]; - result += !escapeSeq && isPrintable(char) - ? string[i] - : escapeSeq || encodeHex(char); - } - - return result; -} - -function writeFlowSequence(state, level, object) { - var _result = '', - _tag = state.tag, - index, - length; - - for (index = 0, length = object.length; index < length; index += 1) { - // Write only valid elements. - if (writeNode(state, level, object[index], false, false)) { - if (index !== 0) _result += ', '; - _result += state.dump; - } - } - - state.tag = _tag; - state.dump = '[' + _result + ']'; -} - -function writeBlockSequence(state, level, object, compact) { - var _result = '', - _tag = state.tag, - index, - length; - - for (index = 0, length = object.length; index < length; index += 1) { - // Write only valid elements. - if (writeNode(state, level + 1, object[index], true, true)) { - if (!compact || index !== 0) { - _result += generateNextLine(state, level); - } - _result += '- ' + state.dump; - } - } - - state.tag = _tag; - state.dump = _result || '[]'; // Empty sequence if no valid values. -} - -function writeFlowMapping(state, level, object) { - var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - pairBuffer; - - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - pairBuffer = ''; - - if (index !== 0) pairBuffer += ', '; - - objectKey = objectKeyList[index]; - objectValue = object[objectKey]; - - if (!writeNode(state, level, objectKey, false, false)) { - continue; // Skip this pair because of invalid key; - } - - if (state.dump.length > 1024) pairBuffer += '? '; - - pairBuffer += state.dump + ': '; - - if (!writeNode(state, level, objectValue, false, false)) { - continue; // Skip this pair because of invalid value. - } - - pairBuffer += state.dump; - - // Both key and value are valid. - _result += pairBuffer; - } - - state.tag = _tag; - state.dump = '{' + _result + '}'; -} - -function writeBlockMapping(state, level, object, compact) { - var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - explicitPair, - pairBuffer; - - // Allow sorting keys so that the output file is deterministic - if (state.sortKeys === true) { - // Default sorting - objectKeyList.sort(); - } else if (typeof state.sortKeys === 'function') { - // Custom sort function - objectKeyList.sort(state.sortKeys); - } else if (state.sortKeys) { - // Something is wrong - throw new YAMLException('sortKeys must be a boolean or a function'); - } - - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - pairBuffer = ''; - - if (!compact || index !== 0) { - pairBuffer += generateNextLine(state, level); - } - - objectKey = objectKeyList[index]; - objectValue = object[objectKey]; - - if (!writeNode(state, level + 1, objectKey, true, true, true)) { - continue; // Skip this pair because of invalid key. - } - - explicitPair = (state.tag !== null && state.tag !== '?') || - (state.dump && state.dump.length > 1024); - - if (explicitPair) { - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - pairBuffer += '?'; - } else { - pairBuffer += '? '; - } - } - - pairBuffer += state.dump; - - if (explicitPair) { - pairBuffer += generateNextLine(state, level); - } - - if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { - continue; // Skip this pair because of invalid value. - } - - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - pairBuffer += ':'; - } else { - pairBuffer += ': '; - } - - pairBuffer += state.dump; - - // Both key and value are valid. - _result += pairBuffer; - } - - state.tag = _tag; - state.dump = _result || '{}'; // Empty mapping if no valid pairs. -} - -function detectType(state, object, explicit) { - var _result, typeList, index, length, type, style; - - typeList = explicit ? state.explicitTypes : state.implicitTypes; - - for (index = 0, length = typeList.length; index < length; index += 1) { - type = typeList[index]; - - if ((type.instanceOf || type.predicate) && - (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) && - (!type.predicate || type.predicate(object))) { - - state.tag = explicit ? type.tag : '?'; - - if (type.represent) { - style = state.styleMap[type.tag] || type.defaultStyle; - - if (_toString.call(type.represent) === '[object Function]') { - _result = type.represent(object, style); - } else if (_hasOwnProperty.call(type.represent, style)) { - _result = type.represent[style](object, style); - } else { - throw new YAMLException('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); - } - - state.dump = _result; - } - - return true; - } - } - - return false; -} - -// Serializes `object` and writes it to global `result`. -// Returns true on success, or false on invalid object. -// -function writeNode(state, level, object, block, compact, iskey) { - state.tag = null; - state.dump = object; - - if (!detectType(state, object, false)) { - detectType(state, object, true); - } - - var type = _toString.call(state.dump); - - if (block) { - block = (state.flowLevel < 0 || state.flowLevel > level); - } - - var objectOrArray = type === '[object Object]' || type === '[object Array]', - duplicateIndex, - duplicate; - - if (objectOrArray) { - duplicateIndex = state.duplicates.indexOf(object); - duplicate = duplicateIndex !== -1; - } - - if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) { - compact = false; - } - - if (duplicate && state.usedDuplicates[duplicateIndex]) { - state.dump = '*ref_' + duplicateIndex; - } else { - if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { - state.usedDuplicates[duplicateIndex] = true; - } - if (type === '[object Object]') { - if (block && (Object.keys(state.dump).length !== 0)) { - writeBlockMapping(state, level, state.dump, compact); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + state.dump; - } - } else { - writeFlowMapping(state, level, state.dump); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; - } - } - } else if (type === '[object Array]') { - if (block && (state.dump.length !== 0)) { - writeBlockSequence(state, level, state.dump, compact); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + state.dump; - } - } else { - writeFlowSequence(state, level, state.dump); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; - } - } - } else if (type === '[object String]') { - if (state.tag !== '?') { - writeScalar(state, state.dump, level, iskey); - } - } else { - if (state.skipInvalid) return false; - throw new YAMLException('unacceptable kind of an object to dump ' + type); - } - - if (state.tag !== null && state.tag !== '?') { - state.dump = '!<' + state.tag + '> ' + state.dump; - } - } - - return true; -} - -function getDuplicateReferences(object, state) { - var objects = [], - duplicatesIndexes = [], - index, - length; - - inspectNode(object, objects, duplicatesIndexes); - - for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { - state.duplicates.push(objects[duplicatesIndexes[index]]); - } - state.usedDuplicates = new Array(length); -} - -function inspectNode(object, objects, duplicatesIndexes) { - var objectKeyList, - index, - length; - - if (object !== null && typeof object === 'object') { - index = objects.indexOf(object); - if (index !== -1) { - if (duplicatesIndexes.indexOf(index) === -1) { - duplicatesIndexes.push(index); - } - } else { - objects.push(object); - - if (Array.isArray(object)) { - for (index = 0, length = object.length; index < length; index += 1) { - inspectNode(object[index], objects, duplicatesIndexes); - } - } else { - objectKeyList = Object.keys(object); - - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); - } - } - } - } -} - -function dump(input, options) { - options = options || {}; - - var state = new State(options); - - if (!state.noRefs) getDuplicateReferences(input, state); - - if (writeNode(state, 0, input, true, true)) return state.dump + '\n'; - - return ''; -} - -function safeDump(input, options) { - return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); -} - -module.exports.dump = dump; -module.exports.safeDump = safeDump; - -},{"./common":21,"./exception":23,"./schema/default_full":28,"./schema/default_safe":29}],23:[function(require,module,exports){ -// YAML error class. http://stackoverflow.com/questions/8458984 -// -'use strict'; - -function YAMLException(reason, mark) { - // Super constructor - Error.call(this); - - // Include stack trace in error object - if (Error.captureStackTrace) { - // Chrome and NodeJS - Error.captureStackTrace(this, this.constructor); - } else { - // FF, IE 10+ and Safari 6+. Fallback for others - this.stack = (new Error()).stack || ''; - } - - this.name = 'YAMLException'; - this.reason = reason; - this.mark = mark; - this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : ''); -} - - -// Inherit from Error -YAMLException.prototype = Object.create(Error.prototype); -YAMLException.prototype.constructor = YAMLException; - - -YAMLException.prototype.toString = function toString(compact) { - var result = this.name + ': '; - - result += this.reason || '(unknown reason)'; - - if (!compact && this.mark) { - result += ' ' + this.mark.toString(); - } - - return result; -}; - - -module.exports = YAMLException; - -},{}],24:[function(require,module,exports){ -'use strict'; - -/*eslint-disable max-len,no-use-before-define*/ - -var common = require('./common'); -var YAMLException = require('./exception'); -var Mark = require('./mark'); -var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe'); -var DEFAULT_FULL_SCHEMA = require('./schema/default_full'); - - -var _hasOwnProperty = Object.prototype.hasOwnProperty; - - -var CONTEXT_FLOW_IN = 1; -var CONTEXT_FLOW_OUT = 2; -var CONTEXT_BLOCK_IN = 3; -var CONTEXT_BLOCK_OUT = 4; - - -var CHOMPING_CLIP = 1; -var CHOMPING_STRIP = 2; -var CHOMPING_KEEP = 3; - - -var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; -var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; -var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; -var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; -var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; - - -function is_EOL(c) { - return (c === 0x0A/* LF */) || (c === 0x0D/* CR */); -} - -function is_WHITE_SPACE(c) { - return (c === 0x09/* Tab */) || (c === 0x20/* Space */); -} - -function is_WS_OR_EOL(c) { - return (c === 0x09/* Tab */) || - (c === 0x20/* Space */) || - (c === 0x0A/* LF */) || - (c === 0x0D/* CR */); -} - -function is_FLOW_INDICATOR(c) { - return c === 0x2C/* , */ || - c === 0x5B/* [ */ || - c === 0x5D/* ] */ || - c === 0x7B/* { */ || - c === 0x7D/* } */; -} - -function fromHexCode(c) { - var lc; - - if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { - return c - 0x30; - } - - /*eslint-disable no-bitwise*/ - lc = c | 0x20; - - if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) { - return lc - 0x61 + 10; - } - - return -1; -} - -function escapedHexLen(c) { - if (c === 0x78/* x */) { return 2; } - if (c === 0x75/* u */) { return 4; } - if (c === 0x55/* U */) { return 8; } - return 0; -} - -function fromDecimalCode(c) { - if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { - return c - 0x30; - } - - return -1; -} - -function simpleEscapeSequence(c) { - return (c === 0x30/* 0 */) ? '\x00' : - (c === 0x61/* a */) ? '\x07' : - (c === 0x62/* b */) ? '\x08' : - (c === 0x74/* t */) ? '\x09' : - (c === 0x09/* Tab */) ? '\x09' : - (c === 0x6E/* n */) ? '\x0A' : - (c === 0x76/* v */) ? '\x0B' : - (c === 0x66/* f */) ? '\x0C' : - (c === 0x72/* r */) ? '\x0D' : - (c === 0x65/* e */) ? '\x1B' : - (c === 0x20/* Space */) ? ' ' : - (c === 0x22/* " */) ? '\x22' : - (c === 0x2F/* / */) ? '/' : - (c === 0x5C/* \ */) ? '\x5C' : - (c === 0x4E/* N */) ? '\x85' : - (c === 0x5F/* _ */) ? '\xA0' : - (c === 0x4C/* L */) ? '\u2028' : - (c === 0x50/* P */) ? '\u2029' : ''; -} - -function charFromCodepoint(c) { - if (c <= 0xFFFF) { - return String.fromCharCode(c); - } - // Encode UTF-16 surrogate pair - // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF - return String.fromCharCode(((c - 0x010000) >> 10) + 0xD800, - ((c - 0x010000) & 0x03FF) + 0xDC00); -} - -var simpleEscapeCheck = new Array(256); // integer, for fast access -var simpleEscapeMap = new Array(256); -for (var i = 0; i < 256; i++) { - simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; - simpleEscapeMap[i] = simpleEscapeSequence(i); -} - - -function State(input, options) { - this.input = input; - - this.filename = options['filename'] || null; - this.schema = options['schema'] || DEFAULT_FULL_SCHEMA; - this.onWarning = options['onWarning'] || null; - this.legacy = options['legacy'] || false; - this.json = options['json'] || false; - this.listener = options['listener'] || null; - - this.implicitTypes = this.schema.compiledImplicit; - this.typeMap = this.schema.compiledTypeMap; - - this.length = input.length; - this.position = 0; - this.line = 0; - this.lineStart = 0; - this.lineIndent = 0; - - this.documents = []; - - /* - this.version; - this.checkLineBreaks; - this.tagMap; - this.anchorMap; - this.tag; - this.anchor; - this.kind; - this.result;*/ - -} - - -function generateError(state, message) { - return new YAMLException( - message, - new Mark(state.filename, state.input, state.position, state.line, (state.position - state.lineStart))); -} - -function throwError(state, message) { - throw generateError(state, message); -} - -function throwWarning(state, message) { - if (state.onWarning) { - state.onWarning.call(null, generateError(state, message)); - } -} - - -var directiveHandlers = { - - YAML: function handleYamlDirective(state, name, args) { - - var match, major, minor; - - if (state.version !== null) { - throwError(state, 'duplication of %YAML directive'); - } - - if (args.length !== 1) { - throwError(state, 'YAML directive accepts exactly one argument'); - } - - match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); - - if (match === null) { - throwError(state, 'ill-formed argument of the YAML directive'); - } - - major = parseInt(match[1], 10); - minor = parseInt(match[2], 10); - - if (major !== 1) { - throwError(state, 'unacceptable YAML version of the document'); - } - - state.version = args[0]; - state.checkLineBreaks = (minor < 2); - - if (minor !== 1 && minor !== 2) { - throwWarning(state, 'unsupported YAML version of the document'); - } - }, - - TAG: function handleTagDirective(state, name, args) { - - var handle, prefix; - - if (args.length !== 2) { - throwError(state, 'TAG directive accepts exactly two arguments'); - } - - handle = args[0]; - prefix = args[1]; - - if (!PATTERN_TAG_HANDLE.test(handle)) { - throwError(state, 'ill-formed tag handle (first argument) of the TAG directive'); - } - - if (_hasOwnProperty.call(state.tagMap, handle)) { - throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); - } - - if (!PATTERN_TAG_URI.test(prefix)) { - throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive'); - } - - state.tagMap[handle] = prefix; - } -}; - - -function captureSegment(state, start, end, checkJson) { - var _position, _length, _character, _result; - - if (start < end) { - _result = state.input.slice(start, end); - - if (checkJson) { - for (_position = 0, _length = _result.length; - _position < _length; - _position += 1) { - _character = _result.charCodeAt(_position); - if (!(_character === 0x09 || - (0x20 <= _character && _character <= 0x10FFFF))) { - throwError(state, 'expected valid JSON character'); - } - } - } else if (PATTERN_NON_PRINTABLE.test(_result)) { - throwError(state, 'the stream contains non-printable characters'); - } - - state.result += _result; - } -} - -function mergeMappings(state, destination, source, overridableKeys) { - var sourceKeys, key, index, quantity; - - if (!common.isObject(source)) { - throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); - } - - sourceKeys = Object.keys(source); - - for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { - key = sourceKeys[index]; - - if (!_hasOwnProperty.call(destination, key)) { - destination[key] = source[key]; - overridableKeys[key] = true; - } - } -} - -function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode) { - var index, quantity; - - keyNode = String(keyNode); - - if (_result === null) { - _result = {}; - } - - if (keyTag === 'tag:yaml.org,2002:merge') { - if (Array.isArray(valueNode)) { - for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { - mergeMappings(state, _result, valueNode[index], overridableKeys); - } - } else { - mergeMappings(state, _result, valueNode, overridableKeys); - } - } else { - if (!state.json && - !_hasOwnProperty.call(overridableKeys, keyNode) && - _hasOwnProperty.call(_result, keyNode)) { - throwError(state, 'duplicated mapping key'); - } - _result[keyNode] = valueNode; - delete overridableKeys[keyNode]; - } - - return _result; -} - -function readLineBreak(state) { - var ch; - - ch = state.input.charCodeAt(state.position); - - if (ch === 0x0A/* LF */) { - state.position++; - } else if (ch === 0x0D/* CR */) { - state.position++; - if (state.input.charCodeAt(state.position) === 0x0A/* LF */) { - state.position++; - } - } else { - throwError(state, 'a line break is expected'); - } - - state.line += 1; - state.lineStart = state.position; -} - -function skipSeparationSpace(state, allowComments, checkIndent) { - var lineBreaks = 0, - ch = state.input.charCodeAt(state.position); - - while (ch !== 0) { - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (allowComments && ch === 0x23/* # */) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0); - } - - if (is_EOL(ch)) { - readLineBreak(state); - - ch = state.input.charCodeAt(state.position); - lineBreaks++; - state.lineIndent = 0; - - while (ch === 0x20/* Space */) { - state.lineIndent++; - ch = state.input.charCodeAt(++state.position); - } - } else { - break; - } - } - - if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { - throwWarning(state, 'deficient indentation'); - } - - return lineBreaks; -} - -function testDocumentSeparator(state) { - var _position = state.position, - ch; - - ch = state.input.charCodeAt(_position); - - // Condition state.position === state.lineStart is tested - // in parent on each call, for efficiency. No needs to test here again. - if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) && - ch === state.input.charCodeAt(_position + 1) && - ch === state.input.charCodeAt(_position + 2)) { - - _position += 3; - - ch = state.input.charCodeAt(_position); - - if (ch === 0 || is_WS_OR_EOL(ch)) { - return true; - } - } - - return false; -} - -function writeFoldedLines(state, count) { - if (count === 1) { - state.result += ' '; - } else if (count > 1) { - state.result += common.repeat('\n', count - 1); - } -} - - -function readPlainScalar(state, nodeIndent, withinFlowCollection) { - var preceding, - following, - captureStart, - captureEnd, - hasPendingContent, - _line, - _lineStart, - _lineIndent, - _kind = state.kind, - _result = state.result, - ch; - - ch = state.input.charCodeAt(state.position); - - if (is_WS_OR_EOL(ch) || - is_FLOW_INDICATOR(ch) || - ch === 0x23/* # */ || - ch === 0x26/* & */ || - ch === 0x2A/* * */ || - ch === 0x21/* ! */ || - ch === 0x7C/* | */ || - ch === 0x3E/* > */ || - ch === 0x27/* ' */ || - ch === 0x22/* " */ || - ch === 0x25/* % */ || - ch === 0x40/* @ */ || - ch === 0x60/* ` */) { - return false; - } - - if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following) || - withinFlowCollection && is_FLOW_INDICATOR(following)) { - return false; - } - } - - state.kind = 'scalar'; - state.result = ''; - captureStart = captureEnd = state.position; - hasPendingContent = false; - - while (ch !== 0) { - if (ch === 0x3A/* : */) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following) || - withinFlowCollection && is_FLOW_INDICATOR(following)) { - break; - } - - } else if (ch === 0x23/* # */) { - preceding = state.input.charCodeAt(state.position - 1); - - if (is_WS_OR_EOL(preceding)) { - break; - } - - } else if ((state.position === state.lineStart && testDocumentSeparator(state)) || - withinFlowCollection && is_FLOW_INDICATOR(ch)) { - break; - - } else if (is_EOL(ch)) { - _line = state.line; - _lineStart = state.lineStart; - _lineIndent = state.lineIndent; - skipSeparationSpace(state, false, -1); - - if (state.lineIndent >= nodeIndent) { - hasPendingContent = true; - ch = state.input.charCodeAt(state.position); - continue; - } else { - state.position = captureEnd; - state.line = _line; - state.lineStart = _lineStart; - state.lineIndent = _lineIndent; - break; - } - } - - if (hasPendingContent) { - captureSegment(state, captureStart, captureEnd, false); - writeFoldedLines(state, state.line - _line); - captureStart = captureEnd = state.position; - hasPendingContent = false; - } - - if (!is_WHITE_SPACE(ch)) { - captureEnd = state.position + 1; - } - - ch = state.input.charCodeAt(++state.position); - } - - captureSegment(state, captureStart, captureEnd, false); - - if (state.result) { - return true; - } - - state.kind = _kind; - state.result = _result; - return false; -} - -function readSingleQuotedScalar(state, nodeIndent) { - var ch, - captureStart, captureEnd; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x27/* ' */) { - return false; - } - - state.kind = 'scalar'; - state.result = ''; - state.position++; - captureStart = captureEnd = state.position; - - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x27/* ' */) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x27/* ' */) { - captureStart = captureEnd = state.position; - state.position++; - } else { - return true; - } - - } else if (is_EOL(ch)) { - captureSegment(state, captureStart, captureEnd, true); - writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); - captureStart = captureEnd = state.position; - - } else if (state.position === state.lineStart && testDocumentSeparator(state)) { - throwError(state, 'unexpected end of the document within a single quoted scalar'); - - } else { - state.position++; - captureEnd = state.position; - } - } - - throwError(state, 'unexpected end of the stream within a single quoted scalar'); -} - -function readDoubleQuotedScalar(state, nodeIndent) { - var captureStart, - captureEnd, - hexLength, - hexResult, - tmp, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x22/* " */) { - return false; - } - - state.kind = 'scalar'; - state.result = ''; - state.position++; - captureStart = captureEnd = state.position; - - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x22/* " */) { - captureSegment(state, captureStart, state.position, true); - state.position++; - return true; - - } else if (ch === 0x5C/* \ */) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - - if (is_EOL(ch)) { - skipSeparationSpace(state, false, nodeIndent); - - // TODO: rework to inline fn with no type cast? - } else if (ch < 256 && simpleEscapeCheck[ch]) { - state.result += simpleEscapeMap[ch]; - state.position++; - - } else if ((tmp = escapedHexLen(ch)) > 0) { - hexLength = tmp; - hexResult = 0; - - for (; hexLength > 0; hexLength--) { - ch = state.input.charCodeAt(++state.position); - - if ((tmp = fromHexCode(ch)) >= 0) { - hexResult = (hexResult << 4) + tmp; - - } else { - throwError(state, 'expected hexadecimal character'); - } - } - - state.result += charFromCodepoint(hexResult); - - state.position++; - - } else { - throwError(state, 'unknown escape sequence'); - } - - captureStart = captureEnd = state.position; - - } else if (is_EOL(ch)) { - captureSegment(state, captureStart, captureEnd, true); - writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); - captureStart = captureEnd = state.position; - - } else if (state.position === state.lineStart && testDocumentSeparator(state)) { - throwError(state, 'unexpected end of the document within a double quoted scalar'); - - } else { - state.position++; - captureEnd = state.position; - } - } - - throwError(state, 'unexpected end of the stream within a double quoted scalar'); -} - -function readFlowCollection(state, nodeIndent) { - var readNext = true, - _line, - _tag = state.tag, - _result, - _anchor = state.anchor, - following, - terminator, - isPair, - isExplicitPair, - isMapping, - overridableKeys = {}, - keyNode, - keyTag, - valueNode, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch === 0x5B/* [ */) { - terminator = 0x5D;/* ] */ - isMapping = false; - _result = []; - } else if (ch === 0x7B/* { */) { - terminator = 0x7D;/* } */ - isMapping = true; - _result = {}; - } else { - return false; - } - - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; - } - - ch = state.input.charCodeAt(++state.position); - - while (ch !== 0) { - skipSeparationSpace(state, true, nodeIndent); - - ch = state.input.charCodeAt(state.position); - - if (ch === terminator) { - state.position++; - state.tag = _tag; - state.anchor = _anchor; - state.kind = isMapping ? 'mapping' : 'sequence'; - state.result = _result; - return true; - } else if (!readNext) { - throwError(state, 'missed comma between flow collection entries'); - } - - keyTag = keyNode = valueNode = null; - isPair = isExplicitPair = false; - - if (ch === 0x3F/* ? */) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following)) { - isPair = isExplicitPair = true; - state.position++; - skipSeparationSpace(state, true, nodeIndent); - } - } - - _line = state.line; - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - keyTag = state.tag; - keyNode = state.result; - skipSeparationSpace(state, true, nodeIndent); - - ch = state.input.charCodeAt(state.position); - - if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) { - isPair = true; - ch = state.input.charCodeAt(++state.position); - skipSeparationSpace(state, true, nodeIndent); - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - valueNode = state.result; - } - - if (isMapping) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); - } else if (isPair) { - _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode)); - } else { - _result.push(keyNode); - } - - skipSeparationSpace(state, true, nodeIndent); - - ch = state.input.charCodeAt(state.position); - - if (ch === 0x2C/* , */) { - readNext = true; - ch = state.input.charCodeAt(++state.position); - } else { - readNext = false; - } - } - - throwError(state, 'unexpected end of the stream within a flow collection'); -} - -function readBlockScalar(state, nodeIndent) { - var captureStart, - folding, - chomping = CHOMPING_CLIP, - didReadContent = false, - detectedIndent = false, - textIndent = nodeIndent, - emptyLines = 0, - atMoreIndented = false, - tmp, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch === 0x7C/* | */) { - folding = false; - } else if (ch === 0x3E/* > */) { - folding = true; - } else { - return false; - } - - state.kind = 'scalar'; - state.result = ''; - - while (ch !== 0) { - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x2B/* + */ || ch === 0x2D/* - */) { - if (CHOMPING_CLIP === chomping) { - chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP; - } else { - throwError(state, 'repeat of a chomping mode identifier'); - } - - } else if ((tmp = fromDecimalCode(ch)) >= 0) { - if (tmp === 0) { - throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one'); - } else if (!detectedIndent) { - textIndent = nodeIndent + tmp - 1; - detectedIndent = true; - } else { - throwError(state, 'repeat of an indentation width identifier'); - } - - } else { - break; - } - } - - if (is_WHITE_SPACE(ch)) { - do { ch = state.input.charCodeAt(++state.position); } - while (is_WHITE_SPACE(ch)); - - if (ch === 0x23/* # */) { - do { ch = state.input.charCodeAt(++state.position); } - while (!is_EOL(ch) && (ch !== 0)); - } - } - - while (ch !== 0) { - readLineBreak(state); - state.lineIndent = 0; - - ch = state.input.charCodeAt(state.position); - - while ((!detectedIndent || state.lineIndent < textIndent) && - (ch === 0x20/* Space */)) { - state.lineIndent++; - ch = state.input.charCodeAt(++state.position); - } - - if (!detectedIndent && state.lineIndent > textIndent) { - textIndent = state.lineIndent; - } - - if (is_EOL(ch)) { - emptyLines++; - continue; - } - - // End of the scalar. - if (state.lineIndent < textIndent) { - - // Perform the chomping. - if (chomping === CHOMPING_KEEP) { - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - } else if (chomping === CHOMPING_CLIP) { - if (didReadContent) { // i.e. only if the scalar is not empty. - state.result += '\n'; - } - } - - // Break this `while` cycle and go to the funciton's epilogue. - break; - } - - // Folded style: use fancy rules to handle line breaks. - if (folding) { - - // Lines starting with white space characters (more-indented lines) are not folded. - if (is_WHITE_SPACE(ch)) { - atMoreIndented = true; - // except for the first content line (cf. Example 8.1) - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - - // End of more-indented block. - } else if (atMoreIndented) { - atMoreIndented = false; - state.result += common.repeat('\n', emptyLines + 1); - - // Just one line break - perceive as the same line. - } else if (emptyLines === 0) { - if (didReadContent) { // i.e. only if we have already read some scalar content. - state.result += ' '; - } - - // Several line breaks - perceive as different lines. - } else { - state.result += common.repeat('\n', emptyLines); - } - - // Literal style: just add exact number of line breaks between content lines. - } else { - // Keep all line breaks except the header line break. - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - } - - didReadContent = true; - detectedIndent = true; - emptyLines = 0; - captureStart = state.position; - - while (!is_EOL(ch) && (ch !== 0)) { - ch = state.input.charCodeAt(++state.position); - } - - captureSegment(state, captureStart, state.position, false); - } - - return true; -} - -function readBlockSequence(state, nodeIndent) { - var _line, - _tag = state.tag, - _anchor = state.anchor, - _result = [], - following, - detected = false, - ch; - - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; - } - - ch = state.input.charCodeAt(state.position); - - while (ch !== 0) { - - if (ch !== 0x2D/* - */) { - break; - } - - following = state.input.charCodeAt(state.position + 1); - - if (!is_WS_OR_EOL(following)) { - break; - } - - detected = true; - state.position++; - - if (skipSeparationSpace(state, true, -1)) { - if (state.lineIndent <= nodeIndent) { - _result.push(null); - ch = state.input.charCodeAt(state.position); - continue; - } - } - - _line = state.line; - composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); - _result.push(state.result); - skipSeparationSpace(state, true, -1); - - ch = state.input.charCodeAt(state.position); - - if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) { - throwError(state, 'bad indentation of a sequence entry'); - } else if (state.lineIndent < nodeIndent) { - break; - } - } - - if (detected) { - state.tag = _tag; - state.anchor = _anchor; - state.kind = 'sequence'; - state.result = _result; - return true; - } - return false; -} - -function readBlockMapping(state, nodeIndent, flowIndent) { - var following, - allowCompact, - _line, - _tag = state.tag, - _anchor = state.anchor, - _result = {}, - overridableKeys = {}, - keyTag = null, - keyNode = null, - valueNode = null, - atExplicitKey = false, - detected = false, - ch; - - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; - } - - ch = state.input.charCodeAt(state.position); - - while (ch !== 0) { - following = state.input.charCodeAt(state.position + 1); - _line = state.line; // Save the current line. - - // - // Explicit notation case. There are two separate blocks: - // first for the key (denoted by "?") and second for the value (denoted by ":") - // - if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) { - - if (ch === 0x3F/* ? */) { - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - keyTag = keyNode = valueNode = null; - } - - detected = true; - atExplicitKey = true; - allowCompact = true; - - } else if (atExplicitKey) { - // i.e. 0x3A/* : */ === character after the explicit key. - atExplicitKey = false; - allowCompact = true; - - } else { - throwError(state, 'incomplete explicit mapping pair; a key node is missed'); - } - - state.position += 1; - ch = following; - - // - // Implicit notation case. Flow-style node as the key first, then ":", and the value. - // - } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { - - if (state.line === _line) { - ch = state.input.charCodeAt(state.position); - - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (ch === 0x3A/* : */) { - ch = state.input.charCodeAt(++state.position); - - if (!is_WS_OR_EOL(ch)) { - throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); - } - - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - keyTag = keyNode = valueNode = null; - } - - detected = true; - atExplicitKey = false; - allowCompact = false; - keyTag = state.tag; - keyNode = state.result; - - } else if (detected) { - throwError(state, 'can not read an implicit mapping pair; a colon is missed'); - - } else { - state.tag = _tag; - state.anchor = _anchor; - return true; // Keep the result of `composeNode`. - } - - } else if (detected) { - throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key'); - - } else { - state.tag = _tag; - state.anchor = _anchor; - return true; // Keep the result of `composeNode`. - } - - } else { - break; // Reading is done. Go to the epilogue. - } - - // - // Common reading code for both explicit and implicit notations. - // - if (state.line === _line || state.lineIndent > nodeIndent) { - if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { - if (atExplicitKey) { - keyNode = state.result; - } else { - valueNode = state.result; - } - } - - if (!atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); - keyTag = keyNode = valueNode = null; - } - - skipSeparationSpace(state, true, -1); - ch = state.input.charCodeAt(state.position); - } - - if (state.lineIndent > nodeIndent && (ch !== 0)) { - throwError(state, 'bad indentation of a mapping entry'); - } else if (state.lineIndent < nodeIndent) { - break; - } - } - - // - // Epilogue. - // - - // Special case: last mapping's node contains only the key in explicit notation. - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - } - - // Expose the resulting mapping. - if (detected) { - state.tag = _tag; - state.anchor = _anchor; - state.kind = 'mapping'; - state.result = _result; - } - - return detected; -} - -function readTagProperty(state) { - var _position, - isVerbatim = false, - isNamed = false, - tagHandle, - tagName, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x21/* ! */) return false; - - if (state.tag !== null) { - throwError(state, 'duplication of a tag property'); - } - - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x3C/* < */) { - isVerbatim = true; - ch = state.input.charCodeAt(++state.position); - - } else if (ch === 0x21/* ! */) { - isNamed = true; - tagHandle = '!!'; - ch = state.input.charCodeAt(++state.position); - - } else { - tagHandle = '!'; - } - - _position = state.position; - - if (isVerbatim) { - do { ch = state.input.charCodeAt(++state.position); } - while (ch !== 0 && ch !== 0x3E/* > */); - - if (state.position < state.length) { - tagName = state.input.slice(_position, state.position); - ch = state.input.charCodeAt(++state.position); - } else { - throwError(state, 'unexpected end of the stream within a verbatim tag'); - } - } else { - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - - if (ch === 0x21/* ! */) { - if (!isNamed) { - tagHandle = state.input.slice(_position - 1, state.position + 1); - - if (!PATTERN_TAG_HANDLE.test(tagHandle)) { - throwError(state, 'named tag handle cannot contain such characters'); - } - - isNamed = true; - _position = state.position + 1; - } else { - throwError(state, 'tag suffix cannot contain exclamation marks'); - } - } - - ch = state.input.charCodeAt(++state.position); - } - - tagName = state.input.slice(_position, state.position); - - if (PATTERN_FLOW_INDICATORS.test(tagName)) { - throwError(state, 'tag suffix cannot contain flow indicator characters'); - } - } - - if (tagName && !PATTERN_TAG_URI.test(tagName)) { - throwError(state, 'tag name cannot contain such characters: ' + tagName); - } - - if (isVerbatim) { - state.tag = tagName; - - } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) { - state.tag = state.tagMap[tagHandle] + tagName; - - } else if (tagHandle === '!') { - state.tag = '!' + tagName; - - } else if (tagHandle === '!!') { - state.tag = 'tag:yaml.org,2002:' + tagName; - - } else { - throwError(state, 'undeclared tag handle "' + tagHandle + '"'); - } - - return true; -} - -function readAnchorProperty(state) { - var _position, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x26/* & */) return false; - - if (state.anchor !== null) { - throwError(state, 'duplication of an anchor property'); - } - - ch = state.input.charCodeAt(++state.position); - _position = state.position; - - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (state.position === _position) { - throwError(state, 'name of an anchor node must contain at least one character'); - } - - state.anchor = state.input.slice(_position, state.position); - return true; -} - -function readAlias(state) { - var _position, alias, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x2A/* * */) return false; - - ch = state.input.charCodeAt(++state.position); - _position = state.position; - - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (state.position === _position) { - throwError(state, 'name of an alias node must contain at least one character'); - } - - alias = state.input.slice(_position, state.position); - - if (!state.anchorMap.hasOwnProperty(alias)) { - throwError(state, 'unidentified alias "' + alias + '"'); - } - - state.result = state.anchorMap[alias]; - skipSeparationSpace(state, true, -1); - return true; -} - -function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { - var allowBlockStyles, - allowBlockScalars, - allowBlockCollections, - indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) { - indentStatus = 1; - } else if (state.lineIndent === parentIndent) { - indentStatus = 0; - } else if (state.lineIndent < parentIndent) { - indentStatus = -1; - } - } - } - - if (indentStatus === 1) { - while (readTagProperty(state) || readAnchorProperty(state)) { - if (skipSeparationSpace(state, true, -1)) { - atNewLine = true; - allowBlockCollections = allowBlockStyles; - - if (state.lineIndent > parentIndent) { - indentStatus = 1; - } else if (state.lineIndent === parentIndent) { - indentStatus = 0; - } else if (state.lineIndent < parentIndent) { - indentStatus = -1; - } - } else { - allowBlockCollections = false; - } - } - } - - if (allowBlockCollections) { - allowBlockCollections = atNewLine || allowCompact; - } - - if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { - if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { - flowIndent = parentIndent; - } else { - flowIndent = parentIndent + 1; - } - - blockIndent = state.position - state.lineStart; - - if (indentStatus === 1) { - if (allowBlockCollections && - (readBlockSequence(state, blockIndent) || - readBlockMapping(state, blockIndent, flowIndent)) || - readFlowCollection(state, flowIndent)) { - hasContent = true; - } else { - if ((allowBlockScalars && readBlockScalar(state, flowIndent)) || - readSingleQuotedScalar(state, flowIndent) || - readDoubleQuotedScalar(state, flowIndent)) { - hasContent = true; - - } else if (readAlias(state)) { - hasContent = true; - - if (state.tag !== null || state.anchor !== null) { - throwError(state, 'alias node should not have any properties'); - } - - } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { - hasContent = true; - - if (state.tag === null) { - state.tag = '?'; - } - } - - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - } - } else if (indentStatus === 0) { - // Special case: block sequences are allowed to have same indentation level as the parent. - // http://www.yaml.org/spec/1.2/spec.html#id2799784 - hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); - } - } - - if (state.tag !== null && state.tag !== '!') { - if (state.tag === '?') { - for (typeIndex = 0, typeQuantity = state.implicitTypes.length; - typeIndex < typeQuantity; - typeIndex += 1) { - type = state.implicitTypes[typeIndex]; - - // Implicit resolving is not allowed for non-scalar types, and '?' - // non-specific tag is only assigned to plain scalars. So, it isn't - // needed to check for 'kind' conformity. - - if (type.resolve(state.result)) { // `state.result` updated in resolver if matched - state.result = type.construct(state.result); - state.tag = type.tag; - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - break; - } - } - } else if (_hasOwnProperty.call(state.typeMap, state.tag)) { - type = state.typeMap[state.tag]; - - if (state.result !== null && type.kind !== state.kind) { - throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); - } - - if (!type.resolve(state.result)) { // `state.result` updated in resolver if matched - throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); - } else { - state.result = type.construct(state.result); - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - } - } else { - throwError(state, 'unknown tag !<' + state.tag + '>'); - } - } - - if (state.listener !== null) { - state.listener('close', state); - } - return state.tag !== null || state.anchor !== null || hasContent; -} - -function readDocument(state) { - var documentStart = state.position, - _position, - directiveName, - directiveArgs, - hasDirectives = false, - ch; - - state.version = null; - state.checkLineBreaks = state.legacy; - state.tagMap = {}; - state.anchorMap = {}; - - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - skipSeparationSpace(state, true, -1); - - ch = state.input.charCodeAt(state.position); - - if (state.lineIndent > 0 || ch !== 0x25/* % */) { - break; - } - - hasDirectives = true; - ch = state.input.charCodeAt(++state.position); - _position = state.position; - - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - directiveName = state.input.slice(_position, state.position); - directiveArgs = []; - - if (directiveName.length < 1) { - throwError(state, 'directive name must not be less than one character in length'); - } - - while (ch !== 0) { - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (ch === 0x23/* # */) { - do { ch = state.input.charCodeAt(++state.position); } - while (ch !== 0 && !is_EOL(ch)); - break; - } - - if (is_EOL(ch)) break; - - _position = state.position; - - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - directiveArgs.push(state.input.slice(_position, state.position)); - } - - if (ch !== 0) readLineBreak(state); - - if (_hasOwnProperty.call(directiveHandlers, directiveName)) { - directiveHandlers[directiveName](state, directiveName, directiveArgs); - } else { - throwWarning(state, 'unknown document directive "' + directiveName + '"'); - } - } - - skipSeparationSpace(state, true, -1); - - if (state.lineIndent === 0 && - state.input.charCodeAt(state.position) === 0x2D/* - */ && - state.input.charCodeAt(state.position + 1) === 0x2D/* - */ && - state.input.charCodeAt(state.position + 2) === 0x2D/* - */) { - state.position += 3; - skipSeparationSpace(state, true, -1); - - } else if (hasDirectives) { - throwError(state, 'directives end mark is expected'); - } - - composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); - skipSeparationSpace(state, true, -1); - - if (state.checkLineBreaks && - PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { - throwWarning(state, 'non-ASCII line breaks are interpreted as content'); - } - - state.documents.push(state.result); - - if (state.position === state.lineStart && testDocumentSeparator(state)) { - - if (state.input.charCodeAt(state.position) === 0x2E/* . */) { - state.position += 3; - skipSeparationSpace(state, true, -1); - } - return; - } - - if (state.position < (state.length - 1)) { - throwError(state, 'end of the stream or a document separator is expected'); - } else { - return; - } -} - - -function loadDocuments(input, options) { - input = String(input); - options = options || {}; - - if (input.length !== 0) { - - // Add tailing `\n` if not exists - if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ && - input.charCodeAt(input.length - 1) !== 0x0D/* CR */) { - input += '\n'; - } - - // Strip BOM - if (input.charCodeAt(0) === 0xFEFF) { - input = input.slice(1); - } - } - - var state = new State(input, options); - - // Use 0 as string terminator. That significantly simplifies bounds check. - state.input += '\0'; - - while (state.input.charCodeAt(state.position) === 0x20/* Space */) { - state.lineIndent += 1; - state.position += 1; - } - - while (state.position < (state.length - 1)) { - readDocument(state); - } - - return state.documents; -} - - -function loadAll(input, iterator, options) { - var documents = loadDocuments(input, options), index, length; - - for (index = 0, length = documents.length; index < length; index += 1) { - iterator(documents[index]); - } -} - - -function load(input, options) { - var documents = loadDocuments(input, options); - - if (documents.length === 0) { - /*eslint-disable no-undefined*/ - return undefined; - } else if (documents.length === 1) { - return documents[0]; - } - throw new YAMLException('expected a single document in the stream, but found more'); -} - - -function safeLoadAll(input, output, options) { - loadAll(input, output, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); -} - - -function safeLoad(input, options) { - return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); -} - - -module.exports.loadAll = loadAll; -module.exports.load = load; -module.exports.safeLoadAll = safeLoadAll; -module.exports.safeLoad = safeLoad; - -},{"./common":21,"./exception":23,"./mark":25,"./schema/default_full":28,"./schema/default_safe":29}],25:[function(require,module,exports){ -'use strict'; - - -var common = require('./common'); - - -function Mark(name, buffer, position, line, column) { - this.name = name; - this.buffer = buffer; - this.position = position; - this.line = line; - this.column = column; -} - - -Mark.prototype.getSnippet = function getSnippet(indent, maxLength) { - var head, start, tail, end, snippet; - - if (!this.buffer) return null; - - indent = indent || 4; - maxLength = maxLength || 75; - - head = ''; - start = this.position; - - while (start > 0 && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(start - 1)) === -1) { - start -= 1; - if (this.position - start > (maxLength / 2 - 1)) { - head = ' ... '; - start += 5; - break; - } - } - - tail = ''; - end = this.position; - - while (end < this.buffer.length && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(end)) === -1) { - end += 1; - if (end - this.position > (maxLength / 2 - 1)) { - tail = ' ... '; - end -= 5; - break; - } - } - - snippet = this.buffer.slice(start, end); - - return common.repeat(' ', indent) + head + snippet + tail + '\n' + - common.repeat(' ', indent + this.position - start + head.length) + '^'; -}; - - -Mark.prototype.toString = function toString(compact) { - var snippet, where = ''; - - if (this.name) { - where += 'in "' + this.name + '" '; - } - - where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1); - - if (!compact) { - snippet = this.getSnippet(); - - if (snippet) { - where += ':\n' + snippet; - } - } - - return where; -}; - - -module.exports = Mark; - -},{"./common":21}],26:[function(require,module,exports){ -'use strict'; - -/*eslint-disable max-len*/ - -var common = require('./common'); -var YAMLException = require('./exception'); -var Type = require('./type'); - - -function compileList(schema, name, result) { - var exclude = []; - - schema.include.forEach(function (includedSchema) { - result = compileList(includedSchema, name, result); - }); - - schema[name].forEach(function (currentType) { - result.forEach(function (previousType, previousIndex) { - if (previousType.tag === currentType.tag) { - exclude.push(previousIndex); - } - }); - - result.push(currentType); - }); - - return result.filter(function (type, index) { - return exclude.indexOf(index) === -1; - }); -} - - -function compileMap(/* lists... */) { - var result = {}, index, length; - - function collectType(type) { - result[type.tag] = type; - } - - for (index = 0, length = arguments.length; index < length; index += 1) { - arguments[index].forEach(collectType); - } - - return result; -} - - -function Schema(definition) { - this.include = definition.include || []; - this.implicit = definition.implicit || []; - this.explicit = definition.explicit || []; - - this.implicit.forEach(function (type) { - if (type.loadKind && type.loadKind !== 'scalar') { - throw new YAMLException('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.'); - } - }); - - this.compiledImplicit = compileList(this, 'implicit', []); - this.compiledExplicit = compileList(this, 'explicit', []); - this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit); -} - - -Schema.DEFAULT = null; - - -Schema.create = function createSchema() { - var schemas, types; - - switch (arguments.length) { - case 1: - schemas = Schema.DEFAULT; - types = arguments[0]; - break; - - case 2: - schemas = arguments[0]; - types = arguments[1]; - break; - - default: - throw new YAMLException('Wrong number of arguments for Schema.create function'); - } - - schemas = common.toArray(schemas); - types = common.toArray(types); - - if (!schemas.every(function (schema) { return schema instanceof Schema; })) { - throw new YAMLException('Specified list of super schemas (or a single Schema object) contains a non-Schema object.'); - } - - if (!types.every(function (type) { return type instanceof Type; })) { - throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.'); - } - - return new Schema({ - include: schemas, - explicit: types - }); -}; - - -module.exports = Schema; - -},{"./common":21,"./exception":23,"./type":32}],27:[function(require,module,exports){ -// Standard YAML's Core schema. -// http://www.yaml.org/spec/1.2/spec.html#id2804923 -// -// NOTE: JS-YAML does not support schema-specific tag resolution restrictions. -// So, Core schema has no distinctions from JSON schema is JS-YAML. - - -'use strict'; - - -var Schema = require('../schema'); - - -module.exports = new Schema({ - include: [ - require('./json') - ] -}); - -},{"../schema":26,"./json":31}],28:[function(require,module,exports){ -// JS-YAML's default schema for `load` function. -// It is not described in the YAML specification. -// -// This schema is based on JS-YAML's default safe schema and includes -// JavaScript-specific types: !!js/undefined, !!js/regexp and !!js/function. -// -// Also this schema is used as default base schema at `Schema.create` function. - - -'use strict'; - - -var Schema = require('../schema'); - - -module.exports = Schema.DEFAULT = new Schema({ - include: [ - require('./default_safe') - ], - explicit: [ - require('../type/js/undefined'), - require('../type/js/regexp'), - require('../type/js/function') - ] -}); - -},{"../schema":26,"../type/js/function":37,"../type/js/regexp":38,"../type/js/undefined":39,"./default_safe":29}],29:[function(require,module,exports){ -// JS-YAML's default schema for `safeLoad` function. -// It is not described in the YAML specification. -// -// This schema is based on standard YAML's Core schema and includes most of -// extra types described at YAML tag repository. (http://yaml.org/type/) - - -'use strict'; - - -var Schema = require('../schema'); - - -module.exports = new Schema({ - include: [ - require('./core') - ], - implicit: [ - require('../type/timestamp'), - require('../type/merge') - ], - explicit: [ - require('../type/binary'), - require('../type/omap'), - require('../type/pairs'), - require('../type/set') - ] -}); - -},{"../schema":26,"../type/binary":33,"../type/merge":41,"../type/omap":43,"../type/pairs":44,"../type/set":46,"../type/timestamp":48,"./core":27}],30:[function(require,module,exports){ -// Standard YAML's Failsafe schema. -// http://www.yaml.org/spec/1.2/spec.html#id2802346 - - -'use strict'; - - -var Schema = require('../schema'); - - -module.exports = new Schema({ - explicit: [ - require('../type/str'), - require('../type/seq'), - require('../type/map') - ] -}); - -},{"../schema":26,"../type/map":40,"../type/seq":45,"../type/str":47}],31:[function(require,module,exports){ -// Standard YAML's JSON schema. -// http://www.yaml.org/spec/1.2/spec.html#id2803231 -// -// NOTE: JS-YAML does not support schema-specific tag resolution restrictions. -// So, this schema is not such strict as defined in the YAML specification. -// It allows numbers in binary notaion, use `Null` and `NULL` as `null`, etc. - - -'use strict'; - - -var Schema = require('../schema'); - - -module.exports = new Schema({ - include: [ - require('./failsafe') - ], - implicit: [ - require('../type/null'), - require('../type/bool'), - require('../type/int'), - require('../type/float') - ] -}); - -},{"../schema":26,"../type/bool":34,"../type/float":35,"../type/int":36,"../type/null":42,"./failsafe":30}],32:[function(require,module,exports){ -'use strict'; - -var YAMLException = require('./exception'); - -var TYPE_CONSTRUCTOR_OPTIONS = [ - 'kind', - 'resolve', - 'construct', - 'instanceOf', - 'predicate', - 'represent', - 'defaultStyle', - 'styleAliases' -]; - -var YAML_NODE_KINDS = [ - 'scalar', - 'sequence', - 'mapping' -]; - -function compileStyleAliases(map) { - var result = {}; - - if (map !== null) { - Object.keys(map).forEach(function (style) { - map[style].forEach(function (alias) { - result[String(alias)] = style; - }); - }); - } - - return result; -} - -function Type(tag, options) { - options = options || {}; - - Object.keys(options).forEach(function (name) { - if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { - throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); - } - }); - - // TODO: Add tag format check. - this.tag = tag; - this.kind = options['kind'] || null; - this.resolve = options['resolve'] || function () { return true; }; - this.construct = options['construct'] || function (data) { return data; }; - this.instanceOf = options['instanceOf'] || null; - this.predicate = options['predicate'] || null; - this.represent = options['represent'] || null; - this.defaultStyle = options['defaultStyle'] || null; - this.styleAliases = compileStyleAliases(options['styleAliases'] || null); - - if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { - throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); - } -} - -module.exports = Type; - -},{"./exception":23}],33:[function(require,module,exports){ -'use strict'; - -/*eslint-disable no-bitwise*/ - -var NodeBuffer; - -try { - // A trick for browserified version, to not include `Buffer` shim - var _require = require; - NodeBuffer = _require('buffer').Buffer; -} catch (__) {} - -var Type = require('../type'); - - -// [ 64, 65, 66 ] -> [ padding, CR, LF ] -var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; - - -function resolveYamlBinary(data) { - if (data === null) return false; - - var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP; - - // Convert one by one. - for (idx = 0; idx < max; idx++) { - code = map.indexOf(data.charAt(idx)); - - // Skip CR/LF - if (code > 64) continue; - - // Fail on illegal characters - if (code < 0) return false; - - bitlen += 6; - } - - // If there are any bits left, source was corrupted - return (bitlen % 8) === 0; -} - -function constructYamlBinary(data) { - var idx, tailbits, - input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan - max = input.length, - map = BASE64_MAP, - bits = 0, - result = []; - - // Collect by 6*4 bits (3 bytes) - - for (idx = 0; idx < max; idx++) { - if ((idx % 4 === 0) && idx) { - result.push((bits >> 16) & 0xFF); - result.push((bits >> 8) & 0xFF); - result.push(bits & 0xFF); - } - - bits = (bits << 6) | map.indexOf(input.charAt(idx)); - } - - // Dump tail - - tailbits = (max % 4) * 6; - - if (tailbits === 0) { - result.push((bits >> 16) & 0xFF); - result.push((bits >> 8) & 0xFF); - result.push(bits & 0xFF); - } else if (tailbits === 18) { - result.push((bits >> 10) & 0xFF); - result.push((bits >> 2) & 0xFF); - } else if (tailbits === 12) { - result.push((bits >> 4) & 0xFF); - } - - // Wrap into Buffer for NodeJS and leave Array for browser - if (NodeBuffer) return new NodeBuffer(result); - - return result; -} - -function representYamlBinary(object /*, style*/) { - var result = '', bits = 0, idx, tail, - max = object.length, - map = BASE64_MAP; - - // Convert every three bytes to 4 ASCII characters. - - for (idx = 0; idx < max; idx++) { - if ((idx % 3 === 0) && idx) { - result += map[(bits >> 18) & 0x3F]; - result += map[(bits >> 12) & 0x3F]; - result += map[(bits >> 6) & 0x3F]; - result += map[bits & 0x3F]; - } - - bits = (bits << 8) + object[idx]; - } - - // Dump tail - - tail = max % 3; - - if (tail === 0) { - result += map[(bits >> 18) & 0x3F]; - result += map[(bits >> 12) & 0x3F]; - result += map[(bits >> 6) & 0x3F]; - result += map[bits & 0x3F]; - } else if (tail === 2) { - result += map[(bits >> 10) & 0x3F]; - result += map[(bits >> 4) & 0x3F]; - result += map[(bits << 2) & 0x3F]; - result += map[64]; - } else if (tail === 1) { - result += map[(bits >> 2) & 0x3F]; - result += map[(bits << 4) & 0x3F]; - result += map[64]; - result += map[64]; - } - - return result; -} - -function isBinary(object) { - return NodeBuffer && NodeBuffer.isBuffer(object); -} - -module.exports = new Type('tag:yaml.org,2002:binary', { - kind: 'scalar', - resolve: resolveYamlBinary, - construct: constructYamlBinary, - predicate: isBinary, - represent: representYamlBinary -}); - -},{"../type":32}],34:[function(require,module,exports){ -'use strict'; - -var Type = require('../type'); - -function resolveYamlBoolean(data) { - if (data === null) return false; - - var max = data.length; - - return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) || - (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE')); -} - -function constructYamlBoolean(data) { - return data === 'true' || - data === 'True' || - data === 'TRUE'; -} - -function isBoolean(object) { - return Object.prototype.toString.call(object) === '[object Boolean]'; -} - -module.exports = new Type('tag:yaml.org,2002:bool', { - kind: 'scalar', - resolve: resolveYamlBoolean, - construct: constructYamlBoolean, - predicate: isBoolean, - represent: { - lowercase: function (object) { return object ? 'true' : 'false'; }, - uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; }, - camelcase: function (object) { return object ? 'True' : 'False'; } - }, - defaultStyle: 'lowercase' -}); - -},{"../type":32}],35:[function(require,module,exports){ -'use strict'; - -var common = require('../common'); -var Type = require('../type'); - -var YAML_FLOAT_PATTERN = new RegExp( - '^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?' + - '|\\.[0-9_]+(?:[eE][-+][0-9]+)?' + - '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' + - '|[-+]?\\.(?:inf|Inf|INF)' + - '|\\.(?:nan|NaN|NAN))$'); - -function resolveYamlFloat(data) { - if (data === null) return false; - - if (!YAML_FLOAT_PATTERN.test(data)) return false; - - return true; -} - -function constructYamlFloat(data) { - var value, sign, base, digits; - - value = data.replace(/_/g, '').toLowerCase(); - sign = value[0] === '-' ? -1 : 1; - digits = []; - - if ('+-'.indexOf(value[0]) >= 0) { - value = value.slice(1); - } - - if (value === '.inf') { - return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; - - } else if (value === '.nan') { - return NaN; - - } else if (value.indexOf(':') >= 0) { - value.split(':').forEach(function (v) { - digits.unshift(parseFloat(v, 10)); - }); - - value = 0.0; - base = 1; - - digits.forEach(function (d) { - value += d * base; - base *= 60; - }); - - return sign * value; - - } - return sign * parseFloat(value, 10); -} - - -var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; - -function representYamlFloat(object, style) { - var res; - - if (isNaN(object)) { - switch (style) { - case 'lowercase': return '.nan'; - case 'uppercase': return '.NAN'; - case 'camelcase': return '.NaN'; - } - } else if (Number.POSITIVE_INFINITY === object) { - switch (style) { - case 'lowercase': return '.inf'; - case 'uppercase': return '.INF'; - case 'camelcase': return '.Inf'; - } - } else if (Number.NEGATIVE_INFINITY === object) { - switch (style) { - case 'lowercase': return '-.inf'; - case 'uppercase': return '-.INF'; - case 'camelcase': return '-.Inf'; - } - } else if (common.isNegativeZero(object)) { - return '-0.0'; - } - - res = object.toString(10); - - // JS stringifier can build scientific format without dots: 5e-100, - // while YAML requres dot: 5.e-100. Fix it with simple hack - - return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; -} - -function isFloat(object) { - return (Object.prototype.toString.call(object) === '[object Number]') && - (object % 1 !== 0 || common.isNegativeZero(object)); -} - -module.exports = new Type('tag:yaml.org,2002:float', { - kind: 'scalar', - resolve: resolveYamlFloat, - construct: constructYamlFloat, - predicate: isFloat, - represent: representYamlFloat, - defaultStyle: 'lowercase' -}); - -},{"../common":21,"../type":32}],36:[function(require,module,exports){ -'use strict'; - -var common = require('../common'); -var Type = require('../type'); - -function isHexCode(c) { - return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) || - ((0x41/* A */ <= c) && (c <= 0x46/* F */)) || - ((0x61/* a */ <= c) && (c <= 0x66/* f */)); -} - -function isOctCode(c) { - return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */)); -} - -function isDecCode(c) { - return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)); -} - -function resolveYamlInteger(data) { - if (data === null) return false; - - var max = data.length, - index = 0, - hasDigits = false, - ch; - - if (!max) return false; - - ch = data[index]; - - // sign - if (ch === '-' || ch === '+') { - ch = data[++index]; - } - - if (ch === '0') { - // 0 - if (index + 1 === max) return true; - ch = data[++index]; - - // base 2, base 8, base 16 - - if (ch === 'b') { - // base 2 - index++; - - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (ch !== '0' && ch !== '1') return false; - hasDigits = true; - } - return hasDigits; - } - - - if (ch === 'x') { - // base 16 - index++; - - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (!isHexCode(data.charCodeAt(index))) return false; - hasDigits = true; - } - return hasDigits; - } - - // base 8 - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (!isOctCode(data.charCodeAt(index))) return false; - hasDigits = true; - } - return hasDigits; - } - - // base 10 (except 0) or base 60 - - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (ch === ':') break; - if (!isDecCode(data.charCodeAt(index))) { - return false; - } - hasDigits = true; - } - - if (!hasDigits) return false; - - // if !base60 - done; - if (ch !== ':') return true; - - // base60 almost not used, no needs to optimize - return /^(:[0-5]?[0-9])+$/.test(data.slice(index)); -} - -function constructYamlInteger(data) { - var value = data, sign = 1, ch, base, digits = []; - - if (value.indexOf('_') !== -1) { - value = value.replace(/_/g, ''); - } - - ch = value[0]; - - if (ch === '-' || ch === '+') { - if (ch === '-') sign = -1; - value = value.slice(1); - ch = value[0]; - } - - if (value === '0') return 0; - - if (ch === '0') { - if (value[1] === 'b') return sign * parseInt(value.slice(2), 2); - if (value[1] === 'x') return sign * parseInt(value, 16); - return sign * parseInt(value, 8); - } - - if (value.indexOf(':') !== -1) { - value.split(':').forEach(function (v) { - digits.unshift(parseInt(v, 10)); - }); - - value = 0; - base = 1; - - digits.forEach(function (d) { - value += (d * base); - base *= 60; - }); - - return sign * value; - - } - - return sign * parseInt(value, 10); -} - -function isInteger(object) { - return (Object.prototype.toString.call(object)) === '[object Number]' && - (object % 1 === 0 && !common.isNegativeZero(object)); -} - -module.exports = new Type('tag:yaml.org,2002:int', { - kind: 'scalar', - resolve: resolveYamlInteger, - construct: constructYamlInteger, - predicate: isInteger, - represent: { - binary: function (object) { return '0b' + object.toString(2); }, - octal: function (object) { return '0' + object.toString(8); }, - decimal: function (object) { return object.toString(10); }, - hexadecimal: function (object) { return '0x' + object.toString(16).toUpperCase(); } - }, - defaultStyle: 'decimal', - styleAliases: { - binary: [ 2, 'bin' ], - octal: [ 8, 'oct' ], - decimal: [ 10, 'dec' ], - hexadecimal: [ 16, 'hex' ] - } -}); - -},{"../common":21,"../type":32}],37:[function(require,module,exports){ -'use strict'; - -var esprima; - -// Browserified version does not have esprima -// -// 1. For node.js just require module as deps -// 2. For browser try to require mudule via external AMD system. -// If not found - try to fallback to window.esprima. If not -// found too - then fail to parse. -// -try { - // workaround to exclude package from browserify list. - var _require = require; - esprima = _require('esprima'); -} catch (_) { - /*global window */ - if (typeof window !== 'undefined') esprima = window.esprima; -} - -var Type = require('../../type'); - -function resolveJavascriptFunction(data) { - if (data === null) return false; - - try { - var source = '(' + data + ')', - ast = esprima.parse(source, { range: true }); - - if (ast.type !== 'Program' || - ast.body.length !== 1 || - ast.body[0].type !== 'ExpressionStatement' || - ast.body[0].expression.type !== 'FunctionExpression') { - return false; - } - - return true; - } catch (err) { - return false; - } -} - -function constructJavascriptFunction(data) { - /*jslint evil:true*/ - - var source = '(' + data + ')', - ast = esprima.parse(source, { range: true }), - params = [], - body; - - if (ast.type !== 'Program' || - ast.body.length !== 1 || - ast.body[0].type !== 'ExpressionStatement' || - ast.body[0].expression.type !== 'FunctionExpression') { - throw new Error('Failed to resolve function'); - } - - ast.body[0].expression.params.forEach(function (param) { - params.push(param.name); - }); - - body = ast.body[0].expression.body.range; - - // Esprima's ranges include the first '{' and the last '}' characters on - // function expressions. So cut them out. - /*eslint-disable no-new-func*/ - return new Function(params, source.slice(body[0] + 1, body[1] - 1)); -} - -function representJavascriptFunction(object /*, style*/) { - return object.toString(); -} - -function isFunction(object) { - return Object.prototype.toString.call(object) === '[object Function]'; -} - -module.exports = new Type('tag:yaml.org,2002:js/function', { - kind: 'scalar', - resolve: resolveJavascriptFunction, - construct: constructJavascriptFunction, - predicate: isFunction, - represent: representJavascriptFunction -}); - -},{"../../type":32}],38:[function(require,module,exports){ -'use strict'; - -var Type = require('../../type'); - -function resolveJavascriptRegExp(data) { - if (data === null) return false; - if (data.length === 0) return false; - - var regexp = data, - tail = /\/([gim]*)$/.exec(data), - modifiers = ''; - - // if regexp starts with '/' it can have modifiers and must be properly closed - // `/foo/gim` - modifiers tail can be maximum 3 chars - if (regexp[0] === '/') { - if (tail) modifiers = tail[1]; - - if (modifiers.length > 3) return false; - // if expression starts with /, is should be properly terminated - if (regexp[regexp.length - modifiers.length - 1] !== '/') return false; - } - - return true; -} - -function constructJavascriptRegExp(data) { - var regexp = data, - tail = /\/([gim]*)$/.exec(data), - modifiers = ''; - - // `/foo/gim` - tail can be maximum 4 chars - if (regexp[0] === '/') { - if (tail) modifiers = tail[1]; - regexp = regexp.slice(1, regexp.length - modifiers.length - 1); - } - - return new RegExp(regexp, modifiers); -} - -function representJavascriptRegExp(object /*, style*/) { - var result = '/' + object.source + '/'; - - if (object.global) result += 'g'; - if (object.multiline) result += 'm'; - if (object.ignoreCase) result += 'i'; - - return result; -} - -function isRegExp(object) { - return Object.prototype.toString.call(object) === '[object RegExp]'; -} - -module.exports = new Type('tag:yaml.org,2002:js/regexp', { - kind: 'scalar', - resolve: resolveJavascriptRegExp, - construct: constructJavascriptRegExp, - predicate: isRegExp, - represent: representJavascriptRegExp -}); - -},{"../../type":32}],39:[function(require,module,exports){ -'use strict'; - -var Type = require('../../type'); - -function resolveJavascriptUndefined() { - return true; -} - -function constructJavascriptUndefined() { - /*eslint-disable no-undefined*/ - return undefined; -} - -function representJavascriptUndefined() { - return ''; -} - -function isUndefined(object) { - return typeof object === 'undefined'; -} - -module.exports = new Type('tag:yaml.org,2002:js/undefined', { - kind: 'scalar', - resolve: resolveJavascriptUndefined, - construct: constructJavascriptUndefined, - predicate: isUndefined, - represent: representJavascriptUndefined -}); - -},{"../../type":32}],40:[function(require,module,exports){ -'use strict'; - -var Type = require('../type'); - -module.exports = new Type('tag:yaml.org,2002:map', { - kind: 'mapping', - construct: function (data) { return data !== null ? data : {}; } -}); - -},{"../type":32}],41:[function(require,module,exports){ -'use strict'; - -var Type = require('../type'); - -function resolveYamlMerge(data) { - return data === '<<' || data === null; -} - -module.exports = new Type('tag:yaml.org,2002:merge', { - kind: 'scalar', - resolve: resolveYamlMerge -}); - -},{"../type":32}],42:[function(require,module,exports){ -'use strict'; - -var Type = require('../type'); - -function resolveYamlNull(data) { - if (data === null) return true; - - var max = data.length; - - return (max === 1 && data === '~') || - (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL')); -} - -function constructYamlNull() { - return null; -} - -function isNull(object) { - return object === null; -} - -module.exports = new Type('tag:yaml.org,2002:null', { - kind: 'scalar', - resolve: resolveYamlNull, - construct: constructYamlNull, - predicate: isNull, - represent: { - canonical: function () { return '~'; }, - lowercase: function () { return 'null'; }, - uppercase: function () { return 'NULL'; }, - camelcase: function () { return 'Null'; } - }, - defaultStyle: 'lowercase' -}); - -},{"../type":32}],43:[function(require,module,exports){ -'use strict'; - -var Type = require('../type'); - -var _hasOwnProperty = Object.prototype.hasOwnProperty; -var _toString = Object.prototype.toString; - -function resolveYamlOmap(data) { - if (data === null) return true; - - var objectKeys = [], index, length, pair, pairKey, pairHasKey, - object = data; - - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - pairHasKey = false; - - if (_toString.call(pair) !== '[object Object]') return false; - - for (pairKey in pair) { - if (_hasOwnProperty.call(pair, pairKey)) { - if (!pairHasKey) pairHasKey = true; - else return false; - } - } - - if (!pairHasKey) return false; - - if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey); - else return false; - } - - return true; -} - -function constructYamlOmap(data) { - return data !== null ? data : []; -} - -module.exports = new Type('tag:yaml.org,2002:omap', { - kind: 'sequence', - resolve: resolveYamlOmap, - construct: constructYamlOmap -}); - -},{"../type":32}],44:[function(require,module,exports){ -'use strict'; - -var Type = require('../type'); - -var _toString = Object.prototype.toString; - -function resolveYamlPairs(data) { - if (data === null) return true; - - var index, length, pair, keys, result, - object = data; - - result = new Array(object.length); - - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - - if (_toString.call(pair) !== '[object Object]') return false; - - keys = Object.keys(pair); - - if (keys.length !== 1) return false; - - result[index] = [ keys[0], pair[keys[0]] ]; - } - - return true; -} - -function constructYamlPairs(data) { - if (data === null) return []; - - var index, length, pair, keys, result, - object = data; - - result = new Array(object.length); - - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - - keys = Object.keys(pair); - - result[index] = [ keys[0], pair[keys[0]] ]; - } - - return result; -} - -module.exports = new Type('tag:yaml.org,2002:pairs', { - kind: 'sequence', - resolve: resolveYamlPairs, - construct: constructYamlPairs -}); - -},{"../type":32}],45:[function(require,module,exports){ -'use strict'; - -var Type = require('../type'); - -module.exports = new Type('tag:yaml.org,2002:seq', { - kind: 'sequence', - construct: function (data) { return data !== null ? data : []; } -}); - -},{"../type":32}],46:[function(require,module,exports){ -'use strict'; - -var Type = require('../type'); - -var _hasOwnProperty = Object.prototype.hasOwnProperty; - -function resolveYamlSet(data) { - if (data === null) return true; - - var key, object = data; - - for (key in object) { - if (_hasOwnProperty.call(object, key)) { - if (object[key] !== null) return false; - } - } - - return true; -} - -function constructYamlSet(data) { - return data !== null ? data : {}; -} - -module.exports = new Type('tag:yaml.org,2002:set', { - kind: 'mapping', - resolve: resolveYamlSet, - construct: constructYamlSet -}); - -},{"../type":32}],47:[function(require,module,exports){ -'use strict'; - -var Type = require('../type'); - -module.exports = new Type('tag:yaml.org,2002:str', { - kind: 'scalar', - construct: function (data) { return data !== null ? data : ''; } -}); - -},{"../type":32}],48:[function(require,module,exports){ -'use strict'; - -var Type = require('../type'); - -var YAML_DATE_REGEXP = new RegExp( - '^([0-9][0-9][0-9][0-9])' + // [1] year - '-([0-9][0-9])' + // [2] month - '-([0-9][0-9])$'); // [3] day - -var YAML_TIMESTAMP_REGEXP = new RegExp( - '^([0-9][0-9][0-9][0-9])' + // [1] year - '-([0-9][0-9]?)' + // [2] month - '-([0-9][0-9]?)' + // [3] day - '(?:[Tt]|[ \\t]+)' + // ... - '([0-9][0-9]?)' + // [4] hour - ':([0-9][0-9])' + // [5] minute - ':([0-9][0-9])' + // [6] second - '(?:\\.([0-9]*))?' + // [7] fraction - '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour - '(?::([0-9][0-9]))?))?$'); // [11] tz_minute - -function resolveYamlTimestamp(data) { - if (data === null) return false; - if (YAML_DATE_REGEXP.exec(data) !== null) return true; - if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; - return false; -} - -function constructYamlTimestamp(data) { - var match, year, month, day, hour, minute, second, fraction = 0, - delta = null, tz_hour, tz_minute, date; - - match = YAML_DATE_REGEXP.exec(data); - if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); - - if (match === null) throw new Error('Date resolve error'); - - // match: [1] year [2] month [3] day - - year = +(match[1]); - month = +(match[2]) - 1; // JS month starts with 0 - day = +(match[3]); - - if (!match[4]) { // no hour - return new Date(Date.UTC(year, month, day)); - } - - // match: [4] hour [5] minute [6] second [7] fraction - - hour = +(match[4]); - minute = +(match[5]); - second = +(match[6]); - - if (match[7]) { - fraction = match[7].slice(0, 3); - while (fraction.length < 3) { // milli-seconds - fraction += '0'; - } - fraction = +fraction; - } - - // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute - - if (match[9]) { - tz_hour = +(match[10]); - tz_minute = +(match[11] || 0); - delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds - if (match[9] === '-') delta = -delta; - } - - date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); - - if (delta) date.setTime(date.getTime() - delta); - - return date; -} - -function representYamlTimestamp(object /*, style*/) { - return object.toISOString(); -} - -module.exports = new Type('tag:yaml.org,2002:timestamp', { - kind: 'scalar', - resolve: resolveYamlTimestamp, - construct: constructYamlTimestamp, - instanceOf: Date, - represent: representYamlTimestamp -}); - -},{"../type":32}],49:[function(require,module,exports){ -var baseIndexOf = require('../internal/baseIndexOf'), - binaryIndex = require('../internal/binaryIndex'); - -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; - -/** - * Gets the index at which the first occurrence of `value` is found in `array` - * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) - * for equality comparisons. If `fromIndex` is negative, it's used as the offset - * from the end of `array`. If `array` is sorted providing `true` for `fromIndex` - * performs a faster binary search. - * - * @static - * @memberOf _ - * @category Array - * @param {Array} array The array to search. - * @param {*} value The value to search for. - * @param {boolean|number} [fromIndex=0] The index to search from or `true` - * to perform a binary search on a sorted array. - * @returns {number} Returns the index of the matched value, else `-1`. - * @example - * - * _.indexOf([1, 2, 1, 2], 2); - * // => 1 - * - * // using `fromIndex` - * _.indexOf([1, 2, 1, 2], 2, 2); - * // => 3 - * - * // performing a binary search - * _.indexOf([1, 1, 2, 2], 2, true); - * // => 2 - */ -function indexOf(array, value, fromIndex) { - var length = array ? array.length : 0; - if (!length) { - return -1; - } - if (typeof fromIndex == 'number') { - fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex; - } else if (fromIndex) { - var index = binaryIndex(array, value); - if (index < length && - (value === value ? (value === array[index]) : (array[index] !== array[index]))) { - return index; - } - return -1; - } - return baseIndexOf(array, value, fromIndex || 0); -} - -module.exports = indexOf; - -},{"../internal/baseIndexOf":78,"../internal/binaryIndex":92}],50:[function(require,module,exports){ -/** - * Gets the last element of `array`. - * - * @static - * @memberOf _ - * @category Array - * @param {Array} array The array to query. - * @returns {*} Returns the last element of `array`. - * @example - * - * _.last([1, 2, 3]); - * // => 3 - */ -function last(array) { - var length = array ? array.length : 0; - return length ? array[length - 1] : undefined; -} - -module.exports = last; - -},{}],51:[function(require,module,exports){ -var LazyWrapper = require('../internal/LazyWrapper'), - LodashWrapper = require('../internal/LodashWrapper'), - baseLodash = require('../internal/baseLodash'), - isArray = require('../lang/isArray'), - isObjectLike = require('../internal/isObjectLike'), - wrapperClone = require('../internal/wrapperClone'); - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * Creates a `lodash` object which wraps `value` to enable implicit chaining. - * Methods that operate on and return arrays, collections, and functions can - * be chained together. Methods that retrieve a single value or may return a - * primitive value will automatically end the chain returning the unwrapped - * value. Explicit chaining may be enabled using `_.chain`. The execution of - * chained methods is lazy, that is, execution is deferred until `_#value` - * is implicitly or explicitly called. - * - * Lazy evaluation allows several methods to support shortcut fusion. Shortcut - * fusion is an optimization strategy which merge iteratee calls; this can help - * to avoid the creation of intermediate data structures and greatly reduce the - * number of iteratee executions. - * - * Chaining is supported in custom builds as long as the `_#value` method is - * directly or indirectly included in the build. - * - * In addition to lodash methods, wrappers have `Array` and `String` methods. - * - * The wrapper `Array` methods are: - * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, - * `splice`, and `unshift` - * - * The wrapper `String` methods are: - * `replace` and `split` - * - * The wrapper methods that support shortcut fusion are: - * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`, - * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`, - * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`, - * and `where` - * - * The chainable wrapper methods are: - * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`, - * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`, - * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defaultsDeep`, - * `defer`, `delay`, `difference`, `drop`, `dropRight`, `dropRightWhile`, - * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, - * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, - * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, - * `invoke`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, - * `matchesProperty`, `memoize`, `merge`, `method`, `methodOf`, `mixin`, - * `modArgs`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`, - * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`, - * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `restParam`, - * `reverse`, `set`, `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, - * `sortByOrder`, `splice`, `spread`, `take`, `takeRight`, `takeRightWhile`, - * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`, - * `transform`, `union`, `uniq`, `unshift`, `unzip`, `unzipWith`, `values`, - * `valuesIn`, `where`, `without`, `wrap`, `xor`, `zip`, `zipObject`, `zipWith` - * - * The wrapper methods that are **not** chainable by default are: - * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clone`, `cloneDeep`, - * `deburr`, `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, - * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, - * `floor`, `get`, `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`, - * `inRange`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`, - * `isEmpty`, `isEqual`, `isError`, `isFinite` `isFunction`, `isMatch`, - * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`, - * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`, - * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`, - * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`, - * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `shift`, `size`, - * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`, - * `startsWith`, `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`, - * `unescape`, `uniqueId`, `value`, and `words` - * - * The wrapper method `sample` will return a wrapped value when `n` is provided, - * otherwise an unwrapped value is returned. - * - * @name _ - * @constructor - * @category Chain - * @param {*} value The value to wrap in a `lodash` instance. - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var wrapped = _([1, 2, 3]); - * - * // returns an unwrapped value - * wrapped.reduce(function(total, n) { - * return total + n; - * }); - * // => 6 - * - * // returns a wrapped value - * var squares = wrapped.map(function(n) { - * return n * n; - * }); - * - * _.isArray(squares); - * // => false - * - * _.isArray(squares.value()); - * // => true - */ -function lodash(value) { - if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { - if (value instanceof LodashWrapper) { - return value; - } - if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) { - return wrapperClone(value); - } - } - return new LodashWrapper(value); -} - -// Ensure wrappers are instances of `baseLodash`. -lodash.prototype = baseLodash.prototype; - -module.exports = lodash; - -},{"../internal/LazyWrapper":60,"../internal/LodashWrapper":61,"../internal/baseLodash":82,"../internal/isObjectLike":126,"../internal/wrapperClone":137,"../lang/isArray":140}],52:[function(require,module,exports){ -module.exports = require('./forEach'); - -},{"./forEach":54}],53:[function(require,module,exports){ -var baseEach = require('../internal/baseEach'), - createFind = require('../internal/createFind'); - -/** - * Iterates over elements of `collection`, returning the first element - * `predicate` returns truthy for. The predicate is bound to `thisArg` and - * invoked with three arguments: (value, index|key, collection). - * - * If a property name is provided for `predicate` the created `_.property` - * style callback returns the property value of the given element. - * - * If a value is also provided for `thisArg` the created `_.matchesProperty` - * style callback returns `true` for elements that have a matching property - * value, else `false`. - * - * If an object is provided for `predicate` the created `_.matches` style - * callback returns `true` for elements that have the properties of the given - * object, else `false`. - * - * @static - * @memberOf _ - * @alias detect - * @category Collection - * @param {Array|Object|string} collection The collection to search. - * @param {Function|Object|string} [predicate=_.identity] The function invoked - * per iteration. - * @param {*} [thisArg] The `this` binding of `predicate`. - * @returns {*} Returns the matched element, else `undefined`. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': true }, - * { 'user': 'fred', 'age': 40, 'active': false }, - * { 'user': 'pebbles', 'age': 1, 'active': true } - * ]; - * - * _.result(_.find(users, function(chr) { - * return chr.age < 40; - * }), 'user'); - * // => 'barney' - * - * // using the `_.matches` callback shorthand - * _.result(_.find(users, { 'age': 1, 'active': true }), 'user'); - * // => 'pebbles' - * - * // using the `_.matchesProperty` callback shorthand - * _.result(_.find(users, 'active', false), 'user'); - * // => 'fred' - * - * // using the `_.property` callback shorthand - * _.result(_.find(users, 'active'), 'user'); - * // => 'barney' - */ -var find = createFind(baseEach); - -module.exports = find; - -},{"../internal/baseEach":71,"../internal/createFind":102}],54:[function(require,module,exports){ -var arrayEach = require('../internal/arrayEach'), - baseEach = require('../internal/baseEach'), - createForEach = require('../internal/createForEach'); - -/** - * Iterates over elements of `collection` invoking `iteratee` for each element. - * The `iteratee` is bound to `thisArg` and invoked with three arguments: - * (value, index|key, collection). Iteratee functions may exit iteration early - * by explicitly returning `false`. - * - * **Note:** As with other "Collections" methods, objects with a "length" property - * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn` - * may be used for object iteration. - * - * @static - * @memberOf _ - * @alias each - * @category Collection - * @param {Array|Object|string} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {*} [thisArg] The `this` binding of `iteratee`. - * @returns {Array|Object|string} Returns `collection`. - * @example - * - * _([1, 2]).forEach(function(n) { - * console.log(n); - * }).value(); - * // => logs each value from left to right and returns the array - * - * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) { - * console.log(n, key); - * }); - * // => logs each value-key pair and returns the object (iteration order is not guaranteed) - */ -var forEach = createForEach(arrayEach, baseEach); - -module.exports = forEach; - -},{"../internal/arrayEach":63,"../internal/baseEach":71,"../internal/createForEach":103}],55:[function(require,module,exports){ -var baseIndexOf = require('../internal/baseIndexOf'), - getLength = require('../internal/getLength'), - isArray = require('../lang/isArray'), - isIterateeCall = require('../internal/isIterateeCall'), - isLength = require('../internal/isLength'), - isString = require('../lang/isString'), - values = require('../object/values'); - -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; - -/** - * Checks if `target` is in `collection` using - * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) - * for equality comparisons. If `fromIndex` is negative, it's used as the offset - * from the end of `collection`. - * - * @static - * @memberOf _ - * @alias contains, include - * @category Collection - * @param {Array|Object|string} collection The collection to search. - * @param {*} target The value to search for. - * @param {number} [fromIndex=0] The index to search from. - * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`. - * @returns {boolean} Returns `true` if a matching element is found, else `false`. - * @example - * - * _.includes([1, 2, 3], 1); - * // => true - * - * _.includes([1, 2, 3], 1, 2); - * // => false - * - * _.includes({ 'user': 'fred', 'age': 40 }, 'fred'); - * // => true - * - * _.includes('pebbles', 'eb'); - * // => true - */ -function includes(collection, target, fromIndex, guard) { - var length = collection ? getLength(collection) : 0; - if (!isLength(length)) { - collection = values(collection); - length = collection.length; - } - if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) { - fromIndex = 0; - } else { - fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0); - } - return (typeof collection == 'string' || !isArray(collection) && isString(collection)) - ? (fromIndex <= length && collection.indexOf(target, fromIndex) > -1) - : (!!length && baseIndexOf(collection, target, fromIndex) > -1); -} - -module.exports = includes; - -},{"../internal/baseIndexOf":78,"../internal/getLength":112,"../internal/isIterateeCall":122,"../internal/isLength":125,"../lang/isArray":140,"../lang/isString":146,"../object/values":152}],56:[function(require,module,exports){ -var arrayMap = require('../internal/arrayMap'), - baseCallback = require('../internal/baseCallback'), - baseMap = require('../internal/baseMap'), - isArray = require('../lang/isArray'); - -/** - * Creates an array of values by running each element in `collection` through - * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three - * arguments: (value, index|key, collection). - * - * If a property name is provided for `iteratee` the created `_.property` - * style callback returns the property value of the given element. - * - * If a value is also provided for `thisArg` the created `_.matchesProperty` - * style callback returns `true` for elements that have a matching property - * value, else `false`. - * - * If an object is provided for `iteratee` the created `_.matches` style - * callback returns `true` for elements that have the properties of the given - * object, else `false`. - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. - * - * The guarded methods are: - * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, - * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, - * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, - * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, - * `sum`, `uniq`, and `words` - * - * @static - * @memberOf _ - * @alias collect - * @category Collection - * @param {Array|Object|string} collection The collection to iterate over. - * @param {Function|Object|string} [iteratee=_.identity] The function invoked - * per iteration. - * @param {*} [thisArg] The `this` binding of `iteratee`. - * @returns {Array} Returns the new mapped array. - * @example - * - * function timesThree(n) { - * return n * 3; - * } - * - * _.map([1, 2], timesThree); - * // => [3, 6] - * - * _.map({ 'a': 1, 'b': 2 }, timesThree); - * // => [3, 6] (iteration order is not guaranteed) - * - * var users = [ - * { 'user': 'barney' }, - * { 'user': 'fred' } - * ]; - * - * // using the `_.property` callback shorthand - * _.map(users, 'user'); - * // => ['barney', 'fred'] - */ -function map(collection, iteratee, thisArg) { - var func = isArray(collection) ? arrayMap : baseMap; - iteratee = baseCallback(iteratee, thisArg, 3); - return func(collection, iteratee); -} - -module.exports = map; - -},{"../internal/arrayMap":64,"../internal/baseCallback":67,"../internal/baseMap":83,"../lang/isArray":140}],57:[function(require,module,exports){ -var getNative = require('../internal/getNative'); - -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeNow = getNative(Date, 'now'); - -/** - * Gets the number of milliseconds that have elapsed since the Unix epoch - * (1 January 1970 00:00:00 UTC). - * - * @static - * @memberOf _ - * @category Date - * @example - * - * _.defer(function(stamp) { - * console.log(_.now() - stamp); - * }, _.now()); - * // => logs the number of milliseconds it took for the deferred function to be invoked - */ -var now = nativeNow || function() { - return new Date().getTime(); -}; - -module.exports = now; - -},{"../internal/getNative":114}],58:[function(require,module,exports){ -var createWrapper = require('../internal/createWrapper'), - replaceHolders = require('../internal/replaceHolders'), - restParam = require('./restParam'); - -/** Used to compose bitmasks for wrapper metadata. */ -var BIND_FLAG = 1, - PARTIAL_FLAG = 32; - -/** - * Creates a function that invokes `func` with the `this` binding of `thisArg` - * and prepends any additional `_.bind` arguments to those provided to the - * bound function. - * - * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, - * may be used as a placeholder for partially applied arguments. - * - * **Note:** Unlike native `Function#bind` this method does not set the "length" - * property of bound functions. - * - * @static - * @memberOf _ - * @category Function - * @param {Function} func The function to bind. - * @param {*} thisArg The `this` binding of `func`. - * @param {...*} [partials] The arguments to be partially applied. - * @returns {Function} Returns the new bound function. - * @example - * - * var greet = function(greeting, punctuation) { - * return greeting + ' ' + this.user + punctuation; - * }; - * - * var object = { 'user': 'fred' }; - * - * var bound = _.bind(greet, object, 'hi'); - * bound('!'); - * // => 'hi fred!' - * - * // using placeholders - * var bound = _.bind(greet, object, _, '!'); - * bound('hi'); - * // => 'hi fred!' - */ -var bind = restParam(function(func, thisArg, partials) { - var bitmask = BIND_FLAG; - if (partials.length) { - var holders = replaceHolders(partials, bind.placeholder); - bitmask |= PARTIAL_FLAG; - } - return createWrapper(func, bitmask, thisArg, partials, holders); -}); - -// Assign default placeholders. -bind.placeholder = {}; - -module.exports = bind; - -},{"../internal/createWrapper":106,"../internal/replaceHolders":132,"./restParam":59}],59:[function(require,module,exports){ -/** Used as the `TypeError` message for "Functions" methods. */ -var FUNC_ERROR_TEXT = 'Expected a function'; - -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; - -/** - * Creates a function that invokes `func` with the `this` binding of the - * created function and arguments from `start` and beyond provided as an array. - * - * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters). - * - * @static - * @memberOf _ - * @category Function - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @returns {Function} Returns the new function. - * @example - * - * var say = _.restParam(function(what, names) { - * return what + ' ' + _.initial(names).join(', ') + - * (_.size(names) > 1 ? ', & ' : '') + _.last(names); - * }); - * - * say('hello', 'fred', 'barney', 'pebbles'); - * // => 'hello fred, barney, & pebbles' - */ -function restParam(func, start) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0); - return function() { - var args = arguments, - index = -1, - length = nativeMax(args.length - start, 0), - rest = Array(length); - - while (++index < length) { - rest[index] = args[start + index]; - } - switch (start) { - case 0: return func.call(this, rest); - case 1: return func.call(this, args[0], rest); - case 2: return func.call(this, args[0], args[1], rest); - } - var otherArgs = Array(start + 1); - index = -1; - while (++index < start) { - otherArgs[index] = args[index]; - } - otherArgs[start] = rest; - return func.apply(this, otherArgs); - }; -} - -module.exports = restParam; - -},{}],60:[function(require,module,exports){ -var baseCreate = require('./baseCreate'), - baseLodash = require('./baseLodash'); - -/** Used as references for `-Infinity` and `Infinity`. */ -var POSITIVE_INFINITY = Number.POSITIVE_INFINITY; - -/** - * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. - * - * @private - * @param {*} value The value to wrap. - */ -function LazyWrapper(value) { - this.__wrapped__ = value; - this.__actions__ = []; - this.__dir__ = 1; - this.__filtered__ = false; - this.__iteratees__ = []; - this.__takeCount__ = POSITIVE_INFINITY; - this.__views__ = []; -} - -LazyWrapper.prototype = baseCreate(baseLodash.prototype); -LazyWrapper.prototype.constructor = LazyWrapper; - -module.exports = LazyWrapper; - -},{"./baseCreate":70,"./baseLodash":82}],61:[function(require,module,exports){ -var baseCreate = require('./baseCreate'), - baseLodash = require('./baseLodash'); - -/** - * The base constructor for creating `lodash` wrapper objects. - * - * @private - * @param {*} value The value to wrap. - * @param {boolean} [chainAll] Enable chaining for all wrapper methods. - * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value. - */ -function LodashWrapper(value, chainAll, actions) { - this.__wrapped__ = value; - this.__actions__ = actions || []; - this.__chain__ = !!chainAll; -} - -LodashWrapper.prototype = baseCreate(baseLodash.prototype); -LodashWrapper.prototype.constructor = LodashWrapper; - -module.exports = LodashWrapper; - -},{"./baseCreate":70,"./baseLodash":82}],62:[function(require,module,exports){ -/** - * Copies the values of `source` to `array`. - * - * @private - * @param {Array} source The array to copy values from. - * @param {Array} [array=[]] The array to copy values to. - * @returns {Array} Returns `array`. - */ -function arrayCopy(source, array) { - var index = -1, - length = source.length; - - array || (array = Array(length)); - while (++index < length) { - array[index] = source[index]; - } - return array; -} - -module.exports = arrayCopy; - -},{}],63:[function(require,module,exports){ -/** - * A specialized version of `_.forEach` for arrays without support for callback - * shorthands and `this` binding. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns `array`. - */ -function arrayEach(array, iteratee) { - var index = -1, - length = array.length; - - while (++index < length) { - if (iteratee(array[index], index, array) === false) { - break; - } - } - return array; -} - -module.exports = arrayEach; - -},{}],64:[function(require,module,exports){ -/** - * A specialized version of `_.map` for arrays without support for callback - * shorthands and `this` binding. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - */ -function arrayMap(array, iteratee) { - var index = -1, - length = array.length, - result = Array(length); - - while (++index < length) { - result[index] = iteratee(array[index], index, array); - } - return result; -} - -module.exports = arrayMap; - -},{}],65:[function(require,module,exports){ -/** - * A specialized version of `_.some` for arrays without support for callback - * shorthands and `this` binding. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if any element passes the predicate check, - * else `false`. - */ -function arraySome(array, predicate) { - var index = -1, - length = array.length; - - while (++index < length) { - if (predicate(array[index], index, array)) { - return true; - } - } - return false; -} - -module.exports = arraySome; - -},{}],66:[function(require,module,exports){ -var baseCopy = require('./baseCopy'), - keys = require('../object/keys'); - -/** - * The base implementation of `_.assign` without support for argument juggling, - * multiple sources, and `customizer` functions. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @returns {Object} Returns `object`. - */ -function baseAssign(object, source) { - return source == null - ? object - : baseCopy(source, keys(source), object); -} - -module.exports = baseAssign; - -},{"../object/keys":149,"./baseCopy":69}],67:[function(require,module,exports){ -var baseMatches = require('./baseMatches'), - baseMatchesProperty = require('./baseMatchesProperty'), - bindCallback = require('./bindCallback'), - identity = require('../utility/identity'), - property = require('../utility/property'); - -/** - * The base implementation of `_.callback` which supports specifying the - * number of arguments to provide to `func`. - * - * @private - * @param {*} [func=_.identity] The value to convert to a callback. - * @param {*} [thisArg] The `this` binding of `func`. - * @param {number} [argCount] The number of arguments to provide to `func`. - * @returns {Function} Returns the callback. - */ -function baseCallback(func, thisArg, argCount) { - var type = typeof func; - if (type == 'function') { - return thisArg === undefined - ? func - : bindCallback(func, thisArg, argCount); - } - if (func == null) { - return identity; - } - if (type == 'object') { - return baseMatches(func); - } - return thisArg === undefined - ? property(func) - : baseMatchesProperty(func, thisArg); -} - -module.exports = baseCallback; - -},{"../utility/identity":154,"../utility/property":156,"./baseMatches":84,"./baseMatchesProperty":85,"./bindCallback":94}],68:[function(require,module,exports){ -var arrayCopy = require('./arrayCopy'), - arrayEach = require('./arrayEach'), - baseAssign = require('./baseAssign'), - baseForOwn = require('./baseForOwn'), - initCloneArray = require('./initCloneArray'), - initCloneByTag = require('./initCloneByTag'), - initCloneObject = require('./initCloneObject'), - isArray = require('../lang/isArray'), - isHostObject = require('./isHostObject'), - isObject = require('../lang/isObject'); - -/** `Object#toString` result references. */ -var argsTag = '[object Arguments]', - arrayTag = '[object Array]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - funcTag = '[object Function]', - mapTag = '[object Map]', - numberTag = '[object Number]', - objectTag = '[object Object]', - regexpTag = '[object RegExp]', - setTag = '[object Set]', - stringTag = '[object String]', - weakMapTag = '[object WeakMap]'; - -var arrayBufferTag = '[object ArrayBuffer]', - float32Tag = '[object Float32Array]', - float64Tag = '[object Float64Array]', - int8Tag = '[object Int8Array]', - int16Tag = '[object Int16Array]', - int32Tag = '[object Int32Array]', - uint8Tag = '[object Uint8Array]', - uint8ClampedTag = '[object Uint8ClampedArray]', - uint16Tag = '[object Uint16Array]', - uint32Tag = '[object Uint32Array]'; - -/** Used to identify `toStringTag` values supported by `_.clone`. */ -var cloneableTags = {}; -cloneableTags[argsTag] = cloneableTags[arrayTag] = -cloneableTags[arrayBufferTag] = cloneableTags[boolTag] = -cloneableTags[dateTag] = cloneableTags[float32Tag] = -cloneableTags[float64Tag] = cloneableTags[int8Tag] = -cloneableTags[int16Tag] = cloneableTags[int32Tag] = -cloneableTags[numberTag] = cloneableTags[objectTag] = -cloneableTags[regexpTag] = cloneableTags[stringTag] = -cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = -cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; -cloneableTags[errorTag] = cloneableTags[funcTag] = -cloneableTags[mapTag] = cloneableTags[setTag] = -cloneableTags[weakMapTag] = false; - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; - -/** - * The base implementation of `_.clone` without support for argument juggling - * and `this` binding `customizer` functions. - * - * @private - * @param {*} value The value to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @param {Function} [customizer] The function to customize cloning values. - * @param {string} [key] The key of `value`. - * @param {Object} [object] The object `value` belongs to. - * @param {Array} [stackA=[]] Tracks traversed source objects. - * @param {Array} [stackB=[]] Associates clones with source counterparts. - * @returns {*} Returns the cloned value. - */ -function baseClone(value, isDeep, customizer, key, object, stackA, stackB) { - var result; - if (customizer) { - result = object ? customizer(value, key, object) : customizer(value); - } - if (result !== undefined) { - return result; - } - if (!isObject(value)) { - return value; - } - var isArr = isArray(value); - if (isArr) { - result = initCloneArray(value); - if (!isDeep) { - return arrayCopy(value, result); - } - } else { - var tag = objToString.call(value), - isFunc = tag == funcTag; - - if (tag == objectTag || tag == argsTag || (isFunc && !object)) { - if (isHostObject(value)) { - return object ? value : {}; - } - result = initCloneObject(isFunc ? {} : value); - if (!isDeep) { - return baseAssign(result, value); - } - } else { - return cloneableTags[tag] - ? initCloneByTag(value, tag, isDeep) - : (object ? value : {}); - } - } - // Check for circular references and return its corresponding clone. - stackA || (stackA = []); - stackB || (stackB = []); - - var length = stackA.length; - while (length--) { - if (stackA[length] == value) { - return stackB[length]; - } - } - // Add the source value to the stack of traversed objects and associate it with its clone. - stackA.push(value); - stackB.push(result); - - // Recursively populate clone (susceptible to call stack limits). - (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) { - result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB); - }); - return result; -} - -module.exports = baseClone; - -},{"../lang/isArray":140,"../lang/isObject":144,"./arrayCopy":62,"./arrayEach":63,"./baseAssign":66,"./baseForOwn":76,"./initCloneArray":116,"./initCloneByTag":117,"./initCloneObject":118,"./isHostObject":120}],69:[function(require,module,exports){ -/** - * Copies properties of `source` to `object`. - * - * @private - * @param {Object} source The object to copy properties from. - * @param {Array} props The property names to copy. - * @param {Object} [object={}] The object to copy properties to. - * @returns {Object} Returns `object`. - */ -function baseCopy(source, props, object) { - object || (object = {}); - - var index = -1, - length = props.length; - - while (++index < length) { - var key = props[index]; - object[key] = source[key]; - } - return object; -} - -module.exports = baseCopy; - -},{}],70:[function(require,module,exports){ -var isObject = require('../lang/isObject'); - -/** - * The base implementation of `_.create` without support for assigning - * properties to the created object. - * - * @private - * @param {Object} prototype The object to inherit from. - * @returns {Object} Returns the new object. - */ -var baseCreate = (function() { - function object() {} - return function(prototype) { - if (isObject(prototype)) { - object.prototype = prototype; - var result = new object; - object.prototype = undefined; - } - return result || {}; - }; -}()); - -module.exports = baseCreate; - -},{"../lang/isObject":144}],71:[function(require,module,exports){ -var baseForOwn = require('./baseForOwn'), - createBaseEach = require('./createBaseEach'); - -/** - * The base implementation of `_.forEach` without support for callback - * shorthands and `this` binding. - * - * @private - * @param {Array|Object|string} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array|Object|string} Returns `collection`. - */ -var baseEach = createBaseEach(baseForOwn); - -module.exports = baseEach; - -},{"./baseForOwn":76,"./createBaseEach":98}],72:[function(require,module,exports){ -/** - * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`, - * without support for callback shorthands and `this` binding, which iterates - * over `collection` using the provided `eachFunc`. - * - * @private - * @param {Array|Object|string} collection The collection to search. - * @param {Function} predicate The function invoked per iteration. - * @param {Function} eachFunc The function to iterate over `collection`. - * @param {boolean} [retKey] Specify returning the key of the found element - * instead of the element itself. - * @returns {*} Returns the found element or its key, else `undefined`. - */ -function baseFind(collection, predicate, eachFunc, retKey) { - var result; - eachFunc(collection, function(value, key, collection) { - if (predicate(value, key, collection)) { - result = retKey ? key : value; - return false; - } - }); - return result; -} - -module.exports = baseFind; - -},{}],73:[function(require,module,exports){ -/** - * The base implementation of `_.findIndex` and `_.findLastIndex` without - * support for callback shorthands and `this` binding. - * - * @private - * @param {Array} array The array to search. - * @param {Function} predicate The function invoked per iteration. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function baseFindIndex(array, predicate, fromRight) { - var length = array.length, - index = fromRight ? length : -1; - - while ((fromRight ? index-- : ++index < length)) { - if (predicate(array[index], index, array)) { - return index; - } - } - return -1; -} - -module.exports = baseFindIndex; - -},{}],74:[function(require,module,exports){ -var createBaseFor = require('./createBaseFor'); - -/** - * The base implementation of `baseForIn` and `baseForOwn` which iterates - * over `object` properties returned by `keysFunc` invoking `iteratee` for - * each property. Iteratee functions may exit iteration early by explicitly - * returning `false`. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {Function} keysFunc The function to get the keys of `object`. - * @returns {Object} Returns `object`. - */ -var baseFor = createBaseFor(); - -module.exports = baseFor; - -},{"./createBaseFor":99}],75:[function(require,module,exports){ -var baseFor = require('./baseFor'), - keysIn = require('../object/keysIn'); - -/** - * The base implementation of `_.forIn` without support for callback - * shorthands and `this` binding. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Object} Returns `object`. - */ -function baseForIn(object, iteratee) { - return baseFor(object, iteratee, keysIn); -} - -module.exports = baseForIn; - -},{"../object/keysIn":150,"./baseFor":74}],76:[function(require,module,exports){ -var baseFor = require('./baseFor'), - keys = require('../object/keys'); - -/** - * The base implementation of `_.forOwn` without support for callback - * shorthands and `this` binding. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Object} Returns `object`. - */ -function baseForOwn(object, iteratee) { - return baseFor(object, iteratee, keys); -} - -module.exports = baseForOwn; - -},{"../object/keys":149,"./baseFor":74}],77:[function(require,module,exports){ -var toObject = require('./toObject'); - -/** - * The base implementation of `get` without support for string paths - * and default values. - * - * @private - * @param {Object} object The object to query. - * @param {Array} path The path of the property to get. - * @param {string} [pathKey] The key representation of path. - * @returns {*} Returns the resolved value. - */ -function baseGet(object, path, pathKey) { - if (object == null) { - return; - } - object = toObject(object); - if (pathKey !== undefined && pathKey in object) { - path = [pathKey]; - } - var index = 0, - length = path.length; - - while (object != null && index < length) { - object = toObject(object)[path[index++]]; - } - return (index && index == length) ? object : undefined; -} - -module.exports = baseGet; - -},{"./toObject":135}],78:[function(require,module,exports){ -var indexOfNaN = require('./indexOfNaN'); - -/** - * The base implementation of `_.indexOf` without support for binary searches. - * - * @private - * @param {Array} array The array to search. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function baseIndexOf(array, value, fromIndex) { - if (value !== value) { - return indexOfNaN(array, fromIndex); - } - var index = fromIndex - 1, - length = array.length; - - while (++index < length) { - if (array[index] === value) { - return index; - } - } - return -1; -} - -module.exports = baseIndexOf; - -},{"./indexOfNaN":115}],79:[function(require,module,exports){ -var baseIsEqualDeep = require('./baseIsEqualDeep'), - isObject = require('../lang/isObject'), - isObjectLike = require('./isObjectLike'); - -/** - * The base implementation of `_.isEqual` without support for `this` binding - * `customizer` functions. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @param {Function} [customizer] The function to customize comparing values. - * @param {boolean} [isLoose] Specify performing partial comparisons. - * @param {Array} [stackA] Tracks traversed `value` objects. - * @param {Array} [stackB] Tracks traversed `other` objects. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - */ -function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) { - if (value === other) { - return true; - } - if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { - return value !== value && other !== other; - } - return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB); -} - -module.exports = baseIsEqual; - -},{"../lang/isObject":144,"./baseIsEqualDeep":80,"./isObjectLike":126}],80:[function(require,module,exports){ -var equalArrays = require('./equalArrays'), - equalByTag = require('./equalByTag'), - equalObjects = require('./equalObjects'), - isArray = require('../lang/isArray'), - isHostObject = require('./isHostObject'), - isTypedArray = require('../lang/isTypedArray'); - -/** `Object#toString` result references. */ -var argsTag = '[object Arguments]', - arrayTag = '[object Array]', - objectTag = '[object Object]'; - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; - -/** - * A specialized version of `baseIsEqual` for arrays and objects which performs - * deep comparisons and tracks traversed objects enabling objects with circular - * references to be compared. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Function} [customizer] The function to customize comparing objects. - * @param {boolean} [isLoose] Specify performing partial comparisons. - * @param {Array} [stackA=[]] Tracks traversed `value` objects. - * @param {Array} [stackB=[]] Tracks traversed `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ -function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) { - var objIsArr = isArray(object), - othIsArr = isArray(other), - objTag = arrayTag, - othTag = arrayTag; - - if (!objIsArr) { - objTag = objToString.call(object); - if (objTag == argsTag) { - objTag = objectTag; - } else if (objTag != objectTag) { - objIsArr = isTypedArray(object); - } - } - if (!othIsArr) { - othTag = objToString.call(other); - if (othTag == argsTag) { - othTag = objectTag; - } else if (othTag != objectTag) { - othIsArr = isTypedArray(other); - } - } - var objIsObj = objTag == objectTag && !isHostObject(object), - othIsObj = othTag == objectTag && !isHostObject(other), - isSameTag = objTag == othTag; - - if (isSameTag && !(objIsArr || objIsObj)) { - return equalByTag(object, other, objTag); - } - if (!isLoose) { - var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), - othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); - - if (objIsWrapped || othIsWrapped) { - return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB); - } - } - if (!isSameTag) { - return false; - } - // Assume cyclic values are equal. - // For more information on detecting circular references see https://es5.github.io/#JO. - stackA || (stackA = []); - stackB || (stackB = []); - - var length = stackA.length; - while (length--) { - if (stackA[length] == object) { - return stackB[length] == other; - } - } - // Add `object` and `other` to the stack of traversed objects. - stackA.push(object); - stackB.push(other); - - var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB); - - stackA.pop(); - stackB.pop(); - - return result; -} - -module.exports = baseIsEqualDeep; - -},{"../lang/isArray":140,"../lang/isTypedArray":147,"./equalArrays":107,"./equalByTag":108,"./equalObjects":109,"./isHostObject":120}],81:[function(require,module,exports){ -var baseIsEqual = require('./baseIsEqual'), - toObject = require('./toObject'); - -/** - * The base implementation of `_.isMatch` without support for callback - * shorthands and `this` binding. - * - * @private - * @param {Object} object The object to inspect. - * @param {Array} matchData The propery names, values, and compare flags to match. - * @param {Function} [customizer] The function to customize comparing objects. - * @returns {boolean} Returns `true` if `object` is a match, else `false`. - */ -function baseIsMatch(object, matchData, customizer) { - var index = matchData.length, - length = index, - noCustomizer = !customizer; - - if (object == null) { - return !length; - } - object = toObject(object); - while (index--) { - var data = matchData[index]; - if ((noCustomizer && data[2]) - ? data[1] !== object[data[0]] - : !(data[0] in object) - ) { - return false; - } - } - while (++index < length) { - data = matchData[index]; - var key = data[0], - objValue = object[key], - srcValue = data[1]; - - if (noCustomizer && data[2]) { - if (objValue === undefined && !(key in object)) { - return false; - } - } else { - var result = customizer ? customizer(objValue, srcValue, key) : undefined; - if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) { - return false; - } - } - } - return true; -} - -module.exports = baseIsMatch; - -},{"./baseIsEqual":79,"./toObject":135}],82:[function(require,module,exports){ -/** - * The function whose prototype all chaining wrappers inherit from. - * - * @private - */ -function baseLodash() { - // No operation performed. -} - -module.exports = baseLodash; - -},{}],83:[function(require,module,exports){ -var baseEach = require('./baseEach'), - isArrayLike = require('./isArrayLike'); - -/** - * The base implementation of `_.map` without support for callback shorthands - * and `this` binding. - * - * @private - * @param {Array|Object|string} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - */ -function baseMap(collection, iteratee) { - var index = -1, - result = isArrayLike(collection) ? Array(collection.length) : []; - - baseEach(collection, function(value, key, collection) { - result[++index] = iteratee(value, key, collection); - }); - return result; -} - -module.exports = baseMap; - -},{"./baseEach":71,"./isArrayLike":119}],84:[function(require,module,exports){ -var baseIsMatch = require('./baseIsMatch'), - getMatchData = require('./getMatchData'), - toObject = require('./toObject'); - -/** - * The base implementation of `_.matches` which does not clone `source`. - * - * @private - * @param {Object} source The object of property values to match. - * @returns {Function} Returns the new function. - */ -function baseMatches(source) { - var matchData = getMatchData(source); - if (matchData.length == 1 && matchData[0][2]) { - var key = matchData[0][0], - value = matchData[0][1]; - - return function(object) { - if (object == null) { - return false; - } - object = toObject(object); - return object[key] === value && (value !== undefined || (key in object)); - }; - } - return function(object) { - return baseIsMatch(object, matchData); - }; -} - -module.exports = baseMatches; - -},{"./baseIsMatch":81,"./getMatchData":113,"./toObject":135}],85:[function(require,module,exports){ -var baseGet = require('./baseGet'), - baseIsEqual = require('./baseIsEqual'), - baseSlice = require('./baseSlice'), - isArray = require('../lang/isArray'), - isKey = require('./isKey'), - isStrictComparable = require('./isStrictComparable'), - last = require('../array/last'), - toObject = require('./toObject'), - toPath = require('./toPath'); - -/** - * The base implementation of `_.matchesProperty` which does not clone `srcValue`. - * - * @private - * @param {string} path The path of the property to get. - * @param {*} srcValue The value to compare. - * @returns {Function} Returns the new function. - */ -function baseMatchesProperty(path, srcValue) { - var isArr = isArray(path), - isCommon = isKey(path) && isStrictComparable(srcValue), - pathKey = (path + ''); - - path = toPath(path); - return function(object) { - if (object == null) { - return false; - } - var key = pathKey; - object = toObject(object); - if ((isArr || !isCommon) && !(key in object)) { - object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); - if (object == null) { - return false; - } - key = last(path); - object = toObject(object); - } - return object[key] === srcValue - ? (srcValue !== undefined || (key in object)) - : baseIsEqual(srcValue, object[key], undefined, true); - }; -} - -module.exports = baseMatchesProperty; - -},{"../array/last":50,"../lang/isArray":140,"./baseGet":77,"./baseIsEqual":79,"./baseSlice":89,"./isKey":123,"./isStrictComparable":127,"./toObject":135,"./toPath":136}],86:[function(require,module,exports){ -var toObject = require('./toObject'); - -/** - * The base implementation of `_.property` without support for deep paths. - * - * @private - * @param {string} key The key of the property to get. - * @returns {Function} Returns the new function. - */ -function baseProperty(key) { - return function(object) { - return object == null ? undefined : toObject(object)[key]; - }; -} - -module.exports = baseProperty; - -},{"./toObject":135}],87:[function(require,module,exports){ -var baseGet = require('./baseGet'), - toPath = require('./toPath'); - -/** - * A specialized version of `baseProperty` which supports deep paths. - * - * @private - * @param {Array|string} path The path of the property to get. - * @returns {Function} Returns the new function. - */ -function basePropertyDeep(path) { - var pathKey = (path + ''); - path = toPath(path); - return function(object) { - return baseGet(object, path, pathKey); - }; -} - -module.exports = basePropertyDeep; - -},{"./baseGet":77,"./toPath":136}],88:[function(require,module,exports){ -var identity = require('../utility/identity'), - metaMap = require('./metaMap'); - -/** - * The base implementation of `setData` without support for hot loop detection. - * - * @private - * @param {Function} func The function to associate metadata with. - * @param {*} data The metadata. - * @returns {Function} Returns `func`. - */ -var baseSetData = !metaMap ? identity : function(func, data) { - metaMap.set(func, data); - return func; -}; - -module.exports = baseSetData; - -},{"../utility/identity":154,"./metaMap":129}],89:[function(require,module,exports){ -/** - * The base implementation of `_.slice` without an iteratee call guard. - * - * @private - * @param {Array} array The array to slice. - * @param {number} [start=0] The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns the slice of `array`. - */ -function baseSlice(array, start, end) { - var index = -1, - length = array.length; - - start = start == null ? 0 : (+start || 0); - if (start < 0) { - start = -start > length ? 0 : (length + start); - } - end = (end === undefined || end > length) ? length : (+end || 0); - if (end < 0) { - end += length; - } - length = start > end ? 0 : ((end - start) >>> 0); - start >>>= 0; - - var result = Array(length); - while (++index < length) { - result[index] = array[index + start]; - } - return result; -} - -module.exports = baseSlice; - -},{}],90:[function(require,module,exports){ -/** - * Converts `value` to a string if it's not one. An empty string is returned - * for `null` or `undefined` values. - * - * @private - * @param {*} value The value to process. - * @returns {string} Returns the string. - */ -function baseToString(value) { - return value == null ? '' : (value + ''); -} - -module.exports = baseToString; - -},{}],91:[function(require,module,exports){ -/** - * The base implementation of `_.values` and `_.valuesIn` which creates an - * array of `object` property values corresponding to the property names - * of `props`. - * - * @private - * @param {Object} object The object to query. - * @param {Array} props The property names to get values for. - * @returns {Object} Returns the array of property values. - */ -function baseValues(object, props) { - var index = -1, - length = props.length, - result = Array(length); - - while (++index < length) { - result[index] = object[props[index]]; - } - return result; -} - -module.exports = baseValues; - -},{}],92:[function(require,module,exports){ -var binaryIndexBy = require('./binaryIndexBy'), - identity = require('../utility/identity'); - -/** Used as references for the maximum length and index of an array. */ -var MAX_ARRAY_LENGTH = 4294967295, - HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; - -/** - * Performs a binary search of `array` to determine the index at which `value` - * should be inserted into `array` in order to maintain its sort order. - * - * @private - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @param {boolean} [retHighest] Specify returning the highest qualified index. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - */ -function binaryIndex(array, value, retHighest) { - var low = 0, - high = array ? array.length : low; - - if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { - while (low < high) { - var mid = (low + high) >>> 1, - computed = array[mid]; - - if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) { - low = mid + 1; - } else { - high = mid; - } - } - return high; - } - return binaryIndexBy(array, value, identity, retHighest); -} - -module.exports = binaryIndex; - -},{"../utility/identity":154,"./binaryIndexBy":93}],93:[function(require,module,exports){ -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeFloor = Math.floor, - nativeMin = Math.min; - -/** Used as references for the maximum length and index of an array. */ -var MAX_ARRAY_LENGTH = 4294967295, - MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1; - -/** - * This function is like `binaryIndex` except that it invokes `iteratee` for - * `value` and each element of `array` to compute their sort ranking. The - * iteratee is invoked with one argument; (value). - * - * @private - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @param {Function} iteratee The function invoked per iteration. - * @param {boolean} [retHighest] Specify returning the highest qualified index. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - */ -function binaryIndexBy(array, value, iteratee, retHighest) { - value = iteratee(value); - - var low = 0, - high = array ? array.length : 0, - valIsNaN = value !== value, - valIsNull = value === null, - valIsUndef = value === undefined; - - while (low < high) { - var mid = nativeFloor((low + high) / 2), - computed = iteratee(array[mid]), - isDef = computed !== undefined, - isReflexive = computed === computed; - - if (valIsNaN) { - var setLow = isReflexive || retHighest; - } else if (valIsNull) { - setLow = isReflexive && isDef && (retHighest || computed != null); - } else if (valIsUndef) { - setLow = isReflexive && (retHighest || isDef); - } else if (computed == null) { - setLow = false; - } else { - setLow = retHighest ? (computed <= value) : (computed < value); - } - if (setLow) { - low = mid + 1; - } else { - high = mid; - } - } - return nativeMin(high, MAX_ARRAY_INDEX); -} - -module.exports = binaryIndexBy; - -},{}],94:[function(require,module,exports){ -var identity = require('../utility/identity'); - -/** - * A specialized version of `baseCallback` which only supports `this` binding - * and specifying the number of arguments to provide to `func`. - * - * @private - * @param {Function} func The function to bind. - * @param {*} thisArg The `this` binding of `func`. - * @param {number} [argCount] The number of arguments to provide to `func`. - * @returns {Function} Returns the callback. - */ -function bindCallback(func, thisArg, argCount) { - if (typeof func != 'function') { - return identity; - } - if (thisArg === undefined) { - return func; - } - switch (argCount) { - case 1: return function(value) { - return func.call(thisArg, value); - }; - case 3: return function(value, index, collection) { - return func.call(thisArg, value, index, collection); - }; - case 4: return function(accumulator, value, index, collection) { - return func.call(thisArg, accumulator, value, index, collection); - }; - case 5: return function(value, other, key, object, source) { - return func.call(thisArg, value, other, key, object, source); - }; - } - return function() { - return func.apply(thisArg, arguments); - }; -} - -module.exports = bindCallback; - -},{"../utility/identity":154}],95:[function(require,module,exports){ -(function (global){ -/** Native method references. */ -var ArrayBuffer = global.ArrayBuffer, - Uint8Array = global.Uint8Array; - -/** - * Creates a clone of the given array buffer. - * - * @private - * @param {ArrayBuffer} buffer The array buffer to clone. - * @returns {ArrayBuffer} Returns the cloned array buffer. - */ -function bufferClone(buffer) { - var result = new ArrayBuffer(buffer.byteLength), - view = new Uint8Array(result); - - view.set(new Uint8Array(buffer)); - return result; -} - -module.exports = bufferClone; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],96:[function(require,module,exports){ -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; - -/** - * Creates an array that is the composition of partially applied arguments, - * placeholders, and provided arguments into a single array of arguments. - * - * @private - * @param {Array|Object} args The provided arguments. - * @param {Array} partials The arguments to prepend to those provided. - * @param {Array} holders The `partials` placeholder indexes. - * @returns {Array} Returns the new array of composed arguments. - */ -function composeArgs(args, partials, holders) { - var holdersLength = holders.length, - argsIndex = -1, - argsLength = nativeMax(args.length - holdersLength, 0), - leftIndex = -1, - leftLength = partials.length, - result = Array(leftLength + argsLength); - - while (++leftIndex < leftLength) { - result[leftIndex] = partials[leftIndex]; - } - while (++argsIndex < holdersLength) { - result[holders[argsIndex]] = args[argsIndex]; - } - while (argsLength--) { - result[leftIndex++] = args[argsIndex++]; - } - return result; -} - -module.exports = composeArgs; - -},{}],97:[function(require,module,exports){ -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; - -/** - * This function is like `composeArgs` except that the arguments composition - * is tailored for `_.partialRight`. - * - * @private - * @param {Array|Object} args The provided arguments. - * @param {Array} partials The arguments to append to those provided. - * @param {Array} holders The `partials` placeholder indexes. - * @returns {Array} Returns the new array of composed arguments. - */ -function composeArgsRight(args, partials, holders) { - var holdersIndex = -1, - holdersLength = holders.length, - argsIndex = -1, - argsLength = nativeMax(args.length - holdersLength, 0), - rightIndex = -1, - rightLength = partials.length, - result = Array(argsLength + rightLength); - - while (++argsIndex < argsLength) { - result[argsIndex] = args[argsIndex]; - } - var offset = argsIndex; - while (++rightIndex < rightLength) { - result[offset + rightIndex] = partials[rightIndex]; - } - while (++holdersIndex < holdersLength) { - result[offset + holders[holdersIndex]] = args[argsIndex++]; - } - return result; -} - -module.exports = composeArgsRight; - -},{}],98:[function(require,module,exports){ -var getLength = require('./getLength'), - isLength = require('./isLength'), - toObject = require('./toObject'); - -/** - * Creates a `baseEach` or `baseEachRight` function. - * - * @private - * @param {Function} eachFunc The function to iterate over a collection. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ -function createBaseEach(eachFunc, fromRight) { - return function(collection, iteratee) { - var length = collection ? getLength(collection) : 0; - if (!isLength(length)) { - return eachFunc(collection, iteratee); - } - var index = fromRight ? length : -1, - iterable = toObject(collection); - - while ((fromRight ? index-- : ++index < length)) { - if (iteratee(iterable[index], index, iterable) === false) { - break; - } - } - return collection; - }; -} - -module.exports = createBaseEach; - -},{"./getLength":112,"./isLength":125,"./toObject":135}],99:[function(require,module,exports){ -var toObject = require('./toObject'); - -/** - * Creates a base function for `_.forIn` or `_.forInRight`. - * - * @private - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ -function createBaseFor(fromRight) { - return function(object, iteratee, keysFunc) { - var iterable = toObject(object), - props = keysFunc(object), - length = props.length, - index = fromRight ? length : -1; - - while ((fromRight ? index-- : ++index < length)) { - var key = props[index]; - if (iteratee(iterable[key], key, iterable) === false) { - break; - } - } - return object; - }; -} - -module.exports = createBaseFor; - -},{"./toObject":135}],100:[function(require,module,exports){ -(function (global){ -var createCtorWrapper = require('./createCtorWrapper'); - -/** - * Creates a function that wraps `func` and invokes it with the `this` - * binding of `thisArg`. - * - * @private - * @param {Function} func The function to bind. - * @param {*} [thisArg] The `this` binding of `func`. - * @returns {Function} Returns the new bound function. - */ -function createBindWrapper(func, thisArg) { - var Ctor = createCtorWrapper(func); - - function wrapper() { - var fn = (this && this !== global && this instanceof wrapper) ? Ctor : func; - return fn.apply(thisArg, arguments); - } - return wrapper; -} - -module.exports = createBindWrapper; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./createCtorWrapper":101}],101:[function(require,module,exports){ -var baseCreate = require('./baseCreate'), - isObject = require('../lang/isObject'); - -/** - * Creates a function that produces an instance of `Ctor` regardless of - * whether it was invoked as part of a `new` expression or by `call` or `apply`. - * - * @private - * @param {Function} Ctor The constructor to wrap. - * @returns {Function} Returns the new wrapped function. - */ -function createCtorWrapper(Ctor) { - return function() { - // Use a `switch` statement to work with class constructors. - // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist - // for more details. - var args = arguments; - switch (args.length) { - case 0: return new Ctor; - case 1: return new Ctor(args[0]); - case 2: return new Ctor(args[0], args[1]); - case 3: return new Ctor(args[0], args[1], args[2]); - case 4: return new Ctor(args[0], args[1], args[2], args[3]); - case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); - case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); - case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); - } - var thisBinding = baseCreate(Ctor.prototype), - result = Ctor.apply(thisBinding, args); - - // Mimic the constructor's `return` behavior. - // See https://es5.github.io/#x13.2.2 for more details. - return isObject(result) ? result : thisBinding; - }; -} - -module.exports = createCtorWrapper; - -},{"../lang/isObject":144,"./baseCreate":70}],102:[function(require,module,exports){ -var baseCallback = require('./baseCallback'), - baseFind = require('./baseFind'), - baseFindIndex = require('./baseFindIndex'), - isArray = require('../lang/isArray'); - -/** - * Creates a `_.find` or `_.findLast` function. - * - * @private - * @param {Function} eachFunc The function to iterate over a collection. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new find function. - */ -function createFind(eachFunc, fromRight) { - return function(collection, predicate, thisArg) { - predicate = baseCallback(predicate, thisArg, 3); - if (isArray(collection)) { - var index = baseFindIndex(collection, predicate, fromRight); - return index > -1 ? collection[index] : undefined; - } - return baseFind(collection, predicate, eachFunc); - }; -} - -module.exports = createFind; - -},{"../lang/isArray":140,"./baseCallback":67,"./baseFind":72,"./baseFindIndex":73}],103:[function(require,module,exports){ -var bindCallback = require('./bindCallback'), - isArray = require('../lang/isArray'); - -/** - * Creates a function for `_.forEach` or `_.forEachRight`. - * - * @private - * @param {Function} arrayFunc The function to iterate over an array. - * @param {Function} eachFunc The function to iterate over a collection. - * @returns {Function} Returns the new each function. - */ -function createForEach(arrayFunc, eachFunc) { - return function(collection, iteratee, thisArg) { - return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection)) - ? arrayFunc(collection, iteratee) - : eachFunc(collection, bindCallback(iteratee, thisArg, 3)); - }; -} - -module.exports = createForEach; - -},{"../lang/isArray":140,"./bindCallback":94}],104:[function(require,module,exports){ -(function (global){ -var arrayCopy = require('./arrayCopy'), - composeArgs = require('./composeArgs'), - composeArgsRight = require('./composeArgsRight'), - createCtorWrapper = require('./createCtorWrapper'), - isLaziable = require('./isLaziable'), - reorder = require('./reorder'), - replaceHolders = require('./replaceHolders'), - setData = require('./setData'); - -/** Used to compose bitmasks for wrapper metadata. */ -var BIND_FLAG = 1, - BIND_KEY_FLAG = 2, - CURRY_BOUND_FLAG = 4, - CURRY_FLAG = 8, - CURRY_RIGHT_FLAG = 16, - PARTIAL_FLAG = 32, - PARTIAL_RIGHT_FLAG = 64, - ARY_FLAG = 128; - -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; - -/** - * Creates a function that wraps `func` and invokes it with optional `this` - * binding of, partial application, and currying. - * - * @private - * @param {Function|string} func The function or method name to reference. - * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details. - * @param {*} [thisArg] The `this` binding of `func`. - * @param {Array} [partials] The arguments to prepend to those provided to the new function. - * @param {Array} [holders] The `partials` placeholder indexes. - * @param {Array} [partialsRight] The arguments to append to those provided to the new function. - * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. - * @param {Array} [argPos] The argument positions of the new function. - * @param {number} [ary] The arity cap of `func`. - * @param {number} [arity] The arity of `func`. - * @returns {Function} Returns the new wrapped function. - */ -function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { - var isAry = bitmask & ARY_FLAG, - isBind = bitmask & BIND_FLAG, - isBindKey = bitmask & BIND_KEY_FLAG, - isCurry = bitmask & CURRY_FLAG, - isCurryBound = bitmask & CURRY_BOUND_FLAG, - isCurryRight = bitmask & CURRY_RIGHT_FLAG, - Ctor = isBindKey ? undefined : createCtorWrapper(func); - - function wrapper() { - // Avoid `arguments` object use disqualifying optimizations by - // converting it to an array before providing it to other functions. - var length = arguments.length, - index = length, - args = Array(length); - - while (index--) { - args[index] = arguments[index]; - } - if (partials) { - args = composeArgs(args, partials, holders); - } - if (partialsRight) { - args = composeArgsRight(args, partialsRight, holdersRight); - } - if (isCurry || isCurryRight) { - var placeholder = wrapper.placeholder, - argsHolders = replaceHolders(args, placeholder); - - length -= argsHolders.length; - if (length < arity) { - var newArgPos = argPos ? arrayCopy(argPos) : undefined, - newArity = nativeMax(arity - length, 0), - newsHolders = isCurry ? argsHolders : undefined, - newHoldersRight = isCurry ? undefined : argsHolders, - newPartials = isCurry ? args : undefined, - newPartialsRight = isCurry ? undefined : args; - - bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG); - bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG); - - if (!isCurryBound) { - bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG); - } - var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity], - result = createHybridWrapper.apply(undefined, newData); - - if (isLaziable(func)) { - setData(result, newData); - } - result.placeholder = placeholder; - return result; - } - } - var thisBinding = isBind ? thisArg : this, - fn = isBindKey ? thisBinding[func] : func; - - if (argPos) { - args = reorder(args, argPos); - } - if (isAry && ary < args.length) { - args.length = ary; - } - if (this && this !== global && this instanceof wrapper) { - fn = Ctor || createCtorWrapper(func); - } - return fn.apply(thisBinding, args); - } - return wrapper; -} - -module.exports = createHybridWrapper; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./arrayCopy":62,"./composeArgs":96,"./composeArgsRight":97,"./createCtorWrapper":101,"./isLaziable":124,"./reorder":131,"./replaceHolders":132,"./setData":133}],105:[function(require,module,exports){ -(function (global){ -var createCtorWrapper = require('./createCtorWrapper'); - -/** Used to compose bitmasks for wrapper metadata. */ -var BIND_FLAG = 1; - -/** - * Creates a function that wraps `func` and invokes it with the optional `this` - * binding of `thisArg` and the `partials` prepended to those provided to - * the wrapper. - * - * @private - * @param {Function} func The function to partially apply arguments to. - * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details. - * @param {*} thisArg The `this` binding of `func`. - * @param {Array} partials The arguments to prepend to those provided to the new function. - * @returns {Function} Returns the new bound function. - */ -function createPartialWrapper(func, bitmask, thisArg, partials) { - var isBind = bitmask & BIND_FLAG, - Ctor = createCtorWrapper(func); - - function wrapper() { - // Avoid `arguments` object use disqualifying optimizations by - // converting it to an array before providing it `func`. - var argsIndex = -1, - argsLength = arguments.length, - leftIndex = -1, - leftLength = partials.length, - args = Array(leftLength + argsLength); - - while (++leftIndex < leftLength) { - args[leftIndex] = partials[leftIndex]; - } - while (argsLength--) { - args[leftIndex++] = arguments[++argsIndex]; - } - var fn = (this && this !== global && this instanceof wrapper) ? Ctor : func; - return fn.apply(isBind ? thisArg : this, args); - } - return wrapper; -} - -module.exports = createPartialWrapper; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./createCtorWrapper":101}],106:[function(require,module,exports){ -var baseSetData = require('./baseSetData'), - createBindWrapper = require('./createBindWrapper'), - createHybridWrapper = require('./createHybridWrapper'), - createPartialWrapper = require('./createPartialWrapper'), - getData = require('./getData'), - mergeData = require('./mergeData'), - setData = require('./setData'); - -/** Used to compose bitmasks for wrapper metadata. */ -var BIND_FLAG = 1, - BIND_KEY_FLAG = 2, - PARTIAL_FLAG = 32, - PARTIAL_RIGHT_FLAG = 64; - -/** Used as the `TypeError` message for "Functions" methods. */ -var FUNC_ERROR_TEXT = 'Expected a function'; - -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; - -/** - * Creates a function that either curries or invokes `func` with optional - * `this` binding and partially applied arguments. - * - * @private - * @param {Function|string} func The function or method name to reference. - * @param {number} bitmask The bitmask of flags. - * The bitmask may be composed of the following flags: - * 1 - `_.bind` - * 2 - `_.bindKey` - * 4 - `_.curry` or `_.curryRight` of a bound function - * 8 - `_.curry` - * 16 - `_.curryRight` - * 32 - `_.partial` - * 64 - `_.partialRight` - * 128 - `_.rearg` - * 256 - `_.ary` - * @param {*} [thisArg] The `this` binding of `func`. - * @param {Array} [partials] The arguments to be partially applied. - * @param {Array} [holders] The `partials` placeholder indexes. - * @param {Array} [argPos] The argument positions of the new function. - * @param {number} [ary] The arity cap of `func`. - * @param {number} [arity] The arity of `func`. - * @returns {Function} Returns the new wrapped function. - */ -function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { - var isBindKey = bitmask & BIND_KEY_FLAG; - if (!isBindKey && typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - var length = partials ? partials.length : 0; - if (!length) { - bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG); - partials = holders = undefined; - } - length -= (holders ? holders.length : 0); - if (bitmask & PARTIAL_RIGHT_FLAG) { - var partialsRight = partials, - holdersRight = holders; - - partials = holders = undefined; - } - var data = isBindKey ? undefined : getData(func), - newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity]; - - if (data) { - mergeData(newData, data); - bitmask = newData[1]; - arity = newData[9]; - } - newData[9] = arity == null - ? (isBindKey ? 0 : func.length) - : (nativeMax(arity - length, 0) || 0); - - if (bitmask == BIND_FLAG) { - var result = createBindWrapper(newData[0], newData[2]); - } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) { - result = createPartialWrapper.apply(undefined, newData); - } else { - result = createHybridWrapper.apply(undefined, newData); - } - var setter = data ? baseSetData : setData; - return setter(result, newData); -} - -module.exports = createWrapper; - -},{"./baseSetData":88,"./createBindWrapper":100,"./createHybridWrapper":104,"./createPartialWrapper":105,"./getData":110,"./mergeData":128,"./setData":133}],107:[function(require,module,exports){ -var arraySome = require('./arraySome'); - -/** - * A specialized version of `baseIsEqualDeep` for arrays with support for - * partial deep comparisons. - * - * @private - * @param {Array} array The array to compare. - * @param {Array} other The other array to compare. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Function} [customizer] The function to customize comparing arrays. - * @param {boolean} [isLoose] Specify performing partial comparisons. - * @param {Array} [stackA] Tracks traversed `value` objects. - * @param {Array} [stackB] Tracks traversed `other` objects. - * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. - */ -function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) { - var index = -1, - arrLength = array.length, - othLength = other.length; - - if (arrLength != othLength && !(isLoose && othLength > arrLength)) { - return false; - } - // Ignore non-index properties. - while (++index < arrLength) { - var arrValue = array[index], - othValue = other[index], - result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined; - - if (result !== undefined) { - if (result) { - continue; - } - return false; - } - // Recursively compare arrays (susceptible to call stack limits). - if (isLoose) { - if (!arraySome(other, function(othValue) { - return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); - })) { - return false; - } - } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) { - return false; - } - } - return true; -} - -module.exports = equalArrays; - -},{"./arraySome":65}],108:[function(require,module,exports){ -/** `Object#toString` result references. */ -var boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - numberTag = '[object Number]', - regexpTag = '[object RegExp]', - stringTag = '[object String]'; - -/** - * A specialized version of `baseIsEqualDeep` for comparing objects of - * the same `toStringTag`. - * - * **Note:** This function only supports comparing values with tags of - * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {string} tag The `toStringTag` of the objects to compare. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ -function equalByTag(object, other, tag) { - switch (tag) { - case boolTag: - case dateTag: - // Coerce dates and booleans to numbers, dates to milliseconds and booleans - // to `1` or `0` treating invalid dates coerced to `NaN` as not equal. - return +object == +other; - - case errorTag: - return object.name == other.name && object.message == other.message; - - case numberTag: - // Treat `NaN` vs. `NaN` as equal. - return (object != +object) - ? other != +other - : object == +other; - - case regexpTag: - case stringTag: - // Coerce regexes to strings and treat strings primitives and string - // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details. - return object == (other + ''); - } - return false; -} - -module.exports = equalByTag; - -},{}],109:[function(require,module,exports){ -var keys = require('../object/keys'); - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * A specialized version of `baseIsEqualDeep` for objects with support for - * partial deep comparisons. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Function} [customizer] The function to customize comparing values. - * @param {boolean} [isLoose] Specify performing partial comparisons. - * @param {Array} [stackA] Tracks traversed `value` objects. - * @param {Array} [stackB] Tracks traversed `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ -function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) { - var objProps = keys(object), - objLength = objProps.length, - othProps = keys(other), - othLength = othProps.length; - - if (objLength != othLength && !isLoose) { - return false; - } - var index = objLength; - while (index--) { - var key = objProps[index]; - if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) { - return false; - } - } - var skipCtor = isLoose; - while (++index < objLength) { - key = objProps[index]; - var objValue = object[key], - othValue = other[key], - result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined; - - // Recursively compare objects (susceptible to call stack limits). - if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) { - return false; - } - skipCtor || (skipCtor = key == 'constructor'); - } - if (!skipCtor) { - var objCtor = object.constructor, - othCtor = other.constructor; - - // Non `Object` object instances with different constructors are not equal. - if (objCtor != othCtor && - ('constructor' in object && 'constructor' in other) && - !(typeof objCtor == 'function' && objCtor instanceof objCtor && - typeof othCtor == 'function' && othCtor instanceof othCtor)) { - return false; - } - } - return true; -} - -module.exports = equalObjects; - -},{"../object/keys":149}],110:[function(require,module,exports){ -var metaMap = require('./metaMap'), - noop = require('../utility/noop'); - -/** - * Gets metadata for `func`. - * - * @private - * @param {Function} func The function to query. - * @returns {*} Returns the metadata for `func`. - */ -var getData = !metaMap ? noop : function(func) { - return metaMap.get(func); -}; - -module.exports = getData; - -},{"../utility/noop":155,"./metaMap":129}],111:[function(require,module,exports){ -var realNames = require('./realNames'); - -/** - * Gets the name of `func`. - * - * @private - * @param {Function} func The function to query. - * @returns {string} Returns the function name. - */ -function getFuncName(func) { - var result = (func.name + ''), - array = realNames[result], - length = array ? array.length : 0; - - while (length--) { - var data = array[length], - otherFunc = data.func; - if (otherFunc == null || otherFunc == func) { - return data.name; - } - } - return result; -} - -module.exports = getFuncName; - -},{"./realNames":130}],112:[function(require,module,exports){ -var baseProperty = require('./baseProperty'); - -/** - * Gets the "length" property value of `object`. - * - * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) - * that affects Safari on at least iOS 8.1-8.3 ARM64. - * - * @private - * @param {Object} object The object to query. - * @returns {*} Returns the "length" value. - */ -var getLength = baseProperty('length'); - -module.exports = getLength; - -},{"./baseProperty":86}],113:[function(require,module,exports){ -var isStrictComparable = require('./isStrictComparable'), - pairs = require('../object/pairs'); - -/** - * Gets the propery names, values, and compare flags of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the match data of `object`. - */ -function getMatchData(object) { - var result = pairs(object), - length = result.length; - - while (length--) { - result[length][2] = isStrictComparable(result[length][1]); - } - return result; -} - -module.exports = getMatchData; - -},{"../object/pairs":151,"./isStrictComparable":127}],114:[function(require,module,exports){ -var isNative = require('../lang/isNative'); - -/** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ -function getNative(object, key) { - var value = object == null ? undefined : object[key]; - return isNative(value) ? value : undefined; -} - -module.exports = getNative; - -},{"../lang/isNative":143}],115:[function(require,module,exports){ -/** - * Gets the index at which the first occurrence of `NaN` is found in `array`. - * - * @private - * @param {Array} array The array to search. - * @param {number} fromIndex The index to search from. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {number} Returns the index of the matched `NaN`, else `-1`. - */ -function indexOfNaN(array, fromIndex, fromRight) { - var length = array.length, - index = fromIndex + (fromRight ? 0 : -1); - - while ((fromRight ? index-- : ++index < length)) { - var other = array[index]; - if (other !== other) { - return index; - } - } - return -1; -} - -module.exports = indexOfNaN; - -},{}],116:[function(require,module,exports){ -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * Initializes an array clone. - * - * @private - * @param {Array} array The array to clone. - * @returns {Array} Returns the initialized clone. - */ -function initCloneArray(array) { - var length = array.length, - result = new array.constructor(length); - - // Add array properties assigned by `RegExp#exec`. - if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { - result.index = array.index; - result.input = array.input; - } - return result; -} - -module.exports = initCloneArray; - -},{}],117:[function(require,module,exports){ -(function (global){ -var bufferClone = require('./bufferClone'); - -/** `Object#toString` result references. */ -var boolTag = '[object Boolean]', - dateTag = '[object Date]', - numberTag = '[object Number]', - regexpTag = '[object RegExp]', - stringTag = '[object String]'; - -var arrayBufferTag = '[object ArrayBuffer]', - float32Tag = '[object Float32Array]', - float64Tag = '[object Float64Array]', - int8Tag = '[object Int8Array]', - int16Tag = '[object Int16Array]', - int32Tag = '[object Int32Array]', - uint8Tag = '[object Uint8Array]', - uint8ClampedTag = '[object Uint8ClampedArray]', - uint16Tag = '[object Uint16Array]', - uint32Tag = '[object Uint32Array]'; - -/** Used to match `RegExp` flags from their coerced string values. */ -var reFlags = /\w*$/; - -/** Native method references. */ -var Uint8Array = global.Uint8Array; - -/** Used to lookup a type array constructors by `toStringTag`. */ -var ctorByTag = {}; -ctorByTag[float32Tag] = global.Float32Array; -ctorByTag[float64Tag] = global.Float64Array; -ctorByTag[int8Tag] = global.Int8Array; -ctorByTag[int16Tag] = global.Int16Array; -ctorByTag[int32Tag] = global.Int32Array; -ctorByTag[uint8Tag] = Uint8Array; -ctorByTag[uint8ClampedTag] = global.Uint8ClampedArray; -ctorByTag[uint16Tag] = global.Uint16Array; -ctorByTag[uint32Tag] = global.Uint32Array; - -/** - * Initializes an object clone based on its `toStringTag`. - * - * **Note:** This function only supports cloning values with tags of - * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. - * - * @private - * @param {Object} object The object to clone. - * @param {string} tag The `toStringTag` of the object to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the initialized clone. - */ -function initCloneByTag(object, tag, isDeep) { - var Ctor = object.constructor; - switch (tag) { - case arrayBufferTag: - return bufferClone(object); - - case boolTag: - case dateTag: - return new Ctor(+object); - - case float32Tag: case float64Tag: - case int8Tag: case int16Tag: case int32Tag: - case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: - // Safari 5 mobile incorrectly has `Object` as the constructor of typed arrays. - if (Ctor instanceof Ctor) { - Ctor = ctorByTag[tag]; - } - var buffer = object.buffer; - return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length); - - case numberTag: - case stringTag: - return new Ctor(object); - - case regexpTag: - var result = new Ctor(object.source, reFlags.exec(object)); - result.lastIndex = object.lastIndex; - } - return result; -} - -module.exports = initCloneByTag; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./bufferClone":95}],118:[function(require,module,exports){ -/** - * Initializes an object clone. - * - * @private - * @param {Object} object The object to clone. - * @returns {Object} Returns the initialized clone. - */ -function initCloneObject(object) { - var Ctor = object.constructor; - if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) { - Ctor = Object; - } - return new Ctor; -} - -module.exports = initCloneObject; - -},{}],119:[function(require,module,exports){ -var getLength = require('./getLength'), - isLength = require('./isLength'); - -/** - * Checks if `value` is array-like. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is array-like, else `false`. - */ -function isArrayLike(value) { - return value != null && isLength(getLength(value)); -} - -module.exports = isArrayLike; - -},{"./getLength":112,"./isLength":125}],120:[function(require,module,exports){ -/** - * Checks if `value` is a host object in IE < 9. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a host object, else `false`. - */ -var isHostObject = (function() { - try { - Object({ 'toString': 0 } + ''); - } catch(e) { - return function() { return false; }; - } - return function(value) { - // IE < 9 presents many host objects as `Object` objects that can coerce - // to strings despite having improperly defined `toString` methods. - return typeof value.toString != 'function' && typeof (value + '') == 'string'; - }; -}()); - -module.exports = isHostObject; - -},{}],121:[function(require,module,exports){ -/** Used to detect unsigned integer values. */ -var reIsUint = /^\d+$/; - -/** - * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) - * of an array-like value. - */ -var MAX_SAFE_INTEGER = 9007199254740991; - -/** - * Checks if `value` is a valid array-like index. - * - * @private - * @param {*} value The value to check. - * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. - * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. - */ -function isIndex(value, length) { - value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; - length = length == null ? MAX_SAFE_INTEGER : length; - return value > -1 && value % 1 == 0 && value < length; -} - -module.exports = isIndex; - -},{}],122:[function(require,module,exports){ -var isArrayLike = require('./isArrayLike'), - isIndex = require('./isIndex'), - isObject = require('../lang/isObject'); - -/** - * Checks if the provided arguments are from an iteratee call. - * - * @private - * @param {*} value The potential iteratee value argument. - * @param {*} index The potential iteratee index or key argument. - * @param {*} object The potential iteratee object argument. - * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. - */ -function isIterateeCall(value, index, object) { - if (!isObject(object)) { - return false; - } - var type = typeof index; - if (type == 'number' - ? (isArrayLike(object) && isIndex(index, object.length)) - : (type == 'string' && index in object)) { - var other = object[index]; - return value === value ? (value === other) : (other !== other); - } - return false; -} - -module.exports = isIterateeCall; - -},{"../lang/isObject":144,"./isArrayLike":119,"./isIndex":121}],123:[function(require,module,exports){ -var isArray = require('../lang/isArray'), - toObject = require('./toObject'); - -/** Used to match property names within property paths. */ -var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/, - reIsPlainProp = /^\w*$/; - -/** - * Checks if `value` is a property name and not a property path. - * - * @private - * @param {*} value The value to check. - * @param {Object} [object] The object to query keys on. - * @returns {boolean} Returns `true` if `value` is a property name, else `false`. - */ -function isKey(value, object) { - var type = typeof value; - if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') { - return true; - } - if (isArray(value)) { - return false; - } - var result = !reIsDeepProp.test(value); - return result || (object != null && value in toObject(object)); -} - -module.exports = isKey; - -},{"../lang/isArray":140,"./toObject":135}],124:[function(require,module,exports){ -var LazyWrapper = require('./LazyWrapper'), - getData = require('./getData'), - getFuncName = require('./getFuncName'), - lodash = require('../chain/lodash'); - -/** - * Checks if `func` has a lazy counterpart. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`. - */ -function isLaziable(func) { - var funcName = getFuncName(func), - other = lodash[funcName]; - - if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { - return false; - } - if (func === other) { - return true; - } - var data = getData(other); - return !!data && func === data[0]; -} - -module.exports = isLaziable; - -},{"../chain/lodash":51,"./LazyWrapper":60,"./getData":110,"./getFuncName":111}],125:[function(require,module,exports){ -/** - * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) - * of an array-like value. - */ -var MAX_SAFE_INTEGER = 9007199254740991; - -/** - * Checks if `value` is a valid array-like length. - * - * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. - */ -function isLength(value) { - return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; -} - -module.exports = isLength; - -},{}],126:[function(require,module,exports){ -/** - * Checks if `value` is object-like. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - */ -function isObjectLike(value) { - return !!value && typeof value == 'object'; -} - -module.exports = isObjectLike; - -},{}],127:[function(require,module,exports){ -var isObject = require('../lang/isObject'); - -/** - * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` if suitable for strict - * equality comparisons, else `false`. - */ -function isStrictComparable(value) { - return value === value && !isObject(value); -} - -module.exports = isStrictComparable; - -},{"../lang/isObject":144}],128:[function(require,module,exports){ -var arrayCopy = require('./arrayCopy'), - composeArgs = require('./composeArgs'), - composeArgsRight = require('./composeArgsRight'), - replaceHolders = require('./replaceHolders'); - -/** Used to compose bitmasks for wrapper metadata. */ -var BIND_FLAG = 1, - CURRY_BOUND_FLAG = 4, - CURRY_FLAG = 8, - ARY_FLAG = 128, - REARG_FLAG = 256; - -/** Used as the internal argument placeholder. */ -var PLACEHOLDER = '__lodash_placeholder__'; - -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeMin = Math.min; - -/** - * Merges the function metadata of `source` into `data`. - * - * Merging metadata reduces the number of wrappers required to invoke a function. - * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` - * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg` - * augment function arguments, making the order in which they are executed important, - * preventing the merging of metadata. However, we make an exception for a safe - * common case where curried functions have `_.ary` and or `_.rearg` applied. - * - * @private - * @param {Array} data The destination metadata. - * @param {Array} source The source metadata. - * @returns {Array} Returns `data`. - */ -function mergeData(data, source) { - var bitmask = data[1], - srcBitmask = source[1], - newBitmask = bitmask | srcBitmask, - isCommon = newBitmask < ARY_FLAG; - - var isCombo = - (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) || - (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) || - (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG); - - // Exit early if metadata can't be merged. - if (!(isCommon || isCombo)) { - return data; - } - // Use source `thisArg` if available. - if (srcBitmask & BIND_FLAG) { - data[2] = source[2]; - // Set when currying a bound function. - newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG; - } - // Compose partial arguments. - var value = source[3]; - if (value) { - var partials = data[3]; - data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value); - data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]); - } - // Compose partial right arguments. - value = source[5]; - if (value) { - partials = data[5]; - data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value); - data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]); - } - // Use source `argPos` if available. - value = source[7]; - if (value) { - data[7] = arrayCopy(value); - } - // Use source `ary` if it's smaller. - if (srcBitmask & ARY_FLAG) { - data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); - } - // Use source `arity` if one is not provided. - if (data[9] == null) { - data[9] = source[9]; - } - // Use source `func` and merge bitmasks. - data[0] = source[0]; - data[1] = newBitmask; - - return data; -} - -module.exports = mergeData; - -},{"./arrayCopy":62,"./composeArgs":96,"./composeArgsRight":97,"./replaceHolders":132}],129:[function(require,module,exports){ -(function (global){ -var getNative = require('./getNative'); - -/** Native method references. */ -var WeakMap = getNative(global, 'WeakMap'); - -/** Used to store function metadata. */ -var metaMap = WeakMap && new WeakMap; - -module.exports = metaMap; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./getNative":114}],130:[function(require,module,exports){ -/** Used to lookup unminified function names. */ -var realNames = {}; - -module.exports = realNames; - -},{}],131:[function(require,module,exports){ -var arrayCopy = require('./arrayCopy'), - isIndex = require('./isIndex'); - -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeMin = Math.min; - -/** - * Reorder `array` according to the specified indexes where the element at - * the first index is assigned as the first element, the element at - * the second index is assigned as the second element, and so on. - * - * @private - * @param {Array} array The array to reorder. - * @param {Array} indexes The arranged array indexes. - * @returns {Array} Returns `array`. - */ -function reorder(array, indexes) { - var arrLength = array.length, - length = nativeMin(indexes.length, arrLength), - oldArray = arrayCopy(array); - - while (length--) { - var index = indexes[length]; - array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; - } - return array; -} - -module.exports = reorder; - -},{"./arrayCopy":62,"./isIndex":121}],132:[function(require,module,exports){ -/** Used as the internal argument placeholder. */ -var PLACEHOLDER = '__lodash_placeholder__'; - -/** - * Replaces all `placeholder` elements in `array` with an internal placeholder - * and returns an array of their indexes. - * - * @private - * @param {Array} array The array to modify. - * @param {*} placeholder The placeholder to replace. - * @returns {Array} Returns the new array of placeholder indexes. - */ -function replaceHolders(array, placeholder) { - var index = -1, - length = array.length, - resIndex = -1, - result = []; - - while (++index < length) { - if (array[index] === placeholder) { - array[index] = PLACEHOLDER; - result[++resIndex] = index; - } - } - return result; -} - -module.exports = replaceHolders; - -},{}],133:[function(require,module,exports){ -var baseSetData = require('./baseSetData'), - now = require('../date/now'); - -/** Used to detect when a function becomes hot. */ -var HOT_COUNT = 150, - HOT_SPAN = 16; - -/** - * Sets metadata for `func`. - * - * **Note:** If this function becomes hot, i.e. is invoked a lot in a short - * period of time, it will trip its breaker and transition to an identity function - * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070) - * for more details. - * - * @private - * @param {Function} func The function to associate metadata with. - * @param {*} data The metadata. - * @returns {Function} Returns `func`. - */ -var setData = (function() { - var count = 0, - lastCalled = 0; - - return function(key, value) { - var stamp = now(), - remaining = HOT_SPAN - (stamp - lastCalled); - - lastCalled = stamp; - if (remaining > 0) { - if (++count >= HOT_COUNT) { - return key; - } - } else { - count = 0; - } - return baseSetData(key, value); - }; -}()); - -module.exports = setData; - -},{"../date/now":57,"./baseSetData":88}],134:[function(require,module,exports){ -var isArguments = require('../lang/isArguments'), - isArray = require('../lang/isArray'), - isIndex = require('./isIndex'), - isLength = require('./isLength'), - isString = require('../lang/isString'), - keysIn = require('../object/keysIn'); - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * A fallback implementation of `Object.keys` which creates an array of the - * own enumerable property names of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ -function shimKeys(object) { - var props = keysIn(object), - propsLength = props.length, - length = propsLength && object.length; - - var allowIndexes = !!length && isLength(length) && - (isArray(object) || isArguments(object) || isString(object)); - - var index = -1, - result = []; - - while (++index < propsLength) { - var key = props[index]; - if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { - result.push(key); - } - } - return result; -} - -module.exports = shimKeys; - -},{"../lang/isArguments":139,"../lang/isArray":140,"../lang/isString":146,"../object/keysIn":150,"./isIndex":121,"./isLength":125}],135:[function(require,module,exports){ -var isObject = require('../lang/isObject'), - isString = require('../lang/isString'), - support = require('../support'); - -/** - * Converts `value` to an object if it's not one. - * - * @private - * @param {*} value The value to process. - * @returns {Object} Returns the object. - */ -function toObject(value) { - if (support.unindexedChars && isString(value)) { - var index = -1, - length = value.length, - result = Object(value); - - while (++index < length) { - result[index] = value.charAt(index); - } - return result; - } - return isObject(value) ? value : Object(value); -} - -module.exports = toObject; - -},{"../lang/isObject":144,"../lang/isString":146,"../support":153}],136:[function(require,module,exports){ -var baseToString = require('./baseToString'), - isArray = require('../lang/isArray'); - -/** Used to match property names within property paths. */ -var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g; - -/** Used to match backslashes in property paths. */ -var reEscapeChar = /\\(\\)?/g; - -/** - * Converts `value` to property path array if it's not one. - * - * @private - * @param {*} value The value to process. - * @returns {Array} Returns the property path array. - */ -function toPath(value) { - if (isArray(value)) { - return value; - } - var result = []; - baseToString(value).replace(rePropName, function(match, number, quote, string) { - result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); - }); - return result; -} - -module.exports = toPath; - -},{"../lang/isArray":140,"./baseToString":90}],137:[function(require,module,exports){ -var LazyWrapper = require('./LazyWrapper'), - LodashWrapper = require('./LodashWrapper'), - arrayCopy = require('./arrayCopy'); - -/** - * Creates a clone of `wrapper`. - * - * @private - * @param {Object} wrapper The wrapper to clone. - * @returns {Object} Returns the cloned wrapper. - */ -function wrapperClone(wrapper) { - return wrapper instanceof LazyWrapper - ? wrapper.clone() - : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__)); -} - -module.exports = wrapperClone; - -},{"./LazyWrapper":60,"./LodashWrapper":61,"./arrayCopy":62}],138:[function(require,module,exports){ -var baseClone = require('../internal/baseClone'), - bindCallback = require('../internal/bindCallback'); - -/** - * Creates a deep clone of `value`. If `customizer` is provided it's invoked - * to produce the cloned values. If `customizer` returns `undefined` cloning - * is handled by the method instead. The `customizer` is bound to `thisArg` - * and invoked with up to three argument; (value [, index|key, object]). - * - * **Note:** This method is loosely based on the - * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm). - * The enumerable properties of `arguments` objects and objects created by - * constructors other than `Object` are cloned to plain `Object` objects. An - * empty object is returned for uncloneable values such as functions, DOM nodes, - * Maps, Sets, and WeakMaps. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to deep clone. - * @param {Function} [customizer] The function to customize cloning values. - * @param {*} [thisArg] The `this` binding of `customizer`. - * @returns {*} Returns the deep cloned value. - * @example - * - * var users = [ - * { 'user': 'barney' }, - * { 'user': 'fred' } - * ]; - * - * var deep = _.cloneDeep(users); - * deep[0] === users[0]; - * // => false - * - * // using a customizer callback - * var el = _.cloneDeep(document.body, function(value) { - * if (_.isElement(value)) { - * return value.cloneNode(true); - * } - * }); - * - * el === document.body - * // => false - * el.nodeName - * // => BODY - * el.childNodes.length; - * // => 20 - */ -function cloneDeep(value, customizer, thisArg) { - return typeof customizer == 'function' - ? baseClone(value, true, bindCallback(customizer, thisArg, 3)) - : baseClone(value, true); -} - -module.exports = cloneDeep; - -},{"../internal/baseClone":68,"../internal/bindCallback":94}],139:[function(require,module,exports){ -var isArrayLike = require('../internal/isArrayLike'), - isObjectLike = require('../internal/isObjectLike'); - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** Native method references. */ -var propertyIsEnumerable = objectProto.propertyIsEnumerable; - -/** - * Checks if `value` is classified as an `arguments` object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isArguments(function() { return arguments; }()); - * // => true - * - * _.isArguments([1, 2, 3]); - * // => false - */ -function isArguments(value) { - return isObjectLike(value) && isArrayLike(value) && - hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); -} - -module.exports = isArguments; - -},{"../internal/isArrayLike":119,"../internal/isObjectLike":126}],140:[function(require,module,exports){ -var getNative = require('../internal/getNative'), - isLength = require('../internal/isLength'), - isObjectLike = require('../internal/isObjectLike'); - -/** `Object#toString` result references. */ -var arrayTag = '[object Array]'; - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; - -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeIsArray = getNative(Array, 'isArray'); - -/** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(function() { return arguments; }()); - * // => false - */ -var isArray = nativeIsArray || function(value) { - return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; -}; - -module.exports = isArray; - -},{"../internal/getNative":114,"../internal/isLength":125,"../internal/isObjectLike":126}],141:[function(require,module,exports){ -var isArguments = require('./isArguments'), - isArray = require('./isArray'), - isArrayLike = require('../internal/isArrayLike'), - isFunction = require('./isFunction'), - isObjectLike = require('../internal/isObjectLike'), - isString = require('./isString'), - keys = require('../object/keys'); - -/** - * Checks if `value` is empty. A value is considered empty unless it's an - * `arguments` object, array, string, or jQuery-like collection with a length - * greater than `0` or an object with own enumerable properties. - * - * @static - * @memberOf _ - * @category Lang - * @param {Array|Object|string} value The value to inspect. - * @returns {boolean} Returns `true` if `value` is empty, else `false`. - * @example - * - * _.isEmpty(null); - * // => true - * - * _.isEmpty(true); - * // => true - * - * _.isEmpty(1); - * // => true - * - * _.isEmpty([1, 2, 3]); - * // => false - * - * _.isEmpty({ 'a': 1 }); - * // => false - */ -function isEmpty(value) { - if (value == null) { - return true; - } - if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) || - (isObjectLike(value) && isFunction(value.splice)))) { - return !value.length; - } - return !keys(value).length; -} - -module.exports = isEmpty; - -},{"../internal/isArrayLike":119,"../internal/isObjectLike":126,"../object/keys":149,"./isArguments":139,"./isArray":140,"./isFunction":142,"./isString":146}],142:[function(require,module,exports){ -var isObject = require('./isObject'); - -/** `Object#toString` result references. */ -var funcTag = '[object Function]'; - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; - -/** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ -function isFunction(value) { - // The use of `Object#toString` avoids issues with the `typeof` operator - // in older versions of Chrome and Safari which return 'function' for regexes - // and Safari 8 which returns 'object' for typed array constructors. - return isObject(value) && objToString.call(value) == funcTag; -} - -module.exports = isFunction; - -},{"./isObject":144}],143:[function(require,module,exports){ -var isFunction = require('./isFunction'), - isHostObject = require('../internal/isHostObject'), - isObjectLike = require('../internal/isObjectLike'); - -/** Used to detect host constructors (Safari > 5). */ -var reIsHostCtor = /^\[object .+?Constructor\]$/; - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** Used to resolve the decompiled source of functions. */ -var fnToString = Function.prototype.toString; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** Used to detect if a method is native. */ -var reIsNative = RegExp('^' + - fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' -); - -/** - * Checks if `value` is a native function. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, else `false`. - * @example - * - * _.isNative(Array.prototype.push); - * // => true - * - * _.isNative(_); - * // => false - */ -function isNative(value) { - if (value == null) { - return false; - } - if (isFunction(value)) { - return reIsNative.test(fnToString.call(value)); - } - return isObjectLike(value) && (isHostObject(value) ? reIsNative : reIsHostCtor).test(value); -} - -module.exports = isNative; - -},{"../internal/isHostObject":120,"../internal/isObjectLike":126,"./isFunction":142}],144:[function(require,module,exports){ -/** - * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. - * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(1); - * // => false - */ -function isObject(value) { - // Avoid a V8 JIT bug in Chrome 19-20. - // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); -} - -module.exports = isObject; - -},{}],145:[function(require,module,exports){ -var baseForIn = require('../internal/baseForIn'), - isArguments = require('./isArguments'), - isHostObject = require('../internal/isHostObject'), - isObjectLike = require('../internal/isObjectLike'), - support = require('../support'); - -/** `Object#toString` result references. */ -var objectTag = '[object Object]'; - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; - -/** - * Checks if `value` is a plain object, that is, an object created by the - * `Object` constructor or one with a `[[Prototype]]` of `null`. - * - * **Note:** This method assumes objects created by the `Object` constructor - * have no inherited enumerable properties. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. - * @example - * - * function Foo() { - * this.a = 1; - * } - * - * _.isPlainObject(new Foo); - * // => false - * - * _.isPlainObject([1, 2, 3]); - * // => false - * - * _.isPlainObject({ 'x': 0, 'y': 0 }); - * // => true - * - * _.isPlainObject(Object.create(null)); - * // => true - */ -function isPlainObject(value) { - var Ctor; - - // Exit early for non `Object` objects. - if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isHostObject(value) && !isArguments(value)) || - (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) { - return false; - } - // IE < 9 iterates inherited properties before own properties. If the first - // iterated property is an object's own property then there are no inherited - // enumerable properties. - var result; - if (support.ownLast) { - baseForIn(value, function(subValue, key, object) { - result = hasOwnProperty.call(object, key); - return false; - }); - return result !== false; - } - // In most environments an object's own properties are iterated before - // its inherited properties. If the last iterated property is an object's - // own property then there are no inherited enumerable properties. - baseForIn(value, function(subValue, key) { - result = key; - }); - return result === undefined || hasOwnProperty.call(value, result); -} - -module.exports = isPlainObject; - -},{"../internal/baseForIn":75,"../internal/isHostObject":120,"../internal/isObjectLike":126,"../support":153,"./isArguments":139}],146:[function(require,module,exports){ -var isObjectLike = require('../internal/isObjectLike'); - -/** `Object#toString` result references. */ -var stringTag = '[object String]'; - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; - -/** - * Checks if `value` is classified as a `String` primitive or object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isString('abc'); - * // => true - * - * _.isString(1); - * // => false - */ -function isString(value) { - return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag); -} - -module.exports = isString; - -},{"../internal/isObjectLike":126}],147:[function(require,module,exports){ -var isLength = require('../internal/isLength'), - isObjectLike = require('../internal/isObjectLike'); - -/** `Object#toString` result references. */ -var argsTag = '[object Arguments]', - arrayTag = '[object Array]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - funcTag = '[object Function]', - mapTag = '[object Map]', - numberTag = '[object Number]', - objectTag = '[object Object]', - regexpTag = '[object RegExp]', - setTag = '[object Set]', - stringTag = '[object String]', - weakMapTag = '[object WeakMap]'; - -var arrayBufferTag = '[object ArrayBuffer]', - float32Tag = '[object Float32Array]', - float64Tag = '[object Float64Array]', - int8Tag = '[object Int8Array]', - int16Tag = '[object Int16Array]', - int32Tag = '[object Int32Array]', - uint8Tag = '[object Uint8Array]', - uint8ClampedTag = '[object Uint8ClampedArray]', - uint16Tag = '[object Uint16Array]', - uint32Tag = '[object Uint32Array]'; - -/** Used to identify `toStringTag` values of typed arrays. */ -var typedArrayTags = {}; -typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = -typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = -typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = -typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = -typedArrayTags[uint32Tag] = true; -typedArrayTags[argsTag] = typedArrayTags[arrayTag] = -typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = -typedArrayTags[dateTag] = typedArrayTags[errorTag] = -typedArrayTags[funcTag] = typedArrayTags[mapTag] = -typedArrayTags[numberTag] = typedArrayTags[objectTag] = -typedArrayTags[regexpTag] = typedArrayTags[setTag] = -typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; - -/** - * Checks if `value` is classified as a typed array. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isTypedArray(new Uint8Array); - * // => true - * - * _.isTypedArray([]); - * // => false - */ -function isTypedArray(value) { - return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)]; -} - -module.exports = isTypedArray; - -},{"../internal/isLength":125,"../internal/isObjectLike":126}],148:[function(require,module,exports){ -/** - * Checks if `value` is `undefined`. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. - * @example - * - * _.isUndefined(void 0); - * // => true - * - * _.isUndefined(null); - * // => false - */ -function isUndefined(value) { - return value === undefined; -} - -module.exports = isUndefined; - -},{}],149:[function(require,module,exports){ -var getNative = require('../internal/getNative'), - isArrayLike = require('../internal/isArrayLike'), - isObject = require('../lang/isObject'), - shimKeys = require('../internal/shimKeys'), - support = require('../support'); - -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeKeys = getNative(Object, 'keys'); - -/** - * Creates an array of the own enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. See the - * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) - * for more details. - * - * @static - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keys(new Foo); - * // => ['a', 'b'] (iteration order is not guaranteed) - * - * _.keys('hi'); - * // => ['0', '1'] - */ -var keys = !nativeKeys ? shimKeys : function(object) { - var Ctor = object == null ? undefined : object.constructor; - if ((typeof Ctor == 'function' && Ctor.prototype === object) || - (typeof object == 'function' ? support.enumPrototypes : isArrayLike(object))) { - return shimKeys(object); - } - return isObject(object) ? nativeKeys(object) : []; -}; - -module.exports = keys; - -},{"../internal/getNative":114,"../internal/isArrayLike":119,"../internal/shimKeys":134,"../lang/isObject":144,"../support":153}],150:[function(require,module,exports){ -var arrayEach = require('../internal/arrayEach'), - isArguments = require('../lang/isArguments'), - isArray = require('../lang/isArray'), - isFunction = require('../lang/isFunction'), - isIndex = require('../internal/isIndex'), - isLength = require('../internal/isLength'), - isObject = require('../lang/isObject'), - isString = require('../lang/isString'), - support = require('../support'); - -/** `Object#toString` result references. */ -var arrayTag = '[object Array]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - funcTag = '[object Function]', - numberTag = '[object Number]', - objectTag = '[object Object]', - regexpTag = '[object RegExp]', - stringTag = '[object String]'; - -/** Used to fix the JScript `[[DontEnum]]` bug. */ -var shadowProps = [ - 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', - 'toLocaleString', 'toString', 'valueOf' -]; - -/** Used for native method references. */ -var errorProto = Error.prototype, - objectProto = Object.prototype, - stringProto = String.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; - -/** Used to avoid iterating over non-enumerable properties in IE < 9. */ -var nonEnumProps = {}; -nonEnumProps[arrayTag] = nonEnumProps[dateTag] = nonEnumProps[numberTag] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true }; -nonEnumProps[boolTag] = nonEnumProps[stringTag] = { 'constructor': true, 'toString': true, 'valueOf': true }; -nonEnumProps[errorTag] = nonEnumProps[funcTag] = nonEnumProps[regexpTag] = { 'constructor': true, 'toString': true }; -nonEnumProps[objectTag] = { 'constructor': true }; - -arrayEach(shadowProps, function(key) { - for (var tag in nonEnumProps) { - if (hasOwnProperty.call(nonEnumProps, tag)) { - var props = nonEnumProps[tag]; - props[key] = hasOwnProperty.call(props, key); - } - } -}); - -/** - * Creates an array of the own and inherited enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keysIn(new Foo); - * // => ['a', 'b', 'c'] (iteration order is not guaranteed) - */ -function keysIn(object) { - if (object == null) { - return []; - } - if (!isObject(object)) { - object = Object(object); - } - var length = object.length; - - length = (length && isLength(length) && - (isArray(object) || isArguments(object) || isString(object)) && length) || 0; - - var Ctor = object.constructor, - index = -1, - proto = (isFunction(Ctor) && Ctor.prototype) || objectProto, - isProto = proto === object, - result = Array(length), - skipIndexes = length > 0, - skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error), - skipProto = support.enumPrototypes && isFunction(object); - - while (++index < length) { - result[index] = (index + ''); - } - // lodash skips the `constructor` property when it infers it's iterating - // over a `prototype` object because IE < 9 can't set the `[[Enumerable]]` - // attribute of an existing property and the `constructor` property of a - // prototype defaults to non-enumerable. - for (var key in object) { - if (!(skipProto && key == 'prototype') && - !(skipErrorProps && (key == 'message' || key == 'name')) && - !(skipIndexes && isIndex(key, length)) && - !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { - result.push(key); - } - } - if (support.nonEnumShadows && object !== objectProto) { - var tag = object === stringProto ? stringTag : (object === errorProto ? errorTag : objToString.call(object)), - nonEnums = nonEnumProps[tag] || nonEnumProps[objectTag]; - - if (tag == objectTag) { - proto = objectProto; - } - length = shadowProps.length; - while (length--) { - key = shadowProps[length]; - var nonEnum = nonEnums[key]; - if (!(isProto && nonEnum) && - (nonEnum ? hasOwnProperty.call(object, key) : object[key] !== proto[key])) { - result.push(key); - } - } - } - return result; -} - -module.exports = keysIn; - -},{"../internal/arrayEach":63,"../internal/isIndex":121,"../internal/isLength":125,"../lang/isArguments":139,"../lang/isArray":140,"../lang/isFunction":142,"../lang/isObject":144,"../lang/isString":146,"../support":153}],151:[function(require,module,exports){ -var keys = require('./keys'), - toObject = require('../internal/toObject'); - -/** - * Creates a two dimensional array of the key-value pairs for `object`, - * e.g. `[[key1, value1], [key2, value2]]`. - * - * @static - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the new array of key-value pairs. - * @example - * - * _.pairs({ 'barney': 36, 'fred': 40 }); - * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed) - */ -function pairs(object) { - object = toObject(object); - - var index = -1, - props = keys(object), - length = props.length, - result = Array(length); - - while (++index < length) { - var key = props[index]; - result[index] = [key, object[key]]; - } - return result; -} - -module.exports = pairs; - -},{"../internal/toObject":135,"./keys":149}],152:[function(require,module,exports){ -var baseValues = require('../internal/baseValues'), - keys = require('./keys'); - -/** - * Creates an array of the own enumerable property values of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property values. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.values(new Foo); - * // => [1, 2] (iteration order is not guaranteed) - * - * _.values('hi'); - * // => ['h', 'i'] - */ -function values(object) { - return baseValues(object, keys(object)); -} - -module.exports = values; - -},{"../internal/baseValues":91,"./keys":149}],153:[function(require,module,exports){ -/** Used for native method references. */ -var arrayProto = Array.prototype, - errorProto = Error.prototype, - objectProto = Object.prototype; - -/** Native method references. */ -var propertyIsEnumerable = objectProto.propertyIsEnumerable, - splice = arrayProto.splice; - -/** - * An object environment feature flags. - * - * @static - * @memberOf _ - * @type Object - */ -var support = {}; - -(function(x) { - var Ctor = function() { this.x = x; }, - object = { '0': x, 'length': x }, - props = []; - - Ctor.prototype = { 'valueOf': x, 'y': x }; - for (var key in new Ctor) { props.push(key); } - - /** - * Detect if `name` or `message` properties of `Error.prototype` are - * enumerable by default (IE < 9, Safari < 5.1). - * - * @memberOf _.support - * @type boolean - */ - support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || - propertyIsEnumerable.call(errorProto, 'name'); - - /** - * Detect if `prototype` properties are enumerable by default. - * - * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1 - * (if the prototype or a property on the prototype has been set) - * incorrectly set the `[[Enumerable]]` value of a function's `prototype` - * property to `true`. - * - * @memberOf _.support - * @type boolean - */ - support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype'); - - /** - * Detect if properties shadowing those on `Object.prototype` are non-enumerable. - * - * In IE < 9 an object's own properties, shadowing non-enumerable ones, - * are made non-enumerable as well (a.k.a the JScript `[[DontEnum]]` bug). - * - * @memberOf _.support - * @type boolean - */ - support.nonEnumShadows = !/valueOf/.test(props); - - /** - * Detect if own properties are iterated after inherited properties (IE < 9). - * - * @memberOf _.support - * @type boolean - */ - support.ownLast = props[0] != 'x'; - - /** - * Detect if `Array#shift` and `Array#splice` augment array-like objects - * correctly. - * - * Firefox < 10, compatibility modes of IE 8, and IE < 9 have buggy Array - * `shift()` and `splice()` functions that fail to remove the last element, - * `value[0]`, of array-like objects even though the "length" property is - * set to `0`. The `shift()` method is buggy in compatibility modes of IE 8, - * while `splice()` is buggy regardless of mode in IE < 9. - * - * @memberOf _.support - * @type boolean - */ - support.spliceObjects = (splice.call(object, 0, 1), !object[0]); - - /** - * Detect lack of support for accessing string characters by index. - * - * IE < 8 can't access characters by index. IE 8 can only access characters - * by index on string literals, not string objects. - * - * @memberOf _.support - * @type boolean - */ - support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx'; -}(1, 0)); - -module.exports = support; - -},{}],154:[function(require,module,exports){ -/** - * This method returns the first argument provided to it. - * - * @static - * @memberOf _ - * @category Utility - * @param {*} value Any value. - * @returns {*} Returns `value`. - * @example - * - * var object = { 'user': 'fred' }; - * - * _.identity(object) === object; - * // => true - */ -function identity(value) { - return value; -} - -module.exports = identity; - -},{}],155:[function(require,module,exports){ -/** - * A no-operation function that returns `undefined` regardless of the - * arguments it receives. - * - * @static - * @memberOf _ - * @category Utility - * @example - * - * var object = { 'user': 'fred' }; - * - * _.noop(object) === undefined; - * // => true - */ -function noop() { - // No operation performed. -} - -module.exports = noop; - -},{}],156:[function(require,module,exports){ -var baseProperty = require('../internal/baseProperty'), - basePropertyDeep = require('../internal/basePropertyDeep'), - isKey = require('../internal/isKey'); - -/** - * Creates a function that returns the property value at `path` on a - * given object. - * - * @static - * @memberOf _ - * @category Utility - * @param {Array|string} path The path of the property to get. - * @returns {Function} Returns the new function. - * @example - * - * var objects = [ - * { 'a': { 'b': { 'c': 2 } } }, - * { 'a': { 'b': { 'c': 1 } } } - * ]; - * - * _.map(objects, _.property('a.b.c')); - * // => [2, 1] - * - * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c'); - * // => [1, 2] - */ -function property(path) { - return isKey(path) ? baseProperty(path) : basePropertyDeep(path); -} - -module.exports = property; - -},{"../internal/baseProperty":86,"../internal/basePropertyDeep":87,"../internal/isKey":123}],157:[function(require,module,exports){ -(function (process){ -// vim:ts=4:sts=4:sw=4: -/*! - * - * Copyright 2009-2012 Kris Kowal under the terms of the MIT - * license found at http://github.com/kriskowal/q/raw/master/LICENSE - * - * With parts by Tyler Close - * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found - * at http://www.opensource.org/licenses/mit-license.html - * Forked at ref_send.js version: 2009-05-11 - * - * With parts by Mark Miller - * Copyright (C) 2011 Google Inc. - * - * 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 - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -(function (definition) { - "use strict"; - - // This file will function properly as a