From fd0959a92ae99125a6700bf8e162086ae68f0f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=A2=E6=99=93=E4=B8=BD?= <975778681@qq.com> Date: Wed, 1 Dec 2021 11:13:41 +0800 Subject: [PATCH 1/2] human --- .../11_20211201/Lu.svg" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 "\345\215\242\346\231\223\344\270\275/11_20211201/Lu.svg" diff --git "a/\345\215\242\346\231\223\344\270\275/11_20211201/Lu.svg" "b/\345\215\242\346\231\223\344\270\275/11_20211201/Lu.svg" new file mode 100644 index 0000000..1eb3e6b --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/11_20211201/Lu.svg" @@ -0,0 +1,25 @@ + + + + Layer 1 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- Gitee From f36ed90674fa61a72443ad8611dff2160254b941 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=A2=E6=99=93=E4=B8=BD?= <975778681@qq.com> Date: Wed, 8 Dec 2021 10:33:58 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo1.html" | 181 + .../demo2.html" | 152 + .../demo1.html" | 35 + .../demo2.css" | 87 + .../demo2.html" | 150 + .../download/font_o4ip7o2u7v/demo.css" | 539 + .../download/font_o4ip7o2u7v/demo_index.html" | 230 + .../download/font_o4ip7o2u7v/iconfont.css" | 21 + .../download/font_o4ip7o2u7v/iconfont.js" | 1 + .../download/font_o4ip7o2u7v/iconfont.json" | 23 + .../download/font_o4ip7o2u7v/iconfont.ttf" | Bin 0 -> 1884 bytes .../jquery-3.6.0.js" | 10881 ++++++++++++++++ .../demo1.html" | 76 + .../demo1.html" | 59 + .../demo.html" | 190 + .../demo1.html" | 57 + .../demo2.html" | 67 + .../demo.html" | 44 + .../img/1.webp" | Bin 0 -> 9748 bytes .../img/10.webp" | Bin 0 -> 40386 bytes .../img/11.webp" | Bin 0 -> 23726 bytes .../img/12.webp" | Bin 0 -> 11224 bytes .../img/2.webp" | Bin 0 -> 10798 bytes .../img/3.webp" | Bin 0 -> 7012 bytes .../img/4.webp" | Bin 0 -> 5116 bytes .../img/5.webp" | Bin 0 -> 10740 bytes .../img/6.webp" | Bin 0 -> 10778 bytes .../img/7.webp" | Bin 0 -> 3156 bytes .../img/8.webp" | Bin 0 -> 14078 bytes .../img/9.webp" | Bin 0 -> 17012 bytes 30 files changed, 12793 insertions(+) create mode 100644 "\345\215\242\346\231\223\344\270\275/11.24 \345\274\271\346\200\247\347\233\222\345\255\220/demo1.html" create mode 100644 "\345\215\242\346\231\223\344\270\275/11.24 \345\274\271\346\200\247\347\233\222\345\255\220/demo2.html" create mode 100644 "\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/demo1.html" create mode 100644 "\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/demo2.css" create mode 100644 "\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/demo2.html" create mode 100644 "\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/demo.css" create mode 100644 "\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/demo_index.html" create mode 100644 "\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.css" create mode 100644 "\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.js" create mode 100644 "\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.json" create mode 100644 "\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.ttf" create mode 100644 "\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/jquery-3.6.0.js" create mode 100644 "\345\215\242\346\231\223\344\270\275/13_1115 \344\270\213\351\233\252\347\211\271\346\225\210/demo1.html" create mode 100644 "\345\215\242\346\231\223\344\270\275/14_1117 \345\244\252\346\236\201\345\233\276/demo1.html" create mode 100644 "\345\215\242\346\231\223\344\270\275/15_1118 \350\203\214\346\231\257\350\276\271\346\241\206/demo.html" create mode 100644 "\345\215\242\346\231\223\344\270\275/16_1119 \345\200\274\344\270\216\345\215\225\344\275\215/demo1.html" create mode 100644 "\345\215\242\346\231\223\344\270\275/16_1119 \345\200\274\344\270\216\345\215\225\344\275\215/demo2.html" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/demo.html" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/1.webp" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/10.webp" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/11.webp" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/12.webp" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/2.webp" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/3.webp" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/4.webp" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/5.webp" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/6.webp" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/7.webp" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/8.webp" create mode 100644 "\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/9.webp" diff --git "a/\345\215\242\346\231\223\344\270\275/11.24 \345\274\271\346\200\247\347\233\222\345\255\220/demo1.html" "b/\345\215\242\346\231\223\344\270\275/11.24 \345\274\271\346\200\247\347\233\222\345\255\220/demo1.html" new file mode 100644 index 0000000..40081e3 --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/11.24 \345\274\271\346\200\247\347\233\222\345\255\220/demo1.html" @@ -0,0 +1,181 @@ + + + + + + Document + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git "a/\345\215\242\346\231\223\344\270\275/11.24 \345\274\271\346\200\247\347\233\222\345\255\220/demo2.html" "b/\345\215\242\346\231\223\344\270\275/11.24 \345\274\271\346\200\247\347\233\222\345\255\220/demo2.html" new file mode 100644 index 0000000..84d542f --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/11.24 \345\274\271\346\200\247\347\233\222\345\255\220/demo2.html" @@ -0,0 +1,152 @@ + + + + + + + Document + + + +
+
+ 切换至inline-flex + + + + + + + 增加成员 + 减少成员 + 增加内敛文本 +
+

flex

+
+
1
+
2
+
3
+
4
+
5
+
+ flex...ing +
+ + + \ No newline at end of file diff --git "a/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/demo1.html" "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/demo1.html" new file mode 100644 index 0000000..f0ed166 --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/demo1.html" @@ -0,0 +1,35 @@ + + + + + + Document + + +
+

一个简单的表单

+ 形式基础 +
+

客户信息

+      姓名:

+      手机号:

+      邮箱地址: +
+
+

书籍

+       + + + + + + + +    数量(最大数量 5): +
+
+
+       ©2011 Acme United.All rights reseverd. + + + \ No newline at end of file diff --git "a/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/demo2.css" "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/demo2.css" new file mode 100644 index 0000000..730a484 --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/demo2.css" @@ -0,0 +1,87 @@ +form{ + margin-left: 33%; + font-size: 12px; + color: #646262; +} +input{ + border: 1px solid #e1e1e1; +} +.act{ + width: 290px; + height: 37px; + font-size: 12px; +} +.choose-role{ + text-align: center; + margin-top: 20px; +} +.choose-role span{ + font-size: 22px; +} +label::before { + content: "*"; + color: red; +} +button{ + color: white; + background-color: rgb(255, 107, 8); + border: none; + height: 40px; + width: 110px; +} +.more{ + position: relative; + border: 1px solid #e1e1e1; + width: 170px; + height: auto; + min-height: 100px; + text-align: center; + margin: -450px 0 0 500px; + padding: 0 20px 0 20px; +} + +.more hr{ + width: 130px; + border: 1px solid #e1e1e1; +} +.radio_type { + width: 20px; + height: 20px; + appearance: none; + position: relative; + outline: none; + border: none; +} +.radio_type:before { + content: ""; + width: 15px; + height: 15px; + border: 1px solid rgb(255, 102, 0); + display: inline-block; + border-radius: 50%; + vertical-align: middle; +} +.radio_type:checked:before { + content: ""; + width: 15px; + height: 15px; + border: 1px solid rgb(255, 102, 0); + display: inline-block; + border-radius: 50%; + vertical-align: middle; +} +.radio_type:checked:after { + content: ""; + width: 9px; + height: 9px; + text-align: center; + background: rgb(255, 102, 0); + border-radius: 50%; + display: block; + position: absolute; + top: 4px; + left: 4px; +} +.radio_type:checked + label { + color: #ecbb60; +} \ No newline at end of file diff --git "a/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/demo2.html" "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/demo2.html" new file mode 100644 index 0000000..53ed433 --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/demo2.html" @@ -0,0 +1,150 @@ + + + + + + + Document + + + + + +
+ 企业账户注册 +                + 个人账户注册 +
+
+

有企业营业执照(含个体工商户)的用户请注册。权益如下:做企业实名认证;作为卖家身份开店;作为买家身份采购。

+

无企业营业执照的个人用户请注册个人账户。权益如下:做个人实名认证;作为买家身份采购;

+
+
+        +

+ +     +

+ +     +

+ + +

+ +     +

+ + + 我要销售 + 我要采购 + 两者都是

+ + + +

+ +
+ 创建网站账号的同时,我同意遵守:
   + 《阿里巴巴服务条款》 + + 《隐私声明》 +

+ +
+ +
+

了解更多:

+

手机收不到验证码?

+
+

会员账户注册不成功?

+
+

企业账户如何开店?

+
+

会员名如何设置会更好?

+
+

阿里巴巴开店必须要营业执照吗?

+
+

其它问题

+
+
+
+ +
+        +

+ +     +

+ +     +

+ + + +

+ +
+ 创建网站账号的同时,我同意遵守:
   + 《阿里巴巴服务条款》 + + 《隐私声明》 +

+ +
+
+

了解更多:

+

会员名如何设置会更好?

+
+

会员账户注册不成功?

+
+

个人账户可以开店吗?

+
+

注册个人账户需要准备什么资料?

+
+

一个人能注册多个会员账户吗?

+
+

其它问题

+
+
+
+ + + + \ No newline at end of file diff --git "a/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/demo.css" "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/demo.css" new file mode 100644 index 0000000..a67054a --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/demo.css" @@ -0,0 +1,539 @@ +/* Logo 字体 */ +@font-face { + font-family: "iconfont logo"; + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); +} + +.logo { + font-family: "iconfont logo"; + font-size: 160px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* tabs */ +.nav-tabs { + position: relative; +} + +.nav-tabs .nav-more { + position: absolute; + right: 0; + bottom: 0; + height: 42px; + line-height: 42px; + color: #666; +} + +#tabs { + border-bottom: 1px solid #eee; +} + +#tabs li { + cursor: pointer; + width: 100px; + height: 40px; + line-height: 40px; + text-align: center; + font-size: 16px; + border-bottom: 2px solid transparent; + position: relative; + z-index: 1; + margin-bottom: -1px; + color: #666; +} + + +#tabs .active { + border-bottom-color: #f00; + color: #222; +} + +.tab-container .content { + display: none; +} + +/* 页面布局 */ +.main { + padding: 30px 100px; + width: 960px; + margin: 0 auto; +} + +.main .logo { + color: #333; + text-align: left; + margin-bottom: 30px; + line-height: 1; + height: 110px; + margin-top: -50px; + overflow: hidden; + *zoom: 1; +} + +.main .logo a { + font-size: 160px; + color: #333; +} + +.helps { + margin-top: 40px; +} + +.helps pre { + padding: 20px; + margin: 10px 0; + border: solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists { + width: 100% !important; + overflow: hidden; + *zoom: 1; +} + +.icon_lists li { + width: 100px; + margin-bottom: 10px; + margin-right: 20px; + text-align: center; + list-style: none !important; + cursor: default; +} + +.icon_lists li .code-name { + line-height: 1.2; +} + +.icon_lists .icon { + display: block; + height: 100px; + line-height: 100px; + font-size: 42px; + margin: 10px auto; + color: #333; + -webkit-transition: font-size 0.25s linear, width 0.25s linear; + -moz-transition: font-size 0.25s linear, width 0.25s linear; + transition: font-size 0.25s linear, width 0.25s linear; +} + +.icon_lists .icon:hover { + font-size: 100px; +} + +.icon_lists .svg-icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; +} + +.icon_lists li .name, +.icon_lists li .code-name { + color: #666; +} + +/* markdown 样式 */ +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p { + margin: 1em 0; +} + +.markdown>p, +.markdown>blockquote, +.markdown>.highlight, +.markdown>ol, +.markdown>ul { + width: 80%; +} + +.markdown ul>li { + list-style: circle; +} + +.markdown>ul li, +.markdown blockquote ul>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown>ul li p, +.markdown>ol li p { + margin: 0.6em 0; +} + +.markdown ol>li { + list-style: decimal; +} + +.markdown>ol li, +.markdown blockquote ol>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown>table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown>table th { + white-space: nowrap; + color: #333; + font-weight: 600; +} + +.markdown>table th, +.markdown>table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown>table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown>br, +.markdown>p>br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/* 代码高亮 */ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre)>code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre)>code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git "a/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/demo_index.html" "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/demo_index.html" new file mode 100644 index 0000000..d61c44c --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/demo_index.html" @@ -0,0 +1,230 @@ + + + + + iconfont Demo + + + + + + + + + + + + + +
+

+ + +

+ +
+
+
    + +
  • + +
    bussiness-man
    +
    &#xe6ef;
    +
  • + +
  • + +
    company
    +
    &#xe748;
    +
  • + +
+
+

Unicode 引用

+
+ +

Unicode 是字体在网页端最原始的应用方式,特点是:

+
    +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 默认情况下不支持多色,直接添加多色图标会自动去色。
  • +
+
+

注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)

+
+

Unicode 使用步骤如下:

+

第一步:拷贝项目下面生成的 @font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.ttf?t=1638414427258') format('truetype');
+}
+
+

第二步:定义使用 iconfont 的样式

+
.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
+<span class="iconfont">&#x33;</span>
+
+
+

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    + bussiness-man +
    +
    .icon-bussiness-man +
    +
  • + +
  • + +
    + company +
    +
    .icon-company +
    +
  • + +
+
+

font-class 引用

+
+ +

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

+

与 Unicode 使用方式相比,具有如下特点:

+
    +
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • +
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 fontclass 代码:

+
<link rel="stylesheet" href="./iconfont.css">
+
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<span class="iconfont icon-xxx"></span>
+
+
+

" + iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    bussiness-man
    +
    #icon-bussiness-man
    +
  • + +
  • + +
    company
    +
    #icon-company
    +
  • + +
+
+

Symbol 引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • +
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • +
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 symbol 代码:

+
<script src="./iconfont.js"></script>
+
+

第二步:加入通用 CSS 代码(引入一次就行):

+
<style>
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>
+
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+ +
+
+ + + diff --git "a/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.css" "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.css" new file mode 100644 index 0000000..8b08f75 --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.css" @@ -0,0 +1,21 @@ +@font-face { + font-family: "iconfont"; /* Project id */ + src: url('iconfont.ttf?t=1638414427258') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-bussiness-man:before { + content: "\e6ef"; +} + +.icon-company:before { + content: "\e748"; +} + diff --git "a/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.js" "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.js" new file mode 100644 index 0000000..1690185 --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.js" @@ -0,0 +1 @@ +!function(e){var t,n,o,i,l,c='',d=(d=document.getElementsByTagName("script"))[d.length-1].getAttribute("data-injectcss"),s=function(e,t){t.parentNode.insertBefore(e,t)};if(d&&!e.__iconfont__svg__cssinject__){e.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(e){console&&console.log(e)}}function a(){l||(l=!0,o())}function m(){try{i.documentElement.doScroll("left")}catch(e){return void setTimeout(m,50)}a()}t=function(){var e,t;(t=document.createElement("div")).innerHTML=c,c=null,(e=t.getElementsByTagName("svg")[0])&&(e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.width=0,e.style.height=0,e.style.overflow="hidden",t=e,(e=document.body).firstChild?s(t,e.firstChild):e.appendChild(t))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(n=function(){document.removeEventListener("DOMContentLoaded",n,!1),t()},document.addEventListener("DOMContentLoaded",n,!1)):document.attachEvent&&(o=t,i=e.document,l=!1,m(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,a())})}(window); \ No newline at end of file diff --git "a/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.json" "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.json" new file mode 100644 index 0000000..76445b1 --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.json" @@ -0,0 +1,23 @@ +{ + "id": "", + "name": "", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "11474220", + "name": "bussiness-man", + "font_class": "bussiness-man", + "unicode": "e6ef", + "unicode_decimal": 59119 + }, + { + "icon_id": "11488011", + "name": "company", + "font_class": "company", + "unicode": "e748", + "unicode_decimal": 59208 + } + ] +} diff --git "a/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.ttf" "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/download/font_o4ip7o2u7v/iconfont.ttf" new file mode 100644 index 0000000000000000000000000000000000000000..f88054dcefb75d74882b73cfe00110512f8ad4aa GIT binary patch literal 1884 zcmd^9&u<$=6n<}aZ5JnYV-m*^Ro%_6)+xbB>^PyO34z*4g%G7_i8vr&?X2w-du`U6 zs)36o3Iag`sBkYrNFY&(D=i1a1*w8drHTVkaY{fz^n}DE3E%9FL8Sc;nAMy4-Z$TS zGxK(KiHWF#TBOqW!kK3t*WVs~g@_*pd-l|svDA$AL?8Tj;J;X`8I6|~Zhj8`FW4L9 z>RRdLPq$7Hsc*thR7_(zel7YDw7hnI)~V*WA0-qqG_i=NZqLWMvV z{M)H619sseUw&c#@jt1<)BgPZuRjV|d(=qz1MWUjWU$DjQc5I66KoI<(XMdO#C(v( zv0EiK|KwQ;R}IIa2c+Jc_hLQF)s?b={L+I?%rY1zzhpIy_&xGrxwn+>z`g5@yhSNS zq(VLw>^<7krTj8|y>Vyrq+1VCf1(y-|E-217Hk_J*1-vhMm?IJm-=VHipWunI5Bw5 z)%Y0d-=5{_oAZ<_TE_RAu9iXQHy3Cq4V;u8D8JeY5JcvPCf( zq6yS77UwVz_75a^>QU~E1=5*xG<{@BO~tt<%%CS{IW`dHo;aswc{0h$>sLa)u0!2B zz1@epe4#4`^{cn$Ze7(Y*}}171xIw*kz68?TNE8RqS1lj@byUWMyqur$lqi= znN!HljpR<}6N&uk+=zQ=NNwN?>BHU<;x=$3J&}$a$;5hNk#w{_la5SIO%G4Sc|T?% zflMqjn280Vfy^{asg9P*@AoJZ+vY@P2Wwq}eRCTdj5fNyzOG!`{)CG|xpb&+=hEC9 z{}$@?+d=<2QQ ztN|aD*oVJfN@73w8Ht1RAmt_QK*omn8npYc&S82@Vx}(oOk#z?^rgfq_-`fFfPawK zN4>Nuu^;@l#6eo(ki;Eyn2RTD({RjXy|AXQ6zf*0ZaM97(JZf44ZH2O$0gHluGB4k zB01is7EH^u+i9BT%PGex=_R{f)8~=TtXAuK!>*q*i%zoQIF0Psm{>>f$zr`mC&(s~ z406yflTHO%L%%{rs*^<}w|DOH7ojfGDpe6_-!;28dI@Tqn$U@yI<9*XztX*`1*j}n zxpy~BI*-*-*rS6T=`b6aYC!XHe^7KuwhthZp7b0{SglU literal 0 HcmV?d00001 diff --git "a/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/jquery-3.6.0.js" "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/jquery-3.6.0.js" new file mode 100644 index 0000000..fc6c299 --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/12_12.2 \350\241\250\345\215\225/jquery-3.6.0.js" @@ -0,0 +1,10881 @@ +/*! + * jQuery JavaScript Library v3.6.0 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2021-03-02T17:08Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.6.0", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.6 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2021-02-16 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the primary Deferred + primary = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + // Support: Chrome 86+ + // In Chrome, if an element having a focusout handler is blurred by + // clicking outside of it, it invokes the handler synchronously. If + // that handler calls `.remove()` on the element, the data is cleared, + // leaving `result` undefined. We need to guard against this. + return result && result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + // Suppress native focus or blur as it's already being fired + // in leverageNative. + _default: function() { + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = "1px"; + trChild.style.height = "9px"; + + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is display: block + // gets around this issue. + trChild.style.display = "block"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ).filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ).map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + +originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + \ No newline at end of file diff --git "a/\345\215\242\346\231\223\344\270\275/14_1117 \345\244\252\346\236\201\345\233\276/demo1.html" "b/\345\215\242\346\231\223\344\270\275/14_1117 \345\244\252\346\236\201\345\233\276/demo1.html" new file mode 100644 index 0000000..d47ff5c --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/14_1117 \345\244\252\346\236\201\345\233\276/demo1.html" @@ -0,0 +1,59 @@ + + + + + + Document + + + +
+ + \ No newline at end of file diff --git "a/\345\215\242\346\231\223\344\270\275/15_1118 \350\203\214\346\231\257\350\276\271\346\241\206/demo.html" "b/\345\215\242\346\231\223\344\270\275/15_1118 \350\203\214\346\231\257\350\276\271\346\241\206/demo.html" new file mode 100644 index 0000000..4b98edb --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/15_1118 \350\203\214\346\231\257\350\276\271\346\241\206/demo.html" @@ -0,0 +1,190 @@ + + + + + + Document + + + +

white-space

+

规定段落中的文本不进行换行:

+
    +
  • +

    white-space: normal

    +

    默认 空白会被浏览器忽略。

    +

    + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 +

    +
  • +
  • +

    white-space: nowrap

    +

    文本不会换行,文本会在在同一行上继续,直到遇到 br 标签为止。

    +

    + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 +

    +
  • +
  • +

    white-space: pre;

    +

    空白会被浏览器保留。其行为方式类似 HTML 中的 pre 标签。

    +

    + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 +

    +
  • +
  • +

    white-space: pre-wrap

    +

    保留空白符序列,但是正常地进行换行。

    +

    + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 +

    +
  • +
  • +

    white-space: pre-line

    +

    合并空白符序列,但是保留换行符。

    +

    + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 +

    +
  • +
  • +

    white-space: inherit

    +

    规定应该从父元素继承 white-space 属性的值。

    +

    + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 + 这是一些文本。 +

    +
+
+ +

word-break

+

在恰当的断字点进行换行

+
    +
  • +

    word-break:normal

    +

    使用浏览器默认的换行规则。

    +

    + This is a veryveryveryveryveryveryveryveryveryvery long paragraph. +

    +
  • +
  • +

    word-break:break-all

    +

    允许在单词内换行。

    +

    + This is a veryveryveryveryveryveryveryveryveryvery long paragraph. +

    +
  • +
  • +

    word-break:keep-all

    +

    只能在半角空格或连字符处换行。

    +

    + This is a veryveryveryveryveryveryveryveryveryvery long paragraph. +

    +
  • +
+ +
+

word-wrap

+

允许长单词换行到下一行:

+
    +
  • +

    word-wrap: normal

    +

    只在允许的断字点换行(浏览器保持默认处理)。

    +

    + This paragraph contains a very long word: thisisaveryveryveryveryveryverylongword. The long word will break and wrap to the next line. +

    +
  • +
  • +

    word-wrap:break-word

    +

    在长单词或 URL 地址内部进行换行。

    +

    + https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%9C%A8%E9%95%BF%E5%8D%95%E8%AF%8D%E6%88%96%20URL%20%E5%9C% +

  • +
+ +
+

word-spacing

+

规定段落中的字间距是多少像素:

+
    +
  • +

    word-spacing:normal

    +

    默认。定义单词间的标准空间。

    +

    + Lorem, ipsum dolor sit amet consectetur adipisicing elit. Cum, esse tempore quod voluptatum libero rerum. +

    +
  • +
  • +

    word-spacing:length

    +

    定义单词间的固定空间。

    +

    + Lorem, ipsum dolor sit amet consectetur adipisicing elit. Cum, esse tempore quod voluptatum libero rerum. +

    +
  • +
  • +

    word-spacing:inherit

    +

    规定应该从父元素继承 word-spacing 属性的值。

    +

    + Lorem, ipsum dolor sit amet consectetur adipisicing elit. Cum, esse tempore quod voluptatum libero rerum. +

    +
  • +
+ +
+

letter-spacing:normal

+

设置 h1 和 h2 元素的字母间距

+
    +
  • +

    letter-spacing:length

    +

    默认。规定字符间没有额外的空间。

    +

    +

    This is header 1

    +

    +
  • +
  • +

    letter-spacing:

    +

    定义字符间的固定空间(允许使用负值)。

    +

    +

    This is header 1

    +

    This is header 4

    +

    +
  • +
  • +

    letter-spacing:inherit

    +

    规定应该从父元素继承 letter-spacing 属性的值。

    +

    +

    This is header 1

    + +

    +
  • +
+ + \ No newline at end of file diff --git "a/\345\215\242\346\231\223\344\270\275/16_1119 \345\200\274\344\270\216\345\215\225\344\275\215/demo1.html" "b/\345\215\242\346\231\223\344\270\275/16_1119 \345\200\274\344\270\216\345\215\225\344\275\215/demo1.html" new file mode 100644 index 0000000..35bbbe2 --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/16_1119 \345\200\274\344\270\216\345\215\225\344\275\215/demo1.html" @@ -0,0 +1,57 @@ + + + + + + Document + + + +
+
+

R:

+

G:

+

B:

+
+ + + \ No newline at end of file diff --git "a/\345\215\242\346\231\223\344\270\275/16_1119 \345\200\274\344\270\216\345\215\225\344\275\215/demo2.html" "b/\345\215\242\346\231\223\344\270\275/16_1119 \345\200\274\344\270\216\345\215\225\344\275\215/demo2.html" new file mode 100644 index 0000000..d35dc2d --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/16_1119 \345\200\274\344\270\216\345\215\225\344\275\215/demo2.html" @@ -0,0 +1,67 @@ + + + + + + Document + + + +
+
+

R:

+

G:

+

B:

+
+ + + \ No newline at end of file diff --git "a/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/demo.html" "b/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/demo.html" new file mode 100644 index 0000000..b0ae11b --- /dev/null +++ "b/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/demo.html" @@ -0,0 +1,44 @@ + + + + + + Document + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + \ No newline at end of file diff --git "a/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/1.webp" "b/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/1.webp" new file mode 100644 index 0000000000000000000000000000000000000000..1dd86facaa8f2e05929f834266e7479fa879662e GIT binary patch literal 9748 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 literal 0 HcmV?d00001 diff --git "a/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/10.webp" "b/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/10.webp" new file mode 100644 index 0000000000000000000000000000000000000000..ab0a255706f6d8625a40cb197dbdd9e1e5663c50 GIT binary patch literal 40386 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 CnSn3> literal 0 HcmV?d00001 diff --git "a/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/11.webp" "b/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/11.webp" new file mode 100644 index 0000000000000000000000000000000000000000..50565aa43ab7ec8652f88aaf9440523b787bb0ba GIT binary patch literal 23726 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 CIKQ|6 literal 0 HcmV?d00001 diff --git "a/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/2.webp" "b/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/2.webp" new file mode 100644 index 0000000000000000000000000000000000000000..5f16d869b2d00fafc6ee01befc081c6147799716 GIT binary patch literal 10798 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 Os`Jq}Tp0gz7xy3Ky_Q7) literal 0 HcmV?d00001 diff --git "a/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/4.webp" "b/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/4.webp" new file mode 100644 index 0000000000000000000000000000000000000000..662cab46bdab6717f79874836d7d375e134abb55 GIT binary patch literal 5116 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 adC+AVTT@f}3(>2|RD`es{l^>sPw-!Ow*njh literal 0 HcmV?d00001 diff --git "a/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/5.webp" "b/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/5.webp" new file mode 100644 index 0000000000000000000000000000000000000000..34c24980d2271e914be7b152fcc8f6445022178e GIT binary patch literal 10740 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 literal 0 HcmV?d00001 diff --git "a/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/6.webp" "b/\345\215\242\346\231\223\344\270\275/17_1122 \347\200\221\345\270\203\346\265\201/img/6.webp" new file mode 100644 index 0000000000000000000000000000000000000000..7688ec0a674d458e2b9219a3023624b0eddedf00 GIT binary patch literal 10778 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

(w4W|A$1UVH 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 X05L?Nd@8Ng^FE)sG=@I$@Bjb+X$