From 8b7b9d5805124e5ccb25d56dde93b59272ab3373 Mon Sep 17 00:00:00 2001 From: augushong Date: Thu, 22 Aug 2019 13:17:44 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=AE=8C=E6=88=90=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E4=BF=A1=E6=81=AF=E5=92=8C=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .example.env | 1 + .gitignore | 5 + .travis.yml | 42 + LICENSE.txt | 32 + app/.htaccess | 1 + app/BaseController.php | 150 + app/ExceptionHandle.php | 68 + app/Request.php | 17 + app/admin/controller/App.php | 226 + app/admin/controller/Common.php | 34 + app/admin/controller/Index.php | 94 + app/admin/controller/Login.php | 51 + app/admin/controller/Member.php | 84 + app/admin/controller/System.php | 67 + app/api/controller/Files.php | 106 + app/api/controller/WxOpen.php | 126 + app/common.php | 136 + app/event.php | 27 + app/index/controller/Index.php | 86 + app/middleware.php | 14 + app/middleware/ConfigInit.php | 36 + app/model/Admin.php | 13 + app/model/SystemConfig.php | 14 + app/model/UploadFiles.php | 22 + app/model/WxPublicAccount.php | 23 + app/provider.php | 19 + build.example.php | 26 + composer.json | 46 + composer.lock | 968 ++ config/app.php | 47 + config/cache.php | 39 + config/console.php | 19 + config/cookie.php | 28 + config/database.php | 70 + config/filesystem.php | 20 + config/lang.php | 37 + config/log.php | 55 + config/route.php | 61 + config/session.php | 27 + config/template.php | 27 + config/trace.php | 20 + ...190728015455_create_table_upload_files.php | 55 + ...90822043653_create_table_system_config.php | 37 + .../20190822043811_create_table_admin.php | 43 + database/seeds/InitAdmin.php | 32 + extend/.gitignore | 2 + public/.htaccess | 8 + public/favicon.ico | Bin 0 -> 1150 bytes public/index.php | 24 + public/robots.txt | 2 + public/router.php | 17 + public/static/.gitignore | 1 + public/static/css/pagination.css | 96 + public/static/css/reset.css | 349 + public/static/images/avatar.jpeg | Bin 0 -> 164992 bytes public/static/js/common.js | 0 public/static/lib/jquery/jquery-3.4.1.js | 10598 ++++++++++++++++ public/static/lib/jquery/jquery-3.4.1.min.js | 2 + public/static/lib/layui/css/layui.css | 2 + public/static/lib/layui/css/layui.mobile.css | 2 + public/static/lib/layui/css/modules/code.css | 2 + .../css/modules/laydate/default/laydate.css | 2 + .../css/modules/layer/default/icon-ext.png | Bin 0 -> 5911 bytes .../layui/css/modules/layer/default/icon.png | Bin 0 -> 11493 bytes .../layui/css/modules/layer/default/layer.css | 2 + .../css/modules/layer/default/loading-0.gif | Bin 0 -> 5793 bytes .../css/modules/layer/default/loading-1.gif | Bin 0 -> 701 bytes .../css/modules/layer/default/loading-2.gif | Bin 0 -> 1787 bytes public/static/lib/layui/font/iconfont.eot | Bin 0 -> 41712 bytes public/static/lib/layui/font/iconfont.svg | 485 + public/static/lib/layui/font/iconfont.ttf | Bin 0 -> 41536 bytes public/static/lib/layui/font/iconfont.woff | Bin 0 -> 27256 bytes public/static/lib/layui/font/iconfont.woff2 | Bin 0 -> 23140 bytes public/static/lib/layui/images/face/0.gif | Bin 0 -> 2689 bytes public/static/lib/layui/images/face/1.gif | Bin 0 -> 5514 bytes public/static/lib/layui/images/face/10.gif | Bin 0 -> 2797 bytes public/static/lib/layui/images/face/11.gif | Bin 0 -> 4121 bytes public/static/lib/layui/images/face/12.gif | Bin 0 -> 3361 bytes public/static/lib/layui/images/face/13.gif | Bin 0 -> 7425 bytes public/static/lib/layui/images/face/14.gif | Bin 0 -> 2375 bytes public/static/lib/layui/images/face/15.gif | Bin 0 -> 1793 bytes public/static/lib/layui/images/face/16.gif | Bin 0 -> 6721 bytes public/static/lib/layui/images/face/17.gif | Bin 0 -> 4439 bytes public/static/lib/layui/images/face/18.gif | Bin 0 -> 3017 bytes public/static/lib/layui/images/face/19.gif | Bin 0 -> 3040 bytes public/static/lib/layui/images/face/2.gif | Bin 0 -> 3222 bytes public/static/lib/layui/images/face/20.gif | Bin 0 -> 5144 bytes public/static/lib/layui/images/face/21.gif | Bin 0 -> 5191 bytes public/static/lib/layui/images/face/22.gif | Bin 0 -> 9823 bytes public/static/lib/layui/images/face/23.gif | Bin 0 -> 3792 bytes public/static/lib/layui/images/face/24.gif | Bin 0 -> 8096 bytes public/static/lib/layui/images/face/25.gif | Bin 0 -> 3127 bytes public/static/lib/layui/images/face/26.gif | Bin 0 -> 3291 bytes public/static/lib/layui/images/face/27.gif | Bin 0 -> 4377 bytes public/static/lib/layui/images/face/28.gif | Bin 0 -> 2793 bytes public/static/lib/layui/images/face/29.gif | Bin 0 -> 4854 bytes public/static/lib/layui/images/face/3.gif | Bin 0 -> 4017 bytes public/static/lib/layui/images/face/30.gif | Bin 0 -> 2555 bytes public/static/lib/layui/images/face/31.gif | Bin 0 -> 2002 bytes public/static/lib/layui/images/face/32.gif | Bin 0 -> 3481 bytes public/static/lib/layui/images/face/33.gif | Bin 0 -> 2454 bytes public/static/lib/layui/images/face/34.gif | Bin 0 -> 3700 bytes public/static/lib/layui/images/face/35.gif | Bin 0 -> 1800 bytes public/static/lib/layui/images/face/36.gif | Bin 0 -> 2331 bytes public/static/lib/layui/images/face/37.gif | Bin 0 -> 1513 bytes public/static/lib/layui/images/face/38.gif | Bin 0 -> 3615 bytes public/static/lib/layui/images/face/39.gif | Bin 0 -> 6495 bytes public/static/lib/layui/images/face/4.gif | Bin 0 -> 5689 bytes public/static/lib/layui/images/face/40.gif | Bin 0 -> 3154 bytes public/static/lib/layui/images/face/41.gif | Bin 0 -> 3644 bytes public/static/lib/layui/images/face/42.gif | Bin 0 -> 5305 bytes public/static/lib/layui/images/face/43.gif | Bin 0 -> 2674 bytes public/static/lib/layui/images/face/44.gif | Bin 0 -> 4126 bytes public/static/lib/layui/images/face/45.gif | Bin 0 -> 3417 bytes public/static/lib/layui/images/face/46.gif | Bin 0 -> 3007 bytes public/static/lib/layui/images/face/47.gif | Bin 0 -> 2333 bytes public/static/lib/layui/images/face/48.gif | Bin 0 -> 2689 bytes public/static/lib/layui/images/face/49.gif | Bin 0 -> 2315 bytes public/static/lib/layui/images/face/5.gif | Bin 0 -> 4567 bytes public/static/lib/layui/images/face/50.gif | Bin 0 -> 5866 bytes public/static/lib/layui/images/face/51.gif | Bin 0 -> 2785 bytes public/static/lib/layui/images/face/52.gif | Bin 0 -> 777 bytes public/static/lib/layui/images/face/53.gif | Bin 0 -> 2127 bytes public/static/lib/layui/images/face/54.gif | Bin 0 -> 2196 bytes public/static/lib/layui/images/face/55.gif | Bin 0 -> 1971 bytes public/static/lib/layui/images/face/56.gif | Bin 0 -> 2034 bytes public/static/lib/layui/images/face/57.gif | Bin 0 -> 2705 bytes public/static/lib/layui/images/face/58.gif | Bin 0 -> 2258 bytes public/static/lib/layui/images/face/59.gif | Bin 0 -> 10311 bytes public/static/lib/layui/images/face/6.gif | Bin 0 -> 2213 bytes public/static/lib/layui/images/face/60.gif | Bin 0 -> 3245 bytes public/static/lib/layui/images/face/61.gif | Bin 0 -> 2495 bytes public/static/lib/layui/images/face/62.gif | Bin 0 -> 2017 bytes public/static/lib/layui/images/face/63.gif | Bin 0 -> 5871 bytes public/static/lib/layui/images/face/64.gif | Bin 0 -> 6448 bytes public/static/lib/layui/images/face/65.gif | Bin 0 -> 3576 bytes public/static/lib/layui/images/face/66.gif | Bin 0 -> 3029 bytes public/static/lib/layui/images/face/67.gif | Bin 0 -> 2701 bytes public/static/lib/layui/images/face/68.gif | Bin 0 -> 1424 bytes public/static/lib/layui/images/face/69.gif | Bin 0 -> 2431 bytes public/static/lib/layui/images/face/7.gif | Bin 0 -> 3398 bytes public/static/lib/layui/images/face/70.gif | Bin 0 -> 4590 bytes public/static/lib/layui/images/face/71.gif | Bin 0 -> 5304 bytes public/static/lib/layui/images/face/8.gif | Bin 0 -> 4050 bytes public/static/lib/layui/images/face/9.gif | Bin 0 -> 4221 bytes .../static/lib/layui/lay/modules/carousel.js | 2 + public/static/lib/layui/lay/modules/code.js | 2 + .../lib/layui/lay/modules/colorpicker.js | 2 + .../static/lib/layui/lay/modules/element.js | 2 + public/static/lib/layui/lay/modules/flow.js | 2 + public/static/lib/layui/lay/modules/form.js | 2 + public/static/lib/layui/lay/modules/jquery.js | 5 + .../static/lib/layui/lay/modules/laydate.js | 2 + .../static/lib/layui/lay/modules/layedit.js | 2 + public/static/lib/layui/lay/modules/layer.js | 2 + .../static/lib/layui/lay/modules/laypage.js | 2 + public/static/lib/layui/lay/modules/laytpl.js | 2 + public/static/lib/layui/lay/modules/mobile.js | 2 + public/static/lib/layui/lay/modules/rate.js | 2 + public/static/lib/layui/lay/modules/slider.js | 2 + public/static/lib/layui/lay/modules/table.js | 2 + .../static/lib/layui/lay/modules/transfer.js | 2 + public/static/lib/layui/lay/modules/tree.js | 2 + public/static/lib/layui/lay/modules/upload.js | 2 + public/static/lib/layui/lay/modules/util.js | 2 + public/static/lib/layui/layui.all.js | 5 + public/static/lib/layui/layui.js | 2 + public/static/lib/quill/quill.min.js | 8 + public/static/lib/quill/quill.snow.css | 945 ++ route/app.php | 17 + runtime/.gitignore | 2 + think | 19 + view/README.md | 1 + view/admin/common/_footer.html | 5 + view/admin/common/_header.html | 23 + view/admin/common/_require.html | 20 + view/admin/common/left_index.html | 10 + view/admin/common/left_system.html | 13 + view/admin/common/模板.html | 36 + view/admin/index/index.html | 126 + view/admin/login/index.html | 98 + view/admin/system/index.html | 126 + view/admin/system/others.html | 252 + view/common/tpl/error.html | 24 + view/common/tpl/success.html | 23 + view/index/index/index.html | 12 + 186 files changed, 16555 insertions(+) create mode 100644 .example.env create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 LICENSE.txt create mode 100644 app/.htaccess create mode 100644 app/BaseController.php create mode 100644 app/ExceptionHandle.php create mode 100644 app/Request.php create mode 100644 app/admin/controller/App.php create mode 100644 app/admin/controller/Common.php create mode 100644 app/admin/controller/Index.php create mode 100644 app/admin/controller/Login.php create mode 100644 app/admin/controller/Member.php create mode 100644 app/admin/controller/System.php create mode 100644 app/api/controller/Files.php create mode 100644 app/api/controller/WxOpen.php create mode 100644 app/common.php create mode 100644 app/event.php create mode 100644 app/index/controller/Index.php create mode 100644 app/middleware.php create mode 100644 app/middleware/ConfigInit.php create mode 100644 app/model/Admin.php create mode 100644 app/model/SystemConfig.php create mode 100644 app/model/UploadFiles.php create mode 100644 app/model/WxPublicAccount.php create mode 100644 app/provider.php create mode 100644 build.example.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/cache.php create mode 100644 config/console.php create mode 100644 config/cookie.php create mode 100644 config/database.php create mode 100644 config/filesystem.php create mode 100644 config/lang.php create mode 100644 config/log.php create mode 100644 config/route.php create mode 100644 config/session.php create mode 100644 config/template.php create mode 100644 config/trace.php create mode 100644 database/migrations/20190728015455_create_table_upload_files.php create mode 100644 database/migrations/20190822043653_create_table_system_config.php create mode 100644 database/migrations/20190822043811_create_table_admin.php create mode 100644 database/seeds/InitAdmin.php create mode 100644 extend/.gitignore create mode 100644 public/.htaccess create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 public/router.php create mode 100644 public/static/.gitignore create mode 100644 public/static/css/pagination.css create mode 100644 public/static/css/reset.css create mode 100644 public/static/images/avatar.jpeg create mode 100644 public/static/js/common.js create mode 100644 public/static/lib/jquery/jquery-3.4.1.js create mode 100644 public/static/lib/jquery/jquery-3.4.1.min.js create mode 100644 public/static/lib/layui/css/layui.css create mode 100644 public/static/lib/layui/css/layui.mobile.css create mode 100644 public/static/lib/layui/css/modules/code.css create mode 100644 public/static/lib/layui/css/modules/laydate/default/laydate.css create mode 100644 public/static/lib/layui/css/modules/layer/default/icon-ext.png create mode 100644 public/static/lib/layui/css/modules/layer/default/icon.png create mode 100644 public/static/lib/layui/css/modules/layer/default/layer.css create mode 100644 public/static/lib/layui/css/modules/layer/default/loading-0.gif create mode 100644 public/static/lib/layui/css/modules/layer/default/loading-1.gif create mode 100644 public/static/lib/layui/css/modules/layer/default/loading-2.gif create mode 100644 public/static/lib/layui/font/iconfont.eot create mode 100644 public/static/lib/layui/font/iconfont.svg create mode 100644 public/static/lib/layui/font/iconfont.ttf create mode 100644 public/static/lib/layui/font/iconfont.woff create mode 100644 public/static/lib/layui/font/iconfont.woff2 create mode 100644 public/static/lib/layui/images/face/0.gif create mode 100644 public/static/lib/layui/images/face/1.gif create mode 100644 public/static/lib/layui/images/face/10.gif create mode 100644 public/static/lib/layui/images/face/11.gif create mode 100644 public/static/lib/layui/images/face/12.gif create mode 100644 public/static/lib/layui/images/face/13.gif create mode 100644 public/static/lib/layui/images/face/14.gif create mode 100644 public/static/lib/layui/images/face/15.gif create mode 100644 public/static/lib/layui/images/face/16.gif create mode 100644 public/static/lib/layui/images/face/17.gif create mode 100644 public/static/lib/layui/images/face/18.gif create mode 100644 public/static/lib/layui/images/face/19.gif create mode 100644 public/static/lib/layui/images/face/2.gif create mode 100644 public/static/lib/layui/images/face/20.gif create mode 100644 public/static/lib/layui/images/face/21.gif create mode 100644 public/static/lib/layui/images/face/22.gif create mode 100644 public/static/lib/layui/images/face/23.gif create mode 100644 public/static/lib/layui/images/face/24.gif create mode 100644 public/static/lib/layui/images/face/25.gif create mode 100644 public/static/lib/layui/images/face/26.gif create mode 100644 public/static/lib/layui/images/face/27.gif create mode 100644 public/static/lib/layui/images/face/28.gif create mode 100644 public/static/lib/layui/images/face/29.gif create mode 100644 public/static/lib/layui/images/face/3.gif create mode 100644 public/static/lib/layui/images/face/30.gif create mode 100644 public/static/lib/layui/images/face/31.gif create mode 100644 public/static/lib/layui/images/face/32.gif create mode 100644 public/static/lib/layui/images/face/33.gif create mode 100644 public/static/lib/layui/images/face/34.gif create mode 100644 public/static/lib/layui/images/face/35.gif create mode 100644 public/static/lib/layui/images/face/36.gif create mode 100644 public/static/lib/layui/images/face/37.gif create mode 100644 public/static/lib/layui/images/face/38.gif create mode 100644 public/static/lib/layui/images/face/39.gif create mode 100644 public/static/lib/layui/images/face/4.gif create mode 100644 public/static/lib/layui/images/face/40.gif create mode 100644 public/static/lib/layui/images/face/41.gif create mode 100644 public/static/lib/layui/images/face/42.gif create mode 100644 public/static/lib/layui/images/face/43.gif create mode 100644 public/static/lib/layui/images/face/44.gif create mode 100644 public/static/lib/layui/images/face/45.gif create mode 100644 public/static/lib/layui/images/face/46.gif create mode 100644 public/static/lib/layui/images/face/47.gif create mode 100644 public/static/lib/layui/images/face/48.gif create mode 100644 public/static/lib/layui/images/face/49.gif create mode 100644 public/static/lib/layui/images/face/5.gif create mode 100644 public/static/lib/layui/images/face/50.gif create mode 100644 public/static/lib/layui/images/face/51.gif create mode 100644 public/static/lib/layui/images/face/52.gif create mode 100644 public/static/lib/layui/images/face/53.gif create mode 100644 public/static/lib/layui/images/face/54.gif create mode 100644 public/static/lib/layui/images/face/55.gif create mode 100644 public/static/lib/layui/images/face/56.gif create mode 100644 public/static/lib/layui/images/face/57.gif create mode 100644 public/static/lib/layui/images/face/58.gif create mode 100644 public/static/lib/layui/images/face/59.gif create mode 100644 public/static/lib/layui/images/face/6.gif create mode 100644 public/static/lib/layui/images/face/60.gif create mode 100644 public/static/lib/layui/images/face/61.gif create mode 100644 public/static/lib/layui/images/face/62.gif create mode 100644 public/static/lib/layui/images/face/63.gif create mode 100644 public/static/lib/layui/images/face/64.gif create mode 100644 public/static/lib/layui/images/face/65.gif create mode 100644 public/static/lib/layui/images/face/66.gif create mode 100644 public/static/lib/layui/images/face/67.gif create mode 100644 public/static/lib/layui/images/face/68.gif create mode 100644 public/static/lib/layui/images/face/69.gif create mode 100644 public/static/lib/layui/images/face/7.gif create mode 100644 public/static/lib/layui/images/face/70.gif create mode 100644 public/static/lib/layui/images/face/71.gif create mode 100644 public/static/lib/layui/images/face/8.gif create mode 100644 public/static/lib/layui/images/face/9.gif create mode 100644 public/static/lib/layui/lay/modules/carousel.js create mode 100644 public/static/lib/layui/lay/modules/code.js create mode 100644 public/static/lib/layui/lay/modules/colorpicker.js create mode 100644 public/static/lib/layui/lay/modules/element.js create mode 100644 public/static/lib/layui/lay/modules/flow.js create mode 100644 public/static/lib/layui/lay/modules/form.js create mode 100644 public/static/lib/layui/lay/modules/jquery.js create mode 100644 public/static/lib/layui/lay/modules/laydate.js create mode 100644 public/static/lib/layui/lay/modules/layedit.js create mode 100644 public/static/lib/layui/lay/modules/layer.js create mode 100644 public/static/lib/layui/lay/modules/laypage.js create mode 100644 public/static/lib/layui/lay/modules/laytpl.js create mode 100644 public/static/lib/layui/lay/modules/mobile.js create mode 100644 public/static/lib/layui/lay/modules/rate.js create mode 100644 public/static/lib/layui/lay/modules/slider.js create mode 100644 public/static/lib/layui/lay/modules/table.js create mode 100644 public/static/lib/layui/lay/modules/transfer.js create mode 100644 public/static/lib/layui/lay/modules/tree.js create mode 100644 public/static/lib/layui/lay/modules/upload.js create mode 100644 public/static/lib/layui/lay/modules/util.js create mode 100644 public/static/lib/layui/layui.all.js create mode 100644 public/static/lib/layui/layui.js create mode 100644 public/static/lib/quill/quill.min.js create mode 100644 public/static/lib/quill/quill.snow.css create mode 100644 route/app.php create mode 100644 runtime/.gitignore create mode 100644 think create mode 100644 view/README.md create mode 100644 view/admin/common/_footer.html create mode 100644 view/admin/common/_header.html create mode 100644 view/admin/common/_require.html create mode 100644 view/admin/common/left_index.html create mode 100644 view/admin/common/left_system.html create mode 100644 view/admin/common/模板.html create mode 100644 view/admin/index/index.html create mode 100644 view/admin/login/index.html create mode 100644 view/admin/system/index.html create mode 100644 view/admin/system/others.html create mode 100644 view/common/tpl/error.html create mode 100644 view/common/tpl/success.html create mode 100644 view/index/index/index.html diff --git a/.example.env b/.example.env new file mode 100644 index 0000000..c27f74c --- /dev/null +++ b/.example.env @@ -0,0 +1 @@ +APP_DEBUG = true [APP] DEFAULT_TIMEZONE = Asia/Shanghai [DATABASE] TYPE = mysql HOSTNAME = 127.0.0.1 DATABASE = test USERNAME = username PASSWORD = password HOSTPORT = 3306 CHARSET = utf8 DEBUG = true [LANG] default_lang = zh-cn \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d465120 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/.idea +/.vscode +/vendor +*.log +.env \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..36f7b6f --- /dev/null +++ b/.travis.yml @@ -0,0 +1,42 @@ +sudo: false + +language: php + +branches: + only: + - stable + +cache: + directories: + - $HOME/.composer/cache + +before_install: + - composer self-update + +install: + - composer install --no-dev --no-interaction --ignore-platform-reqs + - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip . + - composer require --update-no-dev --no-interaction "topthink/think-image:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0" + - composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0" + - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip . + +script: + - php think unit + +deploy: + provider: releases + api_key: + secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw= + file: + - ThinkPHP_Core.zip + - ThinkPHP_Full.zip + skip_cleanup: true + on: + tags: true diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..574a39c --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,32 @@ + +ThinkPHP遵循Apache2开源协议发布,并提供免费使用。 +版权所有Copyright © 2006-2016 by ThinkPHP (http://thinkphp.cn) +All rights reserved。 +ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。 + +Apache Licence是著名的非盈利开源组织Apache采用的协议。 +该协议和BSD类似,鼓励代码共享和尊重原作者的著作权, +允许代码修改,再作为开源或商业软件发布。需要满足 +的条件: +1. 需要给代码的用户一份Apache Licence ; +2. 如果你修改了代码,需要在被修改的文件中说明; +3. 在延伸的代码中(修改和有源代码衍生的代码中)需要 +带有原来代码中的协议,商标,专利声明和其他原来作者规 +定需要包含的说明; +4. 如果再发布的产品中包含一个Notice文件,则在Notice文 +件中需要带有本协议内容。你可以在Notice中增加自己的 +许可,但不可以表现为对Apache Licence构成更改。 +具体的协议参考:http://www.apache.org/licenses/LICENSE-2.0 + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/app/.htaccess b/app/.htaccess new file mode 100644 index 0000000..3418e55 --- /dev/null +++ b/app/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/app/BaseController.php b/app/BaseController.php new file mode 100644 index 0000000..a46dea3 --- /dev/null +++ b/app/BaseController.php @@ -0,0 +1,150 @@ + +// +---------------------------------------------------------------------- +declare (strict_types = 1); + +namespace app; + +use think\App; +use think\exception\ValidateException; +use think\Validate; +use think\facade\View; +use think\exception\HttpResponseException; + +/** + * 控制器基础类 + */ +abstract class BaseController +{ + /** + * Request实例 + * @var \think\Request + */ + protected $request; + + /** + * 应用实例 + * @var \think\App + */ + protected $app; + + /** + * 是否批量验证 + * @var bool + */ + protected $batchValidate = false; + + /** + * 控制器中间件 + * @var array + */ + protected $middleware = []; + + /** + * 构造方法 + * @access public + * @param App $app 应用对象 + */ + public function __construct(App $app) + { + $this->app = $app; + $this->request = $this->app->request; + + // 控制器初始化 + $this->initialize(); + } + + // 初始化 + protected function initialize() + {} + + /** + * 验证数据 + * @access protected + * @param array $data 数据 + * @param string|array $validate 验证器名或者验证规则数组 + * @param array $message 提示信息 + * @param bool $batch 是否批量验证 + * @return array|string|true + * @throws ValidateException + */ + protected function validate(array $data, $validate, array $message = [], bool $batch = false) + { + if (is_array($validate)) { + $v = new Validate(); + $v->rule($validate); + } else { + if (strpos($validate, '.')) { + // 支持场景 + list($validate, $scene) = explode('.', $validate); + } + $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate); + $v = new $class(); + if (!empty($scene)) { + $v->scene($scene); + } + } + + $v->message($message); + + // 是否批量验证 + if ($batch || $this->batchValidate) { + $v->batch(true); + } + + return $v->failException(true)->check($data); + } + + public function success($msg = '操作成功',$jump_to_url = null,$code = 200,$params = []) + { + + if(is_null($jump_to_url)){ + $jump_to_url = \request()->server('HTTP_REFERER'); + }else{ + $jump_to_url = url($jump_to_url); + } + + $data = [ + 'msg'=>$msg, + 'jump_to_url'=>$jump_to_url, + 'params'=>$params + ]; + + if(\request()->isAjax()){ + throw new HttpResponseException(json_message($data,0,$msg)); + } + + View::assign($data); + throw new HttpResponseException(response(View::fetch('common@tpl/success'),$code)); + } + public function error($msg = '操作失败',$jump_to_url = null,$code = 200,$params = []) + { + + if(is_null($jump_to_url)){ + $jump_to_url = \request()->server('HTTP_REFERER'); + }else{ + $jump_to_url = url($jump_to_url); + } + + $data = [ + 'msg'=>$msg, + 'jump_to_url'=>$jump_to_url, + 'params'=>$params + ]; + + if(\request()->isAjax()){ + throw new HttpResponseException(json_message($data,0,$msg)); + } + + View::assign($data); + throw new HttpResponseException(response(View::fetch('common@tpl/error'),$code)); + } + +} diff --git a/app/ExceptionHandle.php b/app/ExceptionHandle.php new file mode 100644 index 0000000..375e841 --- /dev/null +++ b/app/ExceptionHandle.php @@ -0,0 +1,68 @@ + +// +---------------------------------------------------------------------- + +namespace app; + +use think\db\exception\DataNotFoundException; +use think\db\exception\ModelNotFoundException; +use think\exception\Handle; +use think\exception\HttpException; +use think\exception\HttpResponseException; +use think\exception\ValidateException; +use think\Response; +use Throwable; + +/** + * 应用异常处理类 + */ +class ExceptionHandle extends Handle +{ + /** + * 不需要记录信息(日志)的异常类列表 + * @var array + */ + protected $ignoreReport = [ + HttpException::class, + HttpResponseException::class, + ModelNotFoundException::class, + DataNotFoundException::class, + ValidateException::class, + ]; + + /** + * 记录异常信息(包括日志或者其它方式记录) + * + * @access public + * @param Throwable $exception + * @return void + */ + public function report(Throwable $exception): void + { + // 使用内置的方式记录异常日志 + parent::report($exception); + } + + /** + * Render an exception into an HTTP response. + * + * @access public + * @param \think\Request $request + * @param Throwable $e + * @return Response + */ + public function render($request, Throwable $e): Response + { + // 添加自定义异常处理机制 + + // 其他错误交给系统处理 + return parent::render($request, $e); + } +} diff --git a/app/Request.php b/app/Request.php new file mode 100644 index 0000000..bf830dc --- /dev/null +++ b/app/Request.php @@ -0,0 +1,17 @@ + +// +---------------------------------------------------------------------- + +namespace app; + +class Request extends \think\Request +{ + +} diff --git a/app/admin/controller/App.php b/app/admin/controller/App.php new file mode 100644 index 0000000..df07808 --- /dev/null +++ b/app/admin/controller/App.php @@ -0,0 +1,226 @@ +post(); + + $model_app = ModelApp::where('mark_id',$post_data['mark_id'])->find(); + + if(!empty($model_app)){ + return json_message('应用已存在,不能重复创建'); + } + + $model_app = new ModelApp(); + + if(!empty($post_data['poster'])){ + UploadFiles::update(['userd_time'=>time()],['save_name'=>$post_data['poster']]); + } + + if(!empty($post_data['detail'])){ + + foreach ($post_data['detail'] as $key => $value) { + if(isset($value['insert'])){ + if(isset($value['insert']['image'])){ + $full_save_name = $value['insert']['image']; + $save_name = de_source_link($full_save_name); + if($save_name){ + UploadFiles::update(['used_time'=>time()],['save_name'=>$save_name]); + } + } + } + } + } + + + $model_app->data($post_data,true); + + $model_app->save(); + + return json_message(); + } + + /** + * 显示指定的资源 + * + * @param int $id + * @return \think\Response + */ + public function read($id) + { + // + } + + /** + * 显示编辑资源表单页. + * + * @param int $id + * @return \think\Response + */ + public function edit($id) + { + // + $model_app = ModelApp::find($id); + $app_list = get_app_info(); + + View::assign('app_list',$app_list); + View::assign('app',$model_app); + + return View::fetch(); + } + + /** + * 保存更新的资源 + * + * @param \think\Request $request + * @param int $id + * @return \think\Response + */ + public function update(Request $request, $id) + { + // + // + $post_data = $request->post(); + + $model_app = ModelApp::where('id',$id)->find(); + + if(empty($model_app)){ + return json_message('应用不存在'); + } + + if(!empty($post_data['poster'])){ + if($post_data['poster'] != $model_app->getData('poster')){ + UploadFiles::destroy(['save_name'=>$model_app->getData('poster')]); + UploadFiles::update(['userd_time'=>time()],['save_name'=>$post_data['poster']]); + } + } + + if(!empty($post_data['detail'])){ + $image_list = []; + $new_image_list = []; + foreach ($model_app->detail as $key => $value) { + if(isset($value['insert'])){ + if(isset($value['insert']['image'])){ + $full_save_name = $value['insert']['image']; + $save_name = de_source_link($full_save_name); + if($save_name){ + $image_list[] = $save_name; + } + } + } + } + foreach ($post_data['detail'] as $key => $value) { + if(isset($value['insert'])){ + if(isset($value['insert']['image'])){ + $full_save_name = $value['insert']['image']; + $save_name = de_source_link($full_save_name); + if($save_name){ + $new_image_list[] = $save_name; + } + } + } + } + + $del_image_list = array_diff($image_list,$new_image_list); + + foreach ($del_image_list as $key => $value) { + UploadFiles::destroy(['save_name'=>$value]); + } + + $add_image_list = array_diff($new_image_list,$image_list); + + foreach ($add_image_list as $key => $value) { + UploadFiles::update(['used_time'=>time()],['save_name'=>$value]); + } + } + + + $model_app->data($post_data,true); + + $model_app->save(); + + return json_message(); + } + + /** + * 删除指定资源 + * + * @param int $id + * @return \think\Response + */ + public function delete($id) + { + // + $model_app = ModelApp::find($id); + + if(!empty($model_app->getData('poster'))){ + UploadFiles::udpate(['delete_time'=>time()],['save_name'=>$model_app->getData('poster')]); + } + + if(!empty($model_app->getData('detail'))){ + foreach ($model_app->detail as $key => $value) { + if(isset($value['insert'])){ + if(isset($value['insert']['image'])){ + $full_save_name = $value['insert']['image']; + $save_name = de_source_link($full_save_name); + if($save_name){ + UploadFiles::update(['delete_time'=>time()],['save_name'=>$save_name]); + } + } + } + } + } + $model_app->delete(); + + return json_message(); + } +} diff --git a/app/admin/controller/Common.php b/app/admin/controller/Common.php new file mode 100644 index 0000000..eeb20b6 --- /dev/null +++ b/app/admin/controller/Common.php @@ -0,0 +1,34 @@ +request->controller() !== 'Login'){ + + if(empty($admin_id)){ + return $this->error('请登录','admin/Login/index'); + } + + $this->adminInfo = Admin::find(Session::get('admin_id')); + + if(empty($this->adminInfo)){ + if($this->request->controller() !== 'Login'){ + throw new HttpResponseException(redirect('admin/Login/index')); + } + } + } + + } +} \ No newline at end of file diff --git a/app/admin/controller/Index.php b/app/admin/controller/Index.php new file mode 100644 index 0000000..25b53dd --- /dev/null +++ b/app/admin/controller/Index.php @@ -0,0 +1,94 @@ +request->post(); + + $validate = Validate::rule('account',Rule::isRequire()) + ->rule('password',Rule::isRequire()); + + if(!$validate->check($post_data)){ + return json_message($validate->getError()); + } + + $model_admin = Admin::where('account',$post_data['account'])->find(); + + if(empty($model_admin)){ + return json_message('帐号不存在'); + } + + if($model_admin->getData('password') !== md5($post_data['password'].$model_admin->getData('salt'))){ + return json_message('密码错误'); + } + + Session::set('admin_id',$model_admin->id); + + return json_message(); + } +} diff --git a/app/admin/controller/Member.php b/app/admin/controller/Member.php new file mode 100644 index 0000000..03fcca8 --- /dev/null +++ b/app/admin/controller/Member.php @@ -0,0 +1,84 @@ +request->post(); + + $list = SystemConfig::column('value','name'); + + foreach ($post_data as $key => $value) { + if(\in_array($key,$upload_files_config)){ + $old_save_name = get_system_config($key); + UploadFiles::update(['used_time'=>time()],['save_name'=>$value]); + if($old_save_name != $value){ + UploadFiles::destroy(['save_name'=>$old_save_name]); + } + } + if(isset($list[$key])){ + SystemConfig::where('name',$key)->update(['value'=>$value]); + }else{ + $model_sysconfig = new SystemConfig(); + $model_sysconfig->name = $key; + $model_sysconfig->value = $value; + $model_sysconfig->save(); + } + + $list[$key] = $value; + } + + Cache::set('system_config',$list); + + return $this->success(); + } +} diff --git a/app/api/controller/Files.php b/app/api/controller/Files.php new file mode 100644 index 0000000..a91903b --- /dev/null +++ b/app/api/controller/Files.php @@ -0,0 +1,106 @@ +param('type'); + if(empty($type)){ + return json_message('缺少类型参数'); + } + + $file = request()->file('file'); + + if(empty($file)){ + return json_message('上传失败'); + } + + $dir_name = $request->param('dir','data'); + $model_file = new UploadFiles(); + $model_file->file_name = $file->getOriginalName(); + $model_file->mime_type = $file->getOriginalMime(); + $model_file->ext_name = $file->extension(); + $model_file->file_size = $file->getSize(); + $model_file->file_md5 = $file->md5(); + $model_file->file_sha1 = $file->sha1(); + $model_file->create_time = time(); + $model_file->type = $type; + try { + $model_file->save_name = Filesystem::putFile('upload/'.$dir_name,$file,'uniqid'); + $model_file->save(); + return json_message($model_file->append(['src'])->toArray()); + } catch (\Throwable $th) { + return json_message($th->getMessage()); + } + + } + + /** + * 显示指定的资源 + * + * @param int $id + * @return \think\Response + */ + public function read($id) + { + // + } + + /** + * 显示编辑资源表单页. + * + * @param int $id + * @return \think\Response + */ + public function edit($id) + { + // + } + + /** + * 保存更新的资源 + * + * @param \think\Request $request + * @param int $id + * @return \think\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * 删除指定资源 + * + * @param int $id + * @return \think\Response + */ + public function delete($id) + { + // + } +} diff --git a/app/api/controller/WxOpen.php b/app/api/controller/WxOpen.php new file mode 100644 index 0000000..f9e76cf --- /dev/null +++ b/app/api/controller/WxOpen.php @@ -0,0 +1,126 @@ +server; + + return $server->serve(); + } + + public function appAuthCallback() + { + $auth_code = $this->request->param('auth_code'); + + if (empty($auth_code)) { + return $this->error('缺少参数','admin/System/others'); + } + + $wx_open_app_config = Config::get('wx_open_app'); + $openPlatform = Factory::openPlatform($wx_open_app_config); + + $auth_info = $openPlatform->handleAuthorize($auth_code); + + $model_auth_account = WxPublicAccount::where('authorizer_appid',$auth_info['authorization_info']['authorizer_appid'])->find(); + + if(!empty($model_auth_account)){ + if($model_auth_account->getData('deauth_time') === 0){ + return $this->error('不能重复授权','admin/System/others'); + }else{ + $model_auth_account->deauth_time = 0; + } + }else{ + $model_auth_account = new WxPublicAccount(); + $model_auth_account->authorizer_appid = $auth_info['authorization_info']['authorizer_appid']; + // $model_auth_account->authorizer_access_token = $auth_info['authorization_info']['authorizer_access_token']; + $model_auth_account->authorizer_refresh_token = $auth_info['authorization_info']['authorizer_refresh_token']; + $model_auth_account->create_time = time(); + } + + $wx_public_account_info = $openPlatform->getAuthorizer($model_auth_account->authorizer_appid); + + + $model_auth_account->nick_name = $wx_public_account_info['authorizer_info']['nick_name']; + + + if(!empty($model_auth_account->getData('head_img'))){ + UploadFiles::destroy(['save_name'=>$model_auth_account->getData('head_img')]); + } + + $model_auth_account->head_img = \save_url_file($wx_public_account_info['authorizer_info']['head_img'],3); + UploadFiles::update(['used_time'=>time()],['save_name'=>$model_auth_account->getData('head_img')]); + $model_auth_account->service_type_info = $wx_public_account_info['authorizer_info']['service_type_info']['id']; + $model_auth_account->verify_type_info = $wx_public_account_info['authorizer_info']['verify_type_info']['id']; + $model_auth_account->user_name = $wx_public_account_info['authorizer_info']['user_name']; + $model_auth_account->alias = $wx_public_account_info['authorizer_info']['alias']; + + if(!empty($model_auth_account->getData('qrcode_url'))){ + UploadFiles::destroy(['save_name'=>$model_auth_account->getData('qrcode_url')]); + } + $model_auth_account->qrcode_url = save_url_file($wx_public_account_info['authorizer_info']['qrcode_url'],2); + UploadFiles::update(['used_time'=>time()],['save_name'=>$model_auth_account->getData('qrcode_url')]); + $model_auth_account->business_info = json_encode($wx_public_account_info['authorizer_info']['business_info']); + $model_auth_account->principal_name = $wx_public_account_info['authorizer_info']['principal_name']; + $model_auth_account->signature = $wx_public_account_info['authorizer_info']['signature']; + + $func_info = ''; + + foreach ($wx_public_account_info['authorization_info']['func_info'] as $key => $value) { + $func_info .= $value['funcscope_category']['id']; + } + + $model_auth_account->func_info = $func_info; + + $model_auth_account->save(); + $auth_type = $this->request->param('auth_type'); + + switch ($auth_type) { + case 'system': + $default_wx_public_account_id = get_system_config('default_wx_public_account_id'); + + if(empty($default_wx_public_account_id)){ + SystemConfig::create(['name'=>'default_wx_public_account_id','value'=>$model_auth_account->id]); + }else{ + SystemConfig::update(['value'=>$model_auth_account->id],['name'=>get_system_config('default_wx_public_account_id')]); + } + + $list = SystemConfig::column('value','name'); + Cache::set('system_config',$list); + + if($model_auth_account->getData('verify_type_info') !== 0){ + return $this->error('授权成功,但不能使用,公众号未认证','admin/System/others'); + } + + return $this->success('授权成功','admin/System/others'); + break; + + default: + # code... + break; + } + + } + + public function test() + { + $wx_open_app_config = Config::get('wx_open_app'); + $openPlatform = Factory::openPlatform($wx_open_app_config); + $info = $openPlatform->getAuthorizer('wx3280c83a307cbe7c'); + + dump($info); + } +} diff --git a/app/common.php b/app/common.php new file mode 100644 index 0000000..a19a7d8 --- /dev/null +++ b/app/common.php @@ -0,0 +1,136 @@ + +// +---------------------------------------------------------------------- + +// 应用公共文件 +use app\model\SystemConfig; +use think\facade\Cache; +use League\Flysystem\Util\MimeType; +use think\File; +use think\facade\Filesystem; +use app\model\UploadFiles; + +function json_message($data = [],$code = 0,$msg = '') +{ + if(is_string($data)){ + + $code = $code === 0 ? 500 : $code; + $msg = $data; + $data = []; + } + + return json([ + 'code'=>$code, + 'msg'=>$msg, + 'data'=>$data + ]); +} + +function get_system_config($name,$default = '') +{ + + $list = Cache::get('system_config'); + + if(empty($list)){ + $list = SystemConfig::column('value','name'); + } + + if(isset($list[$name])){ + return $list[$name]; + } + + return $default; +} + +function get_source_link($url) +{ + if(strpos($url,'/') === 0){ + return $url; + }if(strpos($url,'http') === 0){ + return $url; + }else{ + $resource_domain = get_system_config('resource_domain'); + + if(empty($resource_domain)){ + request()->host(); + } + return 'http://'.$resource_domain.'/'.$url; + } +} + +function de_source_link($url) +{ + $domain = 'http://'.get_system_config('resource_domain').'/'; + if(strpos($url,$domain) === 0){ + return str_replace($domain,'',$url); + } + return false; +} + +function save_url_file($url,$type) +{ + + $file_data = geturl($url); + + $mime_type = MimeType::detectByContent($file_data); + + $ext_name = array_search($mime_type,MimeType::getExtensionToMimeTypeMap()); + $temp_file = tempnam(app()->getRuntimePath(),'url_save_').'.'.$ext_name; + file_put_contents($temp_file,$file_data); + $file = new File($temp_file); + + $save_name = Filesystem::putFile('wx_public_account/qrcode_url',$file,'unique'); + + $model_file = new UploadFiles(); + $model_file->file_name = $file->getFilename(); + $model_file->mime_type = $mime_type; + $model_file->ext_name = $file->extension(); + $model_file->file_size = $file->getSize(); + $model_file->file_md5 = $file->md5(); + $model_file->file_sha1 = $file->sha1(); + $model_file->create_time = time(); + $model_file->type = $type; + + $model_file->save_name = $save_name; + $model_file->save(); + + return $save_name; +} + +function geturl($url){ + $headerArray =array(); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray); + $output = curl_exec($ch); + curl_close($ch); + + return $output; +} + + +function posturl($url,$data){ + $data = json_encode($data); + $headerArray =array(); + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE); + curl_setopt($curl, CURLOPT_POST, 1); + curl_setopt($curl, CURLOPT_POSTFIELDS, $data); + curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + $output = curl_exec($curl); + curl_close($curl); + return $output; +} \ No newline at end of file diff --git a/app/event.php b/app/event.php new file mode 100644 index 0000000..26ba7eb --- /dev/null +++ b/app/event.php @@ -0,0 +1,27 @@ + +// +---------------------------------------------------------------------- + +// 事件定义文件 +return [ + 'bind' => [ + ], + + 'listen' => [ + 'AppInit' => [], + 'HttpRun' => [], + 'HttpEnd' => [], + 'LogLevel' => [], + 'LogWrite' => [], + ], + + 'subscribe' => [ + ], +]; diff --git a/app/index/controller/Index.php b/app/index/controller/Index.php new file mode 100644 index 0000000..1536908 --- /dev/null +++ b/app/index/controller/Index.php @@ -0,0 +1,86 @@ +getData('save_name')); + } +} diff --git a/app/model/WxPublicAccount.php b/app/model/WxPublicAccount.php new file mode 100644 index 0000000..9f48e3d --- /dev/null +++ b/app/model/WxPublicAccount.php @@ -0,0 +1,23 @@ + +// +---------------------------------------------------------------------- + +use app\ExceptionHandle; +use app\Request; + +// 容器Provider定义文件 +return [ + 'think\Request' => Request::class, + 'think\exception\Handle' => ExceptionHandle::class, +]; diff --git a/build.example.php b/build.example.php new file mode 100644 index 0000000..0f2222f --- /dev/null +++ b/build.example.php @@ -0,0 +1,26 @@ + +// +---------------------------------------------------------------------- + +/** + * php think build 自动生成应用的目录结构的定义示例 + */ +return [ + // 需要自动创建的文件 + '__file__' => [], + // 需要自动创建的目录 + '__dir__' => ['controller', 'model', 'view'], + // 需要自动创建的控制器 + 'controller' => ['Index'], + // 需要自动创建的模型 + 'model' => ['User'], + // 需要自动创建的模板 + 'view' => ['index/index'], +]; diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..05d6ced --- /dev/null +++ b/composer.json @@ -0,0 +1,46 @@ +{ + "name": "topthink/think", + "description": "the new thinkphp framework", + "type": "project", + "keywords": [ + "framework", + "thinkphp", + "ORM" + ], + "homepage": "http://thinkphp.cn/", + "license": "Apache-2.0", + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + } + ], + "require": { + "php": ">=7.1.0", + "topthink/framework": "6.0.*-dev", + "topthink/think-orm": "2.0.*-dev", + "topthink/think-view": "^1.0", + "topthink/think-migration": "^3.0", + "topthink/think-helper": "^3.1" + }, + "require-dev": { + "symfony/var-dumper": "^4.2" + }, + "autoload": { + "psr-4": { + "app\\": "app" + }, + "psr-0": { + "": "extend/" + } + }, + "config": { + "preferred-install": "dist" + }, + "scripts": { + "post-autoload-dump": [ + "@php think service:discover", + "@php think vendor:publish" + ] + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..a3730f1 --- /dev/null +++ b/composer.lock @@ -0,0 +1,968 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "2677b38b2ee3ca9b6481d8996041554b", + "packages": [ + { + "name": "league/flysystem", + "version": "1.0.53", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "08e12b7628f035600634a5e76d95b5eb66cea674" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/08e12b7628f035600634a5e76d95b5eb66cea674", + "reference": "08e12b7628f035600634a5e76d95b5eb66cea674", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-fileinfo": "*", + "php": ">=5.5.9" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/phpspec": "^3.4", + "phpunit/phpunit": "^5.7.10" + }, + "suggest": { + "ext-fileinfo": "Required for MimeType", + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "time": "2019-06-18T20:09:29+00:00" + }, + { + "name": "league/flysystem-cached-adapter", + "version": "1.0.9", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-cached-adapter.git", + "reference": "08ef74e9be88100807a3b92cc9048a312bf01d6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-cached-adapter/zipball/08ef74e9be88100807a3b92cc9048a312bf01d6f", + "reference": "08ef74e9be88100807a3b92cc9048a312bf01d6f", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "league/flysystem": "~1.0", + "psr/cache": "^1.0.0" + }, + "require-dev": { + "mockery/mockery": "~0.9", + "phpspec/phpspec": "^3.4", + "phpunit/phpunit": "^5.7", + "predis/predis": "~1.0", + "tedivm/stash": "~0.12" + }, + "suggest": { + "ext-phpredis": "Pure C implemented extension for PHP" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Cached\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "frankdejonge", + "email": "info@frenky.net" + } + ], + "description": "An adapter decorator to enable meta-data caching.", + "time": "2018-07-09T20:51:04+00:00" + }, + { + "name": "opis/closure", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/opis/closure.git", + "reference": "92927e26d7fc3f271efe1f55bdbb073fbb2f0722" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opis/closure/zipball/92927e26d7fc3f271efe1f55bdbb073fbb2f0722", + "reference": "92927e26d7fc3f271efe1f55bdbb073fbb2f0722", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^5.4 || ^7.0" + }, + "require-dev": { + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Opis\\Closure\\": "src/" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marius Sarca", + "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" + } + ], + "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", + "homepage": "https://opis.io/closure", + "keywords": [ + "anonymous functions", + "closure", + "function", + "serializable", + "serialization", + "serialize" + ], + "time": "2019-07-09T21:58:11+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/log", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2018-11-20T15:27:04+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "topthink/framework", + "version": "6.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/top-think/framework.git", + "reference": "caf09dd37b56208c15a8ca251c675ec44f815ba8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/framework/zipball/caf09dd37b56208c15a8ca251c675ec44f815ba8", + "reference": "caf09dd37b56208c15a8ca251c675ec44f815ba8", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "league/flysystem": "^1.0", + "league/flysystem-cached-adapter": "^1.0", + "opis/closure": "^3.1", + "php": ">=7.1.0", + "psr/container": "~1.0", + "psr/log": "~1.0", + "psr/simple-cache": "^1.0", + "topthink/think-helper": "^3.1.1", + "topthink/think-orm": "^2.0" + }, + "require-dev": { + "mikey179/vfsstream": "^1.6", + "mockery/mockery": "^1.2", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "autoload": { + "files": [], + "psr-4": { + "think\\": "src/think/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + }, + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "description": "The ThinkPHP Framework.", + "homepage": "http://thinkphp.cn/", + "keywords": [ + "framework", + "orm", + "thinkphp" + ], + "time": "2019-08-16T08:25:42+00:00" + }, + { + "name": "topthink/think-helper", + "version": "v3.1.2", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-helper.git", + "reference": "a629c4271fdf3d7e7c6d89089791417cb4796a2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-helper/zipball/a629c4271fdf3d7e7c6d89089791417cb4796a2c", + "reference": "a629c4271fdf3d7e7c6d89089791417cb4796a2c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "think\\": "src" + }, + "files": [ + "src/helper.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "description": "The ThinkPHP6 Helper Package", + "time": "2019-07-11T04:35:03+00:00" + }, + { + "name": "topthink/think-migration", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-migration.git", + "reference": "e8b3396505617732a57309d2818d70ffe187385c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-migration/zipball/e8b3396505617732a57309d2818d70ffe187385c", + "reference": "e8b3396505617732a57309d2818d70ffe187385c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "topthink/framework": "^6.0.0", + "topthink/think-helper": "^3.0.3" + }, + "require-dev": { + "fzaninotto/faker": "^1.8" + }, + "suggest": { + "fzaninotto/faker": "Required to use the factory builder (^1.8)." + }, + "type": "library", + "extra": { + "think": { + "services": [ + "think\\migration\\Service" + ] + } + }, + "autoload": { + "psr-4": { + "Phinx\\": "phinx/src/Phinx", + "think\\migration\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "time": "2019-06-17T10:13:39+00:00" + }, + { + "name": "topthink/think-orm", + "version": "2.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-orm.git", + "reference": "6d8846be82c1a4cd09763f6b973355accb7f799b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-orm/zipball/6d8846be82c1a4cd09763f6b973355accb7f799b", + "reference": "6d8846be82c1a4cd09763f6b973355accb7f799b", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1.0", + "psr/log": "~1.0", + "psr/simple-cache": "^1.0", + "topthink/think-helper": "^3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "think\\": "src" + }, + "files": [] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + } + ], + "description": "think orm", + "keywords": [ + "database", + "orm" + ], + "time": "2019-08-15T13:53:39+00:00" + }, + { + "name": "topthink/think-template", + "version": "v2.0.5", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-template.git", + "reference": "3fb2741d6921475d980d987130cf8780c99c994c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-template/zipball/3fb2741d6921475d980d987130cf8780c99c994c", + "reference": "3fb2741d6921475d980d987130cf8780c99c994c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1.0", + "psr/simple-cache": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "think\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + } + ], + "description": "the php template engine", + "time": "2019-07-30T06:29:57+00:00" + }, + { + "name": "topthink/think-view", + "version": "v1.0.9", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-view.git", + "reference": "3cc8afc7069d3610b5ed09faebdddcfb5c929e80" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-view/zipball/3cc8afc7069d3610b5ed09faebdddcfb5c929e80", + "reference": "3cc8afc7069d3610b5ed09faebdddcfb5c929e80", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1.0", + "topthink/think-template": "^2.0" + }, + "type": "library", + "extra": { + "think": { + "config": { + "template": "src/config/template.php" + } + } + }, + "autoload": { + "psr-4": { + "think\\view\\driver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + } + ], + "description": "thinkphp template driver", + "time": "2019-07-30T04:10:50+00:00" + } + ], + "packages-dev": [ + { + "name": "symfony/polyfill-mbstring", + "version": "v1.12.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b42a2f66e8f1b15ccf25652c3424265923eb4f17", + "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.12-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2019-08-06T08:03:45+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.12.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "04ce3335667451138df4307d6a9b61565560199e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/04ce3335667451138df4307d6a9b61565560199e", + "reference": "04ce3335667451138df4307d6a9b61565560199e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.12-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-08-06T08:03:45+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v4.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "e4110b992d2cbe198d7d3b244d079c1c58761d07" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e4110b992d2cbe198d7d3b244d079c1c58761d07", + "reference": "e4110b992d2cbe198d7d3b244d079c1c58761d07", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2019-07-27T06:42:46+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "topthink/framework": 20, + "topthink/think-orm": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.1.0" + }, + "platform-dev": [] +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..e4183c6 --- /dev/null +++ b/config/app.php @@ -0,0 +1,47 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | 应用设置 +// +---------------------------------------------------------------------- + +use think\facade\Env; + +return [ + // 应用地址 + 'app_host' => Env::get('app.host', ''), + // 应用的命名空间 + 'app_namespace' => '', + // 是否启用路由 + 'with_route' => true, + // 是否启用事件 + 'with_event' => true, + // 自动多应用模式 + 'auto_multi_app' => true, + // 应用映射(自动多应用模式有效) + 'app_map' => [], + // 域名绑定(自动多应用模式有效) + 'domain_bind' => [], + // 禁止URL访问的应用列表(自动多应用模式有效) + 'deny_app_list' => [], + // 默认应用 + 'default_app' => 'index', + // 默认时区 + 'default_timezone' => 'Asia/Shanghai', + + // 异常页面的模板文件 + 'exception_tmpl' => app()->getThinkPath() . 'tpl/think_exception.tpl', + + // 错误显示信息,非调试模式有效 + 'error_message' => '页面错误!请稍后再试~', + // 显示错误信息 + 'show_error_msg' => false, +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..dc54123 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,39 @@ + +// +---------------------------------------------------------------------- +use think\facade\Env; + +// +---------------------------------------------------------------------- +// | 缓存设置 +// +---------------------------------------------------------------------- + +return [ + // 默认缓存驱动 + 'default' => Env::get('cache.driver', 'file'), + + // 缓存连接方式配置 + 'stores' => [ + 'file' => [ + // 驱动方式 + 'type' => 'File', + // 缓存保存目录 + 'path' => '', + // 缓存前缀 + 'prefix' => '', + // 缓存有效期 0表示永久缓存 + 'expire' => 0, + // 缓存标签前缀 + 'tag_prefix' => 'tag:', + // 序列化机制 例如 ['serialize', 'unserialize'] + 'serialize' => [], + ], + // 更多的缓存连接 + ], +]; diff --git a/config/console.php b/config/console.php new file mode 100644 index 0000000..27b516e --- /dev/null +++ b/config/console.php @@ -0,0 +1,19 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | 控制台配置 +// +---------------------------------------------------------------------- +return [ + // 指令定义 + 'commands' => [ + ], +]; diff --git a/config/cookie.php b/config/cookie.php new file mode 100644 index 0000000..bbc5819 --- /dev/null +++ b/config/cookie.php @@ -0,0 +1,28 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | Cookie设置 +// +---------------------------------------------------------------------- +return [ + // cookie 保存时间 + 'expire' => 0, + // cookie 保存路径 + 'path' => '/', + // cookie 有效域名 + 'domain' => '', + // cookie 启用安全传输 + 'secure' => false, + // httponly设置 + 'httponly' => false, + // 是否使用 setcookie + 'setcookie' => true, +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..30c694d --- /dev/null +++ b/config/database.php @@ -0,0 +1,70 @@ + +// +---------------------------------------------------------------------- + +use think\facade\Env; + +return [ + // 默认使用的数据库连接配置 + 'default' => Env::get('database.driver', 'mysql'), + + // 自定义时间查询规则 + 'time_query_rule' => [], + + // 自动写入时间戳字段 + // true为自动识别类型 false关闭 + // 字符串则明确指定时间字段类型 支持 int timestamp datetime date + 'auto_timestamp' => true, + + // 时间字段取出后的默认时间格式 + 'datetime_format' => 'Y-m-d H:i:s', + + // 数据库连接配置信息 + 'connections' => [ + 'mysql' => [ + // 数据库类型 + 'type' => Env::get('database.type', 'mysql'), + // 服务器地址 + 'hostname' => Env::get('database.hostname', '127.0.0.1'), + // 数据库名 + 'database' => Env::get('database.database', ''), + // 用户名 + 'username' => Env::get('database.username', 'root'), + // 密码 + 'password' => Env::get('database.password', ''), + // 端口 + 'hostport' => Env::get('database.hostport', '3306'), + // 数据库连接参数 + 'params' => [], + // 数据库编码默认采用utf8 + 'charset' => Env::get('database.charset', 'utf8'), + // 数据库表前缀 + 'prefix' => Env::get('database.prefix', 'ul_'), + // 数据库调试模式 + 'debug' => Env::get('database.debug', true), + // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) + 'deploy' => 0, + // 数据库读写是否分离 主从式有效 + 'rw_separate' => false, + // 读写分离后 主服务器数量 + 'master_num' => 1, + // 指定从服务器序号 + 'slave_no' => '', + // 是否严格检查字段是否存在 + 'fields_strict' => true, + // 是否需要断线重连 + 'break_reconnect' => false, + // 字段缓存路径 + 'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR, + ], + + // 更多的数据库配置信息 + ], +]; diff --git a/config/filesystem.php b/config/filesystem.php new file mode 100644 index 0000000..87fceb0 --- /dev/null +++ b/config/filesystem.php @@ -0,0 +1,20 @@ + Env::get('filesystem.driver', 'local'), + 'disks' => [ + 'local' => [ + 'type' => 'local', + 'root' => app()->getRuntimePath() . 'storage', + ], + 'public' => [ + 'type' => 'local', + 'root' => app()->getRootPath() . 'public/', + 'url' => '/', + 'visibility' => 'public', + ], + // 更多的磁盘配置信息 + ], +]; diff --git a/config/lang.php b/config/lang.php new file mode 100644 index 0000000..7659eaa --- /dev/null +++ b/config/lang.php @@ -0,0 +1,37 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | 多语言设置 +// +---------------------------------------------------------------------- + +use think\facade\Env; + +return [ + // 默认语言 + 'default_lang' => Env::get('lang.default_lang', 'zh-cn'), + // 允许的语言列表 + 'allow_lang_list' => [], + // 多语言自动侦测变量名 + 'detect_var' => 'lang', + // 是否使用Cookie记录 + 'use_cookie' => true, + // 多语言cookie变量 + 'cookie_var' => 'think_lang', + // 扩展语言包 + 'extend_list' => [], + // Accept-Language转义为对应语言包名称 + 'accept_language' => [ + 'zh-hans-cn' => 'zh-cn', + ], + // 是否支持语言分组 + 'allow_group' => false, +]; diff --git a/config/log.php b/config/log.php new file mode 100644 index 0000000..493234a --- /dev/null +++ b/config/log.php @@ -0,0 +1,55 @@ + +// +---------------------------------------------------------------------- +use think\facade\Env; + +// +---------------------------------------------------------------------- +// | 日志设置 +// +---------------------------------------------------------------------- +return [ + // 默认日志记录通道 + 'default' => Env::get('log.channel', 'file'), + // 日志记录级别 + 'level' => [], + // 日志类型记录的通道 ['error'=>'email',...] + 'type_channel' => [], + // 关闭全局日志写入 + 'close' => false, + // 全局日志处理 支持闭包 + 'processor' => null, + + // 日志通道列表 + 'channels' => [ + 'file' => [ + // 日志记录方式 + 'type' => 'File', + // 日志保存目录 + 'path' => '', + // 单文件日志写入 + 'single' => false, + // 独立日志级别 + 'apart_level' => [], + // 最大日志文件数量 + 'max_files' => 0, + // 使用JSON格式记录 + 'json' => false, + // 日志处理 + 'processor' => null, + // 关闭通道日志写入 + 'close' => false, + // 日志输出格式化 + 'format' => '[%s][%s] %s', + // 是否实时写入 + 'realtime_write' => false, + ], + // 其它日志通道配置 + ], + +]; diff --git a/config/route.php b/config/route.php new file mode 100644 index 0000000..0b0e592 --- /dev/null +++ b/config/route.php @@ -0,0 +1,61 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | 应用设置 +// +---------------------------------------------------------------------- + +return [ + // pathinfo分隔符 + 'pathinfo_depr' => '/', + // URL伪静态后缀 + 'url_html_suffix' => 'html', + // URL普通方式参数 用于自动生成 + 'url_common_param' => true, + // 是否开启路由延迟解析 + 'url_lazy_route' => false, + // 是否强制使用路由 + 'url_route_must' => false, + // 合并路由规则 + 'route_rule_merge' => false, + // 路由是否完全匹配 + 'route_complete_match' => false, + // 是否开启路由缓存 + 'route_check_cache' => false, + // 路由缓存连接参数 + 'route_cache_option' => [], + // 路由缓存Key + 'route_check_cache_key' => '', + // 访问控制器层名称 + 'controller_layer' => 'controller', + // 空控制器名 + 'empty_controller' => 'Error', + // 是否使用控制器后缀 + 'controller_suffix' => false, + // 默认的路由变量规则 + 'default_route_pattern' => '[\w\.]+', + // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则 + 'request_cache' => false, + // 请求缓存有效期 + 'request_cache_expire' => null, + // 全局请求缓存排除规则 + 'request_cache_except' => [], + // 默认控制器名 + 'default_controller' => 'Index', + // 默认操作名 + 'default_action' => 'index', + // 操作方法后缀 + 'action_suffix' => '', + // 默认JSONP格式返回的处理方法 + 'default_jsonp_handler' => 'jsonpReturn', + // 默认JSONP处理方法 + 'var_jsonp_handler' => 'callback', +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..7a2527a --- /dev/null +++ b/config/session.php @@ -0,0 +1,27 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | 会话设置 +// +---------------------------------------------------------------------- + +return [ + // session name + 'name' => '', + // SESSION_ID的提交变量,解决flash上传跨域 + 'var_session_id' => '', + // 驱动方式 支持file redis memcache memcached + 'type' => 'file', + // 过期时间 + 'expire' => 0, + // 前缀 + 'prefix' => '', +]; diff --git a/config/template.php b/config/template.php new file mode 100644 index 0000000..51a4211 --- /dev/null +++ b/config/template.php @@ -0,0 +1,27 @@ + 'Think', + // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法 + 'auto_rule' => 1, + // 模板基础路径 + 'view_base' => '', + // 模板路径 + 'view_path' => '', + // 模板后缀 + 'view_suffix' => 'html', + // 模板文件名分隔符 + 'view_depr' => DIRECTORY_SEPARATOR, + // 模板引擎普通标签开始标记 + 'tpl_begin' => '{', + // 模板引擎普通标签结束标记 + 'tpl_end' => '}', + // 标签库标签开始标记 + 'taglib_begin' => '{', + // 标签库标签结束标记 + 'taglib_end' => '}', +]; diff --git a/config/trace.php b/config/trace.php new file mode 100644 index 0000000..e268f3a --- /dev/null +++ b/config/trace.php @@ -0,0 +1,20 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | Trace设置 开启调试模式后有效 +// +---------------------------------------------------------------------- +return [ + // 内置Html 支持扩展 + 'type' => 'Html', + // 读取的日志通道名 + 'channel' => '', +]; diff --git a/database/migrations/20190728015455_create_table_upload_files.php b/database/migrations/20190728015455_create_table_upload_files.php new file mode 100644 index 0000000..286a704 --- /dev/null +++ b/database/migrations/20190728015455_create_table_upload_files.php @@ -0,0 +1,55 @@ +table('upload_files',['comment'=>'上传的文件']); + $table->addColumn('save_name','string',['limit'=>100,'comment'=>'文件存储地址']); + $table->addColumn('file_name','string',['limit'=>100,'comment'=>'文件原始名称']); + $table->addColumn('mime_type','string',['limit'=>30,'comment'=>'mime type 类型']); + $table->addColumn('file_size','integer',['limit'=>30,'comment'=>'文件大小']); + $table->addColumn('ext_name','string',['limit'=>10,'comment'=>'扩展名']); + $table->addColumn('file_md5','string',['limit'=>32,'comment'=>'文件md5值']); + $table->addColumn('file_sha1','string',['limit'=>40,'comment'=>'文件sha1值']); + $table->addColumn('create_time','integer',['limit'=>10,'comment'=>'上传时间']); + $table->addColumn('used_time','integer',['limit'=>10,'comment'=>'标记使用时间,如果为空,可能仅作为了预览图']); + $table->addColumn('delete_time','integer',['limit'=>10,'comment'=>'删除时间']); + $table->addColumn('clear_time','integer',['limit'=>10,'comment'=>'清空时间']); + $table->addColumn('type','integer',['limit'=>2,'default'=>1,'comment'=>'文件类型,1:系统logo;2:微信公众号授权二维码;3:微信公众号授权头像;4:应用文章图片;5:应用封面']); + $table->addIndex('save_name'); + $table->addIndex('create_time'); + $table->addIndex('used_time'); + $table->addIndex('delete_time'); + $table->addIndex('clear_time'); + $table->addIndex('type'); + $table->create(); + + + + } +} diff --git a/database/migrations/20190822043653_create_table_system_config.php b/database/migrations/20190822043653_create_table_system_config.php new file mode 100644 index 0000000..cc69500 --- /dev/null +++ b/database/migrations/20190822043653_create_table_system_config.php @@ -0,0 +1,37 @@ +table('system_config',['comment'=>'系统配置表']); + $table->addColumn('name','string',['limit'=>30,'comment'=>'配置名称']); + $table->addColumn('value','string',['limit'=>200,'comment'=>'值']); + $table->addIndex('name'); + $table->save(); + } +} diff --git a/database/migrations/20190822043811_create_table_admin.php b/database/migrations/20190822043811_create_table_admin.php new file mode 100644 index 0000000..598df62 --- /dev/null +++ b/database/migrations/20190822043811_create_table_admin.php @@ -0,0 +1,43 @@ +table('admin',['comment'=>'管理员表','signed'=>false]); + $table->addColumn('account','string',['limit'=>20,'comment'=>'用户帐号']); + $table->addColumn('password','string',['limit'=>32,'comment'=>'密码']); + $table->addColumn('salt','string',['limit'=>6,'comment'=>'密码盐']); + $table->addColumn('nickname','string',['limit'=>10,'comment'=>'昵称']); + $table->addColumn('avatar','string',['limit'=>40,'comment'=>'头像地址']); + $table->addColumn('create_time','integer',['limit'=>10,'default'=>0,'comment'=>'添加时间']); + $table->addColumn('delete_time','integer',['limit'=>10,'default'=>0,'comment'=>'删除时间']); + $table->addIndex('account'); + $table->addIndex('delete_time'); + $table->create(); + } +} diff --git a/database/seeds/InitAdmin.php b/database/seeds/InitAdmin.php new file mode 100644 index 0000000..194f239 --- /dev/null +++ b/database/seeds/InitAdmin.php @@ -0,0 +1,32 @@ +find(); + + if(empty($model_admin)){ + $model_admin = new Admin; + $model_admin->data($account); + $model_admin->save(); + } + } +} \ No newline at end of file diff --git a/extend/.gitignore b/extend/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/extend/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..cbc7868 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,8 @@ + + Options +FollowSymlinks -Multiviews + RewriteEngine On + + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e71815a6618c6ef19c78d27840b8995fb2521499 GIT binary patch literal 1150 zcmbVMSx8i26uv?4_SAEaJq7BFqqJE;Q9TBc5JYcLIgSmPnyr-jk`K{>ZB(>aLWVXo z*9E63a&I$RrZR03EEi&&_1^#9`}O_*AViPd;mm*e&-u>z&UX%1)0XhJY?;RY723X~ znzmfiw3Reo@g{fAL(}N{_i=@Ma0M%r6$X8HFcE zpG~1@_%Y6ow1ksJIN%eE0)m_g-8Gd#K%-r;7XvI$t0gLrlUMS(*o zV$Y+$Ct(SJ+L5c+)7OmI%nVG$!vbteaep>7ij6%r*#F`@;?!a~HIJfDIkr7LrT7TO z8Pus^>>;*w*WwO!6s7@#wJgVkVE+^G7)ra2;Ldm_p8Ob6`0br_NQk8JTkP3k{J^jG z*cCa8vT!3JGaq0ucb3{&JkLiTVfXWMD5q9ZyH%ZD)V;jPIT^6ouVd%VG`X~V*0H+F zhl^v6kP#Mn+6Yg-!rHDH>fs|^>X)1U?nncMSj%CIp#G9el3d=+e!&L43iV_6ITI5d zQv>h>y$V~X^k*JwD7m;pl{iR^$K%uN!-g$vq?qse=KxBm_3+$BoO#pw7gpx+aR#|L z%6Dm{!D`%_jIeKm8ajyn9!EZFoOpW+Tl5oZR|^>D;?7A9ZiV-%JuQ#*owco@x{a zD-|ENtov7tOFzK5r}KRMSHhkEb!7aa$$nhqBKuHtV!cJ5I+?Si!w-Hm{`)ye +// +---------------------------------------------------------------------- + +// [ 应用入口文件 ] +namespace think; + +require __DIR__ . '/../vendor/autoload.php'; + +// 执行HTTP应用并响应 +$http = (new App())->http; + +$response = $http->run(); + +$response->send(); + +$http->end($response); diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/public/router.php b/public/router.php new file mode 100644 index 0000000..4f916b4 --- /dev/null +++ b/public/router.php @@ -0,0 +1,17 @@ + +// +---------------------------------------------------------------------- +// $Id$ + +if (is_file($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"])) { + return false; +} else { + require __DIR__ . "/index.php"; +} diff --git a/public/static/.gitignore b/public/static/.gitignore new file mode 100644 index 0000000..b722e9e --- /dev/null +++ b/public/static/.gitignore @@ -0,0 +1 @@ +!.gitignore \ No newline at end of file diff --git a/public/static/css/pagination.css b/public/static/css/pagination.css new file mode 100644 index 0000000..2cffef0 --- /dev/null +++ b/public/static/css/pagination.css @@ -0,0 +1,96 @@ +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} \ No newline at end of file diff --git a/public/static/css/reset.css b/public/static/css/reset.css new file mode 100644 index 0000000..c45a85f --- /dev/null +++ b/public/static/css/reset.css @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + + html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + } + + /* Sections + ========================================================================== */ + + /** + * Remove the margin in all browsers. + */ + + body { + margin: 0; + } + + /** + * Render the `main` element consistently in IE. + */ + + main { + display: block; + } + + /** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + + h1 { + font-size: 2em; + margin: 0.67em 0; + } + + /* Grouping content + ========================================================================== */ + + /** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + + hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /* Text-level semantics + ========================================================================== */ + + /** + * Remove the gray background on active links in IE 10. + */ + + a { + background-color: transparent; + } + + /** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + + abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ + } + + /** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + + b, + strong { + font-weight: bolder; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + code, + kbd, + samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /** + * Add the correct font size in all browsers. + */ + + small { + font-size: 80%; + } + + /** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sub { + bottom: -0.25em; + } + + sup { + top: -0.5em; + } + + /* Embedded content + ========================================================================== */ + + /** + * Remove the border on images inside links in IE 10. + */ + + img { + border-style: none; + } + + /* Forms + ========================================================================== */ + + /** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + + button, + input, + optgroup, + select, + textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ + } + + /** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + + button, + input { /* 1 */ + overflow: visible; + } + + /** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + + button, + select { /* 1 */ + text-transform: none; + } + + /** + * Correct the inability to style clickable types in iOS and Safari. + */ + + button, + [type="button"], + [type="reset"], + [type="submit"] { + -webkit-appearance: button; + } + + /** + * Remove the inner border and padding in Firefox. + */ + + button::-moz-focus-inner, + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus styles unset by the previous rule. + */ + + button:-moz-focusring, + [type="button"]:-moz-focusring, + [type="reset"]:-moz-focusring, + [type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; + } + + /** + * Correct the padding in Firefox. + */ + + fieldset { + padding: 0.35em 0.75em 0.625em; + } + + /** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + + legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ + } + + /** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + + progress { + vertical-align: baseline; + } + + /** + * Remove the default vertical scrollbar in IE 10+. + */ + + textarea { + overflow: auto; + } + + /** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + + [type="checkbox"], + [type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + + [type="number"]::-webkit-inner-spin-button, + [type="number"]::-webkit-outer-spin-button { + height: auto; + } + + /** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + + [type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + } + + /** + * Remove the inner padding in Chrome and Safari on macOS. + */ + + [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + + /** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } + + /* Interactive + ========================================================================== */ + + /* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + + details { + display: block; + } + + /* + * Add the correct display in all browsers. + */ + + summary { + display: list-item; + } + + /* Misc + ========================================================================== */ + + /** + * Add the correct display in IE 10+. + */ + + template { + display: none; + } + + /** + * Add the correct display in IE 10. + */ + + [hidden] { + display: none; + } \ No newline at end of file diff --git a/public/static/images/avatar.jpeg b/public/static/images/avatar.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c2bc2b7776e0a5ea633d0c629c9049b93d84603d GIT binary patch literal 164992 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 F|Jez_{@(xq literal 0 HcmV?d00001 diff --git a/public/static/js/common.js b/public/static/js/common.js new file mode 100644 index 0000000..e69de29 diff --git a/public/static/lib/jquery/jquery-3.4.1.js b/public/static/lib/jquery/jquery-3.4.1.js new file mode 100644 index 0000000..773ad95 --- /dev/null +++ b/public/static/lib/jquery/jquery-3.4.1.js @@ -0,0 +1,10598 @@ +/*! + * jQuery JavaScript Library v3.4.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2019-05-01T21:04Z + */ +( 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 document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +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. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + + + + 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.4.1", + + // 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 ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; + +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 ); + }, + + 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 global context + globalEval: function( code, options ) { + DOMEval( code, { nonce: options && options.nonce } ); + }, + + 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; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // 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 concat.apply( [], 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.4 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2019-04-08 + */ +(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, + push_native = 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]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // 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-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + 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 + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.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 ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + 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. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && rdescend.test( selector ) ) { + + // 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 + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + 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.namespaceURI, + docElem = (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 + 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 + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + 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 ); + } + } + + /* 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 ) { + // 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("~="); + } + + // 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(".#.+[+~]"); + } + }); + + 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" ); + } + + // 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 + 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 + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + 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 ) { + return a === document ? -1 : + b === document ? 1 : + 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 + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + 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 + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + 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 += ""; + + 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; + }; + }, + + "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 ) { + 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 ) { + 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; + 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 ( typeof elem.contentDocument !== "undefined" ) { + 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 master Deferred + master = 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 ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.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"; + }; + +var swap = function( elem, options, callback, args ) { + 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.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +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 ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // 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, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +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; +} + + +( 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; +} )(); + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + 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 ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + 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 = {}; + } + 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 ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ 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(); + return 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: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, 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; + }, + + 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 + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // 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, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.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 = concat.apply( [], 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" ) + } ); + } + } 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.replace( rxhtmlTag, "<$1>" ); + }, + + 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 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, + 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; + } + } ); +} )(); + + +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"; + } + + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + // Support: IE 9-11 only + // Also use offsetWidth/offsetHeight for when box sizing is unreliable + // We use getClientRects() to check for hidden/disconnected. + // In those cases, the computed value can be trusted to be border-box + if ( ( !support.boxSizingReliable() && isBorderBox || + val === "auto" || + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + 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 && type !== false ) { + 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" ) || {} )[ 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() { + var doc = this.ownerDocument || 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, + 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 = Date.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + 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 ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + 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++ ) + 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 ); + } + + // 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._evalUrl = function( url, options ) { + 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 ); + } + } ); +}; + + +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/view/admin/common/left_index.html b/view/admin/common/left_index.html new file mode 100644 index 0000000..e5d152c --- /dev/null +++ b/view/admin/common/left_index.html @@ -0,0 +1,10 @@ +
+
+ + +
+
\ No newline at end of file diff --git a/view/admin/common/left_system.html b/view/admin/common/left_system.html new file mode 100644 index 0000000..5350d81 --- /dev/null +++ b/view/admin/common/left_system.html @@ -0,0 +1,13 @@ +
+
+ + +
+
\ No newline at end of file diff --git a/view/admin/common/模板.html b/view/admin/common/模板.html new file mode 100644 index 0000000..ff00a3a --- /dev/null +++ b/view/admin/common/模板.html @@ -0,0 +1,36 @@ + + + + + + + 应用管理 + {include file="common/_require"} + + + +
+ {include file="common/_header"} + + {include file="common/left_app"} + +
+ +
+
+ + 首页 + 系统信息 + +
+
+ +
+
+
+ + + {include file="common/_footer"} +
+ + \ No newline at end of file diff --git a/view/admin/index/index.html b/view/admin/index/index.html new file mode 100644 index 0000000..f700580 --- /dev/null +++ b/view/admin/index/index.html @@ -0,0 +1,126 @@ + + + + + + + layout 后台大布局 - Layui + {include file="common/_require"} + + + + +
+ + + {include file="common/_header"} + + + {include file="common/left_index"} + +
+ +
+
+ + 系统信息 + +
+
+
+
+
网站名称
+
+ +
+
+
+
系统版本
+
+ +
+
+
+
ThinkPHP版本
+
+ +
+
+
+
PHP版本
+
+ +
+
+
+
服务器版本
+
+ +
+
+ +
+
PHP运行方式
+
+ +
+
+
+
PHP安装路径
+
+ +
+
+
+
Zend版本
+
+ +
+
+
+
服务器当前时间
+
+ +
+
+
+
超时时间
+
+ +
+
+
+
内存限制
+
+ +
+
+
+
服务器解释引擎
+
+ +
+
+ +
+
+
+
+ + {include file="common/_footer"} + +
+ + + + + \ No newline at end of file diff --git a/view/admin/login/index.html b/view/admin/login/index.html new file mode 100644 index 0000000..f672cd1 --- /dev/null +++ b/view/admin/login/index.html @@ -0,0 +1,98 @@ + + + + + + + + 登陆 + + {include file="common/_require"} + + + + + + + +
+
+
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/view/admin/system/index.html b/view/admin/system/index.html new file mode 100644 index 0000000..b2bad27 --- /dev/null +++ b/view/admin/system/index.html @@ -0,0 +1,126 @@ + + + + + + + + 系统管理 + {include file="common/_require"} + + + + +
+ {include file="common/_header"} + + {include file="common/left_system"} + +
+ +
+
+ + 首页 + 系统设置 + +
+
+
+
+ 系统管理 +
+
+
+
网站名称
+
+ +
+
+
+
网站描述
+
+ +
+
+
+
网站logo
+
+
+ +
+
+ +
+ +
+
+
+
备案号
+
+ +
+
+
+
主域名
+
+ +
+
+
+
资源域名
+
+ +
+
+
+
统计代码
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+
+ + + {include file="common/_footer"} + + +
` + + + \ No newline at end of file diff --git a/view/admin/system/others.html b/view/admin/system/others.html new file mode 100644 index 0000000..dbe67ba --- /dev/null +++ b/view/admin/system/others.html @@ -0,0 +1,252 @@ + + + + + + + + 系统管理 + {include file="common/_require"} + + + + + +
+ {include file="common/_header"} + + {include file="common/left_system"} + +
+ +
+ +
+
+ +
+
+ 七牛存储设置 +
+
+
+
AccessKey
+
+ +
+
+
+
SecretKey
+
+ +
+
+
+
空间名称
+
+ +
+
+
+
空间域名
+
+ +
+
+ +
+ +
+
+
+
+ +
+
+
+ +
+
+ 万维易源短信配置 +
+
+
+
AppId
+
+ +
+
+
+
AppSecret
+
+ +
+
+
+
模板ID
+
+ +
+
+ +
+ +
+
+
+
+ +
+
+
+ +
+
+ 微信第三方平台配置 +
+
+
+
AppID
+
+ +
+
+
+
AppSecret
+
+ +
+
+
+
消息校验Token
+
+ +
+
+
+
消息加解密Key
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+
+
+ 微信公众号配置 +
+
+
+
公众号名称
+
+ +
+
+
+
AppID
+
+ +
+
+
+
AppSecret
+
+ +
+
+
+
Token
+
+ +
+
+
+
+ +
保存
+ +
+
+
+
+
+
+
+
+
+
+ 微信支付配置 +
+
+
+
商户ID
+
+ +
+
+
+
商户秘钥
+
+ + +
+
+
+
商户key
+
+ +
上传
+
+
+
+
商户cert
+
+ +
上传
+
+
+
+ +
+
+
+
+
+
+
+
+
+ + + {include file="common/_footer"} +
+ + + + \ No newline at end of file diff --git a/view/common/tpl/error.html b/view/common/tpl/error.html new file mode 100644 index 0000000..8c82f92 --- /dev/null +++ b/view/common/tpl/error.html @@ -0,0 +1,24 @@ + + + + + + + {$msg} + + +

{$msg}

+

3秒后跳转 立即跳转

+ + + \ No newline at end of file diff --git a/view/common/tpl/success.html b/view/common/tpl/success.html new file mode 100644 index 0000000..7bcdc19 --- /dev/null +++ b/view/common/tpl/success.html @@ -0,0 +1,23 @@ + + + + + + + {$msg} + + +

{$msg}

+

3秒后跳转 立即跳转

+ + + \ No newline at end of file diff --git a/view/index/index/index.html b/view/index/index/index.html new file mode 100644 index 0000000..d240106 --- /dev/null +++ b/view/index/index/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + \ No newline at end of file